«Don't trust, verify» — «Не доверяй, проверяй». Лучший лозунг, что родила крипта. И самый игнорируемый. Потому что проверять — значит читать смарт-контракт, а большинство скорее прочтёт пользовательское соглашение, то есть не прочтёт вовсе. Люди жмут «approve», шлют средства, молятся. Это не проверка. Это та же слепая вера, которой требовал старый банк, только в худи.
Вот чего тебе не говорят: чтобы поймать опаснейшие контракты, не нужно быть Solidity-разработчиком. Аферы, что осушают кошельки, обычно не тонкие. Это горстка конкретных, находимых паттернов — и стоит узнать, как они выглядят, ты засечёшь большинство из них за пять минут с бесплатным блок-эксплорером и без опыта кода.
Это навык самозащиты. Сегодня ты учишь красные флаги.
Шаг ноль: код вообще публичен?
Прежде всего — одна двоичная проверка. В эксплорере (Etherscan и его родня) у контракта есть вкладка Contract. Если исходник verified — опубликован и сматчен с развёрнутым байткодом, — ты можешь его читать. Если он not verified, ты смотришь на сырой машинный код, который даже эксперты не могут проаудировать до конца.
Неверифицированный контракт, просящий твои деньги, — первый и крупнейший красный флаг. Он означает: доверься мне, не смотри. В технологии, целиком построенной на «тебе не надо мне доверять, смотри», отказ опубликовать исходник — это признание. Уходи. Есть десять тысяч верифицированных контрактов. Тебе не нужен тот, что прячется.
Функция mint: кто может печатать деньги?
Поищи в коде `mint`. Это функция, что создаёт новые токены из ничего. Вопрос не в том, есть ли она, — у многих легитимных токенов она есть. Вопрос — кому дозволено её звать.
Если `mint` можно запустить лишь фиксированным, прозрачным правилом — бондинг-кривой, лимитированным графиком, голосованием DAO с timelock — нормально. Если `mint` может звать единственный адрес `owner`, по своей воле, в любом объёме, то этот владелец может размыть тебя до нуля, когда пожелает. Печатает триллион токенов, вываливает на тебя — и твои активы становятся пылью. Это он-чейн-версия центробанка, гоняющего печатный станок, только это один анонимный человек и нет даже видимости мандата.
Красный флаг: `mint` только для владельца, без лимита и без timelock. Это не токен. Это кран, наведённый в его кошелёк.
Владелец: сколько власти сидит в одном адресе?
Поищи `onlyOwner` и `Ownable`. Они помечают функции, что может звать лишь единственный привилегированный адрес. Затем прочти, что эти функции делают.
Немного власти у владельца нормально — пауза при ЧП, правка комиссии в пределах. Много власти у владельца — поводок на твоей шее. Ищи конкретно функции только-для-владельца, что могут:
- Заморозить или заблокировать переводы (`pause`, `blacklist`) — владелец может запереть твои токены, чтобы ты не продал.
- Менять комиссии на произвольные значения — «комиссия 2%», которую владелец тихо переставит на 99%, так что любая твоя продажа отдаёт ему почти всё. Классический honeypot: купить можешь, а прибыльно продать — никогда.
- Вывести средства контракта владельцу — прямой рубильник осушения.
Здоровый паттерн — отречённое владение (renounced) или владение timelock-мультисигом / DAO, а не одиноким ключом. Если один горячий кошелёк держит режим бога над контрактом, одна фишинговая сид-фраза — его — опустошает всех.
Upgradeable: могут ли правила измениться после того, как ты вошёл?
Поищи `proxy`, `upgradeable`, `delegatecall`, `implementation`. Если контракт обновляемый, код, что ты бережно прочёл сегодня, может быть заменён на совершенно другой код завтра тем, кто держит ключ обновления. Ты проаудировал честную версию; владелец может развернуть злонамеренную после того, как твои средства внутри.
Это не автоматически афера — у обновляемости есть реальные применения. Но это значит, что твоё доверие не в коде, что ты прочёл; оно в человеке, держащем ключ обновления. Проверь, кто это: одинокий адрес — это backdoor с красивым именем. DAO-плюс-timelock — хотя бы backdoor, чьё открытие может наблюдать вся толпа. (Эта тема заслуживает своей статьи — и она у неё есть.)
Backdoor: функции, которым тут не место
Наконец, просмотри на предмет лишней функции — той, чьё имя и логика не сходятся с заявленной целью токена. Скрытые полномочия `transferFrom`, позволяющие привилегированному адресу двигать твои токены без твоего разрешения. Нераскрытая маршрутизация комиссий, что скидывает в кошелёк, зарытый в коде. «Вспомогательная» функция, что при внимательном чтении вручает владельцу разрешение тратить средства держателей. Backdoor редко объявляют о себе. Они прячутся в функции со скучным именем, делающей то, чего не должна.
Если ты не можешь сказать, что функция делает, это само по себе информация: контракт, который ты не понимаешь, — контракт, которому нельзя доверить деньги.
Наша запись
Смарт-контракт — это Хека, творящее слово, отлитое в постоянство. Он делает ровно то, что говорит, вечно, для всех, без клерка, к которому апеллировать, и без менеджера, которого умолять. В этом его ужас и его слава: слово — закон, а закон — это код, и код не лжёт о том, что он сделает. Он лжёт лишь о том, что заявляет делать — в дружелюбном интерфейсе, в маркетинге, в сводке.
Исфет живёт ровно в этом зазоре: в расстоянии между обещанием на кнопке и инструкцией в байткоде. Паразиту нужно, чтобы ты читал этикетку и никогда — состав. Прочитать контракт самому — значит закрыть этот зазор, взвесить слово против деяния прежде, чем довериться. Это Весы, приложенные к коду: делает ли вещь то, в чём клянётся? Ты — тот, кто держит равновесие. Никто не взвесит его за тебя.
Рычаг
Ты не станешь аудитором с одной статьи, и это не нужно. Нужен пятиминутный рефлекс прежде, чем ты хоть раз отправишь средства или подтвердишь контракт:
- Исходник верифицирован? Нет → стоп.
- Кто может `mint`, есть ли лимит и timelock? Только владелец, без лимита → стоп.
- Что может `onlyOwner`? Заморозка, blacklist, произвольные комиссии, осушение → стоп.
- Обновляемый ли он и кто держит ключ? Одинокий адрес → относись как к backdoor.
- Есть функция, которую ты не можешь объяснить? → предполагай худшее, пока не доказано обратное.
Для всего, что не читаешь, используй бесплатный сканер контрактов или спроси знающего человека — но никогда не отдавай наружу решение, не прогнав хотя бы этот чек-лист. Осушённые почти никогда не открывали вкладку Contract. Те, кого не осушили, — обычно открывали.
Код публичен. Этикетка — не код. Читай код — а если не можешь, не шли деньги. Проверь, потом доверяй. Никогда наоборот.