ru
Назад к списку

Война за P2SH: как завершилась первая большая битва разработчиков биткоина

Аналитика

forklog.com 17 Декабрь 2020 15:50, UTC
  
Время прочтения: ~16 м

За свою историю биткоин пережил немало драматичных моментов, и не всегда это были только взлеты и падения цены монеты. Достаточно вспомнить события, сопровождавшие активацию протокола Segregated Witness, хардфорк Bitcoin Cash и предшествовавшие им войны вокруг размера блока.

Но первым по-настоящему крупным противостоянием в сообществе разработчиков оказался вопрос активации P2SH – первого апгрейда, который состоялся после ухода Сатоши Накамото.

О тех событиях рассказали в статье для Bitcoin Magazine Питер Риццо и Аарон ван Вирдум. Ее адаптированный перевод представлен ниже.

****

«Сдвинь дату на два месяца назад. OP_EVAL пока еще просто не готов».

Гэвин Андресен очень долго работал над тем, чтобы избежать такого вердикта. Всего одна фраза, отправленная с компьютера Рассела О’Коннора, остановила длившуюся несколько месяцев работу над имплементацией первого после ухода Сатоши Накамото обновления кодовой базы биткоина.

Предложенную команду Андресен называл наиболее быстрым путем к более безопасным биткоин-кошелькам. Однако она, как выяснил О’Коннор, содержала уязвимость, позволявшую создавать бесконечный цикл при попытке валидировать транзакции.

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

«Мне потребовалось целых 70 минут, чтобы найти этот баг. Парни, вам следует остановиться и по-настоящему понять биткоин», — написал тогда О’Коннор.

Это была первая крупная неудача для Андресена, нового руководителя проекта, и он пытался оспорить выводы О’Коннора. По его мнению, отказ от OP_EVAL означал бы впустую потраченные месяцы написания и проверки кода, а также оставил бы пользователей без инструментов защиты от троянов и других вирусов, которые в то время угрожали кошелькам.

Целью OP_EVAL было создание простых мультиподписных кошельков, которые позволяли бы восстановить биткоины даже при потерянных бэкапах. Также команда давала возможность создавать схожие с банковскими сервисы оповещения, направленные на предотвращение краж и мошенничества. И все это в рамках уже известных и понятных пользователям транзакций.

Однако для тех, кто видел опасность в слишком быстрой разработке, предупреждение О’Коннора оказалось достаточным.

«Я хотел бы напомнить всем, что мы ставим под угрозу систему стоимостью более чем $20 млн. На кону не просто программное обеспечение – все должно быть исключительно надежным», — писал разработчик Алан Райнер.

Неудача с активацией OP_EVAL имела и другое важное значение. Немногие в 2011 году хорошо понимали код биткоина, и еще меньше людей обладало достаточными знаниями и навыками для его защиты.

Как организовать работу разработчиков? Какую ответственность они несут перед пользователями? Как активировать обновления, если неизвестно, кому принадлежит последнее слово? Все эти вопросы в скором времени стали ключевыми в ходе первой большой войны между разработчиками биткоина.

Передача полномочий

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

Биткоин на раннем этапе своего существования не был исключением. В течение первых двух лет роль ведущего разработчика и диктатора играл Сатоши Накамото. Без каких-либо широких дискуссий в сообществе он внедрил восемь обновлений, после чего постепенно отошел от дел.

К концу 2010 имя Накамото было удалено с сайта Bitcoin.org, а лидером проекта де-факто стал Гэвин Андресен, до этого получивший известность в качестве разработчика ПО для 3D-графики. Процесс передачи полномочий оказался не совсем обычным: все ограничилось коротким публичным сообщением и конфиденциальной передачей ключа системного оповещения.

Гэвин Андресен. Фото: 93.9 & 101.5 THE RIVER.

На тот момент для небольшой группы разработчиков биткоина это особой проблемой не было. Их больше беспокоили вопросы критических уязвимостей, в то время как у Андресена было достаточно свободного времени и энтузиазма, чтобы возглавить работу. Было немало проблем, требовавших оперативного решения: более быстрая синхронизация, более качественное тестирование ПО, а также растущее число сообщений о взломанных кошельках и репутационные потери из-за этих краж. Эти вопросы были в приоритете, с чем соглашалось большинство.

Мультиподпись

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

Система мультиподписи (multisig) давала возможность хранить приватные ключи на нескольких устройствах в разных частях мира или делить их между пользователем и провайдером кошелька. Это означало, что для успешной кражи монет хакерам было необходимо скомпрометировать несколько целей.

