Блокчейн/Уровень VI · После биткоина/6.3 Ethereum и смарт-контракты/Урок 3
Взлом The DAO и Ethereum Classic
Баг повторного входа (reentrancy), который расколол блокчейн и задал рамки спора о неизменяемости
МатериалыИнтерфейс блок-эксплорера (например, Etherscan)Исходный код смарт-контракта The DAO (версия до форка)Блокнот для отслеживания изменений переменных состояния
Любопытство
- Почему строка кода, которая выполняется до обновления состояния, позволяет злоумышленнику раз за разом выводить средства?
- Что происходит, когда сообщество голосует за то, чтобы переписать историю, а не сохранить её?
- За кем последнее слово: за механизмом консенсуса или за разработчиками, которые его поддерживают?
Исследование
- The DAO был запущен в апреле 2016 года как автономный венчурный фонд и собрал около 12,7 миллиона ETH более чем от 11 000 инвесторов. Эта сумма составляла примерно 14% всего эфира, находившегося тогда в обращении. Проект работал исключительно на смарт-контрактах: холдеры токенов голосовали за то, какие проекты финансировать, без централизованного руководства и традиционных структур корпоративного управления.
- 17 июня 2016 года злоумышленник воспользовался уязвимостью повторного входа (reentrancy) в функции split контракта The DAO. Этот баг позволял повторно вызвать контракт до того, как обновится его внутренний баланс. Злоумышленник вывел около 3,6 миллиона ETH в «дочерний DAO» (child DAO), где 28-дневный период удержания заморозил средства. Этот эксплойт показал, что тьюринг-полные машины несут сложные риски управления состоянием, которых нет в более простых системах вроде Bitcoin.
- Сообщество Ethereum сразу оказалось перед дилеммой: соблюсти неизменяемость реестра или защитить инвесторов от последствий критической ошибки в коде. Разработчики утверждали, что баг был ошибкой реализации, а не задуманным поведением, и что если оставить средства заблокированными, это подорвёт доверие к полезности платформы. Критики возражали, что изменение истории блокчейна нарушает главное обещание децентрализованного консенсуса и создаёт опасный прецедент для будущих вмешательств в управление.
- 20 июля 2016 года в блоке 1,920,000 произошел жесткий форк Ethereum с целью противодействия атаке и перевода средств на контракт для возврата. Владельцы токенов DAO смогли затем вернуть свой этер с этого контракта. Меньшинство отвергло это вмешательство и продолжило добычу на оригинальной, нередактированной цепи. Эта группа создала Ethereum Classic (ETC), строго придерживаясь принципа, что «код — это закон», и что ни одна сторона не должна иметь права изменять прошлое.
- Форк породил из одного реестра две параллельные реальности. Ethereum продолжил развиваться в крупную платформу для смарт-контрактов, а Ethereum Classic остался небольшой сетью, во многом служащей философским высказыванием о децентрализации. Этот инцидент повлиял на дальнейшее развитие протоколов во всей криптоиндустрии.
- Посмотрите на блок 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 предложение о том, что обещает принцип «код — это закон» и чем он жертвует, когда код даёт сбой.
Проверка фактов
Даты, цифры и утверждения были проверены по приведенным ниже опубликованным источникам.
- Ethereum Foundation, 'The DAO hack' blog posts (June-July 2016)
- SEC, Report of Investigation: The DAO (July 2017)
- Post-mortem analyses of the reentrancy exploit (2016)