Оптимизация затрат на Gas в разработке смарт-контрактов
Проблема с комиссиями за Gas в основной сети Ethereum всегда была в центре внимания разработчиков и пользователей, особенно в периоды перегрузки сети. В периоды пиковой нагрузки пользователям часто приходится платить высокие комиссии. Поэтому оптимизация затрат на Gas на этапе разработки смарт-контрактов особенно важна. Оптимизация потребления Gas не только может эффективно снизить затраты на транзакции, но и повысить эффективность транзакций, обеспечивая пользователям более экономичный и эффективный опыт использования блокчейна.
В этой статье будет рассмотрен механизм Gas-费 Ethereum Virtual Machine (EVM), связанные с ним ключевые концепции, а также лучшие практики оптимизации Gas-费 при разработке смарт-контрактов. Надеюсь, что этот материал сможет вдохновить разработчиков и предоставить им практическую помощь, а также поможет обычным пользователям лучше понять, как работает система Gas-费 в EVM, и совместно справляться с вызовами в экосистеме блокчейна.
Введение в механизм газовых сборов EVM
В совместимых с EVM сетях Gas является единицей измерения вычислительной мощности, необходимой для выполнения определённых операций.
В структуре EVM расход газа в основном делится на три части: выполнение операций, вызовы внешних сообщений и чтение/запись памяти и хранилища.
Поскольку выполнение каждой транзакции требует вычислительных ресурсов, взимается определенная плата для предотвращения бесконечного цикла и отказа в обслуживании ( DoS ) атак. Плата, необходимая для завершения транзакции, называется Gas-стоимостью.
С момента вступления в силу хард-форка Лондон EIP-1559( ), плата за Gas рассчитывается по следующей формуле:
Комиссия за газ = единицы газа, использованные * (базовая комиссия + приоритетная комиссия)
Базовая плата будет уничтожена, в то время как плата за приоритет будет использоваться в качестве стимула, чтобы поощрить валидаторов добавлять транзакции в блокчейн. Установка более высокой платы за приоритет при отправке транзакции может увеличить вероятность того, что транзакция будет включена в следующий блок.
Понимание оптимизации Gas в EVM
Когда смарт-контракты компилируются с помощью Solidity, контракт преобразуется в ряд операций (opcodes).
Любой фрагмент кода операций (, например создание смарт-контрактов, выполнение вызовов сообщений, доступ к хранилищу аккаунтов и выполнение операций на виртуальной машине ) имеет признанную стоимость потребления газа, эти затраты зафиксированы в желтой книге Ethereum.
После нескольких изменений EIP, стоимость газа для некоторых операций была скорректирована и может отличаться от указанной в жёлтой книге.
Основные концепции оптимизации газа
Основная идея оптимизации Gas заключается в приоритете выбора операций с высокой стоимостью эффективности на блокчейне EVM, избегая операций с высокой стоимостью Gas.
В EVM следующие операции имеют низкую стоимость:
Чтение и запись переменных в памяти
Чтение констант и неизменяемых переменных
Чтение и запись локальных переменных
Чтение переменной calldata, например массива и структуры calldata
Внутренний вызов функции
Операции с высокой стоимостью включают:
Чтение и запись состояния переменных, хранящихся в смарт-контрактах
Внешние вызовы функций
Циклическая операция
Лучшие практики по оптимизации EVM Gas-расходов
Основываясь на вышеупомянутых основных концепциях, мы составили список лучших практик по оптимизации Gas-расходов для сообщества разработчиков. Следуя этим практикам, разработчики могут снизить потребление Gas смарт-контрактами, уменьшить затраты на транзакции и создать более эффективные и удобные для пользователей приложения.
1. Постарайтесь минимизировать использование хранилища
В Solidity, Storage( хранение) является ограниченным ресурсом, его потребление газа значительно выше, чем у Memory( памяти). Каждый раз, когда смарт-контракт читает или записывает данные в хранилище, возникают высокие затраты на газ.
Согласно определению в желтой книге Ethereum, стоимость операций хранения более чем в 100 раз выше, чем стоимость операций с памятью. Например, инструкции OPcodesmload и mstore требуют всего 3 единицы газа, в то время как операции хранения, такие как sload и sstore, даже в наиболее идеальных условиях, стоят как минимум 100 единиц.
Методы ограничения использования хранилища включают:
Хранить непостоянные данные в памяти
Уменьшение количества изменений в хранилище: сохраняйте промежуточные результаты в памяти, а затем, после завершения всех вычислений, распределяйте результаты по переменным хранилища.
2. Упаковка переменных
Количество хранилищ, используемых в смарт-контрактах, и способ, которым разработчики представляют данные, сильно влияет на потребление газа. Storage slot (.
Компилятор Solidity упаковывает последовательные переменные хранения в процессе компиляции и использует 32-байтовый слот хранения в качестве базовой единицы хранения переменных. Упаковка переменных означает, что несколько переменных могут быть адаптированы к одному слоту хранения за счет разумного расположения переменных.
С помощью этой корректировки разработчики могут сэкономить 20 000 единиц газа), чтобы сохранить неиспользуемый слот хранения, требуется 20 000 газа(.
Поскольку каждый слот хранения потребляет Gas, упаковка переменных оптимизирует использование Gas за счет уменьшения количества необходимых слотов хранения.
![Топ-10 лучших практик оптимизации Gas для смарт-контрактов Ethereum])https://img-cdn.gateio.im/webp-social/moments-30f0bc370a7b9ca65f3d623c31262b76.webp(
) 3. Оптимизация типов данных
Переменная может быть представлена несколькими типами данных, но затраты на операции с различными типами данных также различаются. Выбор подходящего типа данных помогает оптимизировать использование Gas.
Например, в Solidity целые числа могут быть разделены на различные размеры: uint8, uint16, uint32 и т.д. Поскольку EVM выполняет операции с единицами по 256 бит, использование uint8 означает, что EVM сначала должен преобразовать его в uint256, и это преобразование будет дополнительно потреблять газ.
На первый взгляд, использование uint256 дешевле, чем uint8. Однако, если использовать упаковку переменных для оптимизации, ситуация иная. Если разработчик может упаковать четыре переменные uint8 в одном слоте памяти, то общая стоимость их итерации будет ниже, чем у четырех переменных uint256. Таким образом, смарт-контракты смогут прочитать и записать один слот памяти за один раз и разместить четыре переменные uint8 в оперативной/памяти.
![Десять лучших практик оптимизации Gas для смарт-контрактов Ethereum]###https://img-cdn.gateio.im/webp-social/moments-995905cb414526d4d991899d0c2e6443.webp(
) 4. Используйте переменные фиксированного размера вместо динамических переменных
Если данные можно контролировать в пределах 32 байт, рекомендуется использовать тип данных bytes32 вместо bytes или strings. Обычно переменные фиксированного размера потребляют меньше газа, чем переменные переменного размера. Если длину байтов можно ограничить, старайтесь выбирать минимальную длину от bytes1 до bytes32.
![Десять лучших практик оптимизации Gas для смарт-контрактов Ethereum]###https://img-cdn.gateio.im/webp-social/moments-55fcdb765912ef9cd238c46b1d248cff.webp(
) 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.
![Десять лучших практик оптимизации Gas для смарт-контрактов Ethereum]###https://img-cdn.gateio.im/webp-social/moments-9c566626ab499ef65d6f5089a2876ad3.webp(
) 7. Используйте ключевые слова Constant/Immutable по возможности
Константные/неизменяемые переменные не хранятся в хранилище контракта. Эти переменные вычисляются во время компиляции и хранятся в байт-коде контракта. Поэтому их стоимость доступа значительно ниже по сравнению с хранилищем, рекомендуется использовать ключевые слова Constant или Immutable, если это возможно.
![Десять лучших практик оптимизации Gas для смарт-контрактов Ethereum]###https://img-cdn.gateio.im/webp-social/moments-c0701f9e09280a1667495d54e262dd2f.webp(
) 8. Используйте Unchecked, чтобы гарантировать, что переполнение/недостаток не произойдет
Когда разработчики могут быть уверены, что арифметические операции не приведут к переполнению или недостатку, они могут использовать ключевое слово unchecked, введенное в Solidity v0.8.0, чтобы избежать избыточной проверки на переполнение или недостаток, тем самым экономя затраты на газ.
Кроме того, в версиях компилятора 0.8.0 и выше больше не требуется использовать библиотеку SafeMath, поскольку компилятор сам по себе уже встроил функции защиты от переполнения и недополнения.
![Десять лучших практик оптимизации газа для смарт-контрактов Ethereum]###https://img-cdn.gateio.im/webp-social/moments-a823fb7761aafa6529a6c45304e0314b.webp(
) 9. Оптимизация модификатора
Код модификатора встроен в изменённые функции, и каждый раз при использовании модификатора его код будет копироваться. Это увеличивает размер байт-кода и повышает потребление газа.
Путем реорганизации логики в внутреннюю функцию, что позволяет повторно использовать эту внутреннюю функцию в модификаторах, можно уменьшить размер байт-кода и снизить затраты на Gas.
![Десять лучших практик оптимизации Gas для смарт-контрактов Ethereum]###https://img-cdn.gateio.im/webp-social/moments-839b91e2f02389949aa698d460a497d8.webp(
) 10. Оптимизация короткого замыкания
Для операторов || и && логические операции будут подвергаться краткой оценке, то есть если первое условие уже может определить результат логического выражения, то второе условие не будет оцениваться.
Чтобы оптимизировать потребление газа, следует ставить условия с низкими вычислительными затратами вперед, чтобы была возможность пропустить дорогостоящие вычисления.
![Десять лучших практик по оптимизации Gas для смарт-контрактов Ethereum]###https://img-cdn.gateio.im/webp-social/moments-a141884dcdcdc56faff12eee2601b7b7.webp(
Дополнительные общие рекомендации
) 1. Удалить ненужный код
Если в смарт-контрактах есть неиспользуемые функции или переменные, рекомендуется их удалить. Это самый прямой способ уменьшить стоимость развертывания контракта и сохранить его небольшой объем.
Вот несколько полезных советов:
Используйте самые эффективные алгоритмы для вычислений. Если в смарт-контрактах используются результаты некоторых вычислений напрямую, то следует устранить эти избыточные вычислительные процессы. По сути, любые неиспользуемые вычисления должны быть удалены.
В Ethereum разработчики могут получить награду в Gas, освободив пространство для хранения. Если переменная больше не нужна, ее следует удалить с помощью ключевого слова delete или установить в значение по умолчанию.
Оптимизация циклов: избегайте затратных операций в цикле, по возможности объединяйте циклы и выносите повторные вычисления за пределы тела цикла.
2. Использование предкомпилированных смарт-контрактов
Предварительно скомпилированные контракты предоставляют сложные библиотечные функции, такие как операции шифрования и хеширования. Поскольку код выполняется не на EVM, а локально на клиентском узле, требуется меньше газа. Использование предварительно скомпилированных контрактов может сэкономить газ за счет уменьшения вычислительной нагрузки, необходимой для выполнения смарт-контрактов.
Примеры предкомпилированных контрактов включают алгоритм цифровой подписи на основе эллиптической кривой ###ECDSA( и хэш-алгоритм SHA2-256. Используя эти предкомпилированные контракты в смарт-контрактах, разработчики могут снизить стоимость газа и повысить эффективность работы приложений.
) 3. Использование встроенного ассемблера
Встраиваемая сборка ### in-line assembly ( позволяет разработчикам писать низкоуровневый, но эффективный код, который может выполняться непосредственно EVM, без необходимости использования дорогих операций Solidity. Встраиваемая сборка также позволяет более точно контролировать использование памяти и хранилища, что дополнительно снижает расходы на Gas. Кроме того, встраиваемая сборка может выполнять некоторые сложные операции, которые трудно реализовать только с помощью Solidity, предоставляя больше гибкости для оптимизации потребления Gas.
Однако использование встроенного ассемблера также может быть рискованным и подверженным ошибкам. Поэтому следует использовать его с осторожностью, только опытным разработчикам.
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
Оптимизация стратегии и лучших практик Gas-стоимости смарт-контрактов Ethereum
Оптимизация затрат на Gas в разработке смарт-контрактов
Проблема с комиссиями за Gas в основной сети Ethereum всегда была в центре внимания разработчиков и пользователей, особенно в периоды перегрузки сети. В периоды пиковой нагрузки пользователям часто приходится платить высокие комиссии. Поэтому оптимизация затрат на Gas на этапе разработки смарт-контрактов особенно важна. Оптимизация потребления Gas не только может эффективно снизить затраты на транзакции, но и повысить эффективность транзакций, обеспечивая пользователям более экономичный и эффективный опыт использования блокчейна.
В этой статье будет рассмотрен механизм Gas-费 Ethereum Virtual Machine (EVM), связанные с ним ключевые концепции, а также лучшие практики оптимизации Gas-费 при разработке смарт-контрактов. Надеюсь, что этот материал сможет вдохновить разработчиков и предоставить им практическую помощь, а также поможет обычным пользователям лучше понять, как работает система Gas-费 в EVM, и совместно справляться с вызовами в экосистеме блокчейна.
Введение в механизм газовых сборов EVM
В совместимых с EVM сетях Gas является единицей измерения вычислительной мощности, необходимой для выполнения определённых операций.
В структуре EVM расход газа в основном делится на три части: выполнение операций, вызовы внешних сообщений и чтение/запись памяти и хранилища.
Поскольку выполнение каждой транзакции требует вычислительных ресурсов, взимается определенная плата для предотвращения бесконечного цикла и отказа в обслуживании ( DoS ) атак. Плата, необходимая для завершения транзакции, называется Gas-стоимостью.
С момента вступления в силу хард-форка Лондон EIP-1559( ), плата за Gas рассчитывается по следующей формуле:
Комиссия за газ = единицы газа, использованные * (базовая комиссия + приоритетная комиссия)
Базовая плата будет уничтожена, в то время как плата за приоритет будет использоваться в качестве стимула, чтобы поощрить валидаторов добавлять транзакции в блокчейн. Установка более высокой платы за приоритет при отправке транзакции может увеличить вероятность того, что транзакция будет включена в следующий блок.
Понимание оптимизации Gas в EVM
Когда смарт-контракты компилируются с помощью Solidity, контракт преобразуется в ряд операций (opcodes).
Любой фрагмент кода операций (, например создание смарт-контрактов, выполнение вызовов сообщений, доступ к хранилищу аккаунтов и выполнение операций на виртуальной машине ) имеет признанную стоимость потребления газа, эти затраты зафиксированы в желтой книге Ethereum.
После нескольких изменений EIP, стоимость газа для некоторых операций была скорректирована и может отличаться от указанной в жёлтой книге.
Основные концепции оптимизации газа
Основная идея оптимизации Gas заключается в приоритете выбора операций с высокой стоимостью эффективности на блокчейне EVM, избегая операций с высокой стоимостью Gas.
В EVM следующие операции имеют низкую стоимость:
Операции с высокой стоимостью включают:
Лучшие практики по оптимизации EVM Gas-расходов
Основываясь на вышеупомянутых основных концепциях, мы составили список лучших практик по оптимизации Gas-расходов для сообщества разработчиков. Следуя этим практикам, разработчики могут снизить потребление Gas смарт-контрактами, уменьшить затраты на транзакции и создать более эффективные и удобные для пользователей приложения.
1. Постарайтесь минимизировать использование хранилища
В Solidity, Storage( хранение) является ограниченным ресурсом, его потребление газа значительно выше, чем у Memory( памяти). Каждый раз, когда смарт-контракт читает или записывает данные в хранилище, возникают высокие затраты на газ.
Согласно определению в желтой книге Ethereum, стоимость операций хранения более чем в 100 раз выше, чем стоимость операций с памятью. Например, инструкции OPcodesmload и mstore требуют всего 3 единицы газа, в то время как операции хранения, такие как sload и sstore, даже в наиболее идеальных условиях, стоят как минимум 100 единиц.
Методы ограничения использования хранилища включают:
2. Упаковка переменных
Количество хранилищ, используемых в смарт-контрактах, и способ, которым разработчики представляют данные, сильно влияет на потребление газа. Storage slot (.
Компилятор Solidity упаковывает последовательные переменные хранения в процессе компиляции и использует 32-байтовый слот хранения в качестве базовой единицы хранения переменных. Упаковка переменных означает, что несколько переменных могут быть адаптированы к одному слоту хранения за счет разумного расположения переменных.
С помощью этой корректировки разработчики могут сэкономить 20 000 единиц газа), чтобы сохранить неиспользуемый слот хранения, требуется 20 000 газа(.
Поскольку каждый слот хранения потребляет Gas, упаковка переменных оптимизирует использование Gas за счет уменьшения количества необходимых слотов хранения.
![Топ-10 лучших практик оптимизации Gas для смарт-контрактов Ethereum])https://img-cdn.gateio.im/webp-social/moments-30f0bc370a7b9ca65f3d623c31262b76.webp(
) 3. Оптимизация типов данных
Переменная может быть представлена несколькими типами данных, но затраты на операции с различными типами данных также различаются. Выбор подходящего типа данных помогает оптимизировать использование Gas.
Например, в Solidity целые числа могут быть разделены на различные размеры: uint8, uint16, uint32 и т.д. Поскольку EVM выполняет операции с единицами по 256 бит, использование uint8 означает, что EVM сначала должен преобразовать его в uint256, и это преобразование будет дополнительно потреблять газ.
На первый взгляд, использование uint256 дешевле, чем uint8. Однако, если использовать упаковку переменных для оптимизации, ситуация иная. Если разработчик может упаковать четыре переменные uint8 в одном слоте памяти, то общая стоимость их итерации будет ниже, чем у четырех переменных uint256. Таким образом, смарт-контракты смогут прочитать и записать один слот памяти за один раз и разместить четыре переменные uint8 в оперативной/памяти.
![Десять лучших практик оптимизации Gas для смарт-контрактов Ethereum]###https://img-cdn.gateio.im/webp-social/moments-995905cb414526d4d991899d0c2e6443.webp(
) 4. Используйте переменные фиксированного размера вместо динамических переменных
Если данные можно контролировать в пределах 32 байт, рекомендуется использовать тип данных bytes32 вместо bytes или strings. Обычно переменные фиксированного размера потребляют меньше газа, чем переменные переменного размера. Если длину байтов можно ограничить, старайтесь выбирать минимальную длину от bytes1 до bytes32.
![Десять лучших практик оптимизации Gas для смарт-контрактов Ethereum]###https://img-cdn.gateio.im/webp-social/moments-55fcdb765912ef9cd238c46b1d248cff.webp(
) 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.
![Десять лучших практик оптимизации Gas для смарт-контрактов Ethereum]###https://img-cdn.gateio.im/webp-social/moments-9c566626ab499ef65d6f5089a2876ad3.webp(
) 7. Используйте ключевые слова Constant/Immutable по возможности
Константные/неизменяемые переменные не хранятся в хранилище контракта. Эти переменные вычисляются во время компиляции и хранятся в байт-коде контракта. Поэтому их стоимость доступа значительно ниже по сравнению с хранилищем, рекомендуется использовать ключевые слова Constant или Immutable, если это возможно.
![Десять лучших практик оптимизации Gas для смарт-контрактов Ethereum]###https://img-cdn.gateio.im/webp-social/moments-c0701f9e09280a1667495d54e262dd2f.webp(
) 8. Используйте Unchecked, чтобы гарантировать, что переполнение/недостаток не произойдет
Когда разработчики могут быть уверены, что арифметические операции не приведут к переполнению или недостатку, они могут использовать ключевое слово unchecked, введенное в Solidity v0.8.0, чтобы избежать избыточной проверки на переполнение или недостаток, тем самым экономя затраты на газ.
Кроме того, в версиях компилятора 0.8.0 и выше больше не требуется использовать библиотеку SafeMath, поскольку компилятор сам по себе уже встроил функции защиты от переполнения и недополнения.
![Десять лучших практик оптимизации газа для смарт-контрактов Ethereum]###https://img-cdn.gateio.im/webp-social/moments-a823fb7761aafa6529a6c45304e0314b.webp(
) 9. Оптимизация модификатора
Код модификатора встроен в изменённые функции, и каждый раз при использовании модификатора его код будет копироваться. Это увеличивает размер байт-кода и повышает потребление газа.
Путем реорганизации логики в внутреннюю функцию, что позволяет повторно использовать эту внутреннюю функцию в модификаторах, можно уменьшить размер байт-кода и снизить затраты на Gas.
![Десять лучших практик оптимизации Gas для смарт-контрактов Ethereum]###https://img-cdn.gateio.im/webp-social/moments-839b91e2f02389949aa698d460a497d8.webp(
) 10. Оптимизация короткого замыкания
Для операторов || и && логические операции будут подвергаться краткой оценке, то есть если первое условие уже может определить результат логического выражения, то второе условие не будет оцениваться.
Чтобы оптимизировать потребление газа, следует ставить условия с низкими вычислительными затратами вперед, чтобы была возможность пропустить дорогостоящие вычисления.
![Десять лучших практик по оптимизации Gas для смарт-контрактов Ethereum]###https://img-cdn.gateio.im/webp-social/moments-a141884dcdcdc56faff12eee2601b7b7.webp(
Дополнительные общие рекомендации
) 1. Удалить ненужный код
Если в смарт-контрактах есть неиспользуемые функции или переменные, рекомендуется их удалить. Это самый прямой способ уменьшить стоимость развертывания контракта и сохранить его небольшой объем.
Вот несколько полезных советов:
Используйте самые эффективные алгоритмы для вычислений. Если в смарт-контрактах используются результаты некоторых вычислений напрямую, то следует устранить эти избыточные вычислительные процессы. По сути, любые неиспользуемые вычисления должны быть удалены.
В Ethereum разработчики могут получить награду в Gas, освободив пространство для хранения. Если переменная больше не нужна, ее следует удалить с помощью ключевого слова delete или установить в значение по умолчанию.
Оптимизация циклов: избегайте затратных операций в цикле, по возможности объединяйте циклы и выносите повторные вычисления за пределы тела цикла.
2. Использование предкомпилированных смарт-контрактов
Предварительно скомпилированные контракты предоставляют сложные библиотечные функции, такие как операции шифрования и хеширования. Поскольку код выполняется не на EVM, а локально на клиентском узле, требуется меньше газа. Использование предварительно скомпилированных контрактов может сэкономить газ за счет уменьшения вычислительной нагрузки, необходимой для выполнения смарт-контрактов.
Примеры предкомпилированных контрактов включают алгоритм цифровой подписи на основе эллиптической кривой ###ECDSA( и хэш-алгоритм SHA2-256. Используя эти предкомпилированные контракты в смарт-контрактах, разработчики могут снизить стоимость газа и повысить эффективность работы приложений.
) 3. Использование встроенного ассемблера
Встраиваемая сборка ### in-line assembly ( позволяет разработчикам писать низкоуровневый, но эффективный код, который может выполняться непосредственно EVM, без необходимости использования дорогих операций Solidity. Встраиваемая сборка также позволяет более точно контролировать использование памяти и хранилища, что дополнительно снижает расходы на Gas. Кроме того, встраиваемая сборка может выполнять некоторые сложные операции, которые трудно реализовать только с помощью Solidity, предоставляя больше гибкости для оптимизации потребления Gas.
Однако использование встроенного ассемблера также может быть рискованным и подверженным ошибкам. Поэтому следует использовать его с осторожностью, только опытным разработчикам.
) 4. Использование решений второго уровня
посланник