Как захватывают DAO: атака 51% голосов и governance-эксплойты

DAO обещает то, о чём старые философы только мечтали: власть кода, а не правителей. Ни короля, ни совета директоров, ни человека за занавесом. Смарт-контракт исполняет то, за что голосует большинство, а большинство — это все, кто держит токен.

Красиво. И ровно здесь живёт слабость.

Потому что «власть большинства токенов» имеет тихий второй смысл: кто контролирует большинство токенов, тот контролирует DAO. Не большинство людей — большинство голосов. А голоса в большинстве DAO — продаются.

В 2022 году атакующий проделал честную версию этого с Beanstalk, DeFi-протоколом. Он взял флеш-заём — сотни миллионов долларов, занятых на время одной транзакции — купил на них достаточно governance-токенов, чтобы протащить вредоносное предложение, вывел из протокола порядка 180 миллионов долларов и вернул заём. Общее время: секунды. Общая стоимость: комиссия за газ. Голосование было легитимным. Код сделал ровно то, что ему велели. В этом и ужас, и урок разом.

Покажу, где ломается демократия кода — и как хорошие проекты бронируются от этого.

Ядро слабости: один доллар — один голос

Большинство DAO используют голосование, взвешенное по токенам. Твоя власть равна твоему балансу токенов. Держишь 5% предложения — отдаёшь 5% голосов. Звучит честно: каждый с долей получает пропорциональный голос.

Но прочти ещё раз. Это не «один человек — один голос». Это «один токен — один голос». Что, поскольку токены покупаются за деньги, схлопывается в «один доллар — один голос».

Это единственное проектное решение — тот самый шов, через который входит почти любая атака захвата. Если голоса следуют за долларами, то управление DAO децентрализовано ровно настолько, насколько децентрализовано распределение токена — а большинство распределений не децентрализованы вовсе. Горстка ранних инвесторов, фондов и команда-основатель часто держат контрольный кусок. «Сообщество» голосует, но решают киты.

Кто способен собрать больше половины активной голосующей силы — владеет машиной. И есть три способа её собрать.

Три двери захвата

Дверь первая: кит. Кто-то просто накапливает достаточно токенов, чтобы качать голосования. Крупный фонд, биржа, голосующая депозитами клиентов, или команда-основатель, которая на деле так и не отпустила руль. Атака не нужна — нужен достаточно толстый кошелёк. Во многих DAO явка так низка, что контроля даже над 10–20% предложения хватает для протаскивания решений, потому что большинство держателей не голосуют вообще. Кворум задали низким — апатия доделала остальное.

Дверь вторая: флеш-рейд. Паттерн Beanstalk. Тебе не нужно владеть токенами — тебе нужно подержать их один блок. Займи состояние, купи governance-токен, проголосуй, исполни, продай, верни. Если DAO позволяет голосовать токенами, добытыми в тот же миг, её демократию можно арендовать посекундно. Это чистейший governance-эксплойт: правила соблюдены идеально — и именно поэтому он сработал.

Дверь третья: собственно governance-эксплойт. Здесь атакующий не давит голосом — он играет на механике. Вредоносное предложение, замаскированное под рутинную смену параметра. Порог кворума настолько низкий, что скоординированное меньшинство проскакивает предложение, пока все спят. Система делегирования, где несколько делегатов тихо держат тысячи доверенных голосов. Предложение, которое выглядит как одно, а в мелком шрифте calldata делает другое. Эксплойт не в токенах — он в процессе.

Наша запись. Код — это Хека: творящее слово, речение, что становится реальным в миг, как произнесено. DAO превращает управление в Хеку: голос произнесён — и контракт являет его в мир, и нет человека, чтобы сказать «стой, это неправильно». В этом и сила, и опасность разом. Честное слово строит Маат — порядок, равновесие, истину. Отравленное слово, произнесённое украденным большинством, строит Исфет столь же верно. Весы не судят намерение. Они взвешивают то, что на них положено. Поэтому всё искусство хорошей DAO — стеречь то, что кладут на Весы, и замедлять руку, тянущуюся положить.

Как бронируются хорошие

Вот дверь — потому что DAO не беззащитны, и лучшие из них уже залатали большинство этих дыр.

Timelock (задержка исполнения). Важнейшая защита. Когда предложение проходит, оно не исполняется сразу. Оно сидит в очереди — 24 часа, 48, неделя — прежде чем код запустится. Это убивает флеш-рейд наповал: нельзя занять деньги на один блок и при этом ждать неделю до исполнения. И это даёт сообществу время увидеть вредоносное предложение и ответить. Timelock превращает «мгновенно и необратимо» в «отложенно, видимо, оспоримо».

Роли veto и стража. Доверенный мультисиг или совет, способный отменить явно вредоносное предложение в окне timelock. Да, это возвращает толику человеческой власти — но узкое право вето, которое может только остановить вред, но никогда его причинить, — разумный автомат защиты. Лучшие схемы дают стражу возможность жать на тормоз, но никогда — на газ.

Кворум и пороги, заданные честно. Требуй, чтобы для зачёта голосования участвовала реальная доля всего предложения, и задай порог внесения предложений достаточно высоким, чтобы случайный адрес не спамил вредоносными. Апатия явки — поверхность атаки; хорошо подобранный кворум её сужает.

Vote-escrow и залоченные по времени токены. Сделай голосующую силу зависящей не только от того, сколько токенов ты держишь, но и от того, как долго ты их залочил. Кто закоммитил токены на четыре года — у того шкура в игре. Флеш-рейдер, держащий один блок, получает нулевой вес голоса. Это прямо разрезает шов «один доллар — один голос»: теперь надо доказать ещё и время, и приверженность, а не только деньги.

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

Более глубокое лечение

Каждая броня выше — патч на один и тот же корневой баг: голосование, взвешенное по токенам, приравнивает деньги к легитимности. Можно поднять timelock, настроить кворум, добавить стража — и нужно — но ты всё ещё играешь в защите на поле, наклонённом к тому, у кого больше капитала.

Настоящее лечение — сменить то, что голос представляет. Взвесь его по личности, по вкладу, по закоммиченному времени — по чему угодно, что труднее скупить оптом, чем токен. Сдвинься от «один доллар — один голос» к «один подтверждённый человек — один голос», и ключевое преимущество кита испаряется. Это фронтир дизайна, в который вламываются сильнейшие проекты.

Никогда — мрак без двери. Так что вывод не «DAO сломаны». Вывод такой: прежде чем доверить DAO свой капитал или свой голос, прочти её защиту. Есть ли timelock? Страж с правом вето? Честный кворум? Голосование, залоченное по времени? Один доллар равен одному голосу — или найден способ обойти это?

Задай эти вопросы — и отличишь крепость от фасада за пять минут. Код — это закон, так научись читать закон, прежде чем жить под ним.