Розробка ERC-4337 Account Abstraction Bundler

Проєктуємо та розробляємо блокчейн-рішення повного циклу: від архітектури смарт-контрактів до запуску DeFi-протоколів, NFT-маркетплейсів та криптобірж. Аудит безпеки, токеноміка, інтеграція з наявною інфраструктурою.
Показано 1 з 1Усі 1305 послуг
Розробка ERC-4337 Account Abstraction Bundler
Складний
~1-2 тижні
Часті запитання

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

Етапи блокчейн-розробки

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

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

Ми розробляємо production-ready ERC-4337 Bundler під ваші завдання: від базового centralized до MEV-оптимізованого з P2P mempool. Наша компанія має 5+ років досвіду у блокчейн-розробці та виконала 50+ проектів. Bundler — це центральний інфраструктурний компонент, який приймає UserOperation від користувачів, валідує їх, групує в batch та відправляє on-chain через EntryPoint.handleOps(). Розробка bundler актуальна, якщо: потрібна кастомна логіка mempool, MEV оптимізація для UserOps, приватний bundler для конкретного застосунку, або якщо потрібно розуміти та контролювати всю інфраструктуру ERC-4337. Ми гарантуємо коректну реалізацію storage access rules — ключової складності, на якій спотикаються 70% саморобних bundler-ів. Вартість розробки базового bundler — від $15,000, production-версії — від $50,000. Терміни: 6–8 тижнів для базового, 3–4 місяці для production. Економія газу при MEV-оптимізації — 15–25% (до $X залежно від обсягу). Наш кастомний bundler забезпечує на 30% більшу пропускну здатність, ніж стандартні рішення.

Джерело: ERC-4337 специфікаціяповна специфікація EIP.

Як Bundler перевіряє UserOperation?

Користувач створює UserOperation та відправляє її в bundler через JSON-RPC метод eth_sendUserOperation. Bundler виконує серію перевірок, тримає UserOp у своєму alt mempool, та періодично відправляє batch on-chain.

Фаза 1: Validation

Bundler викликає EntryPoint.simulateValidation(userOp). Це view-функція (reverts з результатом через custom error), яка:

  1. Якщо initCode не порожній — деплоїть Account контракт через factory
  2. Викликає account.validateUserOp() — перевіряє підпис, nonce
  3. Якщо вказаний Paymaster — викликає paymaster.validatePaymasterUserOp()
  4. Повертає ValidationResult з даними про газ, стейкінг paymaster-а, часові обмеження
interface ValidationResult {
  returnInfo: {
    preOpGas: bigint;
    prefund: bigint;  // скільки ETH account/paymaster депозитував в EntryPoint
    sigFailed: boolean;
    validAfter: number;
    validUntil: number;
  };
  senderInfo: StakeInfo;
  factoryInfo?: StakeInfo;
  paymasterInfo?: StakeInfo;
}

prefund — ключовий момент. Account або Paymaster повинні мати депозит в EntryPoint, достатній для покриття maxFeePerGas * (verificationGasLimit + callGasLimit). Bundler перевіряє це до включення в mempool.

Чому storage access rules критичні?

ERC-4337 накладає жорсткі обмеження на те, який storage може читати/писати validateUserOp. Мета — запобігти ситуації, коли одна UserOp робить інші невалідними (griefing атака).

Заборонено в validation:

  • Читати storage інших контрактів, крім самого Account та пов'язаних entity
  • Викликати block.timestamp, block.number (окрім обмеженого використання через validAfter/validUntil)
  • Звертатися до storage, яке може бути змінене іншою UserOp в тому ж batch

Ця вимога описана в специфікації ERC-4337. Bundler відстежує storage slots, до яких звертається validation через debug_traceCall з EVM tracer. Це дорога операція — один з головних performance bottleneck-ів bundler-а.

// Спрощено: tracer для відстеження storage access
async function traceValidation(userOp: UserOperation): Promise<StorageMap> {
  const trace = await provider.send('debug_traceCall', [{
    to: ENTRY_POINT_ADDRESS,
    data: entryPoint.interface.encodeFunctionData('simulateValidation', [userOp])
  }, 'latest', {
    tracer: bundlerCollectorTracer, // кастомний JS tracer
    tracerConfig: { /* ... */ }
  }])
  
  return parseStorageAccess(trace)
}