Концепция быстро вдохновила Андресена, и в рассылке разработчиков он эмоционально призывал к более активным действиям в этом направлении.

«Больше всего меня беспокоит то, что требуется всего несколько дней, чтобы согласиться, как все это сделать правильно, но прошло шесть месяцев, а консенсуса все нет. А кражи кошельков тем временем продолжаются».

Эти беспокойства не были лишены оснований – имплементация Накамото имела несколько существенных недостатков. Самым главным из них была несовместимость транзакций со стандартным форматом биткоин-адресов, что требовало более длинных адресов. По этой причине при отправке средств на мультиподписные адреса транзакции занимали больше места и требовали более высоких комиссий. Более того, эти комиссии оплачивал не получатель, а отправитель.

Как следствие multisig-транзакции обозначались как «нестандартные». Это означало, что если нода получала такую транзакцию, она ее попросту игнорировала. Не было и гарантий того, что майнеры будут включать такие транзакции в блоки.

OP_EVAL

Чтобы раскрыть весь потенциал идеи с мультиподписью, Андресен поддержал новый операционный код – команду, которую бы использовали ноды для принятия решения о том, является ли корректным, и если да, то при каких условиях, новый тип транзакций.

OP_EVAL полагался на хеширование данных и впервые был предложен разработчиком ByteCoin. Основная идея заключалась в том, что пользователи могли хешировать инструкции, описывающие условия, при которых биткоины можно потратить в будущем (в том числе и с multisig-кошельков), включая этот хеш в транзакцию. Пользователь платил за дополнительный размер транзакции при трате монет, но сами эти дополнительные данные сильной нагрузки на сеть не оказывали.

Предложение встретили позитивно, и Андресен делал все возможное для его скорейшей активации.

«Безопасность – один из главных пунктов в списке приоритетов; мне хотелось бы уже в течение года видеть защищенные адреса в подписях пользователей на форуме», — написал он [в октябре 2011 года].

Не все, впрочем, соглашались с Андресеном касательно необходимости как можно более скорейшей активации решения. OP_EVAL стал бы действительно крупным обновлением в сети, которая уже содержала активы на миллионы долларов. Британский разработчик [создатель Darkleaks] Амир Тааки был убежден, что для оценки предложения необходимо больше времени.

«На первый взгляд идея кажется хорошей. Но спешка в блокчейне – это, наверное, не самая мудрая идея… Биткоин не выстрелит завтра, поэтому я не вижу проблемы в том, чтобы придержать такие изменения», — ответил он Андресену.

Ситуацию осложняло то, что внедрение OP_EVAL в протокол, как посчитали разработчики, привело бы к разделению блокчейна биткоина на две сети, каждая из которых работала бы по своим собственным правилам. То есть речь шла бы о хардфорке – пользователи, которые бы не обновили свое ПО, остались бы в сети, несовместимой с новыми правилами, а не обновившиеся майнеры добывали бы «недействительные» блоки. Что еще хуже, пользователи, сами того не зная, принимали бы «недействительные» транзакции.

Новый тип софтфорка

Впрочем, вскоре Андресен нашел способ успокоить противников. Он выяснил, что OP_EVAL можно внедрить, дав новые определения нескольким неактивным опкодам, которые Сатоши Накамото изначально включил в кодовую базу биткоина в качестве «заглушки» для будущих команд.

Ко всеобщему удивлению, в том числе и для самого Андресена, это также обеспечивало совместимость с нодами, не обновившимися до версии, предполагающей принятие OP_EVAL. Такие ноды проверяли бы, что хеш соответствует правилам, но не делали бы их исполнение обязательным, принимая вместо этого все транзакции по умолчанию.

Таким образом, если бы новые правила приняло большинство майнеров, новый блокчейн принимали бы все ноды – как обновившиеся, так и не сделавшие этого. Такие обратно совместимые апгрейды известны как софтфорки, и Сатоши Накамото уже их проводил до этого, но теперь беспокойство разработчиков вызывало возросшее число пользователей, которым нужно было бы обновиться.

Непростой кейс софтфорка: как будет активировано следующее обновление биткоина

Это также дало возможность начать работу над еще более надежными методами активации софтфорков. Одной из идей было проведение своего рода опросов, целью которых было бы определить, имеет ли та или иная функция достаточную поддержку среди майнеров. Для этого майнерам было необходимо включать в добываемые блоки определенные данные, которые бы сигнализировали об их готовности принять новые правила. Если обновление поддерживало большинство, его активировали в будущих релизах.

P2SH

