К основному содержимому

Введите слово из вопроса или названия статьи.

3 · Под капотом

Аккаунты и состояние Ethereum: EOA, контракты и мировое состояние

Как устроены аккаунты Ethereum: EOA и контрактные, четыре поля аккаунта, мировое состояние, адреса контрактов и единицы wei, gwei, ether.

3 мин чтенияОбновлено:
В этой статье

Чтобы понять, что на самом деле происходит при каждой транзакции, нужно знать, что хранит Ethereum. Ответ такой: таблицу аккаунтов. Каждый перевод, вызов контракта, создание сделки - это изменение записей в этой таблице. Эта статья - фундамент для разделов про EVM и хранилище.

Два вида аккаунтов

Внешний аккаунт (EOA)Контрактный аккаунт
Кто управляетзакрытый ключкод контракта
Инициирует транзакцииданет (только по вызову)
Имеет коднетда
Имеет хранилищенетда
Примерваш кошелёкконтракт эскроу

EOA (externally owned account) - обычный адрес, управляемый ключом (как ключ связан с адресом). Только EOA могут начать транзакцию. Контракт не может «проснуться» сам: он исполняется, когда его вызвал EOA или другой контракт (что такое смарт-контракт).

Четыре поля аккаунта

Каждый аккаунт в сети описывается четырьмя значениями:

  1. nonce - для EOA число отправленных транзакций; для контракта число созданных им контрактов. Защищает от повторного воспроизведения и задаёт порядок транзакций (в транзакции).
  2. balance - баланс в wei (наименьшая единица ETH).
  3. storageRoot - корень структуры данных, в которой лежит постоянная память контракта. У EOA пуст.
  4. codeHash - хеш байткода контракта. У EOA - хеш пустой строки.

Сам байткод хранится отдельно, а в аккаунте записан только его хеш.

Единицы: wei, gwei, ether

В Ethereum нет дробных чисел, всё считается целыми.

ЕдиницаЗначение
1 weiнаименьшая единица
1 gwei10^9 wei
1 ether (ETH)10^18 wei

Цены на газ измеряют в gwei. Токены ERC-20 тоже хранят целые числа и имеют параметр decimals (у USDC 6, у большинства прочих 18) (о токенах). Поэтому «1 USDC» в контракте - это число 1000000. Подробнее о подводных камнях целочисленной математики: целые числа и округление.

Мировое состояние

Совокупность всех аккаунтов называют мировым состоянием (world state). Это отображение «адрес → аккаунт». Оно хранится в специальной древовидной структуре - дереве Меркла-Патриции (что такое дерево Меркла). Её корень - state root - записан в заголовке каждого блока.

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

Как транзакция меняет состояние

Состояние меняется только транзакциями. Каждый блок - это шаг от старого состояния к новому:

  1. Берётся состояние предыдущего блока.
  2. Последовательно выполняются транзакции из блока (EVM выполняет их).
  3. Получается новое состояние и новый 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:

  1. nonce Анны (EOA) увеличивается на 1.
  2. Баланс Анны в ETH уменьшается на оплату газа.
  3. В контракте USDC уменьшается запись баланса Анны и увеличивается запись баланса эскроу.
  4. В контракте эскроу добавляется запись сделки в хранилище и увеличивается счётчик.

Четыре аккаунта, множество записей - но всё в рамках одной атомарной операции: либо всё применится, либо ничего.

Что почитать дальше

Заглянем в «процессор» сети: EVM изнутри. А если интересует, как хранятся данные контракта, - раскладка хранилища.

Упоминается в статьях

Готовы попробовать?

Создайте первую сделку за пару минут. Деньги блокируются в смарт-контракте и выплачиваются по правилам, которые видны заранее.