Что такое смарт-контракт и 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 хранит данные и считает газ.