Post
This post by its id.
https://api.web3aggregator.io/api/v1/posts/19364 curl -H "Authorization: Bearer $W3A_API_KEY" 'https://api.web3aggregator.io/api/v1/posts/19364'
Needs a key: W3A_API_KEY in your environment.
The API gives this message alone: an album's other parts are posts of their own there, linked by album.
API docsЧасть 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
Это первое предложение, которое вводит новый расчет при добавлении новых данных в состояние блокчейна.
Оно включает в себя:
- создание контракта через
- перевод ETH на адрес, которого еще не было, что инициирует создание аккаунта
- первую запись в слот (изменение значения с нуля на что-то) с использованием опкода
- некоторые другие операции, связанные с
Математику изменений можно посмотреть в таблице и коде любого клиента ноды, но основная суть в том, что вводится "магическая переменная" 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 опкоды и прекомпайлы и так укладываются в целевую скорость. Дорожает только то, что ложится на диск.
Логика простая: чтобы ноды не утонули в данных, создавать новое состояние - дорого, а менять существующее чуть-чуть дорого. 😂
Это грандиозная переделка и при этом обратно несовместимое изменение, которое требует планового обновления сети.
Что стоит проверить разработчикам:
•
• если вы закладываете ровно 21_000 на любой перевод ETH, сервис сломается на переводе на новый адрес
• захардкоженные лимиты газа в контрактах и скриптах могут перестать покрывать исполнение, транзакции будут фейлиться
• замеры газа через разницу
#павел_найданов
🤟 Сайт | ТГ-канал | Наш чат
В этот раз работы по газу было проделано много, первые три нововведения рассмотрим в этом посте.
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).#павел_найданов
🤟 Сайт | ТГ-канал | Наш чат