
Полная версия:
Доверие в долг. Криптовалюты как деньги и кредит: механизм, циклы, правила
Если перенести автомат в компьютер, возникает вопрос, знакомый по первой главе. Чья это программа? Программа на чьём-то сервере исполняется так, как решит владелец сервера, и мы снова зависим от хранителя, только теперь хранитель следит за автоматом. Автомату нужна тетрадка, которую никто не может тихо переписать и в которой нет хозяина, а первая такая тетрадка заработала в январе 2009 года601.
Тетрадка, которая помнит
В биткоине условие уже есть в каждой строчке. Как мы видели во второй главе, строчка говорит, какой ключ может её потратить. Условия в биткоине записывают на простом языке, и Бутерин в своём описании Ethereum перечислил, чего этому языку не хватает. На нём нельзя записать любое вычисление. Условие не может тонко управлять суммой, которую снимают. Условие не видит данных самого блока. И у него нет памяти: выход либо потрачен, либо нет, и ничего больше602.603
Без памяти не обходится даже простое общее дело. Представим, что двадцать дворов посёлка хотят новый колодец, а работа плотника стоит 100 (числа условные). Нужна строчка, которая скажет: «Принимать взносы от любого двора. Если к первому сентября набралось 100, отдать их плотнику. Если не набралось, вернуть каждому его взнос». Строчка биткоина так не умеет, потому что для этого нужно помнить, кто сколько внёс, и следить за датой. В посёлке такую работу поручили бы казначею, и казначей стал бы маленьким хранителем со всеми его слабостями.
По воспоминаниям Бутерина, в октябре 2013 года он много общался с командой Mastercoin, протокола поверх биткоина, и предлагал им новые функции. А в ноябре, на долгой прогулке по Сан-Франциско, понял, что смарт-контракты можно сделать полностью универсальными604.605 Мотив он описывал так: вместо того чтобы добавлять в протокол функции по одной, сделать протокол общим, чтобы он поддерживал больше типов контрактов без большого и сложного набора функций606. Описание Ethereum разошлось по рукам в конце 2013 года607.608 Цель в нём названа прямо — блокчейн со встроенным языком программирования, на котором можно записать «контракт» с произвольными правилами609.610 Сеть запустили 30 июля 2015 года611.612
Добавим в посёлок одиннадцатое правило: в тетрадку можно записать правило-автомат, то есть строчку, которой распоряжается не ключ, а записанный в ней порядок действий. Когда кто-то обращается к автомату, каждый двор выполняет этот порядок у себя и получает один и тот же результат.
Двенадцатое правило добавляет память. У автомата есть своя страница, где он сам ведёт записи (кто сколько внёс, какая сегодня дата по тетрадке, сколько осталось до сотни) и сам их меняет.
С этими двумя правилами колодец обходится без казначея. Проследим по шагам. Дворы один за другим присылают автомату по 5, и после каждого взноса автомат делает запись на своей странице («пекарь — 5, доярка — 5» и так далее), а внизу держит сумму. Допустим, к первому сентября пришло 95. Условие «набралось 100» не выполнено, и каждый двор может обратиться к автомату и забрать своё. Автомат найдёт на странице его строчку, отдаст 5 и вычеркнет её. Если бы набралось 100, первое же обращение после первого сентября запустило бы другую ветку, и автомат перевёл бы всю сотню плотнику.
Сам автомат первого сентября не просыпается. Он выполняет свой код, только когда к нему кто-то обращается, и это свойство ещё понадобится нам в истории The DAO. Плотнику не нужно бояться, что казначей сбежит с деньгами, дворам не нужно бояться, что казначей отдаст деньги своему родственнику. Одна вещь автомату при этом недоступна. Он не знает, выкопан ли колодец, потому что знает только то, что записано в тетрадке. К этому мы тоже вернёмся.