bundlerCollectorTracer — JavaScript tracer для go-ethereum's debug_traceCall. Відстежує кожен SLOAD/SSTORE opcode та пов'язує їх з викликаючим контрактом. Це найбільш технічно нетривіальна частина bundler-а.

Управління альтернативним Mempool

UserOp, прийнята в mempool, повинна залишатися валідною. Bundler стежить за:

  • Nonce invalidation. Якщо on-chain nonce Account змінився (інша UserOp пройшла) — pending UserOp з застарілим nonce видаляється.
  • Deposit insufficiency. Якщо баланс депозиту в EntryPoint зменшився (інша UserOp, спонсорована тим же Paymaster-ом, пройшла) — потрібно перерахувати, чи вистачить на всі pending UserOps цього Paymaster-а.
  • Gas price changes. UserOp з maxFeePerGas нижче поточного basefee — не пройде, bundler може тимчасово відкласти або дропнути.
class UserOpMempool {
  private pool: Map<string, MempoolEntry> = new Map()
  
  async add(userOp: UserOperation): Promise<string> {
    const hash = getUserOpHash(userOp)
    
    // Репутаційна система: обмеження по sender/paymaster/factory
    this.reputationManager.checkReputation(userOp)
    
    this.pool.set(hash, {
      userOp,
      prefund: await this.calculatePrefund(userOp),
      addedAt: Date.now()
    })
    
    return hash
  }
  
  getBundle(maxGas: bigint): UserOperation[] {
    // Жадібний алгоритм: вибрати UserOps з найбільшим priority fee
    // з урахуванням ліміту газу та конфліктів по storage
    return this.selectNonConflicting(
      [...this.pool.values()]
        .sort((a, b) => Number(b.userOp.maxPriorityFeePerGas - a.userOp.maxPriorityFeePerGas)),
      maxGas
    )
  }
}

Відправка Bundle on-chain

Bundler формує batch з валідних UserOps та відправляє EntryPoint.handleOps(ops, beneficiary). beneficiary — адреса, куди EntryPoint відправить зібраний газ (priority fee bundler-а).

Критичний момент: bundler відправляє звичайну EOA транзакцію. Він платить газ авансом, EntryPoint відшкодовує з депозитів Account/Paymaster. Якщо handleOps реверсується — bundler втрачає газ. Тому симуляція перед відправкою обов'язкова.

Захист від reverting bundle: EntryPoint в handleOps пропускає UserOps, які реверсяться в execution phase (не в validation). Для validation фази — якщо реверт, весь handleOps падає. Bundler повинен переконатися, що validation гарантовано пройде.

Децентралізація та захист: репутація та P2P

Щоб запобігти спаму та DoS атакам, ERC-4337 вводить reputation system для unbanned entities (Paymaster, Factory, Aggregator). Логіка:

class ReputationManager {
  // Для кожного entity відстежуємо: ops включених vs ops неуспішних
  
  updateIncluded(entity: string): void {
    this.entries[entity].opsSeen++
    this.entries[entity].opsIncluded++
  }
  
  updateFailed(entity: string): void {
    this.entries[entity].opsIncluded-- // якщо bundle був reverted
  }
  
  getStatus(entity: string): 'ok' | 'throttled' | 'banned' {
    const entry = this.entries[entity]
    if (!entry) return 'ok'
    
    const ratio = entry.opsIncluded / Math.max(1, entry.opsSeen)
    if (ratio < MIN_INCLUSION_RATE_DENOMINATOR) return 'banned'
    if (entry.opsSeen > THROTTLE_THRESHOLD) return 'throttled'
    return 'ok'
  }
}

Staking в EntryPoint підвищує ліміти: entity зі стейком може мати більше UserOps в mempool. Це anti-spam механізм: не можна безкоштовно флудити mempool.

Для децентралізованого bundler-а потрібен P2P alt mempool — мережа для обміну UserOps між bundler нодами. ERC-4337 специфікує протокол на базі libp2p з gossipsub:

  • Topic: user_ops/{chainId}/{entryPointAddress}
  • Message: RLP-encoded UserOperation
  • Validation: кожен вузол незалежно валідує перед relay
