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

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

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

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

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

Введение в механизм Gas-ставок EVM

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

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

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

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

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

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

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

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

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

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

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

Основные концепции оптимизации газа

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

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

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

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

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

Газовые оптимизации смарт-контрактов Ethereum: 10 лучших практик

Оптимизация затрат на газ EVM: лучшие практики

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

( 7. Используйте ключевые слова Constant/Immutable, когда это возможно.

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

![Оптимизация газа смарт-контрактов 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. Оптимизация модификатора

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

4. Использование решений второго уровня

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

ETH3.49%
Посмотреть Оригинал
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
  • Награда
  • 4
  • Поделиться
комментарий
0/400
MEV_Whisperervip
· 08-02 05:53
Газ又 рост了,炒合约麻烦死
Посмотреть ОригиналОтветить0
fomo_fightervip
· 08-02 05:46
Газ费 высокие, куда холоднее - туда и идем.
Посмотреть ОригиналОтветить0
ApeWithAPlanvip
· 08-02 05:39
Газ даже если дорогой, все равно ETH самый привлекательный
Посмотреть ОригиналОтветить0
MetadataExplorervip
· 08-02 05:26
Что, опять этот газ шумит?
Посмотреть ОригиналОтветить0
  • Закрепить