Розробка Multicall-контрактів (batch операції)

Ми розробляємо multicall-контракти для batch-операцій, що скорочують RPC-запити до 90% та економлять газ до 70%. Наприклад, читання стану десяти контрактів окремо вимагає десяти RPC-запитів, тоді як Multicall об'єднує їх в один. Завдяки цьому завантаження dApp на публічних ендпоінтах скорочується з

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

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

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

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

Ми розробляємо multicall-контракти для batch-операцій, що скорочують RPC-запити до 90% та економлять газ до 70%. Наприклад, читання стану десяти контрактів окремо вимагає десяти RPC-запитів, тоді як Multicall об'єднує їх в один. Завдяки цьому завантаження dApp на публічних ендпоінтах скорочується з 3 секунд до 0.3 секунди — у 10 разів швидше, ніж послідовні виклики. Це приклад gas optimization batch: економія газу до 70% означає зниження витрат на $0.50 при batch з 10 транзакцій. Наші рішення забезпечують пакетні виклики blockchain з мінімальним навантаженням на ноду.

Ми маємо 5+ років досвіду в Web3 та успішно запустили понад 20 смарт-контрактів для DeFi-протоколів, NFT-маркетплейсів та кросс-чейн мостів. Кожен контракт проходить аудит безпеки, а вартість розробки кастомного multicall починається від $500 за просту read-агрегацію до $3000 за складний multi-step batch з аудитом. Гарантуємо відповідність найкращим практикам. Розробка смарт контрактів web3 — наша спеціалізація, ми виконуємо проєкти під ключ.

Як Multicall3 знижує RPC-навантаження?

Multicall3 (контракт на адресі 0xcA11bde05977b3631167028862bE2a173976CA11) задеплоєний у 50+ мережах. Він приймає масив (address target, bytes callData), виконує всі call-и та повертає результати. Для read-only запитів використовується eth_call, при цьому всі виклики виконуються за один RPC-запит. Це оптимізація RPC запитів у дії.

Типове використання через wagmi/viem для агрегації:

import { useReadContracts } from 'wagmi'; const { data } = useReadContracts({ contracts: [ { address: token1, abi: erc20Abi, functionName: 'balanceOf', args: [user] }, { address: token2, abi: erc20Abi, functionName: 'balanceOf', args: [user] }, { address: pool, abi: poolAbi, functionName: 'getReserves' }, { address: oracle, abi: oracleAbi, functionName: 'latestAnswer' }, ] }); // один RPC запит замість чотирьох 

Wagmi використовує Multicall3 під капотом: всі виклики в одному useReadContracts згортаються в один eth_call. Якщо мережа не підтримує Multicall3, wagmi fallback-ає до паралельних eth_call, що все одно економить час. Економія газу до 70% у batch-операціях — це і є gas optimization batch.

Коли кастомний контракт виграє?

Multicall3 не зберігає стан, не перевіряє авторизацію, не підтримує нативний ETH на окремі виклики. Для write-операцій з кастомною логікою пишемо власний контракт. Кастомний multicall solidity — саме те, що потрібно.

Паттерн self-multicall — контракт викликає сам себе через кілька функцій в одній транзакції. OpenZeppelin Multicall реалізує це через Multicall.sol:

abstract contract Multicall { function multicall(bytes[] calldata data) external virtual returns (bytes[] memory results) { results = new bytes[](data.length); for (uint256 i = 0; i < data.length; i++) { (bool success, bytes memory result) = address(this).delegatecall(data[i]); require(success, _getRevertMsg(result)); results[i] = result; } } } 

delegatecall на address(this) — контракт викликає свої функції від імені оригінального msg.sender. Це дозволяє робити approve + deposit в одному виклику, де обидва кроки бачать однаковий msg.sender.

Критичне попередження щодо безпеки

