Смарт-контракты: программы в блокчейне

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

«Код — это закон: смарт-контракт сделает ровно то, что в нём написано, даже если автор имел в виду совсем другое.»

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

Как это работает

Разработчик пишет контракт (чаще на языке Solidity) и публикует его в сети. Контракт получает свой адрес. Теперь любой может вызвать его функции, отправив транзакцию. Сеть выполнит код на каждом узле одинаково и запишет результат в блокчейн. Так работают токены, биржи, игры и многое другое.

За выполнение нужно платить — это газ (gas). Каждая операция стоит немного газа, оплачиваемого в ETH. Чем сложнее вычисление, тем дороже. Газ защищает сеть от бесконечных циклов: если газ кончился, выполнение прерывается.

Как работает под капотом

        Жизненный цикл смарт-контракта

   1. Разработчик пишет код (Solidity)
   2. Публикует -> контракт получает адрес в сети
   3. Пользователь вызывает функцию (транзакция + газ)
   4. Все узлы выполняют код одинаково
   5. Результат записан в блокчейн (необратимо)

Вот как выглядит простейший контракт-копилка на Solidity (показан как текст, исполнять его в браузере нельзя):

// Простой смарт-контракт: счётчик голосов
contract Voting {
    mapping(string => uint) public votes;

    function vote(string memory option) public {
        votes[option] += 1;   // увеличиваем счётчик
    }

    function getVotes(string memory option) public view returns (uint) {
        return votes[option];
    }
}

А теперь смоделируем логику такого контракта на Python, чтобы увидеть, как он «исполняется» детерминированно.

Попробуй сам ▶ Запусти код прямо здесь — он работает в браузере:

# Имитируем смарт-контракт голосования
class VotingContract:
    def __init__(self):
        self.votes = {}

    def vote(self, option):
        self.votes[option] = self.votes.get(option, 0) + 1

    def get_votes(self, option):
        return self.votes.get(option, 0)

contract = VotingContract()
for v in ['Python', 'Python', 'JavaScript', 'Python', 'Rust']:
    contract.vote(v)

print('Python    :', contract.get_votes('Python'))
print('JavaScript:', contract.get_votes('JavaScript'))
print('Rust      :', contract.get_votes('Rust'))
# Контракт всегда даёт один и тот же результат на одних входах

Частые заблуждения

  • «Смарт-контракт — это юридический договор». Нет, это просто код. Слово «контракт» здесь метафора.
  • «Контракт можно поправить после ошибки». Обычно нет: опубликованный код неизменен, и баг остаётся навсегда.
  • «Контракты бесплатны». Каждый вызов стоит газа, а сложные операции могут быть дорогими.

Важно понимать (риски)

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

Разбор: знаменитый случай, когда «код — это закон»

Чтобы прочувствовать, что значит неизменность кода, полезно знать историю одного из первых крупных смарт-контрактов. Это был большой инвестиционный фонд, целиком управляемый кодом, куда тысячи людей вложили эфир. В коде нашлась уязвимость, и злоумышленник вывел через неё огромную сумму — действуя, по сути, строго по правилам, записанным в контракте. Формально он не «взламывал» сеть, а лишь использовал то, что разработчики не предусмотрели.

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

Итоги

  • Смарт-контракт — программа в блокчейне, выполняемая автоматически и неизменно.
  • За выполнение платят газом, который защищает сеть от перегрузки.
  • «Контракт» здесь метафора: это код, а не юридический документ.
  • Ошибку в опубликованном контракте обычно нельзя исправить — отсюда крупные взломы.
Проверьте себя
1. Что такое смарт-контракт?
AЮридический договор на бумаге
BПрограмма, выполняемая в блокчейне автоматически и неизменно
CТип кошелька
DСпособ майнинга
2. Зачем нужен газ (gas) в Ethereum?
AЧтобы охлаждать майнеры
BЭто плата за выполнение операций, защищающая сеть от перегрузки
CДля анонимности
DДля хранения сид-фразы