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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2. Основные понятия оптимизации газа

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

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

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

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

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

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

Оптимизация затрат на газ 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, и это преобразование будет дополнительно потреблять Gas.

С точки зрения затрат, использование 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 вместо memory

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ETH-1.29%
Посмотреть Оригинал
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
  • Награда
  • 5
  • Репост
  • Поделиться
комментарий
0/400
VirtualRichDreamvip
· 08-06 20:34
Экономия газа — это истина
Посмотреть ОригиналОтветить0
GateUser-26d7f434vip
· 08-06 16:04
Комиссия GAS слишком высока.
Посмотреть ОригиналОтветить0
PermabullPetevip
· 08-05 21:10
Наконец-то есть ценные идеи!
Посмотреть ОригиналОтветить0
MetaverseVagrantvip
· 08-05 20:55
Газ уже почти нельзя себе позволить
Посмотреть ОригиналОтветить0
GasFeeAssassinvip
· 08-05 20:48
Проблема с Gas, наконец, решена.
Посмотреть ОригиналОтветить0
  • Закрепить