Интеграция с Alchemy API
Alchemy — это не просто RPC провайдер. Помимо надёжного доступа к нодам (с автоматическим failover и 99.9% uptime SLA), они предоставляют Enhanced APIs, которые закрывают задачи, требующие в противном случае собственного индексера: история транзакций по адресу, NFT данные, token балансы, decoded event logs. Правильная интеграция с Alchemy убирает необходимость держать собственную ноду для большинства dApp.
Настройка и ключи
Alchemy SDK для TypeScript/JavaScript — предпочтительный способ взаимодействия:
npm install alchemy-sdk
import { Alchemy, Network, AlchemySettings } from "alchemy-sdk"
const settings: AlchemySettings = {
apiKey: process.env.ALCHEMY_API_KEY,
network: Network.ETH_MAINNET,
maxRetries: 5,
requestTimeout: 30000
}
const alchemy = new Alchemy(settings)
SDK автоматически управляет retry логикой и rate limiting. Для нескольких чейнов — отдельные инстансы с разными network значениями.
Enhanced APIs: что реально полезно
NFT API
Без Alchemy получить все NFT адреса — это парсинг Transfer событий с genesis блока или зависимость от маркетплейс API. С Alchemy:
// Все NFT кошелька
const nfts = await alchemy.nft.getNftsForOwner("0xAddress", {
contractAddresses: ["0xOptionalFilter"],
omitMetadata: false
})
// Владелец конкретного токена
const owners = await alchemy.nft.getOwnersForNft(contractAddress, tokenId)
// Все токены коллекции с metadata
const collection = await alchemy.nft.getNftsForContract(contractAddress, {
pageSize: 100
})
Token API
// Все ERC-20 балансы адреса
const balances = await alchemy.core.getTokenBalances("0xAddress")
// Metadata токена
const metadata = await alchemy.core.getTokenMetadata("0xTokenAddress")
// { name, symbol, decimals, logo }
Transaction history
eth_getTransactionByHash возвращает одну транзакцию. Для истории всех транзакций адреса стандартного JSON-RPC метода нет — это одна из болей разработки без Enhanced APIs:
const history = await alchemy.core.getAssetTransfers({
fromAddress: "0xAddress",
category: ["external", "erc20", "erc721", "erc1155"],
withMetadata: true,
maxCount: 100
})
Результат включает decoded transfers с суммами, символами токенов и адресами — готово для отображения в UI.
Alchemy Notify: Webhooks
Polling — плохой способ следить за on-chain событиями. Alchemy Notify — webhook сервис, который отправляет POST на ваш endpoint при наступлении события:
// Через Notify API создаём webhook
const webhook = await alchemy.notify.createWebhook(
"https://your-api.com/webhooks/alchemy",
WebhookType.ADDRESS_ACTIVITY,
{
addresses: ["0xWatchedAddress"],
network: Network.ETH_MAINNET
}
)
Типы вебхуков: ADDRESS_ACTIVITY (любая активность адреса), NFT_ACTIVITY (Transfer события NFT), MINED_TRANSACTION, DROPPED_TRANSACTION.
Верификация подписи webhook:
import { isValidWebhookSignature } from "alchemy-sdk"
app.post("/webhooks/alchemy", express.raw({ type: "application/json" }), (req, res) => {
const isValid = isValidWebhookSignature({
body: req.body.toString(),
signature: req.headers["x-alchemy-signature"] as string,
signingKey: process.env.ALCHEMY_WEBHOOK_SIGNING_KEY!
})
if (!isValid) return res.status(401).send("Unauthorized")
const event = JSON.parse(req.body.toString())
handleAlchemyEvent(event)
res.sendStatus(200)
})
Subscription через WebSocket
Для realtime данных в браузере или Node.js сервисе:
// Подписка на новые блоки
alchemy.ws.on("block", (blockNumber) => {
console.log("New block:", blockNumber)
})
// Подписка на pending транзакции с определённым адресом
alchemy.ws.on(
{ method: "alchemy_pendingTransactions", toAddress: contractAddress },
(tx) => handlePendingTx(tx)
)
// Подписка на события контракта
const filter = {
address: contractAddress,
topics: [ethers.id("Transfer(address,address,uint256)")]
}
alchemy.ws.on(filter, handleTransferEvent)
SDK автоматически восстанавливает WebSocket соединение при разрыве и пропускает missed события через polling.
Rate limits и оптимизация
Бесплатный план: 300 compute units/сек. Каждый вызов стоит разное количество CU: eth_blockNumber — 10 CU, eth_getTransactionReceipt — 15 CU, alchemy_getAssetTransfers — 150 CU.
Батчинг RPC запросов через JSON-RPC batch:
// Параллельные запросы без лишних HTTP round-trips
const [balance, nonce, gasPrice] = await Promise.all([
alchemy.core.getBalance("0xAddress"),
alchemy.core.getTransactionCount("0xAddress"),
alchemy.core.getGasPrice()
])
Promise.all на уровне SDK не делает батчинг на уровне HTTP — это отдельные запросы. Для настоящего батчинга через JSON-RPC batch нужен низкоуровневый fetch напрямую к RPC endpoint.
Сроки
Базовая интеграция SDK с NFT API, token балансами и webhook setup — 1 рабочий день. Включая настройку окружений (mainnet + testnet), обработку ошибок и мониторинг rate limits.







