Руководство по оптимизации газа смарт-контрактов Ethereum: Падение затрат и повышение эффективности

Руководство по оптимизации газа для смарт-контрактов Ethereum

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

![Оптимизация Gas для смарт-контрактов Ethereum: десять лучших практик])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 смарт-контрактов Gas оптимизация десять лучших практик])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, чтобы избежать избыточных проверок на переполнение или недополнение, тем самым сэкономив затраты на Gas.

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

( 9. Оптимизатор

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

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

![Ethereum смарт-контрактов Gas оптимизация十大最佳 практик]###https://img-cdn.gateio.im/webp-social/moments-c0701f9e09280a1667495d54e262dd2f.webp(

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

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

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

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

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

1. Удалить бесполезный код

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

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

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

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

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

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

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

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

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

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

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

ETH1.42%
Посмотреть Оригинал
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
  • Награда
  • 4
  • Репост
  • Поделиться
комментарий
0/400
GateUser-00be86fcvip
· 12ч назад
Газ太贵搞毛线смарт-контракты
Посмотреть ОригиналОтветить0
PermabullPetevip
· 12ч назад
Газ费 высока до неприличия, кто еще осмелится к этому прикасаться?
Посмотреть ОригиналОтветить0
BearMarketMonkvip
· 12ч назад
Все оптимизации в конечном итоге лишь для того, чтобы сэкономить на обеде...
Посмотреть ОригиналОтветить0
RunWithRugsvip
· 12ч назад
В пиковый период газовых сборов можно купить ужин, тьфу-тьфу.
Посмотреть ОригиналОтветить0
  • Закрепить