китаев.tech

Подключение к сети — Infura и Alchemy

Как подключить TypeScript-приложение к Ethereum mainnet через RPC-провайдеров Infura и Alchemy и проверить соединение через ethers.js.

Зачем нужен RPC-провайдер

Приложение не подключается к Ethereum напрямую. Оно отправляет JSON-RPC запросы на узел, а узел читает сеть и возвращает данные.

Infura и Alchemy дают готовый HTTP endpoint к Ethereum. Для чтения баланса, блока или данных контракта достаточно URL и ethers.JsonRpcProvider.


Создаём проект

bash
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:

bash
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:

typescript
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");

Запустите:

bash
npx tsx src/check-rpc.ts

Если соединение работает, вы увидите номер последнего блока и ETH-баланс адреса.


Переключаемся на Infura

Скопируйте полный Ethereum mainnet URL из Infura dashboard и добавьте его в .env как INFURA_RPC_URL. Затем поменяйте RPC_PROVIDER на infura.

Запустите:

bash
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
Alchemyhttps://eth-mainnet.g.alchemy.com/v2/<API_KEY>
Infurahttps://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://.


Что дальше

Материалы китаev.tech публикуются в образовательных целях и не являются инвестиционной рекомендацией. Примеры кода и описания протоколов — для обучения; использование в продакшне на ваш собственный риск. Дисклеймер и политика конфиденциальности.