Раздел 30 · Web3 на Rust

Смарт-контракты: программа как обязательство

middle~30 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

Смарт-контракты: программа как обязательство

Bitcoin умел программировать деньги через Script, но нарочно скупо: без циклов, без состояния между транзакциями. Ethereum пошёл в другую крайность: полноценный язык, полная по Тьюрингу виртуальная машина, программы, которые живут в цепи и хранят своё состояние. Это открывает целый класс приложений и целый класс новых способов потерять деньги. Начнём с того, что такое смарт-контракт и почему он и мощь, и опасность разом.

Идея

Термин придумал Ник Сабо ещё в девяностых, задолго до блокчейна: смарт-контракт это программа, которая сама исполняет условия соглашения, без посредника, которому надо доверять. Его любимый пример это торговый автомат: бросил монету, получил банку, никакого продавца.

В Ethereum смарт-контракт это код по своему адресу в цепи. У него есть постоянное состояние (storage), его функции дёргают транзакциями, а результат каждого вызова детерминирован: любой узел, проиграв ту же транзакцию, получит то же состояние. Мы это уже видели: у нашего собственного узла переход состояния был детерминированным (урок 12), просто набор переходов был жёстко зашит. Смарт-контракт это тот же детерминированный переход, но заданный пользовательской программой.

Свойства, из которых всё вытекает

Четыре свойства делают смарт-контракт особенным, и каждое это палка о двух концах:

  • Детерминизм. Одинаковый ввод даёт одинаковый результат на любом узле, иначе консенсус развалился бы. Отсюда запрет на случайность и на обращения во внешний мир прямо из контракта.
  • Автономность. После деплоя контракт работает сам, никто не обязан его запускать или сопровождать.
  • Неизменяемость. Код в цепи нельзя молча переписать. Это гарантия для пользователя и ловушка для автора: баг застывает навсегда (мы уже видели такое с багом OP_CHECKMULTISIG в уроке 21).
  • Прозрачность. Байткод и состояние видны всем. Логика открыта, но открыты и уязвимости.

Обрати внимание на связку неизменяемость плюс прозрачность: любой может изучить твой контракт, найти дыру и воспользоваться ею, а ты не можешь просто выпустить патч. Отсюда вся культура аудитов и формальной верификации, к которой ещё вернёмся дальше в курсе.

Рикардианские контракты и оракулы

Два понятия, которые постоянно всплывают рядом.

Рикардианский контракт отвечает на вопрос «а что это значит юридически»: он связывает человекочитаемое соглашение с машинными параметрами так, что подменить одно, не сломав другое, нельзя. Смарт-контракт исполняет, рикардианский ещё и фиксирует намерение.

Оракул решает другую проблему, прямо вытекающую из детерминизма. Контракт не может сам сходить в интернет за курсом доллара: разные узлы получили бы разный ответ, и консенсус сломался бы. Значит, внешние данные обязан положить в цепь кто-то снаружи, транзакцией. Это и есть проблема оракула: контракт надёжен ровно настолько, насколько надёжен источник данных.

Оракулы удобно раскладывать по трём осям:

ОсьВидыПример
Откуда данныеСофтверныекурс валюты с API биржи, результат матча со спортивного сервиса
Хардверныедатчик температуры на складе, GPS-трекер контейнера в логистике
Куда направленыВходящиецена ETH попадает в цепь, чтобы контракт-кредит проверил залог
Исходящиеконтракт зафиксировал оплату, и оракул даёт команду умному замку открыть дверь
Кто отвечаетЦентрализованныеодин сервер компании подписывает и публикует курс
Консенсусныесеть независимых узлов сверяет несколько источников и агрегирует ответ

Централизованный оракул это единая точка отказа и подкупа, поэтому серьёзные протоколы используют консенсусные: много источников, агрегация, экономические ставки и штрафы за враньё (так устроена сеть Chainlink, к оракулам ещё вернёмся дальше в курсе).

премиум-урок

Продолжение в премиуме: 1 200 ₽ в месяц или 10 000 ₽ в год. Вместе с ним серверные проверки задач и школьные токены AI-коуча.

Оплата пока не подключена: премиум и курсы открываются промокодом.