Десять лучших практик для оптимизации Gas-расходов смарт-контрактов Ethereum

Десять лучших практик для оптимизации Gas-расходов смарт-контрактов Ethereum

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

В данной статье будет представлена обзор механизма Gas-расходов виртуальной машины Ethereum (EVM), ключевых концепций оптимизации Gas-расходов, а также лучших практик оптимизации Gas-расходов при разработке смарт-контрактов. Надеемся, что эти материалы смогут вдохновить разработчиков и оказать практическую помощь, а также помогут обычным пользователям лучше понять, как работают Gas-расходы EVM, чтобы совместно справляться с вызовами в экосистеме блокчейна.

Оптимизация газа для смарт-контрактов Ethereum: десять лучших практик

Введение в механизм газовых сборов EVM

В сетях, совместимых с EVM, "Gas" является единицей измерения вычислительной мощности, необходимой для выполнения определенных операций.

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

Поскольку выполнение каждой транзакции требует вычислительных ресурсов, взимается определенная плата для предотвращения бесконечных циклов и атак отказа в обслуживании (DoS). Плата, необходимая для завершения транзакции, называется "Gas-стоимость".

С момента вступления в силу хардфорка Лондона EIP-1559( ), плата за газ рассчитывается по следующей формуле:

Комиссия за газ = единицы газа, использованные * (базовая ставка + приоритетная комиссия)

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

Оптимизация Gas для смарт-контрактов Ethereum: десять лучших практик

1. Понимание оптимизации Gas в EVM

Когда смарт-контракты компилируются с помощью Solidity, контракт преобразуется в серию "операционных кодов", то есть opcodes.

Любая операция с кодом (, например создание смарт-контракта, выполнение вызова сообщений, доступ к хранилищу аккаунтов и выполнение операций в виртуальной машине ) имеет признанную стоимость потребления Gas, эти расходы зафиксированы в желтой книге Ethereum.

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

2.Базовые концепции оптимизации газа

Основная идея оптимизации Gas заключается в приоритизации операций с высокой стоимостью эффективности на блокчейне EVM и избегании операций с дорогими затратами Gas.

В EVM следующие операции имеют низкую стоимость:

  • Чтение и запись переменных в памяти
  • Чтение констант и неизменяемых переменных
  • Чтение и запись локальных переменных
  • Чтение переменной calldata, например, массива calldata и структур
  • Внутренний вызов функции

Дорогие операции включают:

  • Чтение и запись состояния переменных, хранящихся в смарт-контрактах.
  • Вызов внешних функций
  • Циклическая операция

Оптимизация Gas для смарт-контрактов Ethereum: 10 лучших практик

Оптимизация газовых сборов EVM: лучшие практики

Основываясь на вышеперечисленных основных концепциях, мы подготовили список лучших практик по оптимизации Gas-расходов для сообщества разработчиков. Следуя этим практикам, разработчики могут снизить потребление Gas смарт-контрактов, уменьшить затраты на транзакции и создать более эффективные и удобные для пользователей приложения.

1. Постарайтесь минимизировать использование хранилища

В Solidity, Storage( хранение) является ограниченным ресурсом, его расход газа значительно выше, чем у Memory( памяти). Каждый раз, когда смарт-контракт читает или записывает данные из хранилища, возникают высокие затраты на газ.

Согласно определению, приведенному в желтой книге Ethereum, стоимость операций хранения более чем в 100 раз выше, чем стоимость операций с памятью. Например, команды OPcodesmload и mstore требуют всего 3 единицы газа, в то время как операции хранения, такие как sload и sstore, даже в самых идеальных условиях, требуют как минимум 100 единиц.

Ограничения методов использования хранения включают:

  • Хранить непостоянные данные в памяти
  • Уменьшение количества изменений в хранилище: сохранение промежуточных результатов в памяти, а затем распределение результатов переменным хранилища после завершения всех вычислений.

Оптимизация Gas смарт-контрактов Ethereum: десять лучших практик

2.Упаковка переменных

Количество хранилищ, используемых в смарт-контрактах, включая Storage slot(, и способ, которым разработчики представляют данные, будут значительно влиять на потребление Gas.

Компилятор Solidity в процессе компиляции упаковывает последовательные переменные хранения и использует 32-байтовый слот хранения в качестве базовой единицы хранения переменных. Упаковка переменных означает разумное размещение переменных, что позволяет нескольким переменным помещаться в один слот хранения.

С помощью этой корректировки разработчики могут сэкономить 20 000 единиц газа ) для хранения неиспользуемого слота хранения, который требует 20 000 газа (, но теперь требуется только два слота хранения.

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

![Ethereum смарт-контрактов Gas оптимизация десять лучших практик])https://img-cdn.gateio.im/webp-social/moments-995905cb414526d4d991899d0c2e6443.webp(

) 3.Оптимизация типов данных

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

Например, в Solidity целые числа могут быть разбиты на различные размеры: uint8, uint16, uint32 и т.д. Поскольку EVM выполняет операции по 256 бит, использование uint8 означает, что EVM сначала должен преобразовать его в uint256, а это преобразование дополнительно потребляет газ.

С точки зрения отдельного использования, uint256 дешевле, чем uint8. Однако, если использовать оптимизацию упаковки переменных, о которой мы говорили ранее, ситуация меняется. Если разработчик сможет упаковать четыре переменные типа uint8 в один слот памяти, то общая стоимость их итерации будет ниже, чем у четырех переменных типа uint256. Таким образом, смарт-контракт сможет читать и записывать в один слот памяти и за одно действие помещать четыре переменные типа uint8 в память/хранилище.

