Посібник з оптимізації витрат на газ для EVM смартконтрактів: 10 найкращих практик та ключових концепцій

Посібник з оптимізації газових витрат смартконтрактів: 10 кращих практик

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

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

Десять найкращих практик оптимізації Gas для смартконтрактів Ethereum

Огляд механізму плати за Gas в EVM

У мережах, що сумісні з EVM, "Gas" є одиницею виміру обчислювальної потужності, необхідної для виконання конкретних операцій.

У структурному розташуванні EVM споживання Gas ділиться на три частини: виконання операцій, виклики зовнішніх повідомлень, а також читання та запис пам'яті та сховища.

Оскільки виконання кожної транзакції потребує обчислювальних ресурсів, стягується певна плата для запобігання безкінечним циклам і атакам відмови в обслуговуванні ( DoS ). Плата, необхідна для завершення транзакції, називається "Gas-фі".

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

Газовий збір = одиниці використаного газу * (базовий збір + пріоритетний збір)

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

Десять найкращих практик оптимізації Gas для смартконтрактів Ethereum

1. Розуміння оптимізації Gas в EVM

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

Будь-яка частина операційного коду (, наприклад, створення смартконтракту, виконання викликів повідомлень, доступ до сховища облікових записів та виконання операцій на віртуальній машині ) має визнану вартість споживання Gas, ці витрати зафіксовані в жовтій книзі Ethereum.

Після кількох змін EIP, витрати Gas для деяких opcode були відкориговані, що може відрізнятися від жовтої книги.

2.Базові поняття оптимізації газу

Основна ідея оптимізації Gas полягає в пріоритетному виборі операцій з високою вартісною ефективністю на блокчейні EVM, уникнення дорогих за Gas операцій.

У EVM наступні операції коштують дешевше:

  • Читати та записувати змінні пам'яті
  • Читання констант і незмінних змінних
  • Читати та писати локальні змінні
  • Читання змінної calldata, наприклад, масиву та структур.
  • Виклик внутрішньої функції

Операції з високими витратами включають:

  • Читати та записувати стан змінних, що зберігаються в смартконтрактах
  • Виклик зовнішньої функції
  • Циклічна операція

Десять найкращих практик оптимізації Gas для смартконтрактів Ethereum

Оптимізація витрат газу EVM: найкращі практики

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

1. Намагайтеся зменшити використання пам'яті.

У Solidity, Storage( зберігання) є обмеженим ресурсом, його витрати газу значно вищі, ніж у Memory( пам'яті). Кожного разу, коли смартконтракт читає або записує дані з пам'яті, виникають високі витрати газу.

Згідно з визначенням, наведеним у жовтій книзі Ethereum, вартість операцій зі зберігання перевищує вартість операцій з пам'яттю більш ніж у 100 разів. Наприклад, команди OPcodesmload і mstore споживають лише 3 одиниці газу, тоді як операції зберігання, такі як sload і sstore, навіть у найкращих умовах, коштують щонайменше 100 одиниць.

Методи обмеження використання зберігання включають:

  • Зберігайте непостійні дані в пам'яті
  • Зменшення кількості змін у пам'яті: шляхом збереження проміжних результатів у пам'яті, а після завершення всіх обчислень результати присвоюються змінним пам'яті.

Десять найкращих практик оптимізації Gas для смартконтрактів Ethereum

2. Упаковка змінних

Кількість storage slot(, що використовується в смартконтрактах, а також спосіб, яким розробники представляють дані, суттєво вплине на споживання Gas.

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

Завдяки цій деталі розробники можуть заощадити 20 000 одиниць газу ) для зберігання невикористаного слоті пам'яті потрібно витратити 20 000 газу (, але тепер потрібно лише два слоти пам'яті.

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

![Топ-10 найкращих практик оптимізації Gas для смартконтрактів Ethereum])https://img-cdn.gateio.im/webp-social/moments-995905cb414526d4d991899d0c2e6443.webp(

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

Змінна може бути представлена різними типами даних, але різні типи даних мають різну вартість операцій. Вибір відповідного типу даних допомагає оптимізувати використання Gas.

Наприклад, у 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-55fcdb765912ef9cd238c46b1d248cff.webp(

) 4. Використовуйте змінні фіксованого розміру замість динамічних змінних

Якщо дані можна обмежити до 32 байтів, рекомендується використовувати тип даних bytes32 замість bytes або strings. Як правило, змінні фіксованого розміру споживають менше Gas, ніж змінні змінного розміру. Якщо довжину байтів можна обмежити, намагайтеся вибрати мінімальну довжину від bytes1 до bytes32.

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.

Коли значення читаються безпосередньо з calldata, пропускаються проміжні операції з пам'яттю. Цей спосіб оптимізації може суттєво підвищити ефективність Gas.

