Інтеграція з Infura API
Проблема, з якою стикається більшість проектів на старті: нода потрібна вже зараз, піднімати собственний Geth/Besu — це дні очікування синхронізації та DevOps-робота, яка не приносить бізнес-цінності на етапі MVP. Infura — керований RPC-провайдер з підтримкою Ethereum, Polygon, Arbitrum, Optimism, Base та ще десятка мереж. Інтеграція займає годину, але в ній є кілька неочевидних моментів.
Що за сервіс та чим він відрізняється від інших
Infura — один з найстаріших провайдерів (ConsenSys, 2016). Конкуренти: Alchemy, QuickNode, Chainstack, Ankr. Ключові відмінності Infura:
- WebSocket підтримка через окремий WSS endpoint — важливо для підписок на подіі
- Ethereum Gas API — окремий сервіс з історичними даними по газу
- IPFS gateway — той самий ключ працює для IPFS API, зручно для NFT-метаданих
-
Archive data — доступ до історичних станів через
eth_getStorageAtна будь-якому блоці (на Core плані обмежено, на Growth/Custom — без обмежень)
Для більшості проектів Infura та Alchemy взаємозамінні — обидва реалізують стандартний Ethereum JSON-RPC. Міграція між ними — заміна URL у конфігу.
Настройка та перший запит
Реєстрація →創ення проекту → отримання Project ID. Endpoint формується так:
https://mainnet.infura.io/v3/{PROJECT_ID}
WSS: wss://mainnet.infura.io/ws/v3/{PROJECT_ID}
Мережі: mainnet, sepolia, polygon-mainnet, arbitrum-mainnet, optimism-mainnet, base-mainnet та ін.
Базовий запит через viem:
import { createPublicClient, http } from 'viem';
import { mainnet } from 'viem/chains';
const client = createPublicClient({
chain: mainnet,
transport: http(`https://mainnet.infura.io/v3/${process.env.INFURA_KEY}`),
});
const blockNumber = await client.getBlockNumber();
const balance = await client.getBalance({ address: '0x...' });
Через ethers.js:
import { JsonRpcProvider } from 'ethers';
const provider = new JsonRpcProvider(
`https://mainnet.infura.io/v3/${process.env.INFURA_KEY}`
);
Rate limits та робота з ними
Безплатний план: 100,000 запитів/день. Core: 3M запитів/день. Лімити по RPS залежать від плану.
Практичні поради:
Батчинг запитів. JSON-RPC підтримує batch — кілька методів в одному HTTP-запиті:
// Один HTTP запит замість трьох
const [block, balance, nonce] = await client.multicall({
contracts: [...],
});
// Або через raw batch
const batch = [
{ jsonrpc: '2.0', method: 'eth_blockNumber', params: [], id: 1 },
{ jsonrpc: '2.0', method: 'eth_getBalance', params: ['0x...', 'latest'], id: 2 },
];
const response = await fetch(rpcUrl, {
method: 'POST',
body: JSON.stringify(batch),
});
Кешування статичних даних. Результати eth_getCode, eth_getTransactionByHash для підтвердженої транзакції — не змінюватимуться ніколи. Кешуйте на Redis з нескінченним TTL або до перезапуску.
Fallback на резервний провайдер. Infura іноді деградує. Паттерн — fallback transport:
import { fallback, http } from 'viem';
const transport = fallback([
http(`https://mainnet.infura.io/v3/${INFURA_KEY}`),
http(`https://eth-mainnet.g.alchemy.com/v2/${ALCHEMY_KEY}`),
]);
WebSocket підписки
Для real-time подій — WebSocket endpoint:
import { createPublicClient, webSocket } from 'viem';
const wsClient = createPublicClient({
chain: mainnet,
transport: webSocket(`wss://mainnet.infura.io/ws/v3/${INFURA_KEY}`),
});
// Підписка на нові блоки
const unwatch = wsClient.watchBlockNumber({
onBlockNumber: (blockNumber) => console.log(blockNumber),
});
// Підписка на подіі контракту
const unwatch = wsClient.watchContractEvent({
address: '0x...',
abi: erc20Abi,
eventName: 'Transfer',
onLogs: (logs) => processTransfers(logs),
});
Важливо: WebSocket з'єднання потрібно відновлювати при розривах. viem робить це автоматично, у ethers.js потрібен WebSocketProvider з ручною reconnect-логікою.
Безпека API ключа
API ключ Infura — не секрет в повному смислі. Зловживання призведе до виснаження лімітів, а не компрометації коштів. Тим не менше:
- Не комітити в git —
.env+.gitignore - Настроїти Allowlist by origin в Infura dashboard для фронтенд-використання
- Настроїти Allowlist by contract address якщо працюєте тільки з конкретними контрактами
- Окремі ключі для dev/staging/production оточень
Для фронтенду: ключ у будь-якому разі видимий у браузері. Рішення — або прийняти цей ризик з обмеженнями по allowlist, або проксирувати запити через собственний backend.
Що входить в роботу
Настройка займає 2-8 годин в залежності від оточення: створення аккаунту та проекту, конфігурація endpoint для потрібних мереж, інтеграція в існуючий код (заміна hardcoded RPC або додання першого провайдера), настройка fallback та кеш, конфігурація allowlist у дашборді. Для проектів з WebSocket — настройка підписок та reconnect-логіки.







