Глоссарий / Протокол и обновления
Биты версии
- Что такое биты версии?
- Биты версии трактуют поле версии из 32 битов в заголовке блока как ряд независимых переключателей, поэтому майнеры могут одновременно сигнализировать о поддержке нескольких мягких форков.
Определено в BIP-9.
Один бит версии соответствует одному ожидающему мягкому форку и подсчитывается на фиксированном окне блоков. BIP-9 отводит биты с 0 по 28, и развертывание закрепляется, когда 1916 блоков в периоде из 2016 блоков устанавливают его бит, либо признается неудачным по тайм-ауту, который предложено установить в один год. Чтение этих сигналов позволяет узнать за месяцы вперед, становится ли функция, нужная вашему кошельку, правилом сети.
Как это работает
Биты версии работают как автомат с пятью состояниями, который каждый узел вычисляет сам, один раз за период пересчета сложности, для каждого известного ему развертывания.
Состояния таковы: DEFINED, STARTED, LOCKED_IN, ACTIVE и FAILED. Все блоки внутри периода пересчета сложности из 2016 блоков имеют одно состояние, поэтому переход может произойти только на высоте, кратной 2016. Развертывание переходит из DEFINED в STARTED, когда медианное время прошлого предыдущего блока превышает заданное время начала, причем медианное время прошлого означает медианную метку времени блока и десяти его предшественников.
Находясь в STARTED, узел проходит назад ровно 2016 предков и считает блоки, у которых три старших бита версии равны 001 и установлен бит развертывания. Все остальное считается нулем, поэтому майнер, использующий другую схему версий, не может просигнализировать случайно. В основной сети требуется 1916 таких блоков, в тестовой сети 1512. Если порог не взят до того, как медианное время прошлого превысит тайм-аут, развертывание навсегда переходит в FAILED. BIP-9 предлагает ставить этот тайм-аут через 31 536 000 секунд, то есть через год, после времени начала, чтобы застрявшее предложение освобождало свой бит, а не блокировало очередь навсегда.
Одна деталь часто вводит в заблуждение. Состояние блока никогда не зависит от его собственного поля версии, только от полей его предков, поэтому майнер не может проголосовать за правило так, чтобы голос связывал сам подающий его блок. Закрепление трех старших битов в значении 001 также фиксирует версию сигнализирующего блока в диапазоне от 0x20000000 до 0x3FFFFFFF, оставляя шаблоны 010 и 011 свободными для любого механизма, который со временем заменит биты версии.
Биты переиспользуются, а не расходуются. После того как развертывание активируется или истекает по тайм-ауту, его бит может нести более позднее предложение, после паузы отлеживания, которую рекомендует BIP-9, чтобы сначала были выявлены ошибки в программном обеспечении. Спецификация также просит узлы отслеживать незнакомые им биты и громко предупреждать, когда неизвестное развертывание закрепляется, и именно так необновленное программное обеспечение предупреждает вас о приближении правила, которое оно не может обеспечить.
Где это встречается
Два развертывания прошли в основной сети биткоина с параметрами самого BIP-9, и список развертываний в этом BIP приводит оба в таблице.
Первое, названное csv, заняло бит 0 со временем начала 2016-05-01 и истечением 2017-05-01 и активировалось на блоке 419 328. Оно объединяло BIP-68, BIP-112 и BIP-113, три из изменений, которые BIP-9 перечисляет как делающие ранее действительные транзакции недействительными. Второе, segwit, заняло бит 1 с окном с 2016-11-15 по 2017-11-15 и активировалось на блоке 481 824, в пределах крайнего срока, который могло и пропустить.
Схема видна и в инфраструктуре майнинга. BIP-9 расширил вызов getblocktemplate массивом rules, в котором перечислены уже активные развертывания, объектом vbavailable, сопоставляющим имя каждого ожидающего развертывания с его битом, и необязательной маской vbrequired из битов, которые требует сервер. Пул читает эти ключи, чтобы решить, о чем сигнализировать, и именно это превращает выпущенную версию в процент на трекере.
Биты версии vs блок версии 2
Блок версии 2 несет счетчик в поле версии; биты версии несут битовый вектор в тех же четырех байтах. По BIP-34 поле сравнивалось как целое число, поэтому одновременно могло идти только одно обновление, и каждый успех навсегда сжигал значения, которые мог бы использовать действительный блок. BIP-9 прямо называет цену: после BIP-34, BIP-66 и BIP-65 оставалось лишь 0x7FFFFFFB значений версии, что ограничивает любую схему с битовым вектором 30 независимыми развертываниями. Закрепление вместо этого трех старших битов превратило остаток в 29 полос, которые работают параллельно и могут использоваться повторно.