Оптимизация Gas для смарт-контрактов Ethereum: лучшие практики
Проблема с Gas-стоимостью в основной сети Ethereum всегда была сложной, особенно это проявляется во время перегрузок сети. В пиковые часы пользователи вынуждены платить высокие транзакционные сборы. Поэтому оптимизация Gas-стоимости на этапе разработки смарт-контрактов имеет решающее значение. Оптимизация потребления Gas не только позволяет эффективно снизить транзакционные затраты, но и повышает эффективность транзакций, обеспечивая пользователям более экономичный и эффективный опыт работы с блокчейном.
В данной статье будет описан механизм комиссии за Gas в виртуальной машине Ethereum (EVM), основные концепции оптимизации комиссий за Gas, а также лучшие практики оптимизации комиссий за Gas при разработке смарт-контрактов. Надеемся, что этот материал вдохновит разработчиков и окажет практическую помощь, а также поможет обычным пользователям лучше понять, как работает комиссия за Gas в EVM, чтобы вместе справляться с вызовами в экосистеме блокчейна.
Введение в механизм платёжных Gas в EVM
В сетях, совместимых с EVM, "Gas" является единицей измерения вычислительной мощности, необходимой для выполнения определенных операций.
В структуре EVM потребление газа делится на три части: выполнение операций, вызовы внешних сообщений и чтение/запись в память и хранилище.
Поскольку выполнение каждой транзакции требует вычислительных ресурсов, взимается определенная плата, чтобы предотвратить бесконечные циклы и атаки отказа в обслуживании ( DoS ). Плата за выполнение транзакции называется "Gas-стоимость".
С тех пор как вступил в силу хардфорк Лондона EIP-1559( ), плата за газ рассчитывается по следующей формуле:
Газовая плата = единицы использованного газа * ( базовая плата + плата за приоритет )
Базовая комиссия будет уничтожена, а приоритетная комиссия будет использоваться в качестве стимула, побуждая валидаторов добавлять транзакции в блокчейн. Установка более высокой приоритетной комиссии при отправке транзакции может увеличить вероятность того, что транзакция будет включена в следующий блок. Это похоже на "чаевые", которые пользователи платят валидаторам.
Понимание оптимизации Gas в EVM
Когда смарт-контракт компилируется с помощью Solidity, контракт преобразуется в серию "операционных кодов", то есть opcodes.
Любой код операции (, например, создание контракта, выполнение вызова сообщений, доступ к хранилищу аккаунта и выполнение операций на виртуальной машине ) имеет признанную стоимость потребления газа, эти расходы зафиксированы в желтой книге Ethereum.
После нескольких изменений EIP, некоторые коды операций были скорректированы по стоимости Gas, что может отличаться от желтой книги.
Основные концепции оптимизации газа
Основная идея оптимизации Gas заключается в том, чтобы в блокчейне EVM приоритизировать операции с высокой стоимостью эффективности и избегать операций с дорогими затратами на Gas.
В EVM следующие операции имеют низкую стоимость:
Чтение и запись переменных памяти
Чтение констант и неизменяемых переменных
Чтение и запись локальных переменных
Чтение переменной calldata, например массива calldata и структур
Вызов внутренних функций
Дорогие операции включают:
Чтение и запись состояния переменных, хранящихся в смарт-контрактах
Вызов внешних функций
Циклическая операция
Лучшие практики оптимизации EVM Gas затрат
Основываясь на вышеупомянутых основных концепциях, мы подготовили для сообщества разработчиков список лучших практик по оптимизации Gas-расходов. Следуя этим практикам, разработчики могут снизить потребление Gas в смарт-контрактах, уменьшить транзакционные расходы и создать более эффективные и удобные для пользователей приложения.
1. Старайтесь минимизировать использование хранилища.
В Solidity, Storage( хранение) является ограниченным ресурсом, его потребление газа значительно выше, чем у Memory( памяти). Каждый раз, когда смарт-контракт считывает или записывает данные из хранилища, возникают высокие затраты на газ.
Согласно определению, данному в желтой книге Ethereum, стоимость операций хранения в 100 раз выше, чем стоимость операций с памятью. Например, команды OPcodesmload и mstore потребляют всего 3 единицы газа, в то время как операции хранения, такие как sload и sstore, даже в самых идеальных условиях, стоят как минимум 100 единиц.
Методы ограничения использования хранилища включают:
Хранить непостоянные данные в памяти
Уменьшение количества изменений в хранилище: сохраняйте промежуточные результаты в памяти, а затем после завершения всех вычислений выделяйте результаты переменным хранилища.
2.Упаковка переменных
Количество хранилищ, используемых в смарт-контрактах, и способ, которым разработчики представляют данные, будет значительно влиять на потребление газа.
Компилятор Solidity на этапе компиляции упаковывает последовательные переменные хранения и использует 32-байтный слот хранения в качестве базовой единицы хранения переменных. Упаковка переменных означает разумное размещение переменных, чтобы несколько переменных могли вписаться в один слот хранения.
С помощью этой настройки разработчики могут сэкономить 20 000 единиц газа. Хранение未使用过的存储槽 требует 20 000 газа, но теперь требуется всего два слота для хранения.
Поскольку каждый слот хранения потребляет газ, упаковка переменных оптимизирует использование газа, уменьшая количество необходимых слотов хранения.
( 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 ###, но их синтаксис и структура совершенно разные.
В большинстве случаев отображение более эффективно и имеет более низкие затраты, но массивы имеют возможность итерации и поддерживают упаковку типов данных. Поэтому рекомендуется в первую очередь использовать отображение при управлении списком данных, если не требуется итерация или если можно оптимизировать расход газа с помощью упаковки типов данных.
( 6. Используйте calldata вместо памяти
Переменные, объявленные в параметрах функции, могут храниться в calldata или memory. Основное различие между ними заключается в том, что memory может быть изменен функцией, в то время как calldata является неизменяемым.
Запомните этот принцип: если параметры функции только для чтения, следует в первую очередь использовать calldata, а не memory. Это поможет избежать ненужных операций копирования из calldata функции в memory.
) 7.По возможности используйте ключевые слова Constant/Immutable
Константные/неизменяемые переменные не будут храниться в хранилище контракта. Эти переменные вычисляются во время компиляции и хранятся в байт-коде контракта. Поэтому их стоимость доступа значительно ниже по сравнению с хранилищем, рекомендуется по возможности использовать ключевые слова Constant или Immutable.
8. Используйте Unchecked, чтобы гарантировать отсутствие переполнения/недополнения.
Когда разработчики могут быть уверены, что арифметические операции не приведут к переполнению или недополнению, они могут использовать ключевое слово unchecked, введенное в Solidity v0.8.0, чтобы избежать избыточной проверки на переполнение или недополнение, тем самым экономя газ.
Кроме того, начиная с версии 0.8.0, компиляторы больше не требуют использования библиотеки SafeMath, так как в самом компиляторе уже встроены функции защиты от переполнения и недостатка.
9.Оптимизация модификатора
Код модификатора встроен в изменённую функцию, и каждый раз при использовании модификатора его код копируется. Это увеличит размер байт-кода и повысит потребление газа.
Путем рефакторинга логики в внутреннюю функцию _checkOwner(), можно повторно использовать эту внутреннюю функцию в модификаторе, что позволяет уменьшить размер байт-кода и снизить стоимость газа.
![Оптимизация газа смарт-контрактов Ethereum: десять лучших практик]###https://img-cdn.gateio.im/webp-social/moments-c0701f9e09280a1667495d54e262dd2f.webp###
( 10. Оптимизация короткого замыкания
Для || и && операторов логические операции будут выполнять короткую оценку, то есть если первое условие уже может определить результат логического выражения, то второе условие не будет оцениваться.
Чтобы оптимизировать потребление газа, условия с низкой стоимостью вычислений должны быть размещены в начале, так как это может позволить пропустить дорогостоящие вычисления.
![Ethereum смарт-контрактов Gas оптимизация десяти лучших практик])https://img-cdn.gateio.im/webp-social/moments-a823fb7761aafa6529a6c45304e0314b.webp(
Дополнительные общие рекомендации
) 1. Удалить ненужный код
Если в смарт-контракте есть неиспользуемые функции или переменные, рекомендуется их удалить. Это самый прямой способ уменьшить затраты на развертывание контракта и сохранить его малый размер.
Вот несколько полезных советов:
Используйте наиболее эффективные алгоритмы для выполнения вычислений. Если в смарт-контракте напрямую используются результаты некоторых расчетов, то следует исключить эти избыточные вычислительные процессы. По сути, любые неиспользуемые вычисления должны быть удалены.
В Ethereum разработчики могут получить вознаграждение в виде газа, освободив место для хранения. Если переменная больше не нужна, ее следует удалить с помощью ключевого слова delete или установить в значение по умолчанию.
Оптимизация циклов: избегайте дорогих операций в цикле, по возможности объединяйте циклы и выносите повторные вычисления за пределы тела цикла.
! [10 лучших практик оптимизации газа для смарт-контрактов Ethereum]###https://img-cdn.gateio.im/webp-social/moments-839b91e2f02389949aa698d460a497d8.webp(
) 2. Использование предкомпилированных смарт-контрактов
Предкомпилированные контракты предоставляют сложные библиотечные функции, такие как операции шифрования и хеширования. Поскольку код выполняется не на EVM, а локально на клиентском узле, требуется меньше газа. Использование предкомпилированных контрактов может сэкономить газ за счет уменьшения вычислительных затрат на выполнение смарт-контрактов.
Примеры предкомпилированных смарт-контрактов включают алгоритм цифровой подписи на основе эллиптической кривой ###ECDSA( и хеш-алгоритм SHA2-256. Используя эти предкомпилированные контракты в смарт-контрактах, разработчики могут снизить затраты на Gas и повысить эффективность работы приложений.
) 3. Использование встроенного ассемблера
Встроенная сборка ### in-line assembly ( позволяет разработчикам писать низкоуровневый, но эффективный код, который может выполняться непосредственно EVM, без необходимости использования дорогих операций Solidity. Встроенная сборка также позволяет более точно контролировать использование памяти и хранилища, что дополнительно снижает стоимость газа. Кроме того, встроенная сборка может выполнять некоторые сложные операции, которые трудно реализовать только с использованием Solidity, предоставляя больше гибкости для оптимизации потребления газа.
Однако использование встроенной сборки также может быть рискованным и подверженным ошибкам. Поэтому следует использовать ее с осторожностью и только опытным разработчикам.
![Оптимизация Gas для смарт-контрактов Ethereum: десять лучших практик])https://img-cdn.gateio.im/webp-social/moments-a141884dcdcdc56faff12eee2601b7b7.webp###
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
16 Лайков
Награда
16
8
Репост
Поделиться
комментарий
0/400
OnchainHolmes
· 3ч назад
Газ费 высокие до безобразия, как теперь играть?
Посмотреть ОригиналОтветить0
SandwichTrader
· 08-11 03:14
Газ опять涨上天了 救命
Посмотреть ОригиналОтветить0
MEVictim
· 08-10 14:16
Снова говоришь о каких-то бесполезных теориях, лучше просто научи меня арбитражу.
Посмотреть ОригиналОтветить0
UnluckyValidator
· 08-10 11:27
Эти Газ сборы действительно изматывают, после создания блока ничего не получено.
Посмотреть ОригиналОтветить0
GasFeeCryer
· 08-10 11:15
газ как снова вырос, ууу
Посмотреть ОригиналОтветить0
AlwaysAnon
· 08-10 11:14
Спасите, когда этот Газ наконец упадет?
Посмотреть ОригиналОтветить0
0xSoulless
· 08-10 11:13
韭都被Газ разыгрывайте людей как лохов了 还整这虚的
Посмотреть ОригиналОтветить0
SleepyValidator
· 08-10 11:09
Газовые сборы стали такими высокими, что не хватает денег на еду.
Подробное объяснение оптимизации Gas для смарт-контрактов Ethereum: 10 полезных советов
Оптимизация Gas для смарт-контрактов Ethereum: лучшие практики
Проблема с Gas-стоимостью в основной сети Ethereum всегда была сложной, особенно это проявляется во время перегрузок сети. В пиковые часы пользователи вынуждены платить высокие транзакционные сборы. Поэтому оптимизация Gas-стоимости на этапе разработки смарт-контрактов имеет решающее значение. Оптимизация потребления Gas не только позволяет эффективно снизить транзакционные затраты, но и повышает эффективность транзакций, обеспечивая пользователям более экономичный и эффективный опыт работы с блокчейном.
В данной статье будет описан механизм комиссии за Gas в виртуальной машине Ethereum (EVM), основные концепции оптимизации комиссий за Gas, а также лучшие практики оптимизации комиссий за Gas при разработке смарт-контрактов. Надеемся, что этот материал вдохновит разработчиков и окажет практическую помощь, а также поможет обычным пользователям лучше понять, как работает комиссия за Gas в EVM, чтобы вместе справляться с вызовами в экосистеме блокчейна.
Введение в механизм платёжных Gas в EVM
В сетях, совместимых с EVM, "Gas" является единицей измерения вычислительной мощности, необходимой для выполнения определенных операций.
В структуре EVM потребление газа делится на три части: выполнение операций, вызовы внешних сообщений и чтение/запись в память и хранилище.
Поскольку выполнение каждой транзакции требует вычислительных ресурсов, взимается определенная плата, чтобы предотвратить бесконечные циклы и атаки отказа в обслуживании ( DoS ). Плата за выполнение транзакции называется "Gas-стоимость".
С тех пор как вступил в силу хардфорк Лондона EIP-1559( ), плата за газ рассчитывается по следующей формуле:
Газовая плата = единицы использованного газа * ( базовая плата + плата за приоритет )
Базовая комиссия будет уничтожена, а приоритетная комиссия будет использоваться в качестве стимула, побуждая валидаторов добавлять транзакции в блокчейн. Установка более высокой приоритетной комиссии при отправке транзакции может увеличить вероятность того, что транзакция будет включена в следующий блок. Это похоже на "чаевые", которые пользователи платят валидаторам.
Понимание оптимизации Gas в EVM
Когда смарт-контракт компилируется с помощью Solidity, контракт преобразуется в серию "операционных кодов", то есть opcodes.
Любой код операции (, например, создание контракта, выполнение вызова сообщений, доступ к хранилищу аккаунта и выполнение операций на виртуальной машине ) имеет признанную стоимость потребления газа, эти расходы зафиксированы в желтой книге Ethereum.
После нескольких изменений EIP, некоторые коды операций были скорректированы по стоимости Gas, что может отличаться от желтой книги.
Основные концепции оптимизации газа
Основная идея оптимизации Gas заключается в том, чтобы в блокчейне EVM приоритизировать операции с высокой стоимостью эффективности и избегать операций с дорогими затратами на Gas.
В EVM следующие операции имеют низкую стоимость:
Дорогие операции включают:
Лучшие практики оптимизации EVM Gas затрат
Основываясь на вышеупомянутых основных концепциях, мы подготовили для сообщества разработчиков список лучших практик по оптимизации Gas-расходов. Следуя этим практикам, разработчики могут снизить потребление Gas в смарт-контрактах, уменьшить транзакционные расходы и создать более эффективные и удобные для пользователей приложения.
1. Старайтесь минимизировать использование хранилища.
В Solidity, Storage( хранение) является ограниченным ресурсом, его потребление газа значительно выше, чем у Memory( памяти). Каждый раз, когда смарт-контракт считывает или записывает данные из хранилища, возникают высокие затраты на газ.
Согласно определению, данному в желтой книге Ethereum, стоимость операций хранения в 100 раз выше, чем стоимость операций с памятью. Например, команды OPcodesmload и mstore потребляют всего 3 единицы газа, в то время как операции хранения, такие как sload и sstore, даже в самых идеальных условиях, стоят как минимум 100 единиц.
Методы ограничения использования хранилища включают:
2.Упаковка переменных
Количество хранилищ, используемых в смарт-контрактах, и способ, которым разработчики представляют данные, будет значительно влиять на потребление газа.
Компилятор Solidity на этапе компиляции упаковывает последовательные переменные хранения и использует 32-байтный слот хранения в качестве базовой единицы хранения переменных. Упаковка переменных означает разумное размещение переменных, чтобы несколько переменных могли вписаться в один слот хранения.
С помощью этой настройки разработчики могут сэкономить 20 000 единиц газа. Хранение未使用过的存储槽 требует 20 000 газа, но теперь требуется всего два слота для хранения.
Поскольку каждый слот хранения потребляет газ, упаковка переменных оптимизирует использование газа, уменьшая количество необходимых слотов хранения.
( 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 ###, но их синтаксис и структура совершенно разные.
В большинстве случаев отображение более эффективно и имеет более низкие затраты, но массивы имеют возможность итерации и поддерживают упаковку типов данных. Поэтому рекомендуется в первую очередь использовать отображение при управлении списком данных, если не требуется итерация или если можно оптимизировать расход газа с помощью упаковки типов данных.
( 6. Используйте calldata вместо памяти
Переменные, объявленные в параметрах функции, могут храниться в calldata или memory. Основное различие между ними заключается в том, что memory может быть изменен функцией, в то время как calldata является неизменяемым.
Запомните этот принцип: если параметры функции только для чтения, следует в первую очередь использовать calldata, а не memory. Это поможет избежать ненужных операций копирования из calldata функции в memory.
) 7.По возможности используйте ключевые слова Constant/Immutable
Константные/неизменяемые переменные не будут храниться в хранилище контракта. Эти переменные вычисляются во время компиляции и хранятся в байт-коде контракта. Поэтому их стоимость доступа значительно ниже по сравнению с хранилищем, рекомендуется по возможности использовать ключевые слова Constant или Immutable.
8. Используйте Unchecked, чтобы гарантировать отсутствие переполнения/недополнения.
Когда разработчики могут быть уверены, что арифметические операции не приведут к переполнению или недополнению, они могут использовать ключевое слово unchecked, введенное в Solidity v0.8.0, чтобы избежать избыточной проверки на переполнение или недополнение, тем самым экономя газ.
Кроме того, начиная с версии 0.8.0, компиляторы больше не требуют использования библиотеки SafeMath, так как в самом компиляторе уже встроены функции защиты от переполнения и недостатка.
9.Оптимизация модификатора
Код модификатора встроен в изменённую функцию, и каждый раз при использовании модификатора его код копируется. Это увеличит размер байт-кода и повысит потребление газа.
Путем рефакторинга логики в внутреннюю функцию _checkOwner(), можно повторно использовать эту внутреннюю функцию в модификаторе, что позволяет уменьшить размер байт-кода и снизить стоимость газа.
![Оптимизация газа смарт-контрактов Ethereum: десять лучших практик]###https://img-cdn.gateio.im/webp-social/moments-c0701f9e09280a1667495d54e262dd2f.webp###
( 10. Оптимизация короткого замыкания
Для || и && операторов логические операции будут выполнять короткую оценку, то есть если первое условие уже может определить результат логического выражения, то второе условие не будет оцениваться.
Чтобы оптимизировать потребление газа, условия с низкой стоимостью вычислений должны быть размещены в начале, так как это может позволить пропустить дорогостоящие вычисления.
![Ethereum смарт-контрактов Gas оптимизация десяти лучших практик])https://img-cdn.gateio.im/webp-social/moments-a823fb7761aafa6529a6c45304e0314b.webp(
Дополнительные общие рекомендации
) 1. Удалить ненужный код
Если в смарт-контракте есть неиспользуемые функции или переменные, рекомендуется их удалить. Это самый прямой способ уменьшить затраты на развертывание контракта и сохранить его малый размер.
Вот несколько полезных советов:
Используйте наиболее эффективные алгоритмы для выполнения вычислений. Если в смарт-контракте напрямую используются результаты некоторых расчетов, то следует исключить эти избыточные вычислительные процессы. По сути, любые неиспользуемые вычисления должны быть удалены.
В Ethereum разработчики могут получить вознаграждение в виде газа, освободив место для хранения. Если переменная больше не нужна, ее следует удалить с помощью ключевого слова delete или установить в значение по умолчанию.
Оптимизация циклов: избегайте дорогих операций в цикле, по возможности объединяйте циклы и выносите повторные вычисления за пределы тела цикла.
! [10 лучших практик оптимизации газа для смарт-контрактов Ethereum]###https://img-cdn.gateio.im/webp-social/moments-839b91e2f02389949aa698d460a497d8.webp(
) 2. Использование предкомпилированных смарт-контрактов
Предкомпилированные контракты предоставляют сложные библиотечные функции, такие как операции шифрования и хеширования. Поскольку код выполняется не на EVM, а локально на клиентском узле, требуется меньше газа. Использование предкомпилированных контрактов может сэкономить газ за счет уменьшения вычислительных затрат на выполнение смарт-контрактов.
Примеры предкомпилированных смарт-контрактов включают алгоритм цифровой подписи на основе эллиптической кривой ###ECDSA( и хеш-алгоритм SHA2-256. Используя эти предкомпилированные контракты в смарт-контрактах, разработчики могут снизить затраты на Gas и повысить эффективность работы приложений.
) 3. Использование встроенного ассемблера
Встроенная сборка ### in-line assembly ( позволяет разработчикам писать низкоуровневый, но эффективный код, который может выполняться непосредственно EVM, без необходимости использования дорогих операций Solidity. Встроенная сборка также позволяет более точно контролировать использование памяти и хранилища, что дополнительно снижает стоимость газа. Кроме того, встроенная сборка может выполнять некоторые сложные операции, которые трудно реализовать только с использованием Solidity, предоставляя больше гибкости для оптимизации потребления газа.
Однако использование встроенной сборки также может быть рискованным и подверженным ошибкам. Поэтому следует использовать ее с осторожностью и только опытным разработчикам.
![Оптимизация Gas для смарт-контрактов Ethereum: десять лучших практик])https://img-cdn.gateio.im/webp-social/moments-a141884dcdcdc56faff12eee2601b7b7.webp###
( 4.