Полная история консенсус-форков Биткоина
Cover

Полная история консенсус-форков Биткоина

28 декабря 2017 г.

Обзор #

В этой статье мы перечислим 19 изменений правил консенсуса Биткоина (или 18, поскольку одно из них случайно “провалилось”), что представляет собой, по нашему мнению, почти все значительные события такого рода в истории Биткоина. По крайней мере три из этих инцидентов привели к заметному разделению цепочки, длившемуся примерно 51, 24 и 6 блоков, в 2010, 2013 и 2015 годах соответственно.

Перевод статьи, опубликованной в блоге BitMEX Research. Позже статья была обновлена. Обновленный список включает в себя инцидент, связанный с безопасностью, 2018 года и активацию Taproot в 2021.

Поддержать проект.

Терминология #

ТерминОпределение
Разделение цепочки (Chainsplit)Разделение блокчейна, в результате которого образуются две отдельные цепочки, имеющие общего предка. Это может быть вызвано либо хардфорком, либо софтфорком, либо ни тем, ни другим.
 Изменение правил консенсуса
 Хардфорк

Изменение правил консенсуса в отношении валидности блоков, в результате чего некоторые блоки, ранее считавшиеся недействительными, теперь считаются действительными.

Существующие узлы должны обновиться, чтобы следовать новой цепочке после хардфорка.

 Софтфорк

Изменение правил консенсуса в отношении валидности блоков, в результате чего некоторые блоки, ранее считавшиеся действительными, теперь считаются недействительными.

Существующие узлы не обязательно должны обновляться, чтобы следовать новой цепочке после софтфорка.

Примечание: считается, что эти термины возникли в апреле 2012 и были формализованы в BIP99 и BIP123.

Список консенсус-форков Биткоина #

ДатаВысота блока при активацииНомер BIP или версия программного обеспеченияОписаниеТипРезультаты
28 июля 201010.3.5Отключен опкод OP_RETURN, исправлена критическая ошибка, позволявшая любому желающему потратить любой биткоин.СофтфоркПри обновлении не было обнаружено никаких проблем.
31 июля 201010.3.6Отключены опкоды OP_VER и OP_VERIF. 3СофтфоркУ некоторых пользователей возникли проблемы с обновлением, и было рекомендовано отключать узлы, если они не могут быть обновлены. 2
Добавлены функции OP_NOP.Хардфорк
1 августа 201010.3.7Разделена проверка scriptSig и scriptPubKey. Исправлена критическая ошибка, позволявшая любому желающему потратить любой биткоин.ХардфоркПри обновлении не было обнаружено никаких проблем.
15 августа 201074 6380.3.10Исправление ошибки переполнения значения суммы на выходе после инцидента с тратой 184,5 миллиардов биткоинов. 0,5 BTC, которые были входом в транзакцию, остаются неизрасходованными по сей день.СофтфоркПроизошло разделение цепочки. Примерно через пять часов после инцидента было выпущено исправление, клиент 0.3.10. Считается, что в "плохой" цепочке был сгенерирован 51 блок, прежде чем “хорошая” цепочка вернула себе лидерство в PoW.
Отключен опкод OP_CAT, что устранило вектор DoS-атаки, а также отключены 14 других функций.Софтфорк
7 сентября 201010.3.12Некорректное добавление лимита в 20 000 операций подписи. Это некорректное ограничение существует до сих пор.СофтфоркПри обновлении не было обнаружено никаких проблем.
12 сентября 201079 400

Добавление ограничения на размер блока в 1 МБ.

Коммит “MAX_BLOCK_SIZE = 1000000” от 15 июля 2010 года был представлен в версии 0.3.1 rc1 19 июля 2010 года. Коммит, вводящий правило 1 МБ, был сделан 7 сентября 2010 года и активирован в блоке 79 400. 20 сентября 2010 года Сатоши удалил эту логику активации, но сохранил ограничение в 1 МБ.

