8 простих трюків з оптимізації газу для міцності

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

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

У Документація Ethereum, газ визначається таким чином:

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

Іншими словами, чим складніший ваш код, тим дорожче він коштуватиме.
Деталізація того, як розраховується плата за газ, є складною і може стати предметом окремої публікації. Найважливіша формула для розуміння:

Плата за газ=одиниці газу*ціна газу

Газові агрегати це загальна вартість обчислювальних операцій, виміряна в одиниці, яка називається газ.
Ціна на газ це ціна газу в гвей (10-9 ефір). Ціна на газ коливається залежно від використання мережі Ethereum.

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

Як оптимізувати плату за газ

Газова оптимізація просто віддає перевагу тому, що є «дешевим» для обчислення, як-от локальні змінні чи константи, і уникає, наскільки це можливо, того, що є «дорогим» для обчислення, як-от змінні стану, що зберігаються в контрактних сховищах або циклах.

Ось кілька порад, щоб почати оптимізувати свій газ.

Порада №1: не ініціалізуйте змінні

Якщо змінна не ініціалізована, передбачається, що вона має значення за замовчуванням (0, false, 0x0, …). Ініціалізація тоді змінні просто a відходи газу.

Порада №2: використовуйте локальні змінні замість змінних стану в циклах

Читання та письмо місцевий змінні є дешево, тоді як читання та письмо були змінні, які зберігаються в контрактному сховищі дорогий.

Порада №3: ​​використовуйте зовнішні та внутрішні замість публічних

external означає, що ви можете викликати свою функцію поза контрактом.
internal означає, що ви можете викликати свою функцію з вашого контракту.
public є сумішшю external та internal, ви можете зробити обидва.
As external та internal надає менший доступ, ніж public, вони є більш дешевий.
Тоді будемо завжди надавати перевагу to use external or internal спочатку та змініть його громадськість якщо це необхідно.

Порада №4: Зберігайте дані в пам’яті, а не в пам’яті

Важливо вибрати ідеальне місце розташування даних. Ви повинні знати ці: 

  • зберігання – змінна зберігається в блокчейні. Це постійна змінна стану. Витрати на газ, щоб визначити його та змінити.
  • пам'ять – тимчасова змінна, оголошена всередині функції. Без газу для декларування. Але це коштує газу для зміни змінних пам'яті (менше, ніж зберігання)
  • дані виклику – подібно до пам’яті, але не піддається змінам і доступний лише як аргумент зовнішніх функцій

Якщо місце розташування даних не вказано, за умовчанням сховище.

Порада №5: упорядкуйте свої змінні

Порядок ваших змінних має значення в смарт-контрактах. Solidity зберігає дані в a один слот 256 біт. Якщо ваша змінна менша за один слот, вона запаковується іншою змінною, яку потрібно помістити в один слот. Але для цього нам потрібно зробити ці змінні поруч одна з одною.

Порада №6: видаліть свої змінні, щоб отримати відшкодування за газ

Це також чудова функція Solidity. Оскільки немає збору сміття, вам доведеться самостійно викинути невикористані дані. Метою тут є економія місця на блокчейні. Хороша новина полягає в тому, що ви отримаєте Повернення 75% ваших витрат на зберігання

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

Порада №7: використовуйте вкладені if або множинні вимагати замість && оператор

Спочатку для видимість, то тому що так більш дешевий!

Порада №8: використовуйте оптимізатор Solidity

Переконатися Оптимізатор Solidity is включений. Це зменшує витрати газу. Стандартне число 200. 

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

Написане
Авігдор Сасон Коен

Авігдор є дослідником безпеки web3 у Sayfer. Він захоплений новими технологіями блокчейну та тим, як ми можемо забезпечити їх безпечний розвиток.

 

Перейти до вмісту