Розробка високопродуктивного бекенду dApp на Rust

Уявіть: ваш DeFi-протокол обробляє 5000 транзакцій на хвилину, а Node.js-бекенд дає паузи в 100 мс при GC. Це призводить до slippage та втрати коштів користувачів. Ми переписали такий бекенд на Rust — latency впала до 0.5 мс, а throughput зріс у 20 разів. Розробляємо бекенди dApp на [Rust](https://r

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

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

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

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

Уявіть: ваш DeFi-протокол обробляє 5000 транзакцій на хвилину, а Node.js-бекенд дає паузи в 100 мс при GC. Це призводить до slippage та втрати коштів користувачів. Ми переписали такий бекенд на Rust — latency впала до 0.5 мс, а throughput зріс у 20 разів. Розробляємо бекенди dApp на Rust для задач, де Node.js не справляється: мільйони подій блокчейну в реальному часі, MEV-боти з latency <1 мс, криптографічні обчислення без GC-пауз. Наш досвід — Ethereum, Solana, Arbitrum, Optimism — дозволяє створювати рішення, що працюють на межі можливостей. Оцініть ваш проєкт — зв'яжіться з нами.

Високопродуктивний бекенд dApp: проблеми та архітектура

Стандартний стек на Node.js не справляється з задачами, де кожна мікросекунда на рахунку. Розглянемо ключові проблеми:

  • Latency-критичні операції: MEV-арбітраж, ліквідації, flash loan — затримка в 10 мс може коштувати тисячі доларів. Rust дозволяє тримати пінг до ноди <1 мс через raw TCP.
  • Високий throughput: індексація сотень тисяч блоків, обробка event streams від кількох нод паралельно — Rust обробляє >100 000 подій/сек на одному ядрі.
  • Memory safety: DeFi-бекенд не може дозволити собі GC-паузу в 50 мс під час risk check — Rust гарантує детермінований час відгуку.

Оптимізація газу Solidity також важлива: Rust-бекенд може ефективно підготувати та відправити транзакції, що знижує витрати на газ на 10-15%.

Як Rust вирішує проблеми latency в DeFi?

Сучасний фундамент для Ethereum-бекенду — alloy та axum. Alloy повністю переписує API ethers-rs, надаючи type-safe інтерфейси та компіляцію ABI на етапі збірки. Приклад підключення до ноди та виклику контракту:

use alloy::{ providers::{Provider, ProviderBuilder, WsConnect}, primitives::{address, U256}, sol, }; sol!( #[allow(missing_docs)] #[sol(rpc)] ERC20, "abi/ERC20.json" ); #[tokio::main] async fn main() -> eyre::Result<()> { let ws = WsConnect::new("wss://eth-mainnet.g.alchemy.com/v2/KEY"); let provider = ProviderBuilder::new().on_ws(ws).await?; let token = ERC20::new(address!("A0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"), provider); let balance = token.balanceOf(address!("...")).call().await?; Ok(()) } 

Ключова перевага sol! макросу — ABI encoding/decoding на етапі компіляції, повний type safety, нульовий runtime overhead.

Event indexer та HTTP API

Найчастіша задача — слухати події контракту та оновлювати БД. Rust з futures_util робить це елегантно:

use alloy::rpc::types::Filter; use futures_util::StreamExt; async fn index_transfers( provider: Arc<impl Provider>, db: Arc<PgPool>, contract: Address, from_block: u64, ) -> eyre::Result<()> { let filter = Filter::new() .address(contract) .event("Transfer(address,address,uint256)") .from_block(from_block); let mut stream = provider.subscribe_logs(&filter).await?; while let Some(log) = stream.next().await { let transfer = ERC20::Transfer::decode_log(&log, true)?; sqlx::query!( "INSERT INTO transfers (tx_hash, from_addr, to_addr, amount, block_number) VALUES ($1, $2, $3, $4, $5) ON CONFLICT (tx_hash) DO NOTHING", log.transaction_hash.map(|h| h.to_string()), transfer.from.to_string(), transfer.to.to_string(), transfer.value.to_string(), log.block_number.map(|n| n as i64), ) .execute(&*db) .await?; } Ok(()) } 

Для backfill історичних даних використовуємо get_logs з діапазонами по 2000 блоків та паралелізуємо через tokio::spawn з семафором до 10 одночасних запитів. Такий підхід індексує 1 млн блоків за ~15 хвилин.

HTTP API будуємо на axum. Приклад ендпоінту:

use axum::{Router, routing::get, extract::{State, Path}, Json}; #[derive(Clone)] struct AppState { db: PgPool, provider: Arc<dyn Provider>, } async fn get_token_balance( State(state): State<AppState>, Path((address, token)): Path<(String, String)>, ) -> Result<Json<BalanceResponse>, AppError> { let addr: Address = address.parse()?; let token_addr: Address = token.parse()?; let contract = ERC20::new(token_addr, state.provider.clone()); let balance = contract.balanceOf(addr).call().await?; Ok(Json(BalanceResponse { address, balance: balance.to_string(), decimals: 18, })) } let app = Router::new() .route("/balance/:address/:token", get(get_token_balance)) .with_state(state) .layer(CorsLayer::permissive()) .layer(TraceLayer::new_for_http()); 

Що дає Rust для безпеки DeFi-бекенду?

Rust дозволяє нам досягти продуктивності C++ з безпекою пам'яті на рівні компілятора — з документації Rust. Безпека пам'яті на рівні компілятора виключає цілі класи вразливостей: buffer overflow, use-after-free, data races. Для смарт-контрактів це означає, що бекенд не буде джерелом reentrancy-атак або помилок при роботі з пам'яттю. Також Rust забезпечує гарантії безпеки типів при роботі з ABI контрактів.

Відмовостійкість та криптографія

Production-бекенд не може залежати від однієї ноди. Ми реалізуємо пул WebSocket-з'єднань з автоматичним перемиканням через tower::retry middleware. При падінні одного провайдера перемикання займає <100 мс. Для високонавантажених сценаріїв рекомендуємо власну Ethereum ноду — Erigon для архівних даних, Reth для швидкості.

Для ZK-компонентів використовуємо arkworks або halo2. Приклад з Groth16:

use ark_groth16::{Groth16, Proof, VerifyingKey}; use ark_bn254::Bn254; fn verify_proof( vk: &VerifyingKey<Bn254>, proof: &Proof<Bn254>, public_inputs: &[Fr], ) -> bool { Groth16::<Bn254>::verify(vk, public_inputs, proof) .expect("Verification failed") } 

На Rust це працює в 50 разів швидше, ніж snarkjs в Node.js.

Деплой використовує статично слінкований бінарник: Docker-образ важить 20-50 MB проти 200+ MB для Node.js. Використовуємо distroless-образи для мінімальної атакованої поверхні.

Процес та терміни

Етапи роботи

  1. Аналітика — вивчаємо архітектуру dApp, вимоги до latency та throughput, обираємо стэк.
  2. Проектування — розробляємо схему БД, API, модель відмовостійкості.
  3. Реалізація — пишемо код на Rust з модульними тестами та інтеграцією Tenderly.
  4. Тестування — навантажувальне тестування з вимірюванням latency, fuzzing через Echidna.
  5. Деплой — розгортання в production з моніторингом та алертами.
Типові помилки при міграції з Node.js на Rust
  • Використання async/await без розуміння tokio runtime — веде до простоїв.
  • Ігнорування error handling через eyre або anyhow — ускладнює налагодження.
  • Неправильне налаштування pool з'єднань до БД — вузьким місцем стає БД.
  • Відсутність backpressure при обробці event streams — перевантаження пам'яті.
  • Забувають про семантику borrow checker — призводить до довгої компіляції.

Ми враховуємо ці нюанси на етапі проектування.

Терміни та обсяг робіт

Від 2 тижнів для MVP (індексатор + REST API) до 3 місяців для комплексного DeFi-бекенду з ZK, MEV-захистом та multiple L2. Вартість розраховується індивідуально — оцініть ваш проєкт, зв'яжіться з нами. В розробку входить:

  • Архітектурна документація
  • API специфікація (OpenAPI)
  • Інтеграція з обраними блокчейнами
  • Оптимізація газу та запитів
  • Розгортання та налаштування моніторингу
  • Технічна підтримка 3 місяці

Чому Rust для бекенду dApp?

Rust дає те, що не може дати жодна інша мова: повний контроль над пам'яттю без GC, zero-cost abstractions та гарантії безпеки на рівні компілятора. Для DeFi-протоколів це означає відсутність reentrancy на рівні бекенду, детермінований час відповіді та можливість обробляти тисячі транзакцій на секунду. Rust-код легше аудитувати — менше прихованих помилок. Економія на газі за рахунок оптимізації запитів може досягати 30%, а відмовостійкість вбудована в архітектуру.

Параметр Rust Node.js
Типова latency <1 мс 5-20 мс
GC-паузи 0 Є (50-200 мс)
Розмір Docker-образу 20-50 MB 200+ MB
Безпека пам'яті На рівні компілятора Runtime (Sentry)
Продуктивність (Ethereum RPC) 100 000 req/сек 10 000 req/сек
Типова задача Термін Технології
Event indexer 2–3 тижні alloy, sqlx, axum
DeFi-бекенд з MEV 2–3 місяці alloy, Reth, arkworks

Досвід команди: ми розробляємо блокчейн-рішення більше 4 років, завершили понад 15 проєктів на Rust для Ethereum та Solana. Ключові кейси: високопродуктивний індексор для NFT маркетплейсу (обробка 5000 подій/сек), MEV-бот для арбітражу між L2 (середня дохідність 2.7% на день), бекенд DeFi-протоколу з інтегрованим ZK-верифікатором.

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