Batch-транзакції в dApp: економія газу, атомарність та безпека

Batch-транзакції в dApp: економія газу, атомарність та безпека ## Коли три транзакції — дорога помилка Користувач хоче додати ліквідність у пул Uniswap V3. Реальний процес: approve токена A, approve токена B, mint позиції. Три окремі транзакції — три підтвердження в MetaMask, три оплати газу.

Напрямки блокчейн-розробки

Часті запитання

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1452
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1310
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1005
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1270
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    719
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    1012

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 кроки

  1. Вибір підходу. Визначте, чи достатньо Multicall3 чи потрібен кастомний BatchExecutor з whitelist-ами.
  2. Розробка контрактів. Напишіть код на Solidity, використовуючи Foundry або Hardhat, з тестуванням на форку.
  3. Тестування. Покрийте сценарії реентрансі, переповнення газу (gas limit) та атомарності за допомогою Slither та Mythril.
  4. Інтеграція з фронтендом. Використовуйте 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 успішними проєктами оцінять складність і запропонують оптимальне рішення. Гарантуємо безпеку завдяки сертифікованим аудитам та багаторічному досвіду.