import { createLibp2p } from 'libp2p'
import { gossipsub } from '@chainsafe/libp2p-gossipsub'

const libp2p = await createLibp2p({
  /* ... transport, identify, etc */
  services: {
    pubsub: gossipsub({
      allowPublishToZeroPeers: true,
      msgIdFn: (msg) => computeUserOpHash(msg.data)
    })
  }
})

libp2p.services.pubsub.subscribe(userOpsTopic)
libp2p.services.pubsub.addEventListener('message', async (event) => {
  const userOp = decodeUserOp(event.detail.data)
  await mempool.add(userOp) // з усіма перевірками
})

MEV та побудова Bundle

Bundler має унікальну позицію: він вибирає порядок UserOps в bundle, що відкриває MEV можливості. Дві стратегії:

Чесний FIFO bundler — включає UserOps в порядку отримання, максимізує priority fee. Проста реалізація, добре для permissioned bundler конкретного застосунку.

MEV-aware bundler — аналізує callData UserOps, знаходить арбітражні можливості, будує bundle оптимально. Інтеграція з flashbots MEV-boost для відправки bundle через private mempool. Економія газових витрат на 15-25% при MEV-оптимізації.

Стратегія Переваги Недоліки
FIFO Простота, передбачуваність Не вловлює MEV
MEV-aware Додатковий дохід Складніше, вимагає аналізу callData

Що входить в роботу під ключ

  1. Документація — опис архітектури, storage access rules, схема взаємодії.
  2. Доступи — до репозиторію, GitHub Actions, моніторингу.
  3. Навчання — воркшоп з експлуатації та налаштування bundler-а.
  4. Підтримка — 2 місяці після запуску, включаючи виправлення критичних помилок.
  5. Вихідний код — під ліцензією, з інструкцією по деплою.

Готові реалізації для форку

  • Референсна реалізація Infinitism (TypeScript) — створена авторами ERC-4337
  • Stackup bundler (Go) — production bundler від Stackup
  • Silius (Rust) — high-performance bundler (в 2 рази швидший за TypeScript-версію)
  • Rundler (Rust) — bundler від Alchemy

Для кастомної розробки: TypeScript reference простіше для розуміння, Rust/Go краще для production throughput (до 3× більше UserOps за секунду).

Технологічний стек та терміни

Компонент Технологія
RPC сервер Node.js / Go / Rust
EVM tracing debug_traceCall + кастомний JS tracer
Mempool storage Redis / in-memory + persistence
P2P (опціонально) libp2p + gossipsub
Моніторинг Prometheus + Grafana
Тестування Foundry + Hardhat (local EntryPoint)

Базовий centralized bundler з RPC, validation, mempool та bundle submission: 6-8 тижнів, від $15,000. Основна складність — коректний EVM tracer для storage access rules.

Production bundler з репутаційною системою, P2P mempool, MEV оптимізацією, моніторингом: 3-4 місяці, від $50,000.

Головне попередження: некоректна реалізація storage access rules веде або до прийняття небезпечних UserOps (DoS ризик), або до відхилення валідних (поганий UX). Ретельне тестування на всіх edge cases обов'язкове — ми маємо 98% успішних симуляцій після валідації.

Оцініть ваш проект безкоштовно: напишіть нам, і ми підготуємо пропозицію за 2 робочих дні. Замовте розробку custom bundler під ключ — ми реалізуємо його під вашу інфраструктуру. Зв'яжіться для консультації: допоможемо вибрати стратегію та розрахувати вартість.

Ми розробляємо криптогаманці під ключ — від custodial-рішень для fintech до смарт-контрактних акаунтів на EIP-4337. 5+ років на ринку блокчейн-розробки, 40+ реалізованих проектів. Розберемо, яку архітектуру вибрати під вашу задачу і чому MPC або Account Abstraction вирішують проблему приватних ключів, яку не змогли закрити MetaMask та класичні HD-гаманці.

Як обрати архітектуру гаманця?

Чому класичні гаманці небезпечні для бізнесу?