Но все эти усилия перечеркнула уязвимость, которую обнаружил О’Коннор. В результате сообщество разработчиков разделилось на два лагеря: одни считали задержку с активацией OP_EVAL необоснованной, другие высказывали опасения, что предложенные фиксы негативно отобразятся на определенных ключевых свойствах биткоина.

Ряд разработчиков, в числе которых оказались Люк Дэш-младший, Питер Велле и Грегори Максвелл, предложили для апгрейдов вроде OP_EVAL метод, получивший название Pay-to-Script Hash (P2SH). Но сохранялась проблема его имплементации в виде софтфорка для предотвращения раскола сети на две отдельные цепи.

Существовавшие на тот момент опкоды имели определенные ограничения, и на помощь пришло новое решение для P2SH, предложенное Андресеном. Оно не требовало использования опкода – вместо этого предлагалось внедрить код, который бы узнавал определенный формат транзакций и валидировал бы его при помощи новых инструкций.

Необновившиеся ноды интерпретировали бы этот нетрадиционный формат при помощи традиционной логики, подтверждая корректность транзакций. Это означало, что P2SH можно было внедрить в виде софтфорка – если новые правила подтверждало большинство майнеров, с ними соглашались все ноды, как обновившиеся, так и необновившиеся.

Казалось, что предложение Андресена удовлетворило всех.

«На первый взгляд мне кажется это приемлемым», — написал О’Коннор.

На состоявшейся через некоторое время встрече разработчиков в январе 2012 года было принято решение об имплементации предложения Андресена. В срок до 1 февраля майнеры должны были просигнализировать о своей готовности его поддержать, а еще через две недели должен был состояться новый релиз, который бы активировал софтфорк.

Но мир продержался недолго.

Критика P2SH и альтернативные предложения

Консенсус нарушил Дэш-младший, который по вынужденным обстоятельствам покинул встречу раньше других и только потом узнал, что предложенную Андресеном версию P2SH приняли в качестве компромиссного решения.

Люк Дэш-младший.

По его мнению, это решение усложняло протокол и несло некоторые до конца неясные последствия. Свои опасения он высказал Андресену, но убедить того в необходимости отказа от такого плана ему не удалось. Свое недовольство Дэш-младший высказал на BitcoinTalk, отказавшись принять P2SH и заявив, что Андресен единственный, кто поддерживает это решение.

«При помощи последней версии кода биткоина Гэвин пытается заставить всех проголосовать за P2SH. Если вы хотите показать, что не согласны с этим безумным изменением в протоколе, вам необходимо изменить исходный код BitcoinD. В противном случае вы по умолчанию будете голосовать «за».

Характер его возражений и резкий тон обвинений в сторону Андресена не встретили понимания среди большей части разработчиков. Некоторые посчитали, что вместо того, чтобы сфокусироваться на технической стороне вопроса, он перешел на личности.

Не помогло и то, что Дэш-младший был одним из наиболее идейных контрибьюторов биткоина. Некоторые даже считали, что подобные заявления ставят под сомнение психическое здоровье разработчика. Были, впрочем, и те, кто не хотели глубоко вдаваться в технические детали и попросту верили Андресену.

Дэш-младший [убежденный христианин и одновременно с этим сторонник теории о Плоской Земле — ForkLog] оспаривал не только техническую сторону P2SH, но и философские аспекты предложения, включая его вероятное негативное влияние на вопросы управления биткоином.

«Если вы хотите иметь монархическую валюту, то почему бы просто не использовать доллар ФРС?» — ответил он одному из критиков, после чего его самого обвинили в стремлении узурпировать власть.

В ответ Дэш-младший написал собственную версию P2SH под названием CheckHashVerify (CHV). По сути это была альтернативная имплементация P2SH, добавлявшая новый опкод и не требовавшая нетрадиционной интерпретации транзакционных выходов.

Гэвин Андресен, однако, не захотел углубляться в дебаты.

«Люк, ты испытываешь мое терпение. Я отойду от кода на несколько дней, чтобы успокоиться и не наделать каких-то глупостей», — ответил он.

Одним из тех, кто разделил высказанную обеспокоенность, был Амир Тааки. Но это произошло не потому, что он выступал против решения Андресена или во всем соглашался с Дэшем-младшим.

Амир Тааки. Фото: Paralelni Polis.

Тааки на тот момент было чуть больше 20 лет и его имя еще не было широко известно, но будучи убежденным анархистом, он уже тогда видел в биткоине не просто программный код, а возможность противостоять истеблишменту. Во многом из-за этого его вытеснили из числа «внутреннего круга» разработчиков.

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