Рисунок 4.1. Автомат колодца
Документация Ethereum описывает то же самое без посёлка. Смарт-контракт — это обычная программа, которая хранится в блокчейне по определённому адресу: набор кода (функций) и данных (состояния)613.614 Во второй главе я обещал вернуться к счетам Ethereum, которыми управляет код. Это они и есть. Одними счетами в Ethereum распоряжается закрытый ключ, другими — программа615. Особый депозитный счёт, на который валидаторы вносят залог (о нём шла речь в прошлой главе), тоже контракт616.
Биткоин можно представить как тетрадь записей о том, кто кому что передал. Ethereum описывает себя иначе, как «машину состояний». Его состояние — одна большая структура со всеми счетами, остатками и памятью всех контрактов, и от блока к блоку она меняется по заранее заданным правилам617. Исполняет их виртуальная машина Ethereum (EVM), программа, которая одинаково работает на каждом узле618.619 При одной и той же памяти и одном и том же обращении все узлы обязаны получить один и тот же результат, иначе они не договорятся о том, какое состояние теперь верно620.
Слово «контракт» вводит в заблуждение, и сам Бутерин предупреждал об этом. В описании Ethereum сказано, что «контракты» не стоит понимать как нечто, что «исполняют» или «соблюдают». Это скорее «автономные агенты», которые живут внутри Ethereum и выполняют свой код, когда их «толкнёт» сообщение621, как наш автомат у колодца.622 Юридического договора с подписями сторон и судом, который его толкует, здесь нет. Есть программа, и она делает ровно то, что в ней написано. Дальше я буду говорить «смарт-контракт» или просто «контракт», потому что так принято, но держать в голове стоит слово «программа».
Счётчик и необратимость
Язык, на котором можно записать любое вычисление, позволяет записать и такое, которое никогда не кончится. Допустим, кто-то записывает в тетрадку автомат, который по кругу прибавляет к числу единицу и никогда не останавливается, и все сто дворов, обязанные выполнить его у себя, садятся считать до бесконечности. Злой умысел для этого не нужен, хватит ошибки в условии остановки.
Ethereum отвечает на это газом. Газ — единица, которой меряют объём вычислительной работы, нужной для операции623.624 Каждая транзакция обязана заранее указать, сколько шагов вычислений она готова оплатить, и Бутерин прямо объяснял это защитой от случайных и враждебных бесконечных циклов625.626 Добавим тринадцатое правило: каждый шаг автомата стоит платы; кто обращается к автомату, заранее говорит, сколько шагов оплачивает; если плата кончилась посреди работы, все изменения отменяются, а заплаченное всё равно списывается627.
Проще всего представить газ как счётчик в такси, который останавливает поездку, когда кончились деньги. Разница в том, что пассажира высаживают там, откуда он выехал, а за километры, которые счётчик уже насчитал, всё равно берут плату628. Отмена изменений нужна, чтобы автомат не застрял на полпути с наполовину переписанной памятью. Плата не возвращается, потому что дворы свою работу уже проделали. У страницы тетрадки тоже есть предел газа, то есть предел работы, которую можно уложить в один блок629, и эта деталь понадобится нам в истории The DAO.
Из предела следует и цена. Место на странице ограничено, как в биткоине во второй главе, и цена газа (её считают в миллиардных долях эфира) зависит от того, сколько желающих630. Основную её часть сеть назначает сама: когда страницы переполнены, цена растёт, когда пустеют, падает. Сверху отправитель может добавить чаевые, чтобы пройти быстрее631. Поэтому, если вы обратитесь к тому же автомату в день ажиотажа, вы заплатите больше, чем в спокойный день, хотя работы в вашем обращении столько же.
Сложим это с правилами, записанными раньше. Тетрадку нельзя тайно переписать (шестое и седьмое правила), а автомат исполняет себя сам и одинаково у всех (одиннадцатое). Значит, то, что автомат сделал, сделано навсегда.
Документация Ethereum говорит то же самое. По умолчанию смарт-контракт нельзя удалить, а взаимодействия с ним необратимы632.633 Там же названо ещё одно свойство. Контракты публичны и могут обращаться друг к другу, как детали, из которых собирают более сложные механизмы634. Это удобно, пока детали исправны. Если одна деталь сломана, могут сломаться все механизмы, в которые её встроили.
Здесь контракт и торговый автомат расходятся, и это различие важнее сходства. У автомата в магазине есть хозяин. У него есть ключ от дверцы, он может открыть её, вынуть деньги, заменить сломанный механизм или увезти автомат совсем. У контракта в тетрадке такого хозяина по умолчанию нет635. Если у кого-то есть особые права, они записаны в самом коде, и распорядиться ими может тот, кого код признаёт хозяином (как мы увидим, это не всегда тот, кого имели в виду авторы). Касса автомата в магазине невелика, а в кассу контракта можно положить столько, сколько готовы принести все желающие. Соразмерность, на которую рассчитывал Сабо, никто не гарантирует.
Автомат, который исполняет правильное условие без участия людей, так же без участия людей исполняет и ошибочное. Ему всё равно, что имели в виду авторы, он делает то, что записано, для любого, кто к нему обратился, и отменить сделанное нельзя. Если в обычном договоре есть ошибка, стороны идут с ней в суд. Ошибкой в контракте первым пользуется тот, кто нашёл её раньше других, и суд, если дело до него дойдёт, разбирает уже сделанное.
Касса на 150 миллионов
The DAO придумали в немецкой компании Slock.it. В ноябре 2015 года её сооснователь Кристоф Йенч представил идею на конференции разработчиков Ethereum в Лондоне как «коммерческую DAO»636.637 (DAO — сокращение от английского decentralized autonomous organization, «децентрализованная автономная организация». Так, по определению SEC, называют «виртуальную» организацию, воплощённую в компьютерном коде и исполняемую в блокчейне638.)639 Устройство было такое. Участники платят эфир и получают токены, то есть строчки на странице памяти контракта, где записано, сколько единиц принадлежит какому адресу. Токены дают голос при выборе проектов, которые фонд будет финансировать, и право на «вознаграждения», а сам Йенч сравнивал это с покупкой акций компании и получением дивидендов640.
Код развернули в сети около 29 апреля 2016 года, а с 30 апреля по 28 мая The DAO продала около 1,15 млрд токенов примерно за 12 млн ETH641.642 Купить мог любой, у кого был эфир, без ограничений по числу покупателей и их опыту643. Это тот же «договор с предъявителем», что у автомата Сабо, только в кассе на момент закрытия продажи лежало, по оценке SEC, около 150 млн долларов644.
Децентрализованной эта организация была не вполне. Какие предложения попадут на голосование, решали «кураторы», одиннадцать человек, отобранных Slock.it, и один из них публично говорил, что у кураторов «огромная власть»645.646 Люди, которые принимают решения, были в The DAO с первого дня, задолго до всякой аварии. О безопасности кода Slock.it сообщала, что его проверила одна из ведущих компаний по аудиту и что за «пять полных дней анализа безопасности» не осталось ни одного неперевёрнутого камня647.648
Тревога появилась ещё до атаки. 26 мая Slock.it внесла предложение о безопасности DAO, 27 мая группа исследователей призвала к временному мораторию на The DAO (их статья разбирала в основном устройство голосования), а 3 июня Йенч предложил приостановить все предложения до исправления уязвимостей649. 10 июня в блоге фонда Ethereum вышла статья о безопасности смарт-контрактов, где разбирался как раз этот класс ошибок650. Статья разбирала общий случай и не говорила, что такая ошибка есть в The DAO651, но лекарство в ней было названо.
Сама ошибка описывается в двух фразах, и лучше всего её понять на условном примере. Представим банкомат, который, получив запрос «снять всё», сначала выдаёт купюры и только потом списывает сумму со счёта, а пока купюры идут из лотка, позволяет нажать «снять всё» ещё раз. Каждое новое нажатие банкомат проверяет по счёту, который ещё не уменьшился, и каждое проходит. Никакой банкомат так не устроен, пример условный. Но функция вывода в The DAO была устроена именно так. Две строки кода стояли не в том порядке, и контракт сначала отправлял эфир, а потом обнулял баланс652.653
Почему получатель мог нажать ещё раз? Получателем эфира может быть другой контракт, и, пока отправка ещё не завершена, он может снова вызвать функцию вывода654. Так и вышло. Строка «обнулить баланс» до своей очереди не доходила, и запрос на вывод исполнялся снова и снова в пределах одной транзакции655. Бутерин в тот же день назвал это уязвимостью «рекурсивного вызова»656, разработчики сегодня называют её повторным входом. Лекарство состоит в перестановке строк: сначала изменить записи, потом отправлять эфир657.
Разберём это на круглых числах (они условные и с настоящими суммами The DAO не связаны). В кассе общего автомата 1000, и на его странице памяти записано, что доля одного адреса равна 10. За адресом стоит другой автомат, и у него одно правило — получив деньги, сразу снова попросить свою долю. Первый запрос. Общий автомат смотрит на страницу, видит 10 и отправляет 10. Получение будит второй автомат, и тот просит снова. Общий автомат снова смотрит на страницу, где по-прежнему записано 10, потому что до строки «обнулить» дело ещё не дошло, и снова отправляет 10. Так повторяется, пока не кончится газ или деньги в кассе, и сорока повторов хватает, чтобы доля в 10 превратилась в 400.
Если переставить две строки, всё останавливается на первом шаге. Автомат сначала запишет на странице 0, потом отправит 10, и на второй запрос у него найдётся ответ: доли больше нет. Код, который исполняет себя сам, не знает, что имели в виду его авторы, и порядок строк для него и есть смысл.

