Смарт-контракты: программа как обязательство
Bitcoin умел программировать деньги через Script, но нарочно скупо: без циклов, без состояния между транзакциями. Ethereum пошёл в другую крайность: полноценный язык, полная по Тьюрингу виртуальная машина, программы, которые живут в цепи и хранят своё состояние. Это открывает целый класс приложений и целый класс новых способов потерять деньги. Начнём с того, что такое смарт-контракт и почему он и мощь, и опасность разом.
Идея
Термин придумал Ник Сабо ещё в девяностых, задолго до блокчейна: смарт-контракт это программа, которая сама исполняет условия соглашения, без посредника, которому надо доверять. Его любимый пример это торговый автомат: бросил монету, получил банку, никакого продавца.
В Ethereum смарт-контракт это код по своему адресу в цепи. У него есть постоянное состояние (storage), его функции дёргают транзакциями, а результат каждого вызова детерминирован: любой узел, проиграв ту же транзакцию, получит то же состояние. Мы это уже видели: у нашего собственного узла переход состояния был детерминированным (урок 12), просто набор переходов был жёстко зашит. Смарт-контракт это тот же детерминированный переход, но заданный пользовательской программой.
Свойства, из которых всё вытекает
Четыре свойства делают смарт-контракт особенным, и каждое это палка о двух концах:
- Детерминизм. Одинаковый ввод даёт одинаковый результат на любом узле, иначе консенсус развалился бы. Отсюда запрет на случайность и на обращения во внешний мир прямо из контракта.
- Автономность. После деплоя контракт работает сам, никто не обязан его запускать или сопровождать.
- Неизменяемость. Код в цепи нельзя молча переписать. Это гарантия для пользователя и ловушка для автора: баг застывает навсегда (мы уже видели такое с багом
OP_CHECKMULTISIGв уроке 21). - Прозрачность. Байткод и состояние видны всем. Логика открыта, но открыты и уязвимости.
Обрати внимание на связку неизменяемость плюс прозрачность: любой может изучить твой контракт, найти дыру и воспользоваться ею, а ты не можешь просто выпустить патч. Отсюда вся культура аудитов и формальной верификации, к которой ещё вернёмся дальше в курсе.
Рикардианские контракты и оракулы
Два понятия, которые постоянно всплывают рядом.
Рикардианский контракт отвечает на вопрос «а что это значит юридически»: он связывает человекочитаемое соглашение с машинными параметрами так, что подменить одно, не сломав другое, нельзя. Смарт-контракт исполняет, рикардианский ещё и фиксирует намерение.
Оракул решает другую проблему, прямо вытекающую из детерминизма. Контракт не может сам сходить в интернет за курсом доллара: разные узлы получили бы разный ответ, и консенсус сломался бы. Значит, внешние данные обязан положить в цепь кто-то снаружи, транзакцией. Это и есть проблема оракула: контракт надёжен ровно настолько, насколько надёжен источник данных.
Оракулы удобно раскладывать по трём осям:
| Ось | Виды | Пример |
|---|---|---|
| Откуда данные | Софтверные | курс валюты с API биржи, результат матча со спортивного сервиса |
| Хардверные | датчик температуры на складе, GPS-трекер контейнера в логистике | |
| Куда направлены | Входящие | цена ETH попадает в цепь, чтобы контракт-кредит проверил залог |
| Исходящие | контракт зафиксировал оплату, и оракул даёт команду умному замку открыть дверь | |
| Кто отвечает | Централизованные | один сервер компании подписывает и публикует курс |
| Консенсусные | сеть независимых узлов сверяет несколько источников и агрегирует ответ |
Централизованный оракул это единая точка отказа и подкупа, поэтому серьёзные протоколы используют консенсусные: много источников, агрегация, экономические ставки и штрафы за враньё (так устроена сеть Chainlink, к оракулам ещё вернёмся дальше в курсе).
премиум-урок
Продолжение в премиуме: 1 200 ₽ в месяц или 10 000 ₽ в год. Вместе с ним серверные проверки задач и школьные токены AI-коуча.
Оплата пока не подключена: премиум и курсы открываются промокодом.