По его мнению, предложения Андресена и Дэша-младшего отличались друг от друга не так сильно, однако в итоге он косвенного поддержал последнего, заявив о важности учитывать мнение пользователей.

«Меня беспокоит, что биткоин однажды станет коррумпированным. Обратите на это дополнительное внимание, как на возможность создать культуру открытости», — заявлял Тааки.

Различия между P2SH и CHV он подробно описал в блоге, отметив возможность выбора, которую давало «голосование» при помощи хешрейта.

Один CPU – один голос

Во время описываемых событий сеть биткоина уже несколько отличалась от того, в каком виде ее представил Сатоши Накамото. В своем white paper создатель криптовалюты предполагал, что вычислительные мощности, необходимые для поддержания работы алгоритма Proof-of-Work, пользователи будут поставлять через свои персональные компьютеры.

«По своей сути Proof-of-Work – это один CPU / один голос», — писал Накамото.

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

Однако со временем индивидуальные майнеры утратили свое значение. Этому поспособствовали механизм добычи биткоина посредством видеокарт, разработанный небезызвестным Ласло Хейницем (это именно он в мае 2010 года отдал 10 000 BTC за две пиццы), а также модель майнинга в пулах, представленная основателем Slush Pool Мареком Палатинусом. Майнинг уже более не был домашним хобби, а становился уделом более крупных компаний.

По состоянию на конец 2011 года более половины всего хешрейта биткоина контролировали всего три пула: DeepBit, Slush Pool и BTC Guild.

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

Голосовать или не голосовать

Ситуацию усложняло то, что предложения Андресена и Дэша-младшего отображали различные подходы к управлению биткоином. До этого времени разработчики всегда говорили о предстоящих обновлениях как о своего рода голосовании за то или иное предложение. Однако, хотя со временем эта терминология и стала частью лексикона, на техническом уровне разработчики уже не спрашивали мнение майнеров о новых правилах. Скорее, для них это было просто способом понять, готовы ли те к внедрению обновлений.

Некоторые разработчики, среди которых можно назвать Грегори Максвелла, выступали за то, чтобы ограничить «голосование» майнеров исключительно вопросами, касающимися транзакций, и не давать им возможности определять правила функционирования всей сети.

«Что произойдет, если подавляющее большинство майнеров, это может быть даже 100%, решит сохранить награду в 50 BTC навсегда? Ничего. Майнеры, которые изменят это правило в своем ПО, попросту перестанут существовать с точки зрения сети», — писал он.

Дэш-младший в этом вопросе Максвеллу не возражал, но не видел практической возможности обеспечения безопасности сети в случае, если разработчики решат внедрить изменения без поддержки майнеров.

«Майнеры могут попросту отказаться подтверждать P2SH-транзакции, защищая тем самым себя от изменений со стороны разработчиков. А если у разработчиков не будет поддержки майнеров, то угадай, произойдет? Легкая атака 51%, сеть не будет более безопасной!»

С этой точки зрения легче понять, почему Дэш-младший считал, что Андресен, пытаясь протолкнуть P2SH, злоупотребляет своей ролью ведущего разработчика: если для создания блока майнер использовал бы стандартное ПО, он автоматически бы отдавал голос за P2SH.

В ответ на это он создал патчи, которые давали бы майнерам право голосовать как против, так и в пользу P2SH и CHV. И хотя на практике этот код использовали немногие, свой эффект он все же оказал. Так, Tycho, оператор крупнейшего на тот момент пула DeepBit, не скрывал, что не чувствует себя комфортно, оказавшись перед перспективой оценки двух конкурирующих предложений, особенно когда консенсуса нет среди самих разработчиков.

«Я не хочу быть тем одним человеком, который примет такое решение», — писал он.

В тупике

Позиция Tycho делала ситуацию еще более сложной – без его поддержки, а речь шла о более чем 30% хешрейта сети, активация P2SH становилась проблематичной. В конце января 2012 года, когда первый раунд голосования приближался к своему завершению, казалось, что необходимой поддержки предложение не наберет.

Вероятная задержка приводила в отчаяние и самого Андресена, и других разработчиков.

«Полагаю, что пока кто-то не установит для этого процесса дедлайн, он никогда не закончится, потому что всегда найдется еще один парень с новой великой идеей», — написал Грегори Максвелл в IRC-канале для разработчиков.

Андресен обвинил в сложившейся тупиковой ситуации именно Tycho. Заявив, что один человек обладает достаточным хешрейтом, чтобы заблокировать любые изменения, он назвал «неправильным» использовать положение оператора крупнейшего майнингового пула и выступать против общего консенсуса.

