Contexto do modelo de conta
Pule esta seção se você estiver familiarizado com contas Solana e sua estrutura.
- Dados: Os bytes reais que armazenam o estado do programa, saldos de tokens ou outras informações
- Proprietário: O programa que controla essa conta e pode modificar seus dados
- Lamports: O saldo SOL da conta para isenção de aluguel
- Executável: Se essa conta contém código de programa
Assinatura básica de conta
Vamos começar com um exemplo simples que assina alterações em contas de tokens. Este script notificará você sempre que os saldos de tokens mudarem:BKMHWYLAX4un3HUbR7a3u9jPmzCiLNa4mSj1RiX11eWF.
Esta conta possui:
- 2.039.280 lamports (~0,002 SOL de saldo - esta é a quantia isenta de aluguel para esta conta de token)
- Programa proprietário
TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA(este é o programa SPL Token) - Assinatura de transação
5C9Hr5nG2j8eQz6inxPmfyjbYdmXddzUDyR1iQgEnjYQ3RNvuP4Zzc8t1enLNy7Rk8KNCtQPEQztENYWxkt9GaVDmostrando qual transação específica causou essa mudança de conta - Slot 352366983 indicando quando essa atualização ocorreu na blockchain
- Campo de dados contendo 165 bytes de dados de conta codificados como base58
Compreendendo a filtragem de contas com datasize
O campo de dados é crucial - ele contém a estrutura real da conta de token. Vamos usar esse entendimento para filtragem inteligente de contas.Por que usar filtragem por datasize?
Para entender por que precisamos de filtragem, primeiro vamos entender o que são realmente as contas de token. Para cada token que uma carteira possui, há uma conta separada on-chain. Se sua carteira possui 3 tokens diferentes (USDC, BONK e SOL), você na verdade tem 1 conta de carteira (sua conta principal de SOL) mais 3 contas de token (uma para cada tipo de token). Cada conta de token tem exatamente 165 bytes e armazena: qual token ela contém (endereço de mint), quem a possui (endereço da sua carteira) e quanto desse token ela contém (quantidade). O Programa de Token possui milhões de contas na Solana, mas nem todas são o que consideramos “contas de token” com saldos de usuário. Aqui está o que acontece com e sem filtragem: Sem filtragem - A inundação:- Contas de token (165 bytes) - Saldos de usuários: milhões de contas
- Contas de mint (82 bytes) - Definições de tokens: centenas de milhares de contas
- Contas multisig (355 bytes) - Controles de carteiras compartilhadas: dezenas de milhares de contas
- Contas do Programa de Token Associado (vários tamanhos) - milhões de contas
- Sem filtragem: Milhões de atualizações de contas (criações de mint, mudanças multisig, etc.)
- Com filtragem por datasize: Apenas mudanças de saldo de token
De onde vêm os 165 bytes?
Isso não é mágica - vem da estrutura de conta do programa SPL Token. Olhando para o código-fonte, podemos ver que a structAccount define exatamente 165 bytes:
- Contas de mint (82 bytes)
- Contas multisig (355 bytes)
- Contas de programa de token associado
- Outras contas relacionadas a tokens com tamanhos diferentes
Decodificando a estrutura da conta
Agora que entendemos por que filtramos por 165 bytes, vamos decodificar o que há dentro da nossa conta de exemplo:- Bytes 0-31: Endereço de mint (qual token esta conta contém)
- Bytes 32-63: Endereço do proprietário (quem possui esta conta de token)
- Bytes 64-71: Quantidade de tokens (quantos tokens estão na conta)
- Bytes 72-164: Metadados adicionais (delegado, estado, autoridade de fechamento, etc.)
Combinando filtros: datasize + memcmp para precisão laser
Agora que sabemos que o endereço de mint está nos bytes 0-31, podemos ser ainda mais específicos. Digamos que queremos monitorar apenas contas de token USDC. Podemos combinar nosso filtrodatasize com um filtro memcmp para direcionar o endereço de mint exato:
- Filtro de proprietário: “Dê-me contas pertencentes ao Programa de Token” (milhões de contas)
- Filtro de datasize: “Mas apenas contas de token padrão de 165 bytes” (centenas de milhares)
- Filtro de memcmp: “E apenas aquelas que contém USDC” (milhares)
Lendo atualizações de conta USDC: Quem, Quanto, Onde?
Agora vamos ver o que essas atualizações filtradas realmente contêm. Vamos criar um monitor específico para USDC que responde às perguntas-chave quando uma conta de token muda:- Quem possui esta conta de token?
- Quanto USDC ela contém agora?
- Onde (qual conta específica) mudou?
- Quando essa mudança aconteceu?
- Que transação causou a mudança?
bs58.encode() para converter objetos Buffer binários em strings legíveis.
Referência completa de filtragem
Além dos filtros básicosowner, datasize e memcmp que usamos, as inscrições de conta suportam opções de filtragem adicionais para restringir ainda mais seus resultados:
Filtragem de contas específicas
Monitore contas exatas por suas chaves públicas:Estratégias de filtragem combinadas
O poder vem da combinação de vários tipos de filtro. Aqui está o modelo mental:- Lance uma rede ampla com
owner- “Dê-me todas as contas geridas por este programa” - Filtre por estrutura com
datasize- “Mas apenas contas deste tipo específico” - Mire em dados específicos com
memcmp- “E apenas aquelas contendo esta informação específica” - Monitore contas conhecidas com
account- “Ou apenas observe estas contas exatas que me importam”
Compreendendo o quadro geral
Pense nas inscrições de contas como assistir a um feed ao vivo de alterações de banco de dados. O estado da Solana é essencialmente um enorme armazenamento de chave-valor onde cada conta é uma entrada. Quando programas são executados, eles modificam essas contas. Sua inscrição permite que você veja entradas específicas mudando em tempo real. O sistema de filtragem funciona como índices de banco de dados - você não está apenas assistindo “todas as mudanças”, mas sim “mudanças nas contas que correspondem a esses critérios”. Isso torna possível construir aplicativos responsivos que reagem imediatamente a eventos on-chain relevantes sem sobrecarregar seu sistema com dados irrelevantes.Aplicando este padrão a outros programas
A abordagem que aprendemos funciona para qualquer programa Solana. Aqui está o padrão geral:- Pesquise a estrutura da conta - Verifique o código-fonte ou a documentação do programa
- Comece com filtragem de proprietário - Direcione o programa que gerencia as contas
- Aplique filtros estruturais - Use tamanho da conta, padrões de dados ou outras características para reduzir a tipos específicos de conta
- Adicione filtros direcionados - Foque em contas específicas, estados ou valores de dados que importam para seu aplicativo