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 успішними проєктами оцінять складність і запропонують оптимальне рішення. Гарантуємо безпеку завдяки сертифікованим аудитам та багаторічному досвіду.







