14 способов оптимизации Gas-расходов смарт-контрактов Ethereum для помощи разработчикам в снижении затрат

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

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

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

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

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

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

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

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

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

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

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

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

1. Понять оптимизацию Gas в EVM

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

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

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

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

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

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

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

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

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

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

Лучшие практики оптимизации газа EVM

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

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

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

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

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

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

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

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

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

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

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

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

![Оптимизация газа для смарт-контрактов Ethereum: 10 лучших практик])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: 10 лучших практик

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ETH9.1%
Посмотреть Оригинал
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
  • Награда
  • 3
  • Репост
  • Поделиться
комментарий
0/400
RugResistantvip
· 07-28 10:42
Практический опыт безусловно
Посмотреть ОригиналОтветить0
P2ENotWorkingvip
· 07-28 09:27
Газ费用 слишком завышены.
Посмотреть ОригиналОтветить0
PhantomMinervip
· 07-25 13:06
ценные идеи实战价值高
Посмотреть ОригиналОтветить0
  • Закрепить