Что такое смарт-контракт и Ethereum

Программа, которую нельзя остановить, подделать или потерять — она живёт в блокчейне Ethereum.
«Code is law»: смарт-контракт исполняется ровно так, как написан, без права на «давай переделаем». Поэтому в Solidity ошибка стоит дороже, чем в любом другом языке.

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

Зачем это нужно? Чтобы стороны, которые друг другу не доверяют, могли договориться без посредника. Биржа, кредитный протокол, голосование, токен — всё это контракты, которые исполняют правила автоматически. Никто не может «отозвать» перевод или незаметно дописать себе миллион токенов: правила зашиты в байт-код и публичны.

Ethereum как «мировой компьютер»

Ethereum часто называют мировым компьютером. У него есть единое глобальное состояние — таблица всех аккаунтов с их балансами и данными. Это состояние меняют транзакции, а правила перехода описывает виртуальная машина EVM (Ethereum Virtual Machine). Каждый узел сети независимо прогоняет одни и те же транзакции и приходит к одному и тому же состоянию — так достигается консенсус.

        Пользователь (кошелёк)
              |
              |  подписанная транзакция
              v
        +-------------+        +------------------+
        |   Сеть      | -----> |  Узлы исполняют  |
        | Ethereum    |        |   EVM-байткод    |
        +-------------+        +------------------+
              |                        |
              |  новый блок            v
              v                +------------------+
        Глобальное   <-------- | Состояние        |
        состояние             | (балансы, данные) |
                              +------------------+

Аккаунты двух видов

В Ethereum есть два типа аккаунтов. EOA (externally owned account) — обычный кошелёк, которым управляет человек через приватный ключ. Контрактный аккаунт — это код, у него нет ключа, он «оживает» только когда кто-то его вызывает. У обоих есть адрес (20 байт), баланс в ETH и nonce.

Как работает под капотом (EVM/газ)

Когда вы отправляете транзакцию, она попадает в мемпул, валидаторы включают её в блок, и каждый узел исполняет её в EVM. EVM — это стековая машина: она не знает про «функции» и «переменные», она знает про опкоды (ADD, SSTORE, CALL). Компилятор Solidity превращает ваш человекочитаемый код в эти опкоды. За каждый опкод платится газ — единица вычислительной работы. Газ умножается на цену газа и оплачивается в ETH. Это защита от бесконечных циклов: если газ кончился — транзакция откатывается целиком.

# Та же логика на Python: как меняется глобальное состояние
# Состояние = словарь адрес -> баланс (в условных единицах)
state = {"alice": 100, "bob": 0}

def apply_transfer(state, sender, to, amount, gas_limit):
    gas_used = 21000  # базовая стоимость перевода
    if gas_used > gas_limit:
        print("OUT OF GAS: транзакция откачена, состояние не изменилось")
        return state
    if state.get(sender, 0) < amount:
        print("REVERT: недостаточно средств")
        return state
    state[sender] -= amount
    state[to] = state.get(to, 0) + amount
    print(f"OK: {sender}->{to} на {amount}, газ {gas_used}")
    return state

state = apply_transfer(state, "alice", "bob", 40, gas_limit=30000)
print(state)

«Та же логика на Python ▶». Обратите внимание: при нехватке газа или средств состояние возвращается нетронутым — это и есть атомарность транзакции в Ethereum.

Частые ошибки

  • Думать, что контракт можно «отредактировать» после деплоя. По умолчанию код неизменяем — изменения возможны только через паттерны прокси, заложенные заранее.
  • Путать ETH (валюту сети) и токены (записи внутри контрактов). У токена ERC-20 нет «собственного» баланса в сети — это просто число в маппинге контракта.
  • Считать, что данные в контракте приватны. Всё состояние публично читается любым узлом, даже переменные с модификатором private.

Best practices

  • Считайте каждую строку дорогой: и по газу, и по риску. Минимализм — это безопасность.
  • Прежде чем писать код, опишите на бумаге, кто и какие транзакции может слать и что меняется в состоянии.
  • Никогда не храните секреты (пароли, ключи) в контракте — блокчейн публичен.

Итоги

Смарт-контракт — это публичная, неизменяемая программа в Ethereum, меняющая глобальное состояние через атомарные транзакции, за которые платят газом. Solidity — язык, на котором мы её пишем. Дальше разберём, как именно EVM хранит данные и считает газ.

Проверьте себя
1. Что произойдёт со состоянием контракта, если в середине транзакции закончится газ?
AСостояние сохранится частично, до места ошибки
BТранзакция откатится целиком, состояние не изменится
CУзел доплатит газ из своего баланса
DКонтракт будет удалён из сети
2. Чем контрактный аккаунт отличается от EOA?
AУ контракта есть приватный ключ, у EOA нет
BУ контракта нет приватного ключа — он исполняется только при вызове
CКонтракт не имеет адреса
DEOA не может хранить ETH