Интеграция с 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 — отдельный сервис с историческими данными по gas
- 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 requests/day. Core: 3M requests/day. Лимиты по 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 ключ 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-логики.







