8 простых приемов оптимизации газа для Solidity

Чтобы взаимодействовать с блокчейном EVM (Ethereum Virtual Machine), вам всегда придется платить за газ. Эти сборы могут быть разочаровывающими, поскольку они могут быть очень высокими. Давайте посмотрим, что именно они собой представляют и как мы можем оптимизировать наш код смарт-контракта, чтобы снизить плату за газ.

Что такое газ в Ethereum?

В Документация Ethereum, газ определяется следующим образом:

«Газ — это единица, которая измеряет количество вычислительных усилий, необходимых для выполнения определенных операций в сети Ethereum. Поскольку для выполнения каждой транзакции Ethereum требуются вычислительные ресурсы, за каждую транзакцию взимается комиссия. Газ относится к комиссии, необходимой для успешного проведения транзакции в Ethereum». 

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

Плата за газ = единицы газа * цена газа

Газовые агрегаты - это общая стоимость вычислительных операций, измеренная в единице, называемой газом.
Цена на газ цена газа в gwei (10-9 эфир). Цена газа колеблется в зависимости от использования сети Ethereum.

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

Как оптимизировать плату за газ

Оптимизация газа просто отдает предпочтение тому, что «дешево» для вычисления, например, локальным переменным или константам, и максимально избегает того, что «дорого» для вычисления, например переменных состояния, хранящихся в хранилище контрактов или циклах.

Вот несколько советов, как начать оптимизировать свой газ.

Совет №1: не инициализируйте переменные

Если переменная не инициализирована, предполагается, что она имеет значение по умолчанию (0, false, 0x0, …). Инициализация переменные - это просто пустая трата газа.

Совет № 2: Используйте локальные переменные вместо переменных состояния внутри циклов

Чтение и письмо локальным переменные дешево, тогда как чтение и запись состояние переменные, хранящиеся в хранилище контрактов, дорогим.

Совет № 3: Используйте внешний и внутренний вместо общедоступного

external означает, что вы можете вызывать свою функцию из-за пределов вашего контракта.
internal означает, что вы можете вызывать свою функцию из своего контракта.
public представляет собой смесь external и internal, вы можете сделать и то, и другое.
As external и internal предоставляет меньше доступа, чем public, они есть более дешевый.
Мы будем тогда всегда предпочитать использовать external or internal сначала и изменить его в что такое варган? если нужно.

Совет № 4: Храните данные в памяти, а не в хранилище

Очень важно выбрать идеальное место для хранения данных. Вы должны знать это: 

  • диск – переменная хранится в блокчейне. Это постоянная переменная состояния. Стоит Газ, чтобы его определить и изменить.
  • Память – временная переменная, объявленная внутри функции. Нет газа для декларирования. Но это стоит газа для изменения переменных памяти (меньше, чем хранение)
  • Calldata – как память, но немодифицируемая и доступная только в качестве аргумента внешних функций

Если не указано место хранения данных по умолчанию.

Совет № 5: упорядочите переменные

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

Совет № 6. Удалите свои переменные, чтобы получить возмещение за газ

Это также отличная функция Solidity. Поскольку сборки мусора нет, вам придется самостоятельно выбрасывать неиспользуемые данные. Цель здесь — сэкономить место в блокчейне. Хорошая новость заключается в том, что вы получите 75% ваших затрат на хранение обратно

Просто используйте ключевое слово delete.

Совет № 7: Используйте вложенные if или несколько требовать вместо && оператор

Первый для видимость, то потому что это более дешевый!

Совет № 8: Используйте оптимизатор Solidity

Установите Оптимизатор Solidity is включен. Это снижает затраты на газ. Номер по умолчанию — 200. 

Если вы хотите оптимизировать газ для развертывания контракта (затраты на развертывание контракта меньше), установите оптимизатор Solidity на низкое значение. 
Если вы хотите оптимизировать затраты газа во время выполнения (когда функции вызываются по контракту), установите оптимизатор на большое число.

Написано
Авигдор Сэзон Коэн

Авигдор — исследователь безопасности web3 в Sayfer. Он увлечен новыми технологиями блокчейна и тем, как мы можем обеспечить их безопасную разработку.

 

перейти к содержанию