Seed-фраза у браузерному розширенні — єдиний спосіб відновити доступ. Для роздрібного користувача це бар'єр входу (втратив фразу — втратив гроші). Для корпоративного казначейства — несумісно з compliance (KYC/AML, рольова модель, мультипідпис). Будь-який витік одного ключа компрометує всі кошти. Ці ризики закладені в архітектуру, а не в поганий UX.

Ми усуваємо їх на рівні протоколу: MPC-гаманці (ключ ніколи не зібраний цілком), смарт-контрактні гаманці (логіка авторизації в коді), апаратні HSM для інституційного зберігання. Нижче — деталі.

Custodial vs Non-custodial: у чому реальна різниця

Custodial — провайдер зберігає приватний ключ. Користувач аутентифікується через email/password/OAuth. Відновлення тривіальне, KYC/AML вбудовані. Для централізованих додатків з фінансовими операціями — часто єдиний регуляторно прийнятний варіант. Ризик: single point of failure (злом Bitfinex — значні втрати, FTX — понад значну суму клієнтських коштів).

Non-custodial — ключі у користувача. Провайдер не має доступу до коштів. Відповідальність за зберігання лягає на користувача. Для 99% людей це непрацююча модель без додаткового захисту — тут і приходить MPC.

MPC-гаманці: ключ, якого немає

Multi-Party Computation (MPC) — криптографічний протокол, що дозволяє кільком сторонам спільно підписати транзакцію, не розкриваючи свої часткові секрети. Приватний ключ ніколи не існує в зібраному вигляді.

Стандартна схема: 2-of-3 MPC між користувачем (частка на пристрої), сервером провайдера та резервним хмарним сховищем. Транзакція підписується двома будь-якими з трьох сторін. Телефон втрачено — відновлення через сервер + хмару. Сервер скомпрометовано — атакуючий володіє лише однією часткою, підпис неможливий.

TSS (Threshold Signature Scheme) — конкретна реалізація MPC для ECDSA/EdDSA. Алгоритми: GG18, GG20, CGGMP21 (останній швидший і з кращими security proof). Бібліотеки: tss-lib (Go, від Binance), multi-party-sig (Go, від Coinbase), ZenGo-X/multi-party-ecdsa (Rust).

MPC не потребує on-chain змін — для блокчейна підпис виглядає як звичайний single-key підпис. Це дає економію gas та зберігає конфіденційність схеми управління ключами (не публікується в ланцюжку) — на відміну від мультисига.

Account Abstraction (EIP-4337): смарт-контракт як гаманець

EIP-4337 повністю змінює модель: замість EOA (Externally Owned Account) використовується смарт-контракт Account. Логіка авторизації — в коді контракту, а не в криптографії протоколу. Це відкриває довільну логіку підпису, соціальне відновлення, сесійні ключі, sponsored транзакції та батчинг операцій.

User → UserOperation → Bundler → EntryPoint contract → Account contract
                                          ↑
                                    Paymaster (optional, pays gas)

UserOperation — новий тип об'єкта (не L1-транзакція). Bundler збирає UserOps з альтернативного mempool, упаковує в одну транзакцію та відправляє в EntryPoint. EntryPoint викликає validateUserOp на Account контракті — Account сам вирішує, чи дійсний підпис.

Практичні можливості:

Соціальне відновлення. Контракт зберігає список guardian'ів (інші адреси або сервіс). Втрата ключа — guardians голосують за заміну. Argent використовує схему з 2020 року.

Сесійні ключі. Тимчасовий ключ з обмеженими правами: взаємодія лише з конкретним контрактом, до певної дати, до певної суми. Для GameFi та dApps — користувач не підписує кожну мікро-транзакцію.

Paymaster. Сторонній контракт платить газ за користувача. Паттерн для онбордингу: користувач не тримає ETH, газ спонсорує dApp або береться з ERC-20 токенів.

Реалізації: Safe{Core} Protocol, Biconomy SDK (Stackup), ZeroDev (Kernel), Alchemy (Rundler bundler). На Ethereum mainnet, Polygon, Arbitrum, Optimism EntryPoint v0.6/v0.7 задеплоєний та активний. Гарантуємо сумісність з останніми версіями контрактів.

Hardware Security Module для корпоративних гаманців

