RPC e subscriptions
JSON-RPC HTTP tipado e subscriptions WebSocket com @solana/kit 7.0.0.
Receita
Cartão de receita de referência rápida - pronto para copiar e colar.
import { createSolanaRpc, createSolanaRpcSubscriptions, address } from "@solana/kit";
const rpc = createSolanaRpc(process.env.RPC_URL!);
const balance = await rpc.getBalance(address("PUBKEY")).send();
const ws = createSolanaRpcSubscriptions(process.env.RPC_WSS_URL!);Quando usar:
- Qualquer leitura on-chain a partir de TypeScript (saldos, contas, blocos).
- Atualizações de UI ao vivo via subscriptions de conta ou assinatura.
- Leituras server-side em route handlers Next.js.
- Substituir chamadas fetch não tipadas para JSON-RPC.
Exemplo prático
import { createSolanaRpc, createSolanaRpcSubscriptions, address } from "@solana/kit";
const rpc = createSolanaRpc("https://api.devnet.solana.com");
const rpcSubscriptions = createSolanaRpcSubscriptions("wss://api.devnet.solana.com");
async function watchBalance(owner: string) {
const acct = address(owner);
const { value } = await rpc.getBalance(acct).send();
console.log("initial", value);
const abort = new AbortController();
const stream = await rpcSubscriptions
.accountNotifications(acct, { commitment: "confirmed" })
.subscribe({ abortSignal: abort.signal });
for await (const n of stream) {
console.log("update", n.value.lamports);
}
}O que isso demonstra:
- RPC HTTP para leituras pontuais com
.send(). - URL WSS correspondente para notificações push.
AbortControllerpara limpeza.
Mergulho profundo
Como funciona
createSolanaRpcencapsula JSON-RPC 2.0 com métodos e respostas tipados.createSolanaRpcSubscriptionsabre WebSocket e expõe notificações async iterable.- Commitment nas chamadas controla obsolescência vs finalidade.
- URLs de provedor frequentemente embutem API keys como query params.
Métodos RPC comuns
| Método | Uso |
|---|---|
getBalance | Saldo SOL |
getAccountInfo | Dados brutos de conta |
getLatestBlockhash | Lifetime de transação |
simulateTransaction | Erros de preflight |
sendTransaction | Submeter tx assinada |
Notas TypeScript
// Passe commitment em leituras que alimentam UI de tesouraria
await rpc.getBalance(owner, { commitment: "finalized" }).send();Erros comuns
- URL HTTP no cliente WebSocket - conexão falha silenciosamente ou lança erro. Correção: use
wss://da documentação do provedor. - Limites de taxa de RPC público - 429 sob carga. Correção: endpoint dedicado devnet/mainnet.
- Vazamento de subscriptions - abas abertas esgotam limites do provedor. Correção: abort no unmount.
- Assumir DAS em todo RPC -
getAssetprecisa de hosts com DAS. Correção: matriz de capacidades por vendor. - Pular
.send()- builders RPC são lazy até enviar. Correção: sempre encadeie.send().
Alternativas
| Alternativa | Use quando | Não use quando |
|---|---|---|
| Yellowstone gRPC | Ingestão em escala de indexador | UI simples de carteira |
| Webhooks Helius | Push de eventos server-side | Cliente browser puro |
| Polling HTTP | Atualizações raras | UI de saldo sub-segundo |
| web3.js Connection | Manutenção legada | Apps greenfield |
FAQs
Funciona na devnet?
Sim - aponte RPC e carteira para o mesmo cluster.
Posso misturar kit e web3.js?
Evite em um módulo - migre por rota inteira.
E os wallet adapters?
Carteiras fornecem signers; kit constrói mensagens.
Como fixar @solana/kit?
Trave 7.0.0 no package.json e CI.
Onde estão priority fees?
Instruções compute budget antes do envio.
Como testar?
Surfpool 0.12.0 ou validador local com clones devnet.
Lamports ou SOL?
Sempre lamports bigint no código kit.
Qual commitment?
confirmed para UI; finalized para tesouraria.
Server components Next.js?
Leituras no servidor; assinatura em client components.
Depurar txs falhas?
Simule, leia logs, verifique owners de conta.
Relacionados
- Noções básicas de RPC - commitment e clusters
- Noções básicas do @solana/kit - primer kit
- Assinatura e envio - caminho de submissão
Versões da stack: Esta página foi escrita para Agave 4.1.1, Solana CLI 3.0.10, Anchor 0.32.1, anchor-lang 0.32.1, Rust 1.91.1, @solana/kit 7.0.0, Surfpool 0.12.0 e LiteSVM 0.6.x.