delegatecall на address(this) з користувацьким data — потенційна вразливість. Якщо контракт не ізольований від привілейованих функцій, атакуючий може скласти data, який викликає transferOwnership. OpenZeppelin попереджає: не використовуйте цей паттерн з контрактами, де авторизація залежить від msg.sender, без додаткових перевірок. Ми при розробці обов'язково застосовуємо перевірки прав доступу на кожному кроці: кожна функція, доступна через self-multicall, перевіряє msg.sender.

Як реалізувати атомарні batch транзакції?

Для складних DeFi операцій (flash loan → swap → repay) потрібен контракт з проміжним станом, який відкочує все при помилці будь-якого кроку:

contract AtomicBatcher { struct Step { address target; bytes callData; uint256 value; uint256 minReturnValue; // перевірка результату } function executeBatch(Step[] calldata steps) external payable returns (bytes[] memory results) { results = new bytes[](steps.length); for (uint256 i = 0; i < steps.length; i++) { (bool success, bytes memory result) = steps[i].target.call{ value: steps[i].value }(steps[i].callData); require(success, string(abi.encodePacked("Step ", i, " failed"))); if (steps[i].minReturnValue > 0) { uint256 returnValue = abi.decode(result, (uint256)); require(returnValue >= steps[i].minReturnValue, "Slippage exceeded"); } results[i] = result; } // повернути невитрачений ETH if (address(this).balance > 0) { (bool sent,) = msg.sender.call{value: address(this).balance}(""); require(sent); } } } 

minReturnValue — вбудований захист від slippage на кожному кроці. Swap повернув менше мінімуму — вся транзакція відкочується. Кастомний контракт зменшує газові витрати у 3 рази у порівнянні з Multicall3 для складних multi-step операцій. Це ще один приклад, як кастомний multicall solidity забезпечує ефективність.

Порівняння Multicall3 та кастомного контракту

Таблиця порівняння
Сценарій Multicall3 Кастомний
Агрегація read-запитів Достатньо Надмірно
Декілька ERC-20 transfer Достатньо Надмірно
Approve + protocol action (один токен) Достатньо Достатньо
Flash loan + arbitrage + repay Не підходить Потрібен
Умовні дії (якщо результат кроку X > Y) Не підходить Потрібен
Розподіл ETH за адресами з різними сумами Не підходить Потрібен

Оцінка тривалості розробки

Складність Орієнтовна тривалість Вартість, $
Проста (read aggregation) 1 день 500
Середня (write batch з перевірками) 2-3 дні 1500
Складна (multi-step DeFi) 3-5 днів 3000

Що входить в роботу

  • Аналіз вимог та проектування архітектури.
  • Написання та тестування Solidity-контракту (Foundry, Tenderly).
  • Аудит безпеки (Slither, Mythril, ручний review).
  • Деплой та верифікація коду на Etherscan.
  • Документація (Natspec, README) та доступ до репозиторію.
  • 1 місяць інцидент-менеджменту та підтримки.
  • Навчання команди замовника роботі з контрактом.

Покроковий процес розробки

Розгорніть для деталей
  1. Аналіз вимог — визначаємо сценарії використання, вимоги до безпеки та gas-ліміти.
  2. Проектування архітектури — обираємо між Multicall3 та кастомним контрактом, проектуємо структуру даних.
  3. Написання коду — реалізуємо Solidity-контракт з урахуванням gas optimization та перевірок.
  4. Тестування — модульні тести на Foundry, стрес-тести на Tenderly, симуляція.
  5. Аудит безпеки — статичний аналіз (Slither, Mythril), ручний review досвідченими розробниками.
  6. Деплой та верифікація — розгортання в цільовій мережі, верифікація коду на Etherscan.
  7. Документація та підтримка — Natspec, README, 1 місяць інцидент-менеджменту.

Ми також виконуємо deploy multicall contract в різних мережах та забезпечуємо подальшу підтримку. Замовте розробку — наші інженери оцінять ваш проєкт за один день. Напишіть нам, і ми зробимо оцінку безкоштовно. Досвід — 5+ років, понад 20 успішних запусків. Гарантуємо чистоту коду та проходження зовнішнього аудиту.