Оптимізація газу смарт-контрактів
До нас звернувся DeFi-проєкт: деплой їх ERC-1155 контракту обійшовся в 0.8 ETH замість очікуваних 0.3. Користувачі платили по $15 за кожен transfer() при gas price 30 gwei, тоді як конкуренти — по $4. Причина — не storage layout і неоптимальні патерни, які компілятор Solidity не виправляє за вас. Ми провели аудит газу та знизили вартість деплою на 62%, а транзакцій — у 3 рази. Наш досвід оптимізації 50+ контрактів показує, що 80% втрат усуваються правильною архітектурою сховища. Кожна зайва операція SLOAD або SSTORE множиться на тисячі викликів. У цій статті ми розберемо конкретні патерни, які дають економію 30–50% на типових контрактах.
Чому storage — головне джерело втрат газу?
SSTORE коштує 20 000 gas при записі в холодний слот, 2 900 gas при оновленні теплого. SLOAD — 2 100 gas для холодного, 100 для теплого (згідно з EIP-2929). Саме тому архітектура сховища визначає 60-80% вартості контракту.
Slot packing — перший інструмент. EVM зберігає дані в 32-байтових слотах. Якщо оголосити змінні так:
// Погано: 3 слоти uint128 a; uint256 b; uint128 c; // Добре: 2 слоти (a і c упаковані) uint128 a; uint128 c; uint256 b; Дає економію двох SLOAD при читанні. На контракті з 10 000 деплоями економія — сотні ETH сумарно.
Таблиця вартості операцій storage
| Операція | Gas (холодний) | Gas (теплий) |
|---|---|---|
| SLOAD | 2100 | 100 |
| SSTORE (new) | 20000 | 20000 |
| SSTORE (update) | 2900 | 2900 |
| BALANCE | 2600 | 100 |
Це не просто цифри — знання цих значень дозволяє вибирати між читанням з storage та обчисленням.
Як знайти вузькі місця в контракті?
Інструменти аналізу
| Інструмент | Що показує |
|---|---|
| Hardhat Gas Reporter | Gas на кожен виклик функції в тестах |
Foundry forge test --gas-report |
Те саме, але швидше та з diff між комітами |
eth-gas-reporter |
Деталізація по opcodes через --verbose |
| Tenderly Gas Profiler | Breakdown по EVM-трейсу реальної транзакції |
| Remix Gas Estimation | Швидка перевірка без setup |
Foundry — переважний вибір. forge snapshot створює .gas-snapshot файл, який можна комітити в репозиторій і відстежувати регресії газу в CI:
forge snapshot # змінюємо код forge snapshot --diff Різниця одразу видна порядково по кожній функції.
Mappings vs Arrays
mapping(uint256 => address) — O(1) доступ, gas-ефективний. address[] з пошуком за значенням — O(n) і в 99% випадків помилка архітектури. Якщо потрібна ітерація — індексуй через події, читай off-chain через The Graph.
Неочевидне джерело: keccak256 на коротких рядках
string memory name у функції, яка викликається тисячі разів — це ABI encoding overhead. Заміна рядків на bytes32 константи там, де рядки відомі заздалегідь, дає 200-500 gas на виклик.
Конкретні патерни оптимізації
Custom errors замість require з рядками
// До: 24 000 gas на деплой одного рядка require(amount > 0, "Amount must be positive"); // Після: економія ~200 gas per revert + менше байткоду error AmountZero(); if (amount == 0) revert AmountZero(); Custom errors (EIP-838) стали стандартом з Solidity 0.8.4. Рядки в require — це bytecode, який збільшує вартість деплою та revert.
Unchecked arithmetic
З Solidity 0.8.0 всі арифметичні операції перевіряють overflow за замовчуванням. Перевірка коштує ~100 gas per operation. Там, де overflow математично неможливий:
unchecked { ++i; // у циклі for — стандартний патерн total += amounts[i]; // якщо суми обмежені та перевірені вище } На циклі з 100 ітерацій — економія 10 000+ gas.
Immutable та constant
constant — значення вбудовується в байткод, SLOAD не потрібен. immutable — значення записується в байткод при деплої, читається як PUSH32. Обидва в ~3 рази дешевші за читання з storage. Адреса токена, fee basis points, адреса owner в контракті, який не апгрейдиться — все це кандидати на immutable.
Calldata vs memory для вхідних параметрів
// memory — копіює дані в пам'ять function process(uint256[] memory ids) external // calldata — читає напряму з calldata, не копіює function process(uint256[] calldata ids) external Для зовнішніх функцій (external), де дані лише читаються — calldata дешевше. Різниця зростає з розміром масиву: на масиві з 50 елементів — 3 000-5 000 gas.
Що входить в оптимізацію газу
- Аудит baseline: запускаємо всі тести з
forge test --gas-report, фіксуємо baseline. Жодних змін без вимірювань до та після. - Профілювання через Tenderly: беремо реальні транзакції з mainnet (якщо контракт уже задеплоєно) або симулюємо в Tenderly fork. Дивимося breakdown по EVM opcodes.
- Ітеративна оптимізація: застосовуємо зміни по одній, вимірюємо. Slot packing зазвичай дає найбільший ефект — починаємо з нього.
- Regression testing:
forge snapshotв CI. Будь-який PR, який збільшує gas більш ніж на 1%, вимагає обґрунтування. - Документація та звіт: фіксуємо всі зміни, економію по кожній функції, рекомендації з подальшої підтримки.
Ми також надаємо навчання команди: як не наступати на ті ж граблі в майбутньому.
Приклад розрахунку економії на storage packing
Контракт з 1 000 000 викликів `mint` з 3 слотами замість 2: кожен зайвий SLOAD коштує 100 gas (warm) або 2100 (cold). При 30 gwei економія становить від кількох сотень доларів.Процес роботи
- Аналітика: аудит поточного контракту, аналіз gas profile.
- Проєктування: визначаємо патерни, які дадуть максимальний ефект.
- Реалізація: вносимо зміни в код, пишемо тести.
- Тестування: regression, stress test, deploy на testnet.
- Деплой: розгортання оптимізованого контракту, міграція даних (якщо потрібно).
Орієнтири за термінами
Аудит газу існуючого контракту + звіт з рекомендаціями: 1-2 дні. Оптимізація з імплементацією змін і тестами: 2-3 дні залежно від складності контракту. Повна переробка storage layout (якщо архітектура спочатку неоптимальна): від 1 тижня, оскільки потребує міграційних скриптів для існуючих даних.
Вартість розраховується після аналізу контракту та поточного gas profile.
Чому обирають нас?
- Більше 5 років досвіду в розробці смарт-контрактів на Solidity, Rust та Vyper.
- Виконали аудит та оптимізацію для 30+ DeFi-проєктів, включаючи протоколи з TVL > $50M.
- Гарантуємо зниження газу на 20–50% на ключових функціях.
- Працюємо з контрактами на Ethereum, Polygon, Arbitrum, Optimism, Base, Solana, BNB Chain.
Якщо ви шукаєте, як знизити вартість транзакцій та заощадити на деплої, зв'яжіться з нами для безкоштовної попередньої оцінки. Отримайте консультацію інженера — визначимо потенціал оптимізації за 1 годину.







