Срок действия и метки времени
Каждая транзакция ZooBC несёт в своих подписанных байтах момент, когда она была создана, в секундах Unix. Эта метка времени открывает окно действительности: блок может включить транзакцию только в пределах окна, а после него транзакция мертва и её нужно подписать заново. Окно защищает подписанта. Платёж, который не смог попасть в блок в загруженный момент, не висит днями, чтобы потом неожиданно пройти; он просто истекает, и подписант может решить заново.
Окно по умолчанию: один час
По умолчанию блок может включить транзакцию в течение 3 600 секунд после её метки времени: одного часа, или 240 блоков при одном блоке каждые 15 секунд. После этого узлы отклоняют её с сообщением, которое заканчивается словами «...sign it again».
У окна есть и передний край. Транзакция, датированная более чем на 3 600 секунд в будущем, тоже отклоняется с подсказкой проверить часы подписанта. Так обнаруживается устройство с неверными часами.
Выбор окна: версия 3
Транзакция версии 3 несёт 4-байтовое поле срока действия, сразу после комиссии и поля survival, и сама указывает своё окно в секундах:
- 0 означает час по умолчанию;
- меньшее значение сокращает окно — для платежа, который должен пройти скоро или не пройти вовсе;
- наибольшее допустимое значение — 86 400 секунд, одни сутки; большее значение отклоняется.
У транзакции версии 1 или 2 поля срока действия нет, и такая транзакция, всё же указывающая срок, отклоняется. Какой бы ни была версия, предел в один час в будущее продолжает действовать.
Более длинное окно помогает, когда подпись собирается долго: на аппаратном кошельке или среди участников мультиподписного аккаунта.
Как успевают пулы и цепочки
Два сопутствующих правила делают суточное окно безопасным:
- пул транзакций узла хранит каждую транзакцию в течение её собственного заявленного окна;
- каждая цепочка хранит идентификаторы транзакций не менее 25 часов: самое длинное окно плюс часовой допуск в будущее.
Поскольку узел отклоняет идентификатор, который уже подтверждён (см. Подписание транзакции), транзакцию никогда нельзя воспроизвести повторно, пока она ещё действительна.
Время в блоках
Блоки проверяются по тем же окнам, поэтому каждый узел выносит один и тот же вердикт:
- блок, метка времени которого позже метки времени транзакции плюс её окно, недействителен;
- как и блок, несущий транзакцию, датированную более чем на 3 600 секунд позже блока.
Некоторые расчёты происходят сами собой, блок за блоком: сроки эскроу, завершение ликвидных платежей, наступление сроков запланированных переводов, истечение сроков ордеров, стоящих на рынке, и фазы голосования по комиссии. Они читают метку времени предыдущего блока, а не собственную метку блока. Поэтому производитель не может поставить на свой блок метку чуть раньше срока, чтобы втянуть в него выплату.
Как блоки распределены во времени, объясняет статья блоки и время.