RPC & WebSockets In Depth
Clientes Solana nunca falam com o ledger como banco de dados bruto; falam com nós RPC que expõem JSON-RPC via HTTP e atualizações em tempo real via WebSockets.
Saldos de carteira, buscas de contas de programa, envios de transação, esperas de assinatura e (em muitos provedores) galerias de ativos digitais rodam nessa camada de acesso.
Esta página é o guarda-chuva da seção: HTTP vs assinaturas, métodos baratos vs caros, RPC core vs DAS, e como provedores, paginação e APIs de fee/simulação completam uma stack de produção.
Resumo
- Solana RPC é a superfície de API voltada ao cluster: clientes usam HTTP JSON-RPC para leituras e submissão de transações, assinaturas WebSocket para atualizações push, e (em provedores com DAS) métodos centrados em ativos sobre dados indexados da chain.
- Por que importa: Transporte, método ou escolhas de commitment erradas criam rate limits, UI obsoleta, estados de sucesso falsos e timeouts na mainnet; um mapa compartilhado de HTTP vs WS, métodos baratos vs caros e RPC core vs DAS evita tratar toda chamada como gratuita e intercambiável.
- Conceitos-chave: JSON-RPC, commitment, HTTP RPC, assinatura WebSocket, getAccountInfo, getMultipleAccounts, getProgramAccounts (GPA), filtros, DAS, provedor, paginação, simulateTransaction, priority fee.
- Quando usar: Primeira orientação antes de conectar clientes
@solana/kit; escolher poll vs assinar; planejar leituras GPA mainnet e portfólio NFT; selecionar features de provedor e caminhos de estimativa de fee. - Limitações / trade-offs: RPC público tem rate limits apertados e sem SLA; DAS e APIs enhanced de fee são features de provedor, não garantidas em toda URL; assinaturas WebSocket são visões locais do nó e ainda precisam disciplina de commitment; GPA não substitui indexer real em escala.
- Tópicos relacionados: Noções básicas de RPC e commitment, métodos de leitura core, filtros GPA, paginação, provedores e APIs de priority-fee/simulação.
Fundamentos
RPC (Remote Procedure Call) é como aplicativos observam e submetem trabalho em um cluster Solana.
Um nó RPC roda (ou encaminha) software de validador como Agave, serve JSON-RPC 2.0 via HTTPS e tipicamente expõe endpoint WebSocket companheiro para assinaturas.
Clientes não precisam rodar validador; precisam de URL RPC correta para o cluster pretendido (mainnet-beta, devnet, testnet ou localnet).
Requisições são objetos JSON-RPC: nomes de method como getBalance ou sendTransaction, params opcionais e id ecoado na resposta.
Respostas trazem result ou error com código e mensagem; código de aplicação deve tratar HTTP 429, timeouts e erros JSON-RPC como modos de falha de primeira classe.
Commitment (processed, confirmed, finalized) é ortogonal à escolha de método: informa ao nó quão profundo no consenso uma leitura ou notificação deve estar antes de responder.
Ler em processed é rápido e sensível a fork; ler em finalized é mais lento e mais seguro para decisões irreversíveis de produto.
O caminho HTTP é request/response: busque esta conta, envie esta transação, simule este payload, retorne uma vez.
O caminho WebSocket é long-lived: assine uma vez, receba notificações push quando conta mudar, assinatura atingir commitment ou logs correspondentes aparecerem.
HTTP e WebSocket são duas faces do mesmo produto RPC, não dois ledgers; você ainda escolhe um cluster e uma política de commitment.
Métodos de leitura core hidratam estado de aplicativo a partir de contas que o runtime já conhece por pubkey: saldos, dados de conta única e cargas multi-conta em lote.
getProgramAccounts faz pergunta mais difícil: retorne toda conta owned por um programa (opcionalmente filtrada), o que força scan do estado owned pelo programa e é fonte clássica de timeouts e rate limits na mainnet.
APIs DAS (Digital Asset Standard) estendem JSON-RPC com métodos centrados em ativos (getAsset, getAssetsByOwner, consultas search/group) apoiados por indexers de provedor que unem programas de token, metadados e árvores de compressão em um modelo.
DAS não é built-in Agave obrigatório em toda URL pública; é capacidade de provedor que você habilita quando UX de NFT, cNFT e portfólio seria dolorosa só com walks de token brutos.
Provedores (RPC gerenciado, DAS, webhooks, gRPC) e validadores self-hosted trocam carga ops por controle; apps de produção deixam endpoints públicos gratuitos para trás.
Paginação e eficiência mantêm você sob tetos de RPS e payload: agrupe pubkeys conhecidas, cursor histórico de assinaturas, filtre GPA com rigor e mova descoberta para indexers quando conjuntos crescem.
APIs de simulação e priority fee ficam no caminho de escrita: estime compute units e micro-lamports por CU, e use simulateTransaction para expor erros de programa sem gastar fees mainnet em todo dry run.
Juntos esses pedaços formam um mapa:
Client (@solana/kit, wallet, backend worker)
|
+-- HTTPS JSON-RPC --------> RPC / provider edge
| reads, send, simulate, fees
|
+-- WSS subscriptions -----> same cluster surface
| account / logs / signature / slot
|
+-- DAS methods (optional) -> DAS-enabled provider
getAsset, getAssetsByOwner, searchAssets
Páginas irmãs nesta seção aprofundam cada ramo; esta página mantém o diagrama inteiro em vista.
Mecânica e interações
Ciclo de vida de requisição HTTP
Uma leitura típica é um POST com Content-Type: application/json.
O nó resolve o método contra snapshot de bank no commitment solicitado, codifica dados de conta (base64, base58 ou jsonParsed onde suportado) e retorna.
sendTransaction aceita transação serializada e assinada e retorna handle de assinatura; durabilidade ainda exige polling ou assinatura WebSocket até o commitment escolhido ser atingido.
App builds + signs tx
|
v
HTTP sendTransaction --> signature S
|
+-- poll getSignatureStatuses(S), or
+-- signatureSubscribe(S) over WSS
|
v
commitment ladder: processed -> confirmed -> finalized
Assinaturas WebSocket
O cliente abre wss://..., envia método *Subscribe e recebe id de assinatura mais mensagens *Notification depois.
Assinaturas comuns:
| Assinatura | Dispara quando |
|---|---|
accountSubscribe | Lamports ou dados da conta mudam |
logsSubscribe | Transações correspondem a filtro (ex.: mentions) |
signatureSubscribe | Transação atinge commitment da assinatura |
slotSubscribe | Novos slots progridem |
Notificações são visões push do nó ao qual você conectou, não barramento global ordenado entre todos os provedores.
Cancele assinatura (ou abort a assinatura kit) quando componentes desmontam para conexões não vazarem.
Leituras baratas vs descoberta cara
| Padrão | Métodos | Postura de custo |
|---|---|---|
| Pubkey conhecida | getBalance, getAccountInfo, getMultipleAccounts | Baixo a médio; agrupe multi-get |
| Scan de programa | getProgramAccounts | Alto sem filtros; pode dar timeout |
| Histórico | getSignaturesForAddress, getTransaction | Médio a alto; pagine e cache |
| Ativos | DAS getAsset / getAssetsByOwner | Indexado por provedor; depende de plano |
| UI ao vivo | Assinaturas WebSocket | Carga de conexão + notify |
Sempre prefira leituras de pubkey conhecida quando indexer, derivação PDA ou resposta anterior já deu endereços.
Use GPA com filtros dataSize e memcmp só quando deve descobrir contas por layout; nunca use GPA sem filtro na mainnet por padrão para programas grandes.
Quando GPA ainda não atende escala de produto, mova descoberta para pipelines Geyser/Yellowstone ou indexer dedicado em vez de retentar o mesmo scan.
DAS em relação ao RPC core
RPC core responde "qual é a conta neste endereço?"
DAS responde "quais ativos digitais este owner mantém, e qual metadado/prova de compressão preciso para renderizar ou verificar?"
Use RPC core (e kit) para contas de programa customizadas, fee payers e submissão de transação.
Use DAS para galerias NFT, consultas de coleção e ativos comprimidos onde o provedor já pagou o custo de indexação.
Provedores, limites e eficiência
Provedores gerenciados encaminham Agave (ou equivalente) com load balancers, API keys e sidecars opcionais (DAS, webhooks, estimativas enhanced de fee).
URLs de cluster públicas existem para aprendizado e devnet leve; limitam agressivamente e não são plano de produção.
Regras de eficiência que se aplicam em todo lugar:
- Divida
getMultipleAccounts(frequentemente ~50-100 chaves por chamada, sujeito a docs do provedor). - Paginate
getSignaturesForAddresscom cursoresbefore/untilelimit. - Cache dados de conta imutáveis ou de mudança lenta; atualize em assinatura ou após suas próprias escritas.
- Faça backoff em 429; faça failover para URL secundária quando SLAs permitirem.
Simulação e priority fees
Antes de aterrissar transações sensíveis, clientes frequentemente:
simulateTransactioncom opções comosigVerify: falseereplaceRecentBlockhashpara lerunitsConsumed, logs e erros.- Amostram
getRecentPrioritizationFees(e/ou APIs de fee percentil do provedor) para contas no conjunto de lock. - Anexam instruções de compute budget com margem sobre CUs simuladas e preço de CU em micro-lamports.
Simulação não substitui confirmação na mainnet; reduz falhas evitáveis e inclusão subprecificada.
Considerações avançadas e aplicações
Mapa conceitual da seção (o que cada irmã cobre)
| Preocupação | Página principal | Takeaway para builder |
|---|---|---|
| Formato JSON-RPC, commitment, rate limits | RPC Basics | Defina commitment explicitamente; trate 429 como normal |
| Saldo, account info, multi-get, visão GPA | Core RPC Methods | Prefira multi-get a leituras únicas chatty |
memcmp / dataSize, discriminators Anchor | getProgramAccounts & Filters | Filtre server-side ou não escaneie |
| Cursores, loteamento, evitar scans pesados | Pagination & Efficiency | GPA não é paginado; projete descoberta offline |
| Amostras de fee, opções simulate, margem CU | Priority Fee & Simulation APIs | Estime depois envie; registre CU e escolhas de fee |
| Gerenciado vs self-host, matrizes de feature | RPC Providers | Combine necessidades DAS/gRPC ao vendor; mantenha keys fora do source |
Assinaturas WebSocket e DAS têm páginas how-to dedicadas nesta seção; operacionalmente ainda dependem da mesma URL de provedor e política de commitment descrita acima.
Projetando uma stack de cliente
Separe configuração de HTTP RPC, WSS e DAS mesmo quando um vendor emite os três.
Fixe commitment por classe de ação em um módulo em vez de espalhar literais de string.
Para produtos write-heavy, combine limites de CU orientados por simulação com priority fees dinâmicas e caminho de confirmação que não trate sucesso de sendTransaction como liquidação.
Quando sair de RPC puro
| Necessidade | Fique em RPC core / WS | Saia para indexer / gRPC / webhooks |
|---|---|---|
| Saldo de carteira + poucas PDAs | Sim | Não |
| UI de conta única ao vivo | WebSocket | Opcional |
| Analytics completo de programa | Não | Sim |
| Portfólio NFT grande + cNFTs | DAS se disponível | Indexer customizado se DAS insuficiente |
| Streams multi-conta em milissegundos | Limitado | Classe Yellowstone / Geyser |
Alinhamento de ferramentas
@solana/kit 7.0.0 fornece createSolanaRpc para HTTP e createSolanaRpcSubscriptions para WSS em métodos padrão.
DAS frequentemente usa fetch direto ou SDK de provedor até você encapsular; mantenha URLs base DAS configuráveis ao lado de URLs RPC kit.
CLI (solana contra a mesma URL RPC) é útil para depurar os métodos idênticos que seu app chama.
Equívocos comuns
- "Assinatura de transação de sendTransaction significa que a transferência é final." A assinatura é handle para polling de status ou
signatureSubscribe; durabilidade é o nível de commitment que você espera depois. - "HTTP e WebSocket são intercambiáveis para todo caso de uso." HTTP cabe em leituras e envios pontuais; WebSockets cabem em atualizações contínuas, mas ambos ainda precisam disciplina de commitment, auth e cleanup.
- "getProgramAccounts é só outra leitura como getAccountInfo." GPA pode escanear conjuntos grandes owned por programa; sem filtros é frequentemente a chamada RPC mais cara do seu app.
- "Métodos DAS funcionam em qualquer URL RPC Solana." DAS exige endpoint de provedor com DAS habilitado; RPC público vanilla errará ou omitirá esses métodos.
- "Polling a cada 200ms equivale a assinatura." Polling agressivo queima rate limits e ainda atrasa; assinaturas reduzem chatter mas não são eventos globais ordenados entre nós.
- "Priority fees e simulação garantem inclusão." Melhoram predição e reduzem falhas evitáveis; leaders, congestionamento e expiração de blockhash ainda exigem lógica de retry e confirmação.
FAQs
O que é Solana RPC em uma frase?
É a superfície de API JSON-RPC (e WebSocket) pela qual clientes leem contas, submetem transações e observam commitment em um cluster escolhido.
Quando usar HTTP vs WebSockets?
Use HTTP para leituras request/response, envios, simulação e amostras de fee; use WebSockets quando precisar de atualizações push para contas, logs ou confirmação de assinatura sem loops de polling apertados.
Qual commitment meu dapp deve usar por padrão?
Muitas ações de produto usam confirmed para UX responsiva; use finalized antes de efeitos externos irreversíveis; trate processed como otimista apenas.
Por que getProgramAccounts falha na mainnet?
Scans sem filtro ou com filtro fraco dão timeout ou atingem limites do provedor; adicione filtros dataSize e memcmp ou mova descoberta para indexer.
Como getMultipleAccounts difere de GPA?
getMultipleAccounts carrega pubkeys conhecidas em lote; GPA descobre contas por owner (e filtros) quando você ainda não conhece os endereços.
DAS faz parte do RPC de protocolo Solana core?
DAS é API padronizada orientada a ativos oferecida por provedores de indexação sobre dados da chain; não é garantida em todo endpoint público Agave.
Posso usar DAS para contas de programa customizadas?
Geralmente não para layouts arbitrários; DAS visa ativos digitais (tokens, NFTs, cNFTs). Estado de programa customizado ainda usa RPC core, filtros ou seu próprio indexer.
Notificações WebSocket sobrevivem forks como leituras finalized?
Não. Notificações honram o commitment em que você assinou; atualizações processed podem reverter em forks, então UI deve permanecer reversível até commitment mais profundo.
Como paginar resultados RPC Solana?
Histórico de assinaturas usa cursores (before / until) e limit; multi-get é dividido por lista de pubkey; GPA não é paginado por offset, então filtros ou índices externos carregam descoberta grande; DAS frequentemente expõe page / limit em APIs de provedor.
Quais são escolhas comuns de provedor?
Opções gerenciadas incluem Helius, Triton e QuickNode para RPC hospedado mais DAS, gRPC ou webhooks opcionais; self-hosting Agave troca custo ops por controle; RPC público gratuito é para uso leve não-produção.
Como APIs de simulação e priority fee se encaixam no caminho de envio?
Simule para estimar compute units e capturar erros de programa; amostre prioritization fees recentes (ou percentis do provedor) para definir preço de CU; depois envie e espere commitment.
@solana/kit substitui entender métodos RPC?
Não. Kit 7.0.0 tipa e encapsula as mesmas superfícies JSON-RPC e de assinatura; você ainda escolhe métodos, commitment, filtros e provedores corretamente.
Apps de produção devem compartilhar uma URL RPC pública global?
Não. Use endpoints de provedor autenticados (e frequentemente URLs HTTP/WSS/DAS separadas), rate-limit client-side e planeje failover para caminhos críticos.
Quando indexer é obrigatório em vez de só RPC?
Quando você precisa analytics histórico completo, descoberta program-wide grande ou streams multi-conta que excedem capacidade de GPA filtrado e assinatura.
Para onde ir depois desta página?
Comece com RPC Basics para commitment e setup de cliente, depois Core RPC Methods para leituras do dia a dia; abra GPA, paginação, fees e provedores conforme essas dores aparecerem.
Relacionados
- RPC Basics - formato JSON-RPC, níveis de commitment e rate limits
- Core RPC Methods -
getAccountInfo,getBalance,getMultipleAccounts, visão geral GPA - getProgramAccounts & Filters -
memcmp,dataSizee scans seguros de programa - Pagination & Efficiency - loteamento, cursores e evitar scans pesados
- Priority Fee & Simulation APIs - amostras de fee,
simulateTransactione margem de CU - RPC Providers - provedores gerenciados, RPC público e trade-offs de self-hosting
Versões da stack: Esta página foi escrita para Agave 4.1.1, Solana CLI 3.0.10, Anchor 0.32.1, Rust 1.91.1 e @solana/kit 7.0.0.