Аккаунты и состояние Ethereum: EOA, контракты и мировое состояние
Как устроены аккаунты Ethereum: EOA и контрактные, четыре поля аккаунта, мировое состояние, адреса контрактов и единицы wei, gwei, ether.
В этой статье
Чтобы понять, что на самом деле происходит при каждой транзакции, нужно знать, что хранит Ethereum. Ответ такой: таблицу аккаунтов. Каждый перевод, вызов контракта, создание сделки - это изменение записей в этой таблице. Эта статья - фундамент для разделов про EVM и хранилище.
Два вида аккаунтов
| Внешний аккаунт (EOA) | Контрактный аккаунт | |
|---|---|---|
| Кто управляет | закрытый ключ | код контракта |
| Инициирует транзакции | да | нет (только по вызову) |
| Имеет код | нет | да |
| Имеет хранилище | нет | да |
| Пример | ваш кошелёк | контракт эскроу |
EOA (externally owned account) - обычный адрес, управляемый ключом (как ключ связан с адресом). Только EOA могут начать транзакцию. Контракт не может «проснуться» сам: он исполняется, когда его вызвал EOA или другой контракт (что такое смарт-контракт).
Четыре поля аккаунта
Каждый аккаунт в сети описывается четырьмя значениями:
- nonce - для EOA число отправленных транзакций; для контракта число созданных им контрактов. Защищает от повторного воспроизведения и задаёт порядок транзакций (в транзакции).
- balance - баланс в wei (наименьшая единица ETH).
- storageRoot - корень структуры данных, в которой лежит постоянная память контракта. У EOA пуст.
- codeHash - хеш байткода контракта. У EOA - хеш пустой строки.
Сам байткод хранится отдельно, а в аккаунте записан только его хеш.
Единицы: wei, gwei, ether
В Ethereum нет дробных чисел, всё считается целыми.
| Единица | Значение |
|---|---|
| 1 wei | наименьшая единица |
| 1 gwei | 10^9 wei |
| 1 ether (ETH) | 10^18 wei |
Цены на газ измеряют в gwei. Токены ERC-20 тоже хранят целые числа и имеют параметр decimals (у USDC 6, у большинства прочих 18) (о токенах). Поэтому «1 USDC» в контракте - это число 1000000. Подробнее о подводных камнях целочисленной математики: целые числа и округление.
Мировое состояние
Совокупность всех аккаунтов называют мировым состоянием (world state). Это отображение «адрес → аккаунт». Оно хранится в специальной древовидной структуре - дереве Меркла-Патриции (что такое дерево Меркла). Её корень - state root - записан в заголовке каждого блока.
Зачем так сложно? Корень - это «отпечаток» всего состояния: изменение даже одной записи меняет корень. Узлы, посчитав свой корень после блока и сравнив с записанным, мгновенно убеждаются, что пришли к одинаковому результату. Это и есть проверка консенсуса.
Как транзакция меняет состояние
Состояние меняется только транзакциями. Каждый блок - это шаг от старого состояния к новому:
- Берётся состояние предыдущего блока.
- Последовательно выполняются транзакции из блока (EVM выполняет их).
- Получается новое состояние и новый state root.
Если транзакция отклоняется (например, ошибка в контракте), её изменения откатываются, но комиссия за газ всё равно списывается.
Как получается адрес контракта
Адрес контракта вычисляется детерминированно, и узнать его можно ещё до создания.
- Обычное создание (CREATE): адрес - последние 20 байт
keccak256(rlp(отправитель, nonce)). - CREATE2: последние 20 байт
keccak256(0xff ‖ отправитель ‖ соль ‖ keccak256(код инициализации)). Это позволяет получить один адрес в разных сетях (как это использует Coin-Trust).
Именно поэтому контракт эскроу имеет адрес 0x6462DDDc0a3D893A7C17f94410e2d27162a390aD одинаково в Ethereum, Base, Polygon и BNB Chain.
Чтение состояния: бесплатно
Чтение (eth_call, eth_getBalance) не создаёт транзакцию и ничего не стоит: узел просто смотрит в своё состояние. Платить нужно только за изменение. Вот почему интерфейс может бесплатно показывать вам сделки, а подпись и комиссия нужны лишь для действий.
Пример: что меняется при создании сделки
Анна создаёт оферту с 500 USDC:
- nonce Анны (EOA) увеличивается на 1.
- Баланс Анны в ETH уменьшается на оплату газа.
- В контракте USDC уменьшается запись баланса Анны и увеличивается запись баланса эскроу.
- В контракте эскроу добавляется запись сделки в хранилище и увеличивается счётчик.
Четыре аккаунта, множество записей - но всё в рамках одной атомарной операции: либо всё применится, либо ничего.
Что почитать дальше
Заглянем в «процессор» сети: EVM изнутри. А если интересует, как хранятся данные контракта, - раскладка хранилища.
Читайте также
- 3 · Под капотом
EVM изнутри: стек, память, storage, calldata и стоимость газа
Как виртуальная машина Ethereum исполняет смарт-контракт: стековая архитектура, области данных, опкоды, цена операций и почему упаковка storage экономит деньги.
4 мин чтения - 3 · Под капотом
Раскладка хранилища и упаковка переменных в Solidity
Как контракт хранит данные в слотах по 32 байта, как упаковываются переменные, где лежат mapping и массивы и как устроена структура сделки Coin-Trust.
4 мин чтения
Упоминается в статьях
- Bitcoin и Ethereum: в чём разница и почему сделки строят на Ethereum
- Хеш-обязательство: как зафиксировать условия сделки, не раскрывая их
- ERC-20 с нуля: пишем токен на Solidity и разбираем каждую строку
- Целочисленная математика и округление в смарт-контрактах
- Деревья Меркла и доказательства: как проверять миллионы данных одним хешем
- Абстракция аккаунтов (ERC-4337): умные кошельки и спонсирование газа
Готовы попробовать?
Создайте первую сделку за пару минут. Деньги блокируются в смарт-контракте и выплачиваются по правилам, которые видны заранее.

