Перейти к содержанию

Gas в Ethereum: лимит и стоимость операции

В реестре новая публикация выглядит коротко: сохранить отпечаток и установить флаг. Однако сеть должна выполнить инструкции и записать изменение. Чтобы понимать цену этой операции и возможные ошибки, разберём газ. Нам не понадобится обещать конкретную стоимость: без выполнения на выбранном состоянии такую цифру нельзя считать измеренной.

Для курса 17 будем сравнивать первое объявление выпуска, замену отпечатка и отключение записи. Все три действия связаны с небольшим количеством данных, но выполняют разные переходы состояния. Это полезнее, чем запоминать один пример комиссии и переносить его на любой будущий вызов.

Работа и её цена

Газ измеряет ресурсы исполнения по правилам EVM. Цена единицы газа выражается в единицах валюты сети. Поэтому расход газа и окончательная сумма — разные величины. Аналогично длина маршрута автомобиля и цена топлива вместе определяют расходы, но одно число не заменяет другое.

Лимит газа в транзакции задаёт верхнюю границу разрешённой работы. Он не означает, что вся эта величина обязательно будет израсходована. Если для выбранного исполнения работы недостаточно, возникает ошибка нехватки газа, а изменения такого исполнения не становятся успешным результатом. Если лимит выше необходимого, это не создаёт дополнительную публикацию и не делает вызов более правильным.

Рассмотрим арифметику с условными, не измеренными данными:

Условный расход: 40 000 единиц газа
Условная эффективная цена: 8 gwei за единицу
Сумма: 40 000 × 8 = 320 000 gwei = 0,00032 ETH

Расчёт объясняет единицы. Он не является оценкой нашей функции publish: число 40 000 здесь выбрано для упражнения. Реальный расход зависит от байткода, аргументов, текущего состояния и правил сети. Смысл упражнения состоит в том, чтобы не назвать 40 000 «количеством ETH» и не перепутать gwei с wei.

В Ethereum механизм комиссии разделяет базовую составляющую и правила дополнительного вознаграждения. Параметры максимальной цены определяют предел, который отправитель готов принять. Для совместимых сетей нужно отдельно изучать их модель, включая возможную плату за размещение данных. Одна формула с ценой газа не описывает автоматически все L2.

Почему состояние меняет расход

Первый publish(17, H1) записывает сведения в ранее пустую запись. Следующий publish(17, H2) заменяет уже существующий отпечаток. deactivate(17) меняет флаг, сохраняя отпечаток. Для EVM это разные операции над состоянием, поэтому ожидание одинакового расхода требует доказательства, а не возникает из одинаковой длины названия функции.

Событие публикации тоже использует ресурсы: оно добавляет данные в журнал. Удаление события ради уменьшения расходов изменит возможности внешнего индексатора. Нельзя рассматривать такую оптимизацию отдельно от требований к истории. Иногда разумнее оставить полезный журнал и сократить бессмысленный массив, который никогда не читается.

Сохранение короткого отпечатка не равно сохранению всех байтов книги. Если файл имеет размер несколько мегабайт, а bytes32 всегда содержит 32 байта, разница в объёме принципиальна. Это не точный расчёт комиссии, но достаточное основание выбрать границу приложения: длинный контент остаётся во внешнем хранилище, реестр содержит идентификатор выпуска.

Также отдельные затраты возникают при передаче входных данных. Даже функция, которая почти не меняет состояние, получает закодированные параметры транзакции. Поэтому сравнение только нескольких строк Solidity может упустить существенные различия между вызовом с двумя числами и вызовом с большим динамическим массивом.

Оценка и фактический результат

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

Состояние при оценке: course 17 активен
Оценка: deactivate(17) проходит условие активности
До исполнения: другая транзакция уже отключила course 17
Исполнение: NotActive вместо повторного успешного отключения

Повышение лимита не исправляет этот случай: ошибка относится к правилу состояния. Интерфейс должен различать недостаток ресурса и недопустимость действия. Если постоянно повторять транзакцию с большим лимитом, можно тратить средства на заведомо неверное условие.

Похожая граница есть у чтения. Запрос eth_call не публикует транзакцию и обычно не списывает сетевую комиссию с читателя, но узел всё равно исполняет код. Слишком тяжёлый getter может упереться в ограничения RPC или стать дорогим, когда другой контракт использует его внутри своей транзакции. Поэтому слово view не разрешает неограниченную работу.

Что означает откат

Если действие завершилось откатом, его изменения состояния и события не закрепляются как успешное исполнение. Однако уже затраченная работа не превращается в бесплатную. Включённая неуспешная транзакция может расходовать газ. Напротив, отказ пользователя в кошельке до отправки не является такой транзакцией.

Ситуация Запись курса Как описать пользователю
Подпись отменена Не изменилась от этого действия Пользователь отменил запрос
RPC не принял отправку Результат пока не установлен Передача не подтверждена
Включённый вызов откатился Изменения вызова отменены Исполнение неуспешно, возможна комиссия
Успешное исполнение Перешла в новое состояние Проверить квитанцию и актуальную запись

Результат урока — умение поставить правильный вопрос к расходам. Для проверки стоимости будущего примера нужно назвать функцию, аргументы, исходное состояние, профиль сборки и сеть. Для проверки ошибки нужно выяснить, где остановилось действие. Именно такая детализация полезнее единственного обещания «публикация стоит дёшево». Газ и комиссии Ethereum содержит определения параметров, с которыми будет работать интерфейс.

Проверка единиц в интерфейсе

Поле «максимальная цена» и поле «лимит газа» нельзя показывать без единиц. Одно относится к стоимости единицы работы, другое — к числу единиц. Если редактор вводит 8 в поле gwei, библиотека должна преобразовать это значение в ожидаемый целочисленный масштаб, а не отправить восемь wei случайно.

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

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

Оглавление курса. Листинги, расчёты и наблюдения здесь разобраны как ожидаемое поведение; компиляция, учебные программы и проверки при написании не запускались.

Оглавление серии