Как работает блокчейн, EVM, типы аккаунтов, транзакции и газ — фундамент для понимания смарт-контрактов
Прежде чем писать смарт-контракты, нужно понять среду, в которой они живут
Блокчейн — это распределённая база данных, которая хранит записи в виде цепочки блоков. Ключевые свойства: децентрализация (нет единого владельца), неизменяемость (записанное нельзя удалить) и прозрачность (любой может проверить историю).
Представьте бухгалтерскую книгу, копию которой хранят тысячи участников по всему миру. Изменить запись в такой книге невозможно без одобрения большинства — именно на этом строится доверие без посредников.
Ethereum пошёл дальше Bitcoin: к транзакциям добавили программируемость. Теперь блокчейн может хранить не только записи о переводах, но и код, который выполняется автоматически при выполнении условий. Этот код называют смарт-контрактами.
EVM — это виртуальный процессор, который выполняет байткод смарт-контрактов. Важное свойство: EVM детерминирована — один и тот же код при одних и тех же входных данных всегда даёт одинаковый результат на любом узле сети.
Когда вы пишете на Solidity, компилятор превращает его в байткод EVM — набор низкоуровневых инструкций (опкодов). Каждый опкод стоит определённое количество газа — единицы измерения вычислительной работы.
В Ethereum существует два типа аккаунтов.
EOA (Externally Owned Account) — обычный кошелёк, которым управляет человек через приватный ключ. У EOA есть баланс ETH, но нет кода. Только EOA может инициировать транзакции.
Контрактный аккаунт — аккаунт, который создаётся при деплое смарт-контракта. У него тоже есть баланс ETH, но главное — у него есть код и хранилище (storage). Контракт не может сам инициировать транзакцию — он реагирует на вызовы.
Каждый аккаунт в Ethereum имеет 4 поля: nonce, balance, codeHash и storageRoot. У EOA codeHash — это хэш пустой строки.
Транзакция — это подписанное сообщение от EOA, которое изменяет состояние блокчейна. Транзакция может:
to пустое)Структура транзакции включает: отправителя (подпись), получателя (to), сумму (value), данные (data), gasLimit и gasPrice (или maxFeePerGas в EIP-1559).
Газ — это плата за вычислительные ресурсы. Каждый опкод EVM стоит определённое число единиц газа. Итоговая стоимость транзакции в ETH вычисляется как gasUsed × gasPrice.
gasLimit — максимальное количество газа, которое вы разрешаете потратить на транзакцию. Если газ закончился раньше завершения операции, транзакция откатывается, но потраченный газ не возвращается — вы заплатили за работу, которую узлы уже проделали.
Nonce — счётчик транзакций аккаунта, начинается с 0. Каждая новая транзакция должна иметь nonce на 1 больше предыдущей. Это защищает от replay-атак: нельзя отправить одну и ту же транзакцию дважды.
Традиционный финансовый контракт требует посредников — банков, юристов, регуляторов. Смарт-контракт исполняется автоматически, когда выполняются прописанные условия, без возможности вмешательства третьей стороны.
Примеры применения:
Ключевое ограничение: смарт-контракт не может сам получать данные из внешнего мира (цены акций, погода, результаты матчей). Для этого используют оракулы — Chainlink, Pyth. Об этом подробнее в теме про DeFi-паттерны.
После перехода на Proof of Stake в сентябре 2022 (The Merge) Ethereum выбирает валидаторов случайным образом для предложения следующего блока. Валидатор должен иметь минимум 32 ETH в стейке. Комитет других валидаторов аттестует блок. Финальность транзакции (когда её уже нельзя отменить) наступает примерно через 2 эпохи (~13 минут).
Блоки в Ethereum появляются каждые ~12 секунд (slot time), что важно учитывать при разработке — block.timestamp меняется дискретно, а не плавно.
Вопросы ещё не добавлены
Вопросы для этой подтемы ещё не добавлены.