MSTR Cat

Блокчейн/Уровень VI · После биткоина/6.3 Ethereum и смарт-контракты/Урок 3

Взлом The DAO и Ethereum Classic

Баг повторного входа (reentrancy), который расколол блокчейн и задал рамки спора о неизменяемости

МатериалыИнтерфейс блок-эксплорера (например, Etherscan)Исходный код смарт-контракта The DAO (версия до форка)Блокнот для отслеживания изменений переменных состояния

Любопытство

  1. Почему строка кода, которая выполняется до обновления состояния, позволяет злоумышленнику раз за разом выводить средства?
  2. Что происходит, когда сообщество голосует за то, чтобы переписать историю, а не сохранить её?
  3. За кем последнее слово: за механизмом консенсуса или за разработчиками, которые его поддерживают?

Исследование

  1. The DAO был запущен в апреле 2016 года как автономный венчурный фонд и собрал около 12,7 миллиона ETH более чем от 11 000 инвесторов. Эта сумма составляла примерно 14% всего эфира, находившегося тогда в обращении. Проект работал исключительно на смарт-контрактах: холдеры токенов голосовали за то, какие проекты финансировать, без централизованного руководства и традиционных структур корпоративного управления.
  2. 17 июня 2016 года злоумышленник воспользовался уязвимостью повторного входа (reentrancy) в функции split контракта The DAO. Этот баг позволял повторно вызвать контракт до того, как обновится его внутренний баланс. Злоумышленник вывел около 3,6 миллиона ETH в «дочерний DAO» (child DAO), где 28-дневный период удержания заморозил средства. Этот эксплойт показал, что тьюринг-полные машины несут сложные риски управления состоянием, которых нет в более простых системах вроде Bitcoin.
  3. Сообщество Ethereum сразу оказалось перед дилеммой: соблюсти неизменяемость реестра или защитить инвесторов от последствий критической ошибки в коде. Разработчики утверждали, что баг был ошибкой реализации, а не задуманным поведением, и что если оставить средства заблокированными, это подорвёт доверие к полезности платформы. Критики возражали, что изменение истории блокчейна нарушает главное обещание децентрализованного консенсуса и создаёт опасный прецедент для будущих вмешательств в управление.
  4. 20 июля 2016 года в блоке 1,920,000 произошел жесткий форк Ethereum с целью противодействия атаке и перевода средств на контракт для возврата. Владельцы токенов DAO смогли затем вернуть свой этер с этого контракта. Меньшинство отвергло это вмешательство и продолжило добычу на оригинальной, нередактированной цепи. Эта группа создала Ethereum Classic (ETC), строго придерживаясь принципа, что «код — это закон», и что ни одна сторона не должна иметь права изменять прошлое.
  5. Форк породил из одного реестра две параллельные реальности. Ethereum продолжил развиваться в крупную платформу для смарт-контрактов, а Ethereum Classic остался небольшой сетью, во многом служащей философским высказыванием о децентрализации. Этот инцидент повлиял на дальнейшее развитие протоколов во всей криптоиндустрии.
  6. Посмотрите на блок 1,920,000 в эксплорере Ethereum и в эксплорере Ethereum Classic: обе сети идентичны до блока 1,919,999, но отличаются начиная с блока 1,920,000. В результате разделения сетей эфир DAO не был перемещен с помощью транзакции; новое программное обеспечение клиента вызвало изменение состояния в этом блоке, поэтому откат происходит в коде, а не в списке транзакций.

Ключевые факты

  • The DAO собрал около 12,7 миллиона ETH — примерно 14% всего эфира в обращении на момент запуска.
  • Баг повторного входа (reentrancy) позволил злоумышленнику 17 июня 2016 года вывести около 3,6 миллиона ETH в дочерний DAO.
  • Этериум прошел хард-форк 20 июля 2016 года на блоке 1,920,000 с целью прекращения атаки и возврата средств.
  • Меньшинство продолжило майнить исходную цепочку, ставшую Ethereum Classic (ETC), ссылаясь на принцип «код — это закон».
  • В результате форка у холдеров оказались и ETH в новой цепочке, и ETC в старой.
  • Этот инцидент породил долгие споры о неизменяемости, полномочиях разработчиков и самом определении консенсуса.

Упражнение девять, шесть, три, один

9СобратьПеречислите 9 случаев, когда обновление программного обеспечения или изменение протокола повлияло на существующие данные пользователей или историю транзакций. Укажите, кто инициировал изменения и каковы были приведенные основания.
6СгруппироватьРаспределите 9 случаев по 6 категориям в зависимости от того, чем было изменение: исправлением ошибки, добавлением функции, откатом ради безопасности, обновлением консенсуса, хардфорком или софтфорком.
3Выделить главноеСведите 6 категорий к 3 видам власти, которые в итоге принимали решения об этих изменениях.
1КристаллизоватьНапишите 1 предложение о том, что обещает принцип «код — это закон» и чем он жертвует, когда код даёт сбой.

Проверка фактов

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

Открыть в интерактивной академии →

EN PT ES ZH JA KO DE FR MS