![Ethereum смарт-контрактов Gas оптимизация десяти лучших практик]###https://img-cdn.gateio.im/webp-social/moments-55fcdb765912ef9cd238c46b1d248cff.webp(

) 4. Используйте фиксированные переменные вместо динамических переменных

Если данные можно контролировать в пределах 32 байт, рекомендуется использовать тип данных bytes32 вместо bytes или strings. Как правило, переменные фиксированного размера потребляют меньше газа, чем переменные переменного размера. Если длину байтов можно ограничить, старайтесь выбирать минимальную длину от bytes1 до bytes32.

5.Отображения и массивы

Списки данных в Solidity могут быть представлены двумя типами данных: массивами ###Arrays( и сопоставлениями )Mappings(, но их синтаксис и структура совершенно разные.

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

![Оптимизация Gas для смарт-контрактов Ethereum: десять лучших практик])https://img-cdn.gateio.im/webp-social/moments-5f3d7e103e47c886f50599cffe35c707.webp(

) 6. Используйте calldata вместо памяти

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

Запомните этот принцип: если параметры функции являются только для чтения, следует предпочитать использование calldata вместо memory. Это поможет избежать ненужных операций копирования из calldata функции в memory.

7. По возможности используйте ключевые слова Constant/Immutable

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

![Оптимизация Gas для смарт-контрактов Ethereum: 10 лучших практик]###https://img-cdn.gateio.im/webp-social/moments-9c566626ab499ef65d6f5089a2876ad3.webp(

) 8. Используйте Unchecked, чтобы гарантировать, что переполнение/недостаток не произойдет

Когда разработчики могут быть уверены, что арифметические операции не приведут к переполнению или недостатку, они могут использовать ключевое слово unchecked, введенное в Solidity v0.8.0, чтобы избежать избыточной проверки на переполнение или недостаток, тем самым экономя Gas.

Кроме того, компиляторы версии 0.8.0 и выше больше не требуют использования библиотеки SafeMath, так как сам компилятор уже встроил функции защиты от переполнения и недополнения.

9. Оптимизация модификатора

Код модификатора встраивается в изменённую функцию, и каждый раз при использовании модификатора его код копируется. Это увеличивает размер байт-кода и повышает потребление газа.

Переписывая логику в виде внутренней функции _checkOwner###(, можно повторно использовать эту внутреннюю функцию в модификаторе, что уменьшает размер байт-кода и снижает затраты на Gas.

![Ethereum смарт-контрактов Gas оптимизация десяти лучших практик])https://img-cdn.gateio.im/webp-social/moments-c0701f9e09280a1667495d54e262dd2f.webp(

) 10. Оптимизация короткого замыкания

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

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

![Оптимизация Gas для смарт-контрактов Ethereum: десять лучших практик]###https://img-cdn.gateio.im/webp-social/moments-a823fb7761aafa6529a6c45304e0314b.webp(

Дополнительные общие рекомендации

) 1. Удалить ненужный код

Если в смарт-контракте есть неиспользуемые функции или переменные, рекомендуется их удалить. Это самый простой способ снизить стоимость развертывания контракта и сохранить его небольшой размер.

Вот некоторые полезные советы:

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

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

Оптимизация циклов: избегайте дорогих операций в циклах, объединяйте циклы, насколько это возможно, и выносите повторные вычисления за пределы тела цикла.

2. Использование предкомпилированных смарт-контрактов

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

Примеры предкомпилированных смарт-контрактов включают алгоритм цифровой подписи на основе эллиптической кривой ###ECDSA( и хеш-алгоритм SHA2-256. Используя эти предкомпилированные контракты в смарт-контрактах, разработчики могут снизить затраты на газ и повысить эффективность работы приложений.

![Оптимизация газа смарт-контрактов Ethereum: десять лучших практик])https://img-cdn.gateio.im/webp-social/moments-839b91e2f02389949aa698d460a497d8.webp(

) 3. Использование встроенного ассемблера

Встраиваемая сборка ### in-line assembly ( позволяет разработчикам писать низкоуровневый, но эффективный код, который может быть выполнен непосредственно EVM, без необходимости использования дорогих операций Solidity. Встраиваемая сборка также позволяет более точно контролировать использование памяти и хранилища, что дополнительно снижает расходы на Gas. Кроме того, встраиваемая сборка может выполнять некоторые сложные операции, которые трудно реализовать только с использованием Solidity, предоставляя больше гибкости для оптимизации потребления Gas.

Однако использование встроенного ассемблера также может повлечь за собой риски и быть подверженным ошибкам. Поэтому следует использовать его с осторожностью, только опытным разработчикам.

) 4. Использование решений Layer 2

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

Например, роллапы,

ETH-4.93%
GAS-4.87%
Посмотреть Оригинал
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
  • Награда
  • 6
  • Репост
  • Поделиться
комментарий
0/400
LootboxPhobiavip
· 07-07 22:43
Газ действительно пропал
Посмотреть ОригиналОтветить0
OnChainSleuthvip
· 07-06 04:36
Снова будут играть для лохов Gas-расходы
Посмотреть ОригиналОтветить0
TokenomicsTrappervip
· 07-05 08:12
лmao еще одна тема "оптимизации газа"... просто подождите, пока вы не увидите каскад ликвидаций, когда эти "оптимизированные" контракты будут разорваны под нагрузкой
Посмотреть ОригиналОтветить0
gas_fee_traumavip
· 07-05 08:09
Если газ высокий, вы не можете позволить себе есть
Посмотреть ОригиналОтветить0
ForumLurkervip
· 07-05 08:02
Эх, стоимость слишком высокая, что за контракт?
Посмотреть ОригиналОтветить0
  • Закрепить