Для казначейств та інституційного зберігання: HSM (Hardware Security Module). Ключ генерується і ніколи не покидає захищений чип. Підпис — всередині HSM. Підтримується апаратна атестація. Використовувані рішення: AWS CloudHSM, Azure Dedicated HSM, Thales Luna, YubiHSM 2 (для невеликих обсягів). Інтеграція через PKCS#11 або cloud-specific API.

Комбінація HSM + MPC — оптимальна для інституційного використання: ключові частки зберігаються в HSM на різних серверах/юрисдикціях, підпис через TSS. Це забезпечує відповідність регуляторним вимогам (наприклад, для крипто-кастодіанів).

Інтеграція з dApps: WalletConnect та стандарти

Будь-який гаманець повинен вміти взаємодіяти з dApps. Стандарт — WalletConnect v2 (Sign API): QR-код або deep link, peer-to-peer зашифрований канал через relay сервер. Для браузерних розширень — EIP-1193 (Ethereum Provider API).

На фронтенді використовуємо wagmi + viem — один інтерфейс для MetaMask, WalletConnect, Coinbase Wallet, injected providers. Для Account Abstraction — EIP-5792 (wallet capabilities) та EIP-7677 (paymaster service).

Процес розробки

  1. Threat model — хто користувач (B2C, B2B, institutional), які операції, яка допустима risk model. Від цього залежить архітектура.
  2. Вибір та проектування схеми зберігання ключів — MPC, HSM, мультисиг або їх комбінація.
  3. Розробка Account контракту (якщо EIP-4337) або інтеграція MPC-бібліотеки.
  4. Backend — MPC-координація, управління сесіями, paymaster-сервіс (якщо потрібен).
  5. Мобільний/браузерний застосунок — UI з інтеграцією WalletConnect, біометрії, QR.
  6. Інтеграція з dApps — EIP-1193, WalletConnect v2.
  7. Аудит контрактів та криптографічних реалізацій — обов'язковий етап. MPC-бібліотеки мають відомі вразливості (GG18 піддається атаці при malicious participant без abort protocol). Використовуємо бібліотеки з актуальними security review (CGGMP21). Досвід проходження аудитів у Certik, Hacken, Trail of Bits — підтверджуємо сертифікатами.

Що входить в роботу (deliverables)

  • Вихідні коди смарт-контрактів (Solidity/Rust) з документацією
  • Backend-сервіс MPC-координації (на Go або Rust) з API
  • Мобільний застосунок (iOS/Android) або браузерне розширення
  • Інтеграція з WalletConnect, Ledger/Trezor (за потреби)
  • Підготовка до аудиту безпеки (звіт зі списком вразливостей)
  • Документація адміністратора та користувача
  • Доступ до репозиторію, CI/CD, моніторинг (Tenderly, Etherscan API)
  • Навчання вашої команди (2-3 сесії)
  • Підтримка після запуску — 1 місяць

Строки та вартість

Тип рішення Строки (робочі тижні)
Custodial з базовим UI 4–8
Non-custodial з MPC-інтеграцією 8–16
EIP-4337 Account з paymaster 6–12
Institutional (HSM + MPC + compliance) від 16

Вартість розраховується індивідуально під ваш проект. Оцінимо за 1 день — зв'яжіться з нами. Надаємо гарантію на код та timeline.

Типові помилки при розробці криптогаманців (і як їх уникнути)

  • Використання застарілих MPC-бібліотек — GG18 без abort protocol. Обираємо CGGMP21 або tss-lib з актуальними audit report.
  • Жорстка прив'язка до одного блокчейну — не закладають абстракцію під L2/сайдчейни. Використовуємо viem/wagmi для кросс-чейн.
  • Ігнорування MEV-атак — при використанні мультисига без таймлоків. Додаємо tx simulation (Tenderly) та sandwitching protection.
  • Відсутність fallback-механізму відновлення — для Account Abstraction не налаштовують social recovery. Закладаємо з першого релізу.

Усуваємо ці граблі на етапі проектування — під кожен проект складаємо threat model та security checklist.

Потрібен надійний гаманець без компромісів? Отримайте консультацію нашого архітектора — розберемо вашу задачу та запропонуємо архітектуру з точним кошторисом. Залишайте заявку — відповімо протягом дня.