Рисунок 4.2. Повторный вход
Выведенный эфир ушёл в «дочернюю DAO», отдельный контракт, откуда код самой The DAO не давал его сразу забрать658. Тот же код, который позволил вывести эфир, запер его на время, и это время ушло у сообщества на спор.
Автомат Сабо защищала соразмерность (в кассе меньше, чем стоит взлом). У The DAO соотношение было обратным: касса больше сотни миллионов долларов, а для взлома хватало знать класс ошибок, который фонд Ethereum разобрал публично за неделю до атаки659, и уметь обратиться к функции повторно. Аудит, пять дней анализа и публичные тревоги о безопасности The DAO атаку не предотвратили660.
Была ли это кража?
Комиссия по ценным бумагам и биржам США (SEC), которая позже расследовала историю The DAO, во введении к отчёту пишет, что атакующий «украл» около трети активов, но в заголовке раздела ставит слово «атака» в кавычки661.662 18 июня на сайте для публикации текстов появилось «открытое письмо» от имени атакующего. Автор утверждал, что законно получил 3 641 694 ETH через функцию, которую контракт сам предусматривал, называл это «намеренной возможностью» и писал, что его разочаровывают те, кто называет её использование кражей663.664 Любой софт- или хардфорк он называл изъятием своего законного эфира, полученного по условиям смарт-контракта665.
Подлинность письма разработчики оспорили сразу. Цифровая подпись под ним, по их разбору, была устроена не так, как должна быть устроена действительная подпись, и Бутерин назвал её «сомнительной»666.667 Поэтому кто написал письмо, неизвестно. Но позиция в нём сформулирована чище, чем где-либо ещё: код разрешил, значит, всё законно. Хорош этот довод или плох, в ближайшие недели предстояло решить майнерам и держателям монет.
Тридцать три дня
Выбор у сообщества был из трёх вариантов: ничего не делать; принять новое правило, которое запретит трогать эфир атакующего; или переложить эфир обратно. Второй и третий путь меняют правила тетрадки, и отличаются они тем, как ведут себя старые программы.
Цена у каждого пути своя. Если ничего не делать, правило «взаимодействия необратимы» остаётся нетронутым, а вкладчики The DAO теряют треть собранного668. Если вернуть деньги, вкладчики остаются при своём, а у сети появляется прецедент, ведь однажды большинство уже поправило результат, который правила допустили. Первый путь дорог для тех, кто вложился, второй — для доверия к самим правилам. Положить эти две цены на одни весы нельзя, и поэтому я не думаю, что спор мог кончиться общим согласием.
Софтфорк, «мягкое» изменение, только ужесточает правила: то, что было запрещено, остаётся запрещённым, а к запретам добавляется новый (если посмотреть с этой стороны, так же исправили ошибку 2010 года из второй главы)669. Страницы, написанные по новым правилам, старые программы тоже признают, и, если новое правило поддерживает большинство тех, кто пишет страницы, сеть не делится. Хардфорк вводит правило, которое старые программы сочтут нарушением. Если на новую версию переходят все, ничего не происходит, а если не все, тетрадка раскалывается на две, и у каждой своя история. В 2016 году Ethereum ещё работал на доказательстве работы, как биткоин (на залог он перешёл в 2022 году670), и голос в этом споре был у майнеров.
Первым предложили софтфорк. 17 июня Бутерин написал, что начиная с блока 1 760 000 новое правило сделает вывод этих средств невозможным671. 24 июня фонд Ethereum выпустил версию программы узла Geth 1.4.8, где софтфорк можно было включить, и оставил решение майнерам672.673 Голосовали самим способом сборки страниц. Сторонники включали флажок и понемногу снижали предел газа в своих блоках, и если бы к блоку 1 800 000 этот предел опустился ниже 4 млн, софтфорк вступил бы в силу674.
28 июня от софтфорка отказались. В его коде нашли уязвимость. Код, который приводил софтфорк в действие, позволял выполнять вычисления вплоть до предела газа в блоке и ничего за них не платить675.676 Так открывался путь для атаки типа «отказ в обслуживании», когда сеть заваливают бесплатной работой677. Софтфорк, который должен был исправить ошибку одного контракта, сам нарушил тринадцатое правило, то самое, которое делает бесконечную работу дорогой. Фонд рекомендовал голосовать против, пока не найдётся лучшее решение678.
Выбор сузился до двух вариантов: ничего не делать или хардфорк.
15 июля фонд объявил параметры хардфорка679.680 По плану на блоке 1 920 000 эфир из The DAO и её дочерних контрактов переходил на контракт возврата, где держатели токенов могли обменять их по курсу 100 токенов DAO за 1 ETH. Будет ли хардфорк включён в программе узла по умолчанию, должно было решить голосование в инструменте carbonvote с подсчётом на блоке 1 894 000. В том же сообщении фонд подчеркнул, что такое решение не может принять ни он сам, ни кто-либо другой в одиночку681.
Допустим, вы купили на продаже 10 000 токенов по нижней цене, 1 ETH за 100 токенов, то есть заплатили 100 ETH682. Контракт возврата меняет 100 токенов на 1 ETH, и после форка вы получаете свои 100 ETH обратно, как если бы атаки не было683. Для этого вам не нужно было ни голосовать, ни даже знать о голосовании. Вернуло ваши деньги решение, которое приняли другие.
Carbonvote — голосование монетами. Вес голоса равен количеству эфира на адресе684. Проголосовало около 5,5% всех монет, и подавляющее большинство проголосовавших высказалось за форк685.686 Критики, среди них сооснователь конкурирующего проекта, упрекали процедуру в том, что голосование длилось меньше суток, объявили о нём только в блоге фонда, в Twitter и на Reddit, а участвовала малая доля держателей687.688
20 июля 2016 года в 13:20:40 по всемирному времени сеть дошла до блока 1 920 000689. По сообщению Бутерина, этот блок содержал «нерегулярное изменение состояния», которое перевело около 12 млн ETH из контрактов под названиями «Dark DAO» и «Whitehat DAO» на контракт возврата690.691 Форк прошёл гладко, на новой цепочке работали около 85% майнеров, а держателям токенов к моменту сообщения уже вернули около 4,5 млн ETH692.
Историю при этом задним числом не переписывали. Старые блоки остались на месте, а балансы переложили в новом блоке одним изменением. Описание форка в документации Ethereum отдельно подчёркивает, что протокол не менялся, и команды виртуальной машины, формат транзакций и устройство блоков остались прежними693.694 Поэтому слово «откатили», которое часто встречается в пересказах, неточно. Точнее сказать, что большинство задним числом отменило правило «взаимодействия с контрактом необратимы» ради одного контракта.
Несогласные, по отчёту SEC, считали, что переход противоречит самой идее неизменяемого блокчейна, и продолжили пользоваться прежней версией695.696 Официальная хронология Ethereum объясняет это короче. По её словам, часть майнеров отказалась от форка, потому что инцидент с The DAO не был дефектом протокола, и они образовали Ethereum Classic697. Старую цепочку, по оценке справочника «Mastering Ethereum», поддержали примерно 10% сообщества по стоимости и по мощности майнинга698.699 Это та самая сеть, которую через четыре года трижды атаковали, как мы видели в прошлой главе700.
Безопасность открытой сети, как мы помним, покупается мощностью, которую на неё тратят. Раскол делит не только людей, но и эту охрану. Цепочка, за которой осталась примерно десятая часть мощности701, охраняется слабее, и переписать её дешевле. Утверждать, что атаки 2020 года прямо вытекают из раскола 2016-го, я не стану, между ними четыре года и много других перемен. Механизм, однако, тот же, и чем меньше мощности держит сеть, тем дешевле её атаковать702.
Полезно сравнить эту историю с ночью 15 августа 2010 года из второй главы. Тогда сломались правила самой тетрадки: ошибка в проверке позволила создать из ничего монеты, которых правила не допускали703. В 2016 году правила тетрадки сработали в точности как записано, и контракт тоже исполнил свой код. Ошиблись люди, которые этот код написали, и вопрос стоял иначе: вправе ли большинство поправить результат, который правила допустили? Для одних это был ремонт после аварии, для других — нарушение правил ради тех, кто вложился в неудачный контракт, и из этой разницы вырос раскол.

