MetaLamp | CIS

Пост

Этот пост по его id.

https://api.web3aggregator.io/api/v1/posts/19364
curl -H "Authorization: Bearer $W3A_API_KEY" 'https://api.web3aggregator.io/api/v1/posts/19364'

Нужен ключ: W3A_API_KEY в окружении.

API отдаёт одно это сообщение: остальные части альбома там — отдельные посты, связанные полем album.

Документация API
Часть 1: Газовая модель - "Состояние блокчейна"

В этот раз работы по газу было проделано много, первые три нововведения рассмотрим в этом посте.

1. EIP-8037: State Creation Gas Cost Increase
2. EIP-8038: State-access gas cost update
3. EIP-2780: Resource-based intrinsic transaction gas

TLDR

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

EIP-8038 пересматривает стоимость доступа к уже существующим данным.

EIP-2780 разбивает фиксированную базовую стоимость транзакции (21_000 газа) на составные части.

Зачем это все?

Абсолютно точно то, что газовая модель фундаментально пересматривается в Glamsterdam. Причина этого, как ни странно, масштабируемость. Увеличение газ-лимита блока до 60 млн. в Fusaka привело к тройному увеличению скорости прироста всего состояния блокчейна. Речь о том, что ежегодно нода будет хранить данных больше на ~116 ГиБ.

При продолжении увеличения газ-лимита до 200 млн. нода будет получать прирост в ~387 ГиБ в год и больше. В будущем это приведет к падению производительности.

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

1️⃣ EIP-8037

Это первое предложение, которое вводит новый расчет при добавлении новых данных в состояние блокчейна.

Оно включает в себя:
- создание контракта через create, create2
- перевод ETH на адрес, которого еще не было, что инициирует создание аккаунта
- первую запись в слот (изменение значения с нуля на что-то) с использованием опкода sstore
- некоторые другие операции, связанные с call, selfdestruct, делегированием вызова для EOA.

Математику изменений можно посмотреть в таблице и коде любого клиента ноды, но основная суть в том, что вводится "магическая переменная" CPSB (cost per state byte), которая равняется 1530 газа.

Теперь цена операции = [сколько байт она добавляет в состояние] × CPSB:

Операция | Байт | Было | Стало
Новый слот | 64 | 20_000 | 97 920 (~5×)
Новый аккаунт | 120 | 25_000 | 183 600 (~7×)
Байт кода при деплое | 1 | 200 | 1 530 (~7,6×)
Контракт 24 КБ целиком | — | ~4,9M | ~37,8M (~8×)

P.S. CPBS взята не с бухты барахты, а рассчитана так, чтобы остановить скорость прироста состояния.

Multidimensional metering


Если вы думаете, что это все, то вы ошибаетесь. Помимо изменения базовых параметров стоимости вводится структурное разделение газа на: execution-gas и state-gas.

Для операций по работе с состоянием используется state-gas, а исполнение (прогнать список опкодов вашего кода) - execution-gas.

На уровне транзакции пользователь платит как за execution-gas, так и за state-gas. Общая стоимость газа для транзакции равна сумме обоих измерений.

Только есть нюанс: лимит газа на одну транзакцию (~16,7M, EIP-7825) теперь применяется только к execution-gas.

Как же теперь считается лимит газа на уровне блока?

Лимит считается отдельно по сумме execution и state gas для всех транзакций, но учитывается максимальное значение из них.

```js
block_gas = max(execution_gas_used, state_gas_used) ≤ gas_limit
```

2️⃣ EIP-8038

Продолжает изменения газовой модели EIP-8038. Он подключается там, где нужно работать с уже существующим состоянием блокчейна: увеличивает стоимость холодного доступа к аккаунту и изменение уже существующих данных.

Количество газа за доступ к данным не менялось с 2021 года (Berlin), а состояние блокчейна с тех пор сильно выросло, и чтение с диска стало медленнее.

Напомню, холодным доступом называется первое обращение к слоту или аккаунту в рамках транзакции, а теплым - повторное.

Теплое обращение дешевле по газу, потому что после холодного доступа данные не требуется читать с диска, они уже в быстром доступе.

