Вики ZooBC
Транзакции

Срок действия и метки времени

Каждая транзакция ZooBC несёт в своих подписанных байтах момент, когда она была создана, в секундах Unix. Эта метка времени открывает окно действительности: блок может включить транзакцию только в пределах окна, а после него транзакция мертва и её нужно подписать заново. Окно защищает подписанта. Платёж, который не смог попасть в блок в загруженный момент, не висит днями, чтобы потом неожиданно пройти; он просто истекает, и подписант может решить заново.

Окно по умолчанию: один час

По умолчанию блок может включить транзакцию в течение 3 600 секунд после её метки времени: одного часа, или 240 блоков при одном блоке каждые 15 секунд. После этого узлы отклоняют её с сообщением, которое заканчивается словами «...sign it again».

У окна есть и передний край. Транзакция, датированная более чем на 3 600 секунд в будущем, тоже отклоняется с подсказкой проверить часы подписанта. Так обнаруживается устройство с неверными часами.

Ось времени от метки времени транзакции: зелёная полоса до одного часа, в течение которого блок может её включить, красная зона после неё и пунктирная полоса до 24 часов для версии 3
Ось времени от метки времени транзакции: зелёная полоса до одного часа, в течение которого блок может её включить, красная зона после неё и пунктирная полоса до 24 часов для версии 3

Выбор окна: версия 3

Транзакция версии 3 несёт 4-байтовое поле срока действия, сразу после комиссии и поля survival, и сама указывает своё окно в секундах:

  • 0 означает час по умолчанию;
  • меньшее значение сокращает окно — для платежа, который должен пройти скоро или не пройти вовсе;
  • наибольшее допустимое значение — 86 400 секунд, одни сутки; большее значение отклоняется.

У транзакции версии 1 или 2 поля срока действия нет, и такая транзакция, всё же указывающая срок, отклоняется. Какой бы ни была версия, предел в один час в будущее продолжает действовать.

Более длинное окно помогает, когда подпись собирается долго: на аппаратном кошельке или среди участников мультиподписного аккаунта.

Как успевают пулы и цепочки

Два сопутствующих правила делают суточное окно безопасным:

  • пул транзакций узла хранит каждую транзакцию в течение её собственного заявленного окна;
  • каждая цепочка хранит идентификаторы транзакций не менее 25 часов: самое длинное окно плюс часовой допуск в будущее.

Поскольку узел отклоняет идентификатор, который уже подтверждён (см. Подписание транзакции), транзакцию никогда нельзя воспроизвести повторно, пока она ещё действительна.

Линейка от метки времени с отметками на 1 часе (по умолчанию), 24 часах (предел) и 25 часах (сколько хранятся идентификаторы) и красной зоной после 24 часов
Линейка от метки времени с отметками на 1 часе (по умолчанию), 24 часах (предел) и 25 часах (сколько хранятся идентификаторы) и красной зоной после 24 часов

Время в блоках

Блоки проверяются по тем же окнам, поэтому каждый узел выносит один и тот же вердикт:

  • блок, метка времени которого позже метки времени транзакции плюс её окно, недействителен;
  • как и блок, несущий транзакцию, датированную более чем на 3 600 секунд позже блока.

Некоторые расчёты происходят сами собой, блок за блоком: сроки эскроу, завершение ликвидных платежей, наступление сроков запланированных переводов, истечение сроков ордеров, стоящих на рынке, и фазы голосования по комиссии. Они читают метку времени предыдущего блока, а не собственную метку блока. Поэтому производитель не может поставить на свой блок метку чуть раньше срока, чтобы втянуть в него выплату.

Как блоки распределены во времени, объясняет статья блоки и время.

См. также