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

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

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

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

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

Введение в механизм Gas-оплат EVM

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Оптимизация газовых сборов EVM: лучшие практики

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

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

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

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

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

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

Ethereum смарт-контрактов Gas оптимизация十大最佳 практик

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Однако использование встроенного ассемблера также может привести к рискам и легкости выхода.

ETH-0.38%
Посмотреть Оригинал
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
  • Награда
  • 3
  • Поделиться
комментарий
0/400
SchrodingerWalletvip
· 22ч назад
Действительно подешевело, но денег на交易 нет.
Посмотреть ОригиналОтветить0
BearMarketMonkvip
· 23ч назад
Дорогие Газ расходы, бедный-бедный.
Посмотреть ОригиналОтветить0
ApeWithAPlanvip
· 23ч назад
Когда станет дешевле, а? L2, давай быстрее!
Посмотреть ОригиналОтветить0
  • Закрепить