Інтеграція з QuickNode API
Публічні RPC-ендпоінти гинуть в production за дні навантаження: rate limit на Infura бесплатного тарифу — 100k запитів на день, Alchemy — 300M compute units на місяць, публічний Ethereum RPC взагалі не має SLA. QuickNode вирішує це інакше: dedicated endpoint, передбачуваний throughput, розширені методи та marketplace add-ons. Інтеграція займає день, але є нюанси, які варто знати заздалегідь.
Що дає QuickNode в порівнянні з публічним RPC
Dedicated endpoint — немає завад від сусідського трафіку. Ваші запити не конкурують з тисячами інших на одному IP.
Add-ons — готові надбудови: NFT API, Token API, DeFi stats, Trace API. Замість самостійної агрегації даних підключаєте готовий endpoint.
Streams — push-сповіщення про нові блоки, транзакції, подій. Замість polling WebSocket з фільтрами — налаштовуєте потік прямо в інтерфейсі QuickNode.
Multi-chain — один аккаунт, десятки мереж. Один і той же SDK працює з Ethereum, Solana, Polygon, Arbitrum, Base без змін коду.
Інтеграція: Практика
QuickNode видає два ендпоінти на кожну ноду: HTTPS для JSON-RPC та WSS для WebSocket subscriptions. Працюють стандартним способом через будь-який Web3 клієнт:
import { createPublicClient, http, webSocket } from 'viem'
import { mainnet } from 'viem/chains'
// HTTP для запитів
const httpClient = createPublicClient({
chain: mainnet,
transport: http('https://your-endpoint.quiknode.pro/YOUR_KEY/'),
})
// WebSocket для subscriptions
const wsClient = createPublicClient({
chain: mainnet,
transport: webSocket('wss://your-endpoint.quiknode.pro/YOUR_KEY/'),
})
// Підписка на нові блоки
const unwatch = wsClient.watchBlocks({
onBlock: (block) => console.log('New block:', block.number),
})
Робота з Add-ons
NFT API, Token API та інші надбудови доступні через ті ж ендпоінти, але нестандартними JSON-RPC методами з префіксом qn_:
// Отримання NFT-колекції кошелька через QuickNode NFT API
const response = await httpClient.request({
method: 'qn_fetchNFTs' as any,
params: [{
wallet: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045',
page: 1,
perPage: 20,
}],
})
Streams: Налаштування push-сповіщень
Streams налаштовуються в дашборді QuickNode. Вибираєте тип потоку (нові блоки, pending транзакції, конкретні подій), destination (webhook, Kafka, S3) та фільтри. Це альтернатива самостійному WebSocket-серверу — менше коду, але менше контролю.
Для webhook-destination QuickNode шле POST з batch записами. Важливо: налаштуйте ідемпотентність на своїй стороні — при retry QuickNode може прислати дублікати.
Управління лімітами
QuickNode рахує не запити, а credits. Простий eth_blockNumber — 20 credits, eth_getLogs з широким діапазоном — до 200+ credits. Дорогі методи: debug_traceTransaction (500 credits), trace_block (200+ credits).
Стратегія заощадження credits:
- Кешуйте статичні дані:
decimals(),symbol(), історичні блоки — вони не змінюються - Використовуйте
eth_getLogsз вузькими фільтрами, не сканіруйте весь діапазон - Для polling — WebSocket subscriptions дешевше серії
eth_getBlockByNumber - Батчинг запитів через JSON-RPC batch: кілька викликів в одному HTTP-запиті
// JSON-RPC batch: один HTTP-запит замість трьох
const [block, balance, gasPrice] = await Promise.all([
httpClient.getBlock({ blockNumber: 20000000n }),
httpClient.getBalance({ address: '0x...' }),
httpClient.getGasPrice(),
])
// viem автоматично батчить при транспорті з опцією batch
Моніторинг та failover
QuickNode надає метрики в дашборді, але для production потрібен власний моніторинг:
// Обёртка з метриками та failover
class RpcClient {
private endpoints: string[]
private currentIndex = 0
async request(method: string, params: any[]) {
for (let attempt = 0; attempt < this.endpoints.length; attempt++) {
try {
const result = await this.callEndpoint(
this.endpoints[this.currentIndex],
method, params
)
return result
} catch (err) {
// Ротуємо на наступний ендпоінт при помилці
this.currentIndex = (this.currentIndex + 1) % this.endpoints.length
if (attempt === this.endpoints.length - 1) throw err
}
}
}
}
Для серйозного production: утримуйте два ендпоінти — QuickNode primary + Alchemy/Infura fallback. Автоматичний failover при перевищенні error rate або latency.







