Уявіть: ваш 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-образи для мінімальної атакованої поверхні.
Процес та терміни
Етапи роботи
- Аналітика — вивчаємо архітектуру dApp, вимоги до latency та throughput, обираємо стэк.
- Проектування — розробляємо схему БД, API, модель відмовостійкості.
- Реалізація — пишемо код на Rust з модульними тестами та інтеграцією Tenderly.
- Тестування — навантажувальне тестування з вимірюванням latency, fuzzing через Echidna.
- Деплой — розгортання в 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-верифікатором.
Отримайте консультацію з архітектури вашого бекенду — ми допоможемо обрати оптимальне рішення.







