Как вычислить срок действия подписи mortal extrinsic в Substrate

Офлайн-подписант может вернуть корректную подпись уже после истечения выбранной эры. До отправки задержанной транзакции определите исходную контрольную точку и конечную высоту.

Воспроизведите эру из контекста подписи

В примере Rust тип Era из SDK создаётся для периода 64 блока и высоты подписания 1000. Сохраните фактический хеш контрольной точки, номер блока и кодированную эру. Та же фаза периода повторяется позднее с другим хешем.

use sp_runtime::generic::Era;

let era = Era::mortal(64, 1000);
assert_eq!(era.birth(1000), 1000);
assert_eq!(era.death(1000), 1064);

Учтите, что конечная граница исключается

В примере исходное окно завершается перед блоком 1064. При отправке на высоте 1065 нельзя продлить старую подпись выбором повторившейся фазы. Другой хеш контрольной точки меняет подписываемые данные и требует новой подписи. До повторения прикладной операции проверьте включение первоначальной транзакции.

Для диагностики используйте реально закодированную эру. SDK нормализует запрошенные периоды и может округлять фазы длинных периодов. Простое сложение значения из интерфейса с текущей высотой может дать неверный срок.

Источники