Рисунок 4.3. Тридцать три дня
Кто же принимал решение? Фонд написал код форка и назвал дату, но решать в одиночку отказался704. Держатели монет голосовали монетами, и голос у каждого был пропорционален его эфиру705. Майнеры голосовали мощностью, выбирая, какую программу запустить706. У пользователя без монет на адресе и без машин для майнинга голоса не было вовсе. Для посёлка это сход, где один голос у того, у кого больше строчек, другой у того, кто пишет страницы, а у остальных никакого, и где несогласные уносят свою копию тетрадки и продолжают вести её отдельно. Это и есть «социальный слой» из прошлой главы, та договорённость людей, которую сайт Ethereum называет последней защитой сети707. Здесь он сработал на деле, за шесть лет до того, как Ethereum перешёл на залог.
Три прочтения одной фразы
Спор о The DAO шёл под лозунгом «код — это закон». У этой фразы есть автор, и думал он о другом. Так называется первая глава книги юриста Лоуренса Лессига «Код и другие законы киберпространства», вышедшей в 1999 году708. Лессиг писал, что в киберпространстве людей регулирует код, то есть программы и железо, из которых это пространство сделано, и в этом смысле код и есть его закон709.710
Для Лессига это было предупреждение. Код может защищать ценности, а может их уничтожать, и его всегда пишут люди, которые выбирают, какие ценности в него заложить711. По его формуле, код никогда не находят, его только делают, и делаем его мы712.713 Отсюда, на мой взгляд, следует вывод, противоположный тому, что из фразы сделали позже. Раз код пишут люди, спрашивать надо о людях: кто пишет, в чьих интересах и кто может поменять. В журнальной статье 2000 года Лессиг назвал код архитектурой, которая задаёт условия жизни в сети, например насколько легко в ней защитить частную жизнь или запретить чьи-то высказывания714. Для смарт-контракта такая архитектура — это, среди прочего, ответ на вопрос, есть ли у него хозяин, способный его остановить.
Второе прочтение принадлежит Ethereum Classic. На сайте сообщества «код — это закон» объявлен принципом: код смарт-контракта — окончательный судья того, чем кончилось взаимодействие в сети, и никакая сила извне не вправе его отменить715.716 По версии сообщества, той же философии держался и Ethereum, пока не случилась The DAO717. Лессиг предупреждал, что код решает за людей, а сообщество Ethereum Classic этого требует.
Третье прочтение дало государство. 25 июля 2017 года SEC опубликовала отчёт о расследовании, где признала токены The DAO ценными бумагами по законам США, но дела против их выпускающих возбуждать не стала718. В том же отчёте сказано, что автоматизация с помощью «смарт-контрактов» или кода не выводит поведение участников из-под действия законов о ценных бумагах719.720 Иными словами, автомат может исполнять себя сам, но те, кто через него продаёт ценные бумаги, остаются под тем же законом, что и без автомата.

