Руководство по оптимизации Gas-расходов для EVM смарт-контрактов: 10 лучших практик и ключевых концепций

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Путем этого уточнения разработчики могут сэкономить 20,000 единиц Gas. ) Для хранения неиспользуемого слота памяти требуется 20,000 Gas (, но теперь требуется всего два слота памяти.

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

![Десять лучших практик по оптимизации 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]###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.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

посланник

GAS-5.93%
Посмотреть Оригинал
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
  • Награда
  • 6
  • Поделиться
комментарий
0/400
AlwaysAnonvip
· 07-09 16:21
Цзэ, опять оптимизация Газ этой ловушки, надоело?
Посмотреть ОригиналОтветить0
ForkTonguevip
· 07-07 17:09
Газ действительно ароматный L2 кто знает кто
Посмотреть ОригиналОтветить0
NonFungibleDegenvip
· 07-07 01:27
Плата за газ в буквальном смысле убивает меня... НГМИ СЕР
Посмотреть ОригиналОтветить0
AllTalkLongTradervip
· 07-07 01:20
Устал, устал, Газ слишком дорог, сразу перейду на L2.
Посмотреть ОригиналОтветить0
0xInsomniavip
· 07-07 01:16
Газ так дорог, что можно говорить о лучших практиках.
Посмотреть ОригиналОтветить0
CryptoTherapistvip
· 07-07 01:10
давайте вместе справимся с этой газовой тревожностью... я чувствую глубокую травму от высоких сборов. осознанная оптимизация контрактов является ключом к эмоциональной стабильности торговли
Посмотреть ОригиналОтветить0
  • Закрепить