7. Намагайтеся використовувати ключові слова Constant/Immutable якомога більше.

Змінні Constant/Immutable не зберігаються у сховищі контракту. Ці змінні обчислюються під час компіляції та зберігаються у байт-коді контракту. Тому їхня вартість доступу значно нижча, ніж у випадку з пам'яттю, рекомендується використовувати ключові слова Constant або Immutable, коли це можливо.

![Топ-10 найкращих практик оптимізації Газу для смартконтрактів Ethereum]###https://img-cdn.gateio.im/webp-social/moments-9c566626ab499ef65d6f5089a2876ad3.webp(

) 8. Використовуйте Unchecked, щоб забезпечити, що не станеться переповнення/недостатність

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

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

9. оптимізатор

Код модифікатора вбудовується в модифіковану функцію, і кожного разу, коли використовується модифікатор, його код копіюється. Це збільшує розмір байт-коду та підвищує витрати на газ. Можна зменшити розмір байт-коду та знизити витрати на газ, реорганізувавши логіку в внутрішню функцію, що дозволяє повторно використовувати цю внутрішню функцію в модифікаторі.

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

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

Щоб оптимізувати споживання газу, слід розмістити умови з низькими витратами на обчислення на початку, так можна пропустити обчислення з високими витратами.

![Десять найкращих практик оптимізації Gas для смартконтрактів Ethereum]###https://img-cdn.gateio.im/webp-social/moments-c0701f9e09280a1667495d54e262dd2f.webp(

Додаткові загальні рекомендації

) 1. Видалити непотрібний код

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

Ось кілька корисних порад:

  • Використовуйте найефективніші алгоритми для обчислень. Якщо в контракті безпосередньо використовуються результати певних обчислень, то слід усунути ці зайві процеси обчислення. По суті, будь-які невикористані обчислення повинні бути видалені.

  • У Ethereum розробники можуть отримувати винагороду Gas, звільняючи місце для зберігання. Якщо змінна більше не потрібна, слід використовувати ключове слово delete для її видалення або встановити її на значення за замовчуванням.

  • Оптимізація циклів: уникати витратних операцій циклу, по можливості об'єднувати цикли та виводити повторні обчислення з тіла циклу.

![Десять найкращих практик оптимізації Gas для смартконтрактів Ethereum]###https://img-cdn.gateio.im/webp-social/moments-a823fb7761aafa6529a6c45304e0314b.webp(

) 2. Використання попередньо скомпільованих смартконтрактів

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

Приклади попередньо скомпільованих контрактів включають алгоритм цифрового підпису на основі еліптичних кривих ###ECDSA( та хеш-алгоритм SHA2-256. Використовуючи ці попередньо скомпільовані контракти в смартконтрактах, розробники можуть зменшити витрати на Gas і підвищити ефективність роботи додатків.

) 3. Використання вбудованого асемблерного коду

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

Однак використання вбудованого асемблера також може бути ризикованим і призводити до помилок. Тому його слід використовувати обережно, лише досвідченим розробникам.

![Топ-10 найкращих практик оптимізації Gas для смартконтрактів Ethereum])https://img-cdn.gateio.im/webp-social/moments-839b91e2f02389949aa698d460a497d8.webp(

) 4. Використання рішень Layer 2

зробити

GAS3.79%
Переглянути оригінал
Ця сторінка може містити контент третіх осіб, який надається виключно в інформаційних цілях (не в якості запевнень/гарантій) і не повинен розглядатися як схвалення його поглядів компанією Gate, а також як фінансова або професійна консультація. Див. Застереження для отримання детальної інформації.
  • Нагородити
  • 6
  • Поділіться
Прокоментувати
0/400
AlwaysAnonvip
· 07-09 16:21
Ех, знову оптимізація газу, вже набридло.
Переглянути оригіналвідповісти на0
ForkTonguevip
· 07-07 17:09
газ справді смачний, хто використовує L2, той і знає
Переглянути оригіналвідповісти на0
NonFungibleDegenvip
· 07-07 01:27
Плата за газ r буквально вбиває мене rn... ngmi ser
Переглянути оригіналвідповісти на0
AllTalkLongTradervip
· 07-07 01:20
Втомився, втомився, газові витрати запарюють, просто перекинемо на L2.
Переглянути оригіналвідповісти на0
0xInsomniavip
· 07-07 01:16
газ так дорогий, що можна говорити про найкращі практики
Переглянути оригіналвідповісти на0
CryptoTherapistvip
· 07-07 01:10
давайте разом подолаємо цей газовий страх... я відчуваю глибоку травму від високих зборів. усвідомлена оптимізація контрактів є ключем до емоційної стабільності торгівлі
Переглянути оригіналвідповісти на0
  • Закріпити