СофтфоркПри обновлении не было обнаружено никаких проблем.
15 марта 2012171 193BIP30Запрещены транзакции с одинаковым TXID, если только более старый UTXO не был полностью израсходован. В сентябре 2012 года это правило было применено ко всем блокам, кроме 91 842 и 91 880, которые нарушали это правило.СофтфоркЭто был софтфорк, запланированный на определенную дату. При обновлении не было обнаружено никаких проблем.
1 апреля 2012173 805BIP16Активация 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 835BIP34Добавление требования, чтобы coinbase-транзакция включала высоту блока.СофтфоркУстановлен порог активации в 95% узлов. Обновление прошло удачно.
11 марта 2013225 4300.8.0Это был незапланированный хардфорк, вызванный переходом с Berkeley DB на LevelDB, которая не использует ограничение в 10 000 блокировок в параметрах базы данных по умолчанию, в отличие от BDB. Это вызвало разделение цепочки 11 марта 2013 года, хотя программное обеспечение, вызвавшее ошибку, было выпущено на 20 дней раньше, 20 февраля 2013 года. Изменение было отменено, так как пользователи Биткоина и майнеры вернулись к правилам из версии 0.7.2.Без изменений в правилах консенсусаПроизошло разделение цепочки как минимум на 24 блока, причем цепочка 0.8.0 имела максимальное преимущество в 13 блоков. Также произошла успешная двойная трата. Цепочка с оригинальными правилами в конечном итоге вернула себе лидерство в PoW.
18 марта 201310.8.1Это был временный софтфорк с новым правилом, вводившим ограничение в 4 500 TXID, на которые могут ссылаться входы в блок. Это правило является более строгим, чем ограничение в BDB. Срок действия правила истек 15 мая 2013 года в день запланированного хардфорка.СофтфоркПри обновлении не было обнаружено никаких проблем.
15 мая 2013 и 16 августа 2013 252 451 или ранееBIP50В августе 2013 года был создан блок, нарушающий ограничение блокировок в BDB, которое было ослаблено 15 мая 2013 года.ХардфоркПри обновлении не было обнаружено никаких проблем.
4 июля 2015 363 731BIP66Обновление вводит строгое кодирование DER, означающее, что Биткоин больше не зависит от OpenSSL при проверке подписей.СофтфоркУстановлен порог активации в 95% из последней 1 000 блоков. Произошло разделение цепочки, длившееся шесть блоков, поскольку некоторые майнеры сигнализировали о поддержке BIP66, но не обновились и занимались майнингом пустых блоков. В конце концов цепочка с новыми правилами софтфорка взяла верх.
14 декабря 2015 388 380BIP65Добавлена функция Check Lock Time Verify, позволяющая заблокировать средства до определенного времени в будущем. Это первая новая функция в Биткоине.СофтфоркУспешное обновление с использованием порога 95%.
4 июля 2016 419 328BIP68
BIP112
BIP113

Добавлена функция относительного времени блокировки, которое позволяет заблокировать выход транзакции на относительный промежуток времени после ее подтверждения.

Добавлен опкод CheckSequenceVerify.

Добавлен показатель Median Time Past (MTP) (среднее время добычи последних 11 блоков), который устраняет стимул для майнера использовать временную метку будущего блока для получения большей комиссии за транзакцию.