Операция | Было | Стало
Холодный доступ к аккаунту | 2_600 | 3_000
Холодный доступ к стораджу | 2_100 | 2_100
Теплый доступ | 100 | 100
Запись в структуру аккаунта (nonce, balance, code hash) | ~6_700 | 9_000
Изменение существующего слота | ~2_800 | 10_000

При этом холодный доступ к стораджу и теплый доступ остаются без изменения.

Если слот имеет нулевое значение, то к нему еще будет добавлен газ из EIP-8037, за создание состояния.

На самом деле изменений в ценовой политике здесь много, в пост не поместится, при необходимости читать EIP.

Помимо этого интересно здесь то, что все клиенты Ethereum (Geth, Nethermind, Besu, Erigon, Reth и др.) написаны при помощи разных языков (Go, C#, Java, Rust) и используют разные базы данных, оптимизации. Хоть все клиенты и посчитают газ за операцию одинаково, но сделают они это с разной скоростью.

Поэтому было принято, что газ за операции задаёт самый медленный клиент - так сеть защищена от блоков, которые клиенты не успевают проверить.

3️⃣ EIP-2780

Сейчас любая транзакция платит фиксированные 21_000 газа, независимо от того, что она реально делает. Перевод без ETH существующему адресу и перевод, который создаёт новый аккаунт, стоят одинаково, хотя второй навсегда увеличивает состояние блокчейна.

Поэтому предлагается разбить 21_000 на составные части:

• 12_000 - это базовая стоимость, которая взимается за проверку подписи, аккаунт отправителя, включение в блок
• 3_000 - взимается за холодный доступ к получателю (как описано в EIP-8038);
• 6_000 - взимается за перевод ETH, который включает в себя запись баланса получателя в структуру аккаунта и лог перевода (это еще один EIP-7708, который пока за рамками нашего поста).


Что же тогда меняется?


• обычный перевод ETH на существующий адрес - 21_000, как раньше
• транзакция без перевода ETH (например, вызов контракта, такой как трансфер ERC-20) - 15_000 + газ за исполнение
• перевод самому себе (так отменяют зависшую транзакцию: новая с тем же nonce и большей комиссией вытесняет старую) - 12_000;
• перевод ETH на новый адрес: 21_000 + 183_600 газа состояния (из EIP-8037);
• деплой контракта: 12 000 (база транзакции) + 12 000 (вычисление и проверка адреса контракта, EIP-8038) + 183_600 за новый аккаунт + 1_530 за каждый байт кода.

Изменение в EIP-2780 было необходимо, потому что без него новый аккаунт можно было бы создать за обычные 21_000 газа и обойти подорожание, описанное в EIP-8037.

Вывод


Glamsterdam фундаментально меняет то, за что мы платим газом.

Раньше газ был усреднённой ценой «за работу», теперь он оплачивает конкретные ресурсы ноды:

• создание нового состояния, которое навсегда ложится на диск каждой ноды (EIP-8037)
• доступ к существующим данным и их изменение (EIP-8038)
• базовую стоимость транзакции, которая теперь зависит от того, что транзакция реально делает (EIP-2780)

На первый взгляд может показаться, что вычисления дорожают, но отдельный анализ (EIP-7904) показал, что после оптимизаций клиентов под BAL опкоды и прекомпайлы и так укладываются в целевую скорость. Дорожает только то, что ложится на диск.

Логика простая: чтобы ноды не утонули в данных, создавать новое состояние - дорого, а менять существующее чуть-чуть дорого. 😂


Это грандиозная переделка и при этом обратно несовместимое изменение, которое требует планового обновления сети.

Что стоит проверить разработчикам:

• eth_estimateGas - обновите ноду или убедитесь, что ваш RPC-провайдер поддерживает новую газовую модель, иначе транзакции будут падать от недооценки газа
• если вы закладываете ровно 21_000 на любой перевод ETH, сервис сломается на переводе на новый адрес
• захардкоженные лимиты газа в контрактах и скриптах могут перестать покрывать исполнение, транзакции будут фейлиться
• замеры газа через разницу gasleft() до и после вызова могут дать отрицательный результат (EIP-8037).

#павел_найданов

🤟 Сайт | ТГ-канал | Наш чат
Часть 1: Газовая модель - "Состояние блокчейна"
Этот каналRUОткрыть в TelegramКанал