Тем не менее, хотя Андресен призывал к публичному давлению на DeepBit и даже предлагал возместить средства в случае, если активация P2SH приведет к финансовым потерям, Tycho отказывался голосовать за предложение.

Аргументы Андресена нашли отклик и среди пользователей, обвинявших Tycho в задержке обновления. Однако оператор DeepBit твердо стоял на своем: он не хотел быть одним человеком, который бы решил судьбу вопроса, отмечая, что совокупных мощностей других пулов было бы достаточно для поддержки решения.

Второй раунд голосования

Не сумев заручиться достаточной поддержкой майнеров, Андресен был вынужден более активно обсуждать свое предложение в публичном пространстве, и в определенный момент даже допустил, что CHV может стать альтернативным решением для выхода из тупика.

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

К числу последних принадлежал и модератор BitcoinTalk Theymos.

«Блоки могут отвергать и не майнеры. Если это будет делать достаточное число клиентов, майнеры будут не нужны», — написал он.

Theymos также выступил с предложением по организации встреч определенного узкого круга экспертов, которые бы собирались каждые две недели и отдавали бы голос за то или иное предложение. Возможно, это было совпадением, но вскоре после этого Дэш-младший создал Wiki-страницу, на которой наиболее известные разработчики могли голосовать за предложения.

Спустя небольшое время Максвелл, Велле и другие дали понять, что, хотя и отдают предпочтение P2SH (BIP-16), они также готовы поддержать CHV (BIP-17). О’Коннор и Дэш-младший согласились с тем, что P2SH может быть принят, но предпочтение отдали CHV.

Единственным, кто категорично отказался поддержать CHV, оказался Андресен.

Но более важным, вероятно, было то, что CHV имел слишком малую поддержку среди майнеров. В середине февраля 2012 года P2SH поддерживало около 30% хешрейта, CHV – всего 2%. Это вынудило Дэша-младшего неохотно принять доминирование P2SH и даже задуматься над тем, чтобы полностью отозвать свое предложение.

Второй раунд голосования назначили на 1 марта, и по мере приближения этой даты P2SH набирал все больше поддержки, вплотную приблизившись к необходимому порогу в 55%. У Tycho и Дэша-младшего не оставалось иного, кроме как принять выбор большинства.

Вскоре Андресен анонсировал активацию софтфорка, и 1 апреля она была успешно завершена. Первый протокол, созданный после ухода Сатоши, был имплементирован в основной сети биткоина.

Сложный процесс активации P2SH оказал значительное влияние на будущую структуру разработчиков биткоина. Андресен добился внедрения решения, которое он сам же и создал, и если во время этого «политического кризиса» кто-то и ставил под сомнение его роль лидера, в конце он свой статус закрепил.

Тем временем отношение сообщества к Дэшу-младшему и Тааки было уже не самым лучшим. На определенном этапе Андресен даже попросил Дэша-младшему полностью отойти от работы над кодом биткоина, хотя позже он либо сам отказался от этой идеи, либо автор CHV его совет просто проигнорировал.

Грегори Максвелл вошел в число ключевых разработчиков, получив вместе с Андресеном, Владимиром ван дер Лааном и Джеффом Гарзиком коммит-доступ к проекту.

Также был задан и общий тон процессу разработки: приветствовался более прагматичный и технически обоснованный подход, а эксцентричные контрибьюторы постепенно утратили свое влияние. Идеологические разногласия тем не менее сохранились и продолжали проявляться в последующие годы.

Год спустя, отвечая на видео, в котором разработчик Питер Тодд приводил аргументы против увеличения размера блока, Андресен сказал:

«Размер блока будет увеличен. Твое видео просто заставит многих людей беспокоиться о том, о чем беспокоиться не стоит. Все будет точно так же, как с предложением Люка-младшего в прошлом году – просто буря в стакане».

Каким же должен быть процесс принятия решений в сети децентрализованной цифровой валюты? Ответа на этот вопрос по-прежнему нет, и прежде чем он будет найден, пройдет еще немало лет.

*****

В 2016 году Андресен поддержал версию, согласно которой создателем биткоина является австралиец Крейг Райт, после чего ему закрыли доступ к обновлению репозитория Bitcoin Core на GitHub и он покинул проект. В 2017 году разработчик поддержал форк Bitcoin Cash.

Летом 2020 года он отказался от предыдущих заявлений о Райте, заявив, что его могли ввести в заблуждение касательно личности создателя биткоина.


   Источник
Назад к списку