СофтфоркУспешное обновление с использованием порога 95% и включением битов версии в заголовок блока.
23 июля 2017  477 800BIP91Этот временный софтфорк сделал обязательным включение битов версии, сигнализирующих о поддержке обновления SegWit.СофтфоркСофтфорк успешно активировался при 80-процентном пороге майнеров в течение 336 блоков, хотя лишь незначительное количество узлов в сети соблюдали правила BIP91 к концу заданного срока. Поэтому в этот период риск разделения цепочки был повышенным.
01 августа 2017 478 479BIP148Этот временный софтфорк сделал подачу сигнала о поддержке обновление SegWit обязательной в течение двух недель после 1 августа 2017 года.СофтфоркСофтфорк в назначенный день прошел без проблем, лишь незначительное количество узлов в сети соблюдали правила BIP148 к концу заданного срока. Поэтому в этот период риск разделения цепочки был повышенным.
24 августа 2017 481 824BIP141
BIP143
BIP147
Обновление segregated-witness (SegWit).СофтфоркУспешное обновление с использованием порога 95% и включением битов версии в заголовок блока.
14 сентября 20170.15.0Случайно добавлена критическая ошибка, которая потенциально могла привести к созданию более 21 миллиона биткоинов и DoS-атакам. Она была исправлена через год, 17 сентября 2018 года.Клиент с поддержкой хардфоркаНе было создано ни одного блока, который бы использовал ошибку, и поэтому можно сказать, что хардфорка в сети Биткоин не произошло.
14 ноября 2021709 632 BIP341Обновление Taproot сочетает в себе такие технологии, как подписи Шнорра (BIP340) и MAST (BIP114BIP117)СофтфоркЭтот софтфорк активировался с помощью “Speedy Trial”, идеи, предложенной Расселом О'Коннором для разрешения спора о лучшей методике активации. Был успешно использован 90-процентный порог майнеров в фиксированных окнах по 2 016 блоков. Софтфорк был зафиксирован 12 июня 2021 года на высоте блока 687 283.
2262 год13 440 000BIP42Исправлена ошибка с ограничением предложения в 21 миллион монет. Программное обеспечение было обновлено в апреле 2014 года, чтобы исправить эту ошибку, но новое правило не будет применяться до 23 века.СофтфоркСофтфорк пока не действует.

(Источники: BitMEX Research, GitHub, блокчейн Биткоина)

Примечания #

  1. За исключением ограничения размера блока в 1 МБ, до софтфорка BIP16 2012 года не существовало методики активации, поэтому, если форк произошел гладко, без разделения цепочки, не обязательно указывать конкретную высоту блока или дату, когда произошел консенсус-форк.
  2. “Если вы не можете обновить версию 0.3.6 прямо сейчас, лучше отключите свой Биткоин-узел, пока не сделаете это.”Сатоши Накамото

  3. До удаления опкода OP_VER каждое обновление программного обеспечения потенциально могло считаться недетерминированным хардфорком, и они были исключены из этого списка. Если определение хардфорков все же включает это, то это несколько странное определение.
  4. В приведенной выше таблице не используются унифицированные термины, поскольку в каждом случае в зависимости от обстоятельств может быть более уместным другое определение даты, когда произошел форк.
  5. Некоторые исследователи отмечали, что изменения в протоколе P2P также могут считаться хардфорками, если они делают предыдущие версии программ непригодными для использования, поскольку они больше не могут подключаться к сети. Однако, строго говоря, они не ослабляют правила валидности блоков, и можно синхронизировать старые узлы, создав ретрансляцию через промежуточные версии программного обеспечения. Эти изменения исключены из приведенного выше списка.
  6. Некоторые считают BIP90 хардфорком, но поскольку в нем были лишь смягчены правила, связанные с активацией софтфорков, которые произошли в прошлом, он не имеет многих характеристик или рисков, обычно связанных с консенсус-форками. Используя ту же логику, добавление схемы контрольных точек блоков также можно отнести к софтфоркам.
  7. В июле 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 был опубликован альтернативный список версий консенсуса.
Дисклеймер: Несмотря на то, что многие утверждения в этом материале снабжены ссылками, мы не гарантируем их точность. Мы могли допустить ошибки или случайно пропустить изменения правил консенсуса в списке. Мы приветствуем исправления от читателей.

Поддержите переводчика #

Поддержать переводчика можно, отправив немного сат в сети Лайтнинг:

LNURL1DP68GURN8GHJ7MRW9E6XJURN9UH8WETVDSKKKMN0WAHZ7MRWW4EXCUP0X9UX2VENXDJN2CTRXSUN2VE3XGCRQPNAPC6


Connect to our relay to leave a comment. Details.
Подключитесь к нашему релею, чтобы оставить комментарий. Подробнее.