Batch-транзакції в dApp: економія газу, атомарність та безпека
Коли три транзакції — дорога помилка
Користувач хоче додати ліквідність у пул Uniswap V3. Реальний процес: approve токена A, approve токена B, mint позиції. Три окремі транзакції — три підтвердження в MetaMask, три оплати газу. Якщо між approve та mint станеться фронтран, позиція створиться за небажаною ціною, і користувач втратить кошти. Кожна окрема транзакція вимагає оплати газу — при batch-підході ви платите лише один раз, заощаджуючи до 46% на intrinsic cost. При базовій ціні газу 30 gwei економія на одній batch-транзакції може сягати $0.50–$2.00 залежно від кількості операцій.
Batch-транзакції вирішують проблему: одне підтвердження, один газ, атомарне виконання. Наша команда розробляє такі рішення під ключ на Solidity, Rust (Solana) та Move. Маємо 5+ років досвіду в DeFi, понад 50 реалізованих проєктів та сертифікованих аудитів. Оцінимо ваш проєкт за 2 дні — зв'яжіться для консультації.
Чому batch-транзакції вигідніші?
Кожна транзакція в EVM коштує мінімум 21 000 gas (intrinsic cost). Batch з 5 операцій в окремих транзакціях: 5 × 21 000 = 105 000 gas лише на intrinsic. Через Multicall3 — один раз 21 000 + overhead роутера (~2 000 gas) + gas на кожен виклик без intrinsic cost. Batch-транзакції в 3 рази дешевші за послідовне виконання для типових DeFi-операцій.
| Сценарій | Окремі транзакції | Batch (Multicall3) | Економія |
|---|---|---|---|
| 3 ERC-20 transfer | 3 × 65 000 = 195 000 | ~125 000 | ~36% |
| 5 approve + swap | 5 × 46 000 = 230 000 | ~148 000 | ~36% |
| 10 NFT mint | 10 × 120 000 = 1 200 000 | ~650 000 | ~46% |
Реальні цифри залежать від логіки, але економія 30-50% на intrinsic cost — консервативна оцінка.
Як впровадити batch-транзакції: 4 кроки
- Вибір підходу. Визначте, чи достатньо Multicall3 чи потрібен кастомний BatchExecutor з whitelist-ами.
- Розробка контрактів. Напишіть код на Solidity, використовуючи Foundry або Hardhat, з тестуванням на форку.
- Тестування. Покрийте сценарії реентрансі, переповнення газу (gas limit) та атомарності за допомогою Slither та Mythril.
- Інтеграція з фронтендом. Використовуйте viem або ethers.js для виклику batch-функцій.
Як вибрати між Multicall3 та кастомним BatchExecutor?
Router-паттерн — контракт-агрегатор, що приймає масив викликів і виконує їх послідовно. Найпростіший варіант — Multicall3 від MakerDAO, задеплоєний у більшості EVM-мереж за адресою 0xcA11bde05977b3631167028862bE2a173976CA11.
struct Call3 { address target; bool allowFailure; bytes callData; } function aggregate3(Call3[] calldata calls) external payable returns (Result[] memory returnData); allowFailure: false робить весь batch атомарним — якщо один виклик reverts, відкочується все. allowFailure: true дозволяє продовжити при помилці (partial execution). Проблема router-паттерну: approve токена на адресу контракту-роутера. Користувач повинен довіряти роутеру, що той не виведе токени. Для кастомних роутерів це створює UX-бар'єр і потребує аудиту.
EIP-4337 (Account Abstraction) — інший рівень. Користувач контролює smart contract wallet, який може виконувати кілька викликів в одній UserOperation. Approve + дія атомарні, без проміжної довіри роутеру. Стек: Biconomy, Safe{Core} AA SDK, ZeroDev.
| Критерій | Router (Multicall3) | EIP-4337 |
|---|---|---|
| Потрібен approve? | Так, на роутер | Ні (гаманець сам схвалює) |
| Атомарність | Так (через allowFailure) | Так |
| Довіра до контракту | Висока | Мінімальна |
| Складність інтеграції | Низька | Середня |
| Гнучкість | Середня | Висока |
Вибір залежить від контексту: для протокольного batch-інгу — router, для wallet-рівневої автоматизації — EIP-4337.
Коли Multicall3 не вистачає: кастомна batch-система
Multicall3 не приймає ETH з розподілом по викликах (тільки загальний msg.value). Не підтримує callback-и. Не зберігає стан між викликами в пакеті. Для складних сценаріїв пишемо кастомний BatchExecutor:
contract BatchExecutor { struct BatchCall { address target; uint256 value; bytes data; bool requireSuccess; } function executeBatch(BatchCall[] calldata calls) external payable returns (bytes[] memory results) { results = new bytes[](calls.length); for (uint256 i = 0; i < calls.length; i++) { (bool success, bytes memory result) = calls[i].target.call{ value: calls[i].value }(calls[i].data); if (calls[i].requireSuccess) { require(success, _getRevertMsg(result)); } results[i] = result; } } } Типові помилки при розробці batch-систем
- Не обмежений whitelist target-адрес — атакуючий може викликати довільний контракт від імені BatchExecutor і вивести токени.
- Відсутність перевірки
requireSuccessдля критичних викликів — частковий failure може залишити систему в некоректному стані. - Ігнорування переповнення газу (gas limit) — batch з 50+ викликів може перевищити ліміт блоку.
Що потрібно для інтеграції з frontend?
На клієнтській стороні формуємо список викликів і кодуємо через viem:
import { encodeFunctionData } from 'viem'; import { multicall3Abi } from './abis'; const calls = [ { target: tokenAddress, allowFailure: false, callData: encodeFunctionData({ abi: erc20Abi, functionName: 'approve', args: [spenderAddress, amount] }) }, { target: protocolAddress, allowFailure: false, callData: encodeFunctionData({ abi: protocolAbi, functionName: 'deposit', args: [amount] }) } ]; await walletClient.writeContract({ address: MULTICALL3_ADDRESS, abi: multicall3Abi, functionName: 'aggregate3', args: [calls] }); Що входить у розробку batch-системи?
- Архітектурний документ з вибором підходу (router / AA / custom)
- Смарт-контракти з тестами (Foundry/Hardhat) та звітом Slither/Mythril
- Інтеграція з frontend (wagmi/viem) та приклади коду
- Деплой в тестову мережу та інструкція з розгортання
- Аудит контрактів (перевірка на реентрансі, gas-оптимізацію)
- Навчання вашої команди роботі з batch-системою
- Підтримка протягом місяця після здачі
Терміни: інтеграція Multicall3 в існуючий dApp — 1-2 дні. Кастомний BatchExecutor з whitelist-логікою та тестами — 3-5 днів. Повноцінна система з EIP-4337 та фронтендом — від 2 тижнів.
Отримайте консультацію щодо впровадження batch-транзакцій у ваш проєкт — наші інженери з 5-річним досвідом у сфері DeFi та понад 50 успішними проєктами оцінять складність і запропонують оптимальне рішення. Гарантуємо безпеку завдяки сертифікованим аудитам та багаторічному досвіду.







