Глоссарий / Транзакции и комиссии
Порядковый номер
Другие названия: nSequence.
- Что такое порядковый номер?
- Порядковый номер представляет собой поле из четырех байт в каждом входе транзакции, которое сигнализирует о замене с более высокой комиссией, включает locktime и может кодировать относительный временной замок.
Определено в BIP-68.
Три несвязанные задачи делят одно поле, потому что биткоин не мог позволить себе добавить еще одно. Первоначальный замысел Сатоши для этого поля, примитивный платежный канал, в котором каждая новая версия повышала номер, был заброшен около 2010 года, потому что ни одно правило не обязывало майнеров предпочитать большее значение. Уцелел набор магических значений, которые определяют, как ведут себя транзакции вашего кошелька.
Как это работает
Прочитать порядковый номер означает сверить его с тремя отдельными правилами, в порядке их давности.
Финальное значение. Порядковый номер 0xffffffff, в десятичном виде 4 294 967 295, помечает вход как финальный. Если все входы транзакции финальные, поле locktime полностью игнорируется. Это было значением по умолчанию в ранних кошельках и остается тем, что видно в транзакциях, построенных программным обеспечением, которое никогда не задумывалось об этом поле.
Сигнал замены. BIP125 придал смысл нижнему краю диапазона: любой вход со значением 0xfffffffd или ниже объявляет, что отправитель может заменить транзакцию версией с более высокой комиссией. Значение 0xfffffffe находит середину: включает locktime, но не подает сигнал замены. Это различие во многом утратило силу, потому что Bitcoin Core передает замены независимо от сигнала начиная с версии 28.0 в октябре 2024 года.
Относительный временной замок. BIP68 переосмыслил младшие биты для транзакций, объявляющих версию 2 или выше, и правило стало подлежать исполнению на блоке 419 328 в июле 2016 года. Когда бит 31 сброшен, нижние 16 бит указывают, сколько времени должно пройти после подтверждения той монеты, которую расходует сам вход. Бит 22 выбирает единицу: сброшенный означает блоки, то есть максимум 65 535 блоков или примерно 455 дней, а установленный означает периоды по 512 секунд, что дает потолок около 388 дней. Отсчет начинается с подтверждения родительской транзакции, а не с какой-либо фиксированной даты, и именно это нужно договору между двумя людьми.
Где это видно
Порядковый номер отображается как столбец в дампах необработанных транзакций и как флажок в программном обеспечении кошелька, и эти два представления редко используют одни и те же слова.
Обозреватель блоков, который декодирует входы, покажет рядом с каждым из них значения вроде 4294967293. Это 0xfffffffd, и это говорит о том, что кошелек построил заменяемую транзакцию. Вызов decoderawtransaction в Bitcoin Core показывает ту же цифру, а Sparrow и Electrum выставляют ее через переключатель "replace by fee", а не в виде числа.
Lightning использует это поле активнее всех. Задержка отзыва канала, окно, в течение которого вашего контрагента можно наказать за публикацию старого состояния, представляет собой относительный временной замок, исполняемый через это поле во входе транзакции фиксации. Тот же механизм лежит в основе submarine swaps, схем хранилищ и любого договора, где путь возврата должен становиться доступным только после того, как у другой стороны была честная возможность действовать.
Порядковый номер vs locktime
Порядковые номера задаются для каждого входа; locktime задается для транзакции. Это самый быстрый способ их различать, и он объясняет, почему их используют для разного.
Locktime устанавливает один абсолютный срок для всей транзакции, выраженный как высота блока или время по часам, и применяется независимо от того, расходуемым монетам один день или пять лет. Относительный временной замок в порядковом номере отсчитывается от подтверждения конкретной монеты, которую расходует этот вход, поэтому каждый вход может нести свой собственный период ожидания и один и тот же скрипт работает независимо от того, когда он был пополнен. Эти два поля зависят друг от друга неудобным образом: locktime исполняется только тогда, когда хотя бы один порядковый номер ниже финального значения, поэтому кошелек, который ставит везде 0xffffffff, незаметно отключает другое поле.