Инцидент с 184 миллиардами BTC

Дальше — по порядку: как это произошло, что сделали разработчики и какие уроки вынесли сообщество.
Что именно произошло
Проблема была не в «магии» блокчейна, а в коде клиента. В том релизе валидация сумм транзакций не корректно проверяла пределы, и злоупотребление этой брешь позволило сформировать выходы с астрономическими значениями. В блоке #74 638 появилась транзакция с двумя выходами по ~92.2 миллиарда BTC — фактически это была «переполненная» сумма (value overflow), которая при суммировании или последующей обработке могла привести к неверному учёту балансов и, в теории, к полной подмене эмиссии.
Кто именно создал транзакцию — неизвестно: были версии про случайную ошибку, были — про намеренный эксперимент или злоупотребление. В любом случае транзакция была обнаружена и быстро распространена по узлам сети.
Как реагировали разработчики
Реакция была молниеносной. В течение нескольких часов (обычно указывают интервал до ~5 часов) ведущие разработчики Bitcoin Core и операторы нод подготовили и распространили исправление клиента. Исправление меняло правила валидации таким образом, что транзакция с переполнением переставала считаться валидной.
Практически это выглядело как координированное обновление: большинство крупных нод и майнеров перешли на патч, затем была проведена короткая «перестройка» цепочки — откат до блока перед инцидентом и повторная синхронизация без проблемного блока. В результате спорные выходы фактически стали недействительными, и «лишние» биткоины никогда не вошли в обращение. Кражи и утраты средств не зафиксированы — уязвимость была закрыта прежде, чем кто-то успел ею воспользоваться в коммерческом смысле.
Технически это требовало координации и доверия к ведущим разработчикам: узлы приняли новый клиент, сеть выполнила реорганизацию, и цепь продолжила работу. Для тогдашней, всё ещё маленькой экосистемы это был серьёзный вызов — но сработало.
Почему это было важно (и тревожно)
- Это показало, что программные ошибки могут угрожать самой монетарной модели. В централизованных системах баги — обычное дело; в децентрализованной — последствия могут быть непредсказуемыми.
- Решение потребовало координации. Хотя реакция прошла быстро, само её проведение показало, что сообщество временно полагается на группу разработчиков и операторов, способных быстро договориться и мобилизовать апгрейд — то есть фактическая централизация действий при кризисе. Для многих это стало поводом задуматься о рисках «человеческого фактора».
- Уязвимость в проверке пределов — классическая ошибка. Это урок про важность корректной обработки граничных значений, unit-тестов и статического анализа в проектах, где ошибки влияют на денежные потоки.
Что изменилось после инцидента
После Августа 2010 сообщество много и системно работало над тем, чтобы подобного не повторилось:
- в кодовую базу добавили больше проверок диапазонов и ограничений на суммы и переполнения;
- усилили практику ревью патчей и ввели более строгие тесты (включая автоматические тест-сьюты, regression tests);
- разработчики яснее прописали процессы реагирования на критические баги;
- появилось больше внимания к надёжности клиентских реализаций и к обмену информацией между операторами нод и майнерами.
Этот случай — один из инцидентов, которые подтолкнули сообщество к профессионализации разработки и к созданию процедур, которые сейчас для большинства open-source-проектов выглядят стандартом.
Уроки и выводы
— Нулевой риск не существует. В любой сложной системе ошибки возможны; важно уметь быстро обнаруживать и нейтрализовать их. — Код должен быть простым и безопасным. Любая логика, связанная с численными ограничениями и денежными величинами, должна быть покрыта тестами и ревью. — Координация важна, но опасна. Быстрое решение 2010 года спасло сеть, но оно потребовало единого согласия основных участников. Это хорошая «оперативная» черта, но долгосрочно улучшение устойчивости должно идти через децентрализацию протокольных механизмов и тщательное тестирование, а не через постоянную зависимость от «координации спасителей». — Коммуникация с сообществом критична. Прозрачность в ходе исправления, объяснения и отчёты по произошедшему помогли сохранить доверие пользователей.
Эпилог
Инцидент с 184 миллиардами BTC — это одна из тех историй, которые напоминают: блокчейн — это не магия, а код. И код пишут люди. Хорошая новость: сообщество научилось. Сегодня требования к качеству, ревью и тестированию в экосистеме значительно выросли по сравнению с 2010 годом. Но история остаётся полезным напоминанием о хрупкости систем, где ошибки в валидации чисел могут приобрести статус международной новости.