Ключевые выводы
- Смарт-контракт обеспечивает перемещение ончейн-активов, и не более того. Он не может принудить ни к чему в физическом мире.
- «Код — это закон» в буквальном смысле: ошибка исполняется в точности так, как написана, а неизменяемость означает, что она может остаться навсегда.
- Большинство потерь восходит к ошибкам проектирования и контроля доступа или к некорректным внешним данным, а не к взломанной криптографии.
- Обновляемость решает проблему ошибок, возвращая в схему доверенную сторону, — это компромисс, а не исправление.
Словосочетание «смарт-контракт» берёт на себя много незаслуженной работы. Оно намекает на что-то юридическое, что-то разумное, что-то, что следит за соблюдением договорённости. На деле разворачивается программа, хранящаяся в блокчейне: она запускается по вызову и перемещает активы согласно собственному коду. Понимание разрыва между названием и механизмом объясняет большую часть рисков.
Что на самом деле разворачивается в сети
Смарт-контракт — это код и хранимые данные, живущие по определённому адресу в блокчейне. Кто угодно может отправить ему транзакцию, вызывающую одну из его функций. Каждый узел исполняет один и тот же код над одним и тем же состоянием и приходит к одному и тому же результату — именно поэтому исход можно проверить, а не принимать на доверие.
Исполнение стоит комиссии, обычно пропорциональной объёму выполненной вычислительной работы. Эта комиссия — не бухгалтерская мелочь: она ограничивает практически достижимую сложность ончейн-логики и подталкивает разработчиков к минималистичным контрактам, где как можно больше вынесено за пределы блокчейна. Из этого же следует, что контракт может завершиться неудачей просто потому, что посреди исполнения у него закончился бюджет.
Отсюда следуют два свойства. Исполнение детерминировано: одни и те же входные данные всегда дают один и тот же результат. И в большинстве блокчейнов развёрнутый код неизменяем — то, что вы развернули, будет работать всегда.
Что смарт-контракт действительно обеспечивает
Внутри своего блокчейна контракт обеспечивает исполнение правил очень жёстко. Он может держать активы и выдавать их только при выполнении заявленных условий. Он может задавать порядок действий, так что второй шаг не произойдёт раньше первого. Он может обеспечивать арифметические правила — например, предел эмиссии или график выпуска. Он может обеспечивать контроль доступа, ограничивая вызов функций конкретными адресами. И всё это — без оператора, который может передумать.
Это реальная возможность. Эскроу, который не может разграбить посредник, эмиссия токена, которую никто не может незаметно раздуть, и автоматизированный маркет-мейкинг, работающий без книги заявок, — всё это подлинные достижения такой модели. Ценность возникает из устранения человеческого усмотрения, а не из добавления интеллекта.
Чего он не может
У контракта нет органов чувств. Он не видит, что доставка пришла, что груз прошёл таможню или что услуга оказана. Он знает только то, что записано в состояние его блокчейна. Любое взаимодействие с физическим миром требует, чтобы кто-то это засвидетельствовал, — и с этого момента вы доверяете свидетелю.
У контракта нет и рычагов принуждения. Он не может изъять имущество, обратить взыскание на заработную плату или заставить кого-то что-то сделать. Если договорённость нужно исполнять в отношении человека, а не пула ончейн-активов, код этого не даёт. На практике это значит, что смарт-контракты хорошо работают там, где весь предмет соглашения уже находится в блокчейне, и работают тем хуже, чем дальше вы от этого уходите.
Не способен контракт и на суждение. Он не распознает, что контрагент действовал недобросовестно, оставаясь в рамках буквы условий, или что обстоятельства изменились так, как никто не предвидел. Человеческие договоры держатся на толковании. У кода толкования нет.
Где на самом деле концентрируется риск
Лежащая в основе криптография редко бывает проблемой. Сбои скапливаются в нескольких узнаваемых местах.
Логика, которая делает написанное, а не задуманное
Классический пример — функция, в которую можно войти повторно до того, как она закончит обновлять собственный учёт, что позволяет вызывающей стороне многократно снимать средства с баланса, который ещё не уменьшен. Код отработал корректно. Ошибочной была сама конструкция. А неизменяемость затем делает такую ошибку постоянной, если в контракт заранее не заложен аварийный путь.
Контроль доступа
Многие инциденты сводятся к привилегированной функции, доступ к которой не был должным образом ограничен, или к административному ключу, который оказался мощнее либо хуже защищён, чем предполагали пользователи. Контракт может быть безупречен в основной логике, тогда как адрес владельца тихо сохраняет возможность вывести из него всё.
Некорректные входные данные
Контракты, которые обращаются к ценам, ставкам или результатам событий, зависят от оракулов. Если цена читается из источника, которым можно дёшево манипулировать, атакующий искажает входные данные и позволяет контракту нанести ущерб вместо себя. Контракт при этом всё время ведёт себя корректно.
Композиция протоколов
Протоколы строятся друг на друге, и контракт, безопасный сам по себе, может оказаться небезопасным, когда другой контракт способен вызывать его в неожиданной последовательности в рамках одной транзакции. Эмерджентное поведение набора по отдельности исправных компонентов — один из самых трудных для анализа классов риска.
Неизменяемость как обоюдоострое свойство
Именно благодаря неизменяемости смарт-контракту можно доверять, не доверяя его автору. И по той же причине ошибка в нём может оказаться неисправимой. Команды отвечают на это обновляемыми схемами, таймлоками, которые откладывают изменения, давая пользователям время выйти, и мультиподписью для административных ключей. Каждая из этих мер — сознательно выбранное частичное возвращение доверия к людям.
Нет такой конфигурации, которая убирала бы этот компромисс. Полная неизменяемость означает полную привязку к тому, что было развёрнуто. Обновляемость означает, что кто-то может менять правила. Честная позиция — знать, какую модель использует конкретный протокол, у кого находятся ключи и какая задержка предусмотрена до вступления изменений в силу.
Где это соприкасается с майнингом и консенсусом
Контракты исполняются внутри блоков, а значит, их гарантии не сильнее гарантий окончательности расчётов у самого блокчейна. В сети, где реорганизации обходятся дёшево, транзакция, выглядевшая окончательной, может быть отменена, а вместе с ней уйдёт и любое состояние контракта, которое от неё зависело. Поэтому безопасность блокчейна — обеспеченная ли накопленным Proof of Work (доказательством работы) или внесённой в стейкинг долей — является частью модели безопасности контракта, а не отдельной темой. Подробнее эта связь разобрана в нашем разделе о блокчейн-технологиях.
Практический способ оценить контракт
Перед взаимодействием с контрактом основную работу делают несколько вопросов. Верифицирован ли исходный код и доступен ли он для чтения — или опубликован только скомпилированный бинарник? Обновляем ли контракт, и если да, кто и насколько быстро может его обновить? От каких внешних данных он зависит и откуда эти данные берутся? Проводился ли аудит, для какой версии кода и были ли устранены найденные замечания? Какой объём средств он удерживал и как долго?
Ничто из этого не гарантирует безопасность. Это лишь переводит вас от доверия к описанию к оценке механизма — и это максимум того, что честно доступно. Сопутствующую терминологию смотрите в глоссарии, а о том, как мы в целом подходим к таким материалам, — в нашей методологии. Ничто из сказанного не является финансовой рекомендацией.
Часто задаваемые вопросы
Являются ли смарт-контракты юридически обязывающими договорами?
Как правило, нет — во всяком случае не в том смысле, который подразумевает название. Юридический договор — это соглашение сторон, которое может истолковать суд, а суды регулярно смотрят на намерение, справедливость и контекст. Смарт-контракт — это программа, которая перемещает активы при выполнении условий, записанных в её коде, без толкования и без права обжалования. Одно с другим вполне может сосуществовать, и некоторые схемы сознательно сочетают письменное соглашение с ончейн-исполнением. Но само по себе название «контракт» не придаёт коду юридической силы, а восприятие этого ярлыка как правовой гарантии — распространённое и дорогое заблуждение.
Почему нельзя просто исправить смарт-контракт с ошибкой?
В большинстве блокчейнов код развёрнутого контракта изменить нельзя. Это сделано намеренно: гарантия того, что правила не поменяются у вас под ногами, составляет значительную часть ценности. Команды обходят это прокси-схемами, где небольшой постоянный контракт перенаправляет вызовы на заменяемую реализацию. Это возвращает возможность исправлять ошибки, но одновременно означает, что тот, кто контролирует ключ обновления, может изменить правила. Вы обменяли риск неисправимой ошибки на риск доверенного администратора. Бесплатных вариантов здесь нет, и пользователям стоит понимать, какой именно они принимают.
Что такое оракул и почему он так важен?
Оракул — это любой механизм, который приносит в блокчейн внешнюю информацию: цену, результат матча, подтверждение доставки. Контракты не видят ничего за пределами своего блокчейна, поэтому всё, что ссылается на реальный мир, зависит от оракула. Это делает оракул несущим допущением о доверии. Если он сообщит неверное или подделанное значение, контракт корректно и необратимо на него отреагирует. Заметная доля потерь в децентрализованных финансах связана именно с манипулированными или взятыми из скудных источников ценовыми данными, а не с изъянами в логике самих контрактов.
Означает ли аудит, что контракт безопасен?
Он означает, что квалифицированные специалисты искали проблемы в рамках оговорённого объёма работ и отведённого времени и сообщили о том, что нашли. Это полезно, но это не гарантия. Аудиты могут пропустить проблему, из объёма проверки может выпасть именно тот компонент, который потом откажет, а контракты часто меняются уже после проверки. Особенно трудно выявлять экономические и теоретико-игровые сбои, когда каждая функция работает так, как написана, но стимулы складываются неудачно. Читайте сам отчёт, а не значок об аудите: что проверялось, на каком коммите, что было найдено и были ли замечания действительно исправлены.
Exploring blockchain, crypto, and DeFi innovation. Ex-fintech analyst turned journalist, spotlighting real-world use cases of blockchain. Writer at Cryptocurrency Miners.