Обзор #
В этой статье мы перечислим 19 изменений правил консенсуса Биткоина (или 18, поскольку одно из них случайно “провалилось”), что представляет собой, по нашему мнению, почти все значительные события такого рода в истории Биткоина. По крайней мере три из этих инцидентов привели к заметному разделению цепочки, длившемуся примерно 51, 24 и 6 блоков, в 2010, 2013 и 2015 годах соответственно.
Перевод статьи, опубликованной в блоге BitMEX Research. Позже статья была обновлена. Обновленный список включает в себя инцидент, связанный с безопасностью, 2018 года и активацию Taproot в 2021.
Терминология #
Термин | Определение |
Разделение цепочки (Chainsplit) | Разделение блокчейна, в результате которого образуются две отдельные цепочки, имеющие общего предка. Это может быть вызвано либо хардфорком, либо софтфорком, либо ни тем, ни другим. |
Изменение правил консенсуса | |
Хардфорк | Изменение правил консенсуса в отношении валидности блоков, в результате чего некоторые блоки, ранее считавшиеся недействительными, теперь считаются действительными. Существующие узлы должны обновиться, чтобы следовать новой цепочке после хардфорка. |
Софтфорк | Изменение правил консенсуса в отношении валидности блоков, в результате чего некоторые блоки, ранее считавшиеся действительными, теперь считаются недействительными. Существующие узлы не обязательно должны обновляться, чтобы следовать новой цепочке после софтфорка. |
Примечание: считается, что эти термины возникли в апреле 2012 и были формализованы в BIP99 и BIP123.
Список консенсус-форков Биткоина #
Дата | Высота блока при активации | Номер BIP или версия программного обеспечения | Описание | Тип | Результаты |
28 июля 2010 | — 1 | 0.3.5 | Отключен опкод OP_RETURN, исправлена критическая ошибка, позволявшая любому желающему потратить любой биткоин. | Софтфорк | При обновлении не было обнаружено никаких проблем. | 31 июля 2010 | — 1 | 0.3.6 | Отключены опкоды OP_VER и OP_VERIF. 3 | Софтфорк | У некоторых пользователей возникли проблемы с обновлением, и было рекомендовано отключать узлы, если они не могут быть обновлены. 2 | Добавлены функции OP_NOP. | Хардфорк |
1 августа 2010 | — 1 | 0.3.7 | Разделена проверка scriptSig и scriptPubKey. Исправлена критическая ошибка, позволявшая любому желающему потратить любой биткоин. | Хардфорк | При обновлении не было обнаружено никаких проблем. | 15 августа 2010 | 74 638 | 0.3.10 | Исправление ошибки переполнения значения суммы на выходе после инцидента с тратой 184,5 миллиардов биткоинов. 0,5 BTC, которые были входом в транзакцию, остаются неизрасходованными по сей день. | Софтфорк | Произошло разделение цепочки. Примерно через пять часов после инцидента было выпущено исправление, клиент 0.3.10. Считается, что в "плохой" цепочке был сгенерирован 51 блок, прежде чем “хорошая” цепочка вернула себе лидерство в PoW. | Отключен опкод OP_CAT, что устранило вектор DoS-атаки, а также отключены 14 других функций. | Софтфорк |
7 сентября 2010 | — 1 | 0.3.12 | Некорректное добавление лимита в 20 000 операций подписи. Это некорректное ограничение существует до сих пор. | Софтфорк | При обновлении не было обнаружено никаких проблем. | 12 сентября 2010 | 79 400 | — | Добавление ограничения на размер блока в 1 МБ. Коммит “MAX_BLOCK_SIZE = 1000000” от 15 июля 2010 года был представлен в версии 0.3.1 rc1 19 июля 2010 года. Коммит, вводящий правило 1 МБ, был сделан 7 сентября 2010 года и активирован в блоке 79 400. 20 сентября 2010 года Сатоши удалил эту логику активации, но сохранил ограничение в 1 МБ. | Софтфорк | При обновлении не было обнаружено никаких проблем. |
15 марта 2012 | 171 193 | BIP30 | Запрещены транзакции с одинаковым TXID, если только более старый UTXO не был полностью израсходован. В сентябре 2012 года это правило было применено ко всем блокам, кроме 91 842 и 91 880, которые нарушали это правило. | Софтфорк | Это был софтфорк, запланированный на определенную дату. При обновлении не было обнаружено никаких проблем. | 1 апреля 2012 | 173 805 | BIP16 | Активация Pay-to-script hash (P2SH) позволила отправлять транзакции на хэш скрипта (адреса, начинающиеся с 3), а не только на хэш публичного ключа (адреса, начинающиеся с 1). | Софтфорк | Порог активации софтфорка в 55% узлов, поддерживающих обновление (550 блоков за неделю, то есть приблизительно из последней 1 000 блоков), не был преодолен к 1 февраля 2012. Майнеры обновлялись недостаточно быстро, поэтому точка активации была отложена до 1 апреля в версии 0.6.0 rc2. Майнеры, которые использовали 0.6.0 rc1 и не обновились, активировали софтфорк раньше времени и застряли на блоке 170 060, когда была добыта недействительная, по мнению их узлов, транзакция. После активации также возникли проблемы, так как оставшиеся 45 % майнеров добывали недействительные блоки в течение нескольких месяцев после софтфорка. |
24 марта 2013 | 227 835 | BIP34 | Добавление требования, чтобы coinbase-транзакция включала высоту блока. | Софтфорк | Установлен порог активации в 95% узлов. Обновление прошло удачно. | 11 марта 2013 | 225 430 | 0.8.0 | Это был незапланированный хардфорк, вызванный переходом с Berkeley DB на LevelDB, которая не использует ограничение в 10 000 блокировок в параметрах базы данных по умолчанию, в отличие от BDB. Это вызвало разделение цепочки 11 марта 2013 года, хотя программное обеспечение, вызвавшее ошибку, было выпущено на 20 дней раньше, 20 февраля 2013 года. Изменение было отменено, так как пользователи Биткоина и майнеры вернулись к правилам из версии 0.7.2. | Без изменений в правилах консенсуса | Произошло разделение цепочки как минимум на 24 блока, причем цепочка 0.8.0 имела максимальное преимущество в 13 блоков. Также произошла успешная двойная трата. Цепочка с оригинальными правилами в конечном итоге вернула себе лидерство в PoW. |
18 марта 2013 | — 1 | 0.8.1 | Это был временный софтфорк с новым правилом, вводившим ограничение в 4 500 TXID, на которые могут ссылаться входы в блок. Это правило является более строгим, чем ограничение в BDB. Срок действия правила истек 15 мая 2013 года в день запланированного хардфорка. | Софтфорк | При обновлении не было обнаружено никаких проблем. | 15 мая 2013 и 16 августа 2013 | 252 451 или ранее | BIP50 | В августе 2013 года был создан блок, нарушающий ограничение блокировок в BDB, которое было ослаблено 15 мая 2013 года. | Хардфорк | При обновлении не было обнаружено никаких проблем. |
4 июля 2015 | 363 731 | BIP66 | Обновление вводит строгое кодирование DER, означающее, что Биткоин больше не зависит от OpenSSL при проверке подписей. | Софтфорк | Установлен порог активации в 95% из последней 1 000 блоков. Произошло разделение цепочки, длившееся шесть блоков, поскольку некоторые майнеры сигнализировали о поддержке BIP66, но не обновились и занимались майнингом пустых блоков. В конце концов цепочка с новыми правилами софтфорка взяла верх. | 14 декабря 2015 | 388 380 | BIP65 | Добавлена функция Check Lock Time Verify, позволяющая заблокировать средства до определенного времени в будущем. Это первая новая функция в Биткоине. | Софтфорк | Успешное обновление с использованием порога 95%. |
4 июля 2016 | 419 328 | BIP68 BIP112 BIP113 | Добавлена функция относительного времени блокировки, которое позволяет заблокировать выход транзакции на относительный промежуток времени после ее подтверждения. Добавлен опкод CheckSequenceVerify. Добавлен показатель Median Time Past (MTP) (среднее время добычи последних 11 блоков), который устраняет стимул для майнера использовать временную метку будущего блока для получения большей комиссии за транзакцию. | Софтфорк | Успешное обновление с использованием порога 95% и включением битов версии в заголовок блока. | 23 июля 2017 | 477 800 | BIP91 | Этот временный софтфорк сделал обязательным включение битов версии, сигнализирующих о поддержке обновления SegWit. | Софтфорк | Софтфорк успешно активировался при 80-процентном пороге майнеров в течение 336 блоков, хотя лишь незначительное количество узлов в сети соблюдали правила BIP91 к концу заданного срока. Поэтому в этот период риск разделения цепочки был повышенным. |
01 августа 2017 | 478 479 | BIP148 | Этот временный софтфорк сделал подачу сигнала о поддержке обновление SegWit обязательной в течение двух недель после 1 августа 2017 года. | Софтфорк | Софтфорк в назначенный день прошел без проблем, лишь незначительное количество узлов в сети соблюдали правила BIP148 к концу заданного срока. Поэтому в этот период риск разделения цепочки был повышенным. | 24 августа 2017 | 481 824 | BIP141 BIP143 BIP147 | Обновление segregated-witness (SegWit). | Софтфорк | Успешное обновление с использованием порога 95% и включением битов версии в заголовок блока. |
14 сентября 2017 | — | 0.15.0 | Случайно добавлена критическая ошибка, которая потенциально могла привести к созданию более 21 миллиона биткоинов и DoS-атакам. Она была исправлена через год, 17 сентября 2018 года. | Клиент с поддержкой хардфорка | Не было создано ни одного блока, который бы использовал ошибку, и поэтому можно сказать, что хардфорка в сети Биткоин не произошло. |
14 ноября 2021 | 709 632 | BIP341 | Обновление Taproot сочетает в себе такие технологии, как подписи Шнорра (BIP340) и MAST (BIP114, BIP117) | Софтфорк | Этот софтфорк активировался с помощью “Speedy Trial”, идеи, предложенной Расселом О'Коннором для разрешения спора о лучшей методике активации. Был успешно использован 90-процентный порог майнеров в фиксированных окнах по 2 016 блоков. Софтфорк был зафиксирован 12 июня 2021 года на высоте блока 687 283. |
2262 год | 13 440 000 | BIP42 | Исправлена ошибка с ограничением предложения в 21 миллион монет. Программное обеспечение было обновлено в апреле 2014 года, чтобы исправить эту ошибку, но новое правило не будет применяться до 23 века. | Софтфорк | Софтфорк пока не действует. |
(Источники: BitMEX Research, GitHub, блокчейн Биткоина)
Примечания #
- За исключением ограничения размера блока в 1 МБ, до софтфорка BIP16 2012 года не существовало методики активации, поэтому, если форк произошел гладко, без разделения цепочки, не обязательно указывать конкретную высоту блока или дату, когда произошел консенсус-форк.
“Если вы не можете обновить версию 0.3.6 прямо сейчас, лучше отключите свой Биткоин-узел, пока не сделаете это.” — Сатоши Накамото
- До удаления опкода OP_VER каждое обновление программного обеспечения потенциально могло считаться недетерминированным хардфорком, и они были исключены из этого списка. Если определение хардфорков все же включает это, то это несколько странное определение.
- В приведенной выше таблице не используются унифицированные термины, поскольку в каждом случае в зависимости от обстоятельств может быть более уместным другое определение даты, когда произошел форк.
- Некоторые исследователи отмечали, что изменения в протоколе P2P также могут считаться хардфорками, если они делают предыдущие версии программ непригодными для использования, поскольку они больше не могут подключаться к сети. Однако, строго говоря, они не ослабляют правила валидности блоков, и можно синхронизировать старые узлы, создав ретрансляцию через промежуточные версии программного обеспечения. Эти изменения исключены из приведенного выше списка.
- Некоторые считают BIP90 хардфорком, но поскольку в нем были лишь смягчены правила, связанные с активацией софтфорков, которые произошли в прошлом, он не имеет многих характеристик или рисков, обычно связанных с консенсус-форками. Используя ту же логику, добавление схемы контрольных точек блоков также можно отнести к софтфоркам.
- В июле 2010 года правило выбора цепочки было изменено, чтобы перейти от количества блоков к наибольшему количеству проделанной работы. Технически это не является изменением правил валидности блоков, однако это изменение несет в себе некоторые риски, связанные с изменением правил консенсуса.
Был ли инцидент 2013 года хардфорком? #
По нашему мнению, увеличение лимита блокировок BDB через несколько месяцев после разделения цепочки 11 марта 2013 года было хардфорком. Правило, о котором идет речь, предусматривало ограничение в 10 000 блокировок, которое было увеличено. Правило было смягчено 15 мая 2013 года в версии программного обеспечения 0.8.1, которая была выпущена 18 марта 2013 года. Блок, превышающий этот лимит, в конечном итоге был создан 16 августа 2013 года, поэтому дату хардфорка можно определить либо как 15 мая 2013 года, либо как 16 августа 2013 года.
Некоторые специалисты утверждают, что это не было хардфорком по разным причинам, включая то, что это правило было “квази-недетерминированным” или что можно было вручную изменить параметры конфигурации BDB. Действительно, из-за недетерминированной природы лимита блокировок теоретически возможно иметь локальную систему, настроенную так, что старый лимит блокировок в BDB никогда не был изменен. Таким образом, можно заявить, что в Биткоине “никогда не было хардфорка”, следуя строгому определению, которое требует, чтобы хардфорк был детерминированным или, возможно, даже напрямую связанным с данными Биткоина, такими как транзакции или заголовок блока.
Обсуждая этот инцидент, разработчик Биткоина Грегори Максвелл сказал:
Это своего рода путаница, на самом деле можно взять узел до BIP-50 и полностью синхронизировать блокчейн. Последний раз я делал это в версии 0.3.24 несколько месяцев назад. Просто он не будет надежно обрабатывать реорганизации с большими блоками, если вы не измените конфигурацию BDB. Так что можно поспорить, является ли это хардфорком, поскольку он квази-недетерминированный. Ранее были исправлены ошибки, из-за которых старые версии застревали и переставали синхронизировать цепочку… Так что я думаю, что согласно действительно строгому определению создания блокчейна, который нарушает правила, предписанные предыдущими версиями, у нас никогда не было хардфорка.
Узнать больше о “несостоявшемся” хардфорке 2013 года можно узнать из этой статьи.
Разделение цепочки в июле 2015 года #
В приведенном выше списке изменений правил консенсуса есть три инцидента, которые привели к идентифицируемым разделениям цепочки. Самый последний из них произошел 4 июля 2015 года во время софтфорка BIP66.
Сразу после активации BIP66 возникла цепочка из шести блоков-сирот, поскольку один майнер создал недействительный блок, который не был признан недействительным другими майнинг-пулами, так как они не проверяли новые блоки.
В этом случае некоторые майнеры сигнализировали о поддержке софтфорка BIP66, но на самом деле не обновляли свои узлы. Можно сказать, что майнеры давали “ложный сигнал”. Если бы майнеры проверяли блоки, они бы обнаружили, что блок недействителен, и отклонили бы его. Вместо этого некоторые майнеры построили блок поверх недействительного, и произошло разделение цепочки.
Ниже приведена схема, иллюстрирующая эти шесть блоков и разделение цепочки.
Графическая схема разделения цепочки в июле 2015 года. (Источник: Blockchain.info http://archive.is/WqGRp и http://archive.is/LHlF7)
Примечание: После публикации этого материала на Bitcoin Wiki был опубликован альтернативный список версий консенсуса.
Дисклеймер: Несмотря на то, что многие утверждения в этом материале снабжены ссылками, мы не гарантируем их точность. Мы могли допустить ошибки или случайно пропустить изменения правил консенсуса в списке. Мы приветствуем исправления от читателей.
Поддержите переводчика #
Поддержать переводчика можно, отправив немного сат в сети Лайтнинг:
lnurl1dp68gurn8ghj7ampd3kx2ar0veekzar0wd5xjtnrdakj7tnhv4kxctttdehhwm30d3h82unvwqhk7mnv093kcmm4v3unxwg6jxyqf