Подключение к сети — Infura и Alchemy
Как подключить TypeScript-приложение к Ethereum mainnet через RPC-провайдеров Infura и Alchemy и проверить соединение через ethers.js.
Зачем нужен RPC-провайдер
Приложение не подключается к Ethereum напрямую. Оно отправляет JSON-RPC запросы на узел, а узел читает сеть и возвращает данные.
Infura и Alchemy дают готовый HTTP endpoint к Ethereum. Для чтения баланса, блока или данных контракта достаточно URL и ethers.JsonRpcProvider.
Создаём проект
mkdir eth-rpc-connect
cd eth-rpc-connect
npm init -y
npm pkg set type="module"
npm install ethers dotenv
npm install --save-dev typescript tsx @types/node
mkdir srcСоздайте файл .env:
RPC_PROVIDER="alchemy"
ALCHEMY_RPC_URL="https://eth-mainnet.g.alchemy.com/v2/demo"Alchemy даёт публичный demo endpoint для простых запросов. Для Infura понадобится свой URL из dashboard: https://mainnet.infura.io/v3/<API_KEY>.
Читаем данные через RPC
Создайте файл src/check-rpc.ts:
import "dotenv/config";
import { ethers } from "ethers";
const providerName = process.env.RPC_PROVIDER ?? "alchemy";
const rpcUrls: Record<string, string | undefined> = {
alchemy: process.env.ALCHEMY_RPC_URL,
infura: process.env.INFURA_RPC_URL,
};
const rpcUrl = rpcUrls[providerName];
if (!rpcUrl) {
throw new Error(`Добавьте RPC URL для провайдера: ${providerName}`);
}
const provider = new ethers.JsonRpcProvider(rpcUrl);
const network = await provider.getNetwork();
const blockNumber = await provider.getBlockNumber();
const vitalikBalance = await provider.getBalance(
"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
);
console.log("Provider:", providerName);
console.log("Network:", network.name);
console.log("Chain ID:", network.chainId.toString());
console.log("Current block:", blockNumber);
console.log("Vitalik balance:", ethers.formatEther(vitalikBalance), "ETH");Запустите:
npx tsx src/check-rpc.tsЕсли соединение работает, вы увидите номер последнего блока и ETH-баланс адреса.
Переключаемся на Infura
Скопируйте полный Ethereum mainnet URL из Infura dashboard и добавьте его в .env как INFURA_RPC_URL. Затем поменяйте RPC_PROVIDER на infura.
Запустите:
npx tsx src/check-rpc.tsКод почти не меняется: меняется только RPC URL. Для ethers.js Infura, Alchemy и собственный узел выглядят одинаково.
Как это работает
dotenv/config — загружает переменные из .env в process.env.
ethers.JsonRpcProvider(rpcUrl) — создаёт подключение к Ethereum через HTTP RPC endpoint.
provider.getBlockNumber() — делает RPC-запрос eth_blockNumber и возвращает последний блок.
provider.getBalance(address) — читает ETH-баланс адреса без подписи и без gas.
provider.getNetwork() — проверяет, к какой сети подключён RPC endpoint.
network.chainId — возвращает числовой идентификатор сети. Для Ethereum mainnet это 1.
ethers.formatEther() — переводит wei в ETH для вывода человеку.
Alchemy vs Infura
| Провайдер | Mainnet RPC URL |
|---|---|
| Alchemy | https://eth-mainnet.g.alchemy.com/v2/<API_KEY> |
| Infura | https://mainnet.infura.io/v3/<API_KEY> |
Оба сервиса подходят для чтения данных, отправки транзакций и backend-скриптов. На старте важнее не выбрать “идеального” провайдера, а вынести URL в .env, чтобы приложение можно было переключить без изменения кода.
Частые ошибки
Ключ попал в frontend bundle → не храните private RPC URL в публичном React-коде. Для frontend используйте ограниченный ключ или проксируйте запросы через backend.
Ошибка 401 или unauthorized → проверьте API key, сеть в dashboard и полный URL. Ключ для Ethereum mainnet не всегда работает для другой сети.
Приложение зависает на первом запросе → проверьте интернет, лимиты бесплатного плана и правильность протокола https://.
Что дальше
- Провайдер vs Сайнер — понять, почему чтение не требует приватного ключа
- Как работает транзакция изнутри — разобраться, что меняется при отправке транзакции
- Отправка ETH — перейти от чтения сети к подписанной записи