Solana Geyser gRPC - Filtros

Solana Stream SDK
O Solana Stream SDK é fornecido como software de código aberto. Para mais detalhes, visite o repositório GitHub abaixo.

Visão geral dos filtros gRPC

Solana Geyser gRPC usa filtros para obter eficientemente apenas os dados que você está interessado, como contas específicas, programas, transações, slots e blocos.
Abaixo, fornecemos exemplos TypeScript usando o Solana Stream SDK, explicando claramente os papéis específicos de cada filtro. A estrutura e significado dos filtros são idênticos ao usar Rust.

Funções e Exemplos de Cada Filtro

Subscrever uma conta

Subscreva atualizações em tempo real para uma conta específica. O exemplo a seguir se inscreve na conta do OpenBook SOL-USDC no nível de compromisso Confirmado:
typescript
import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'

const request = {
  slots: { slots: {} },
  accounts: {
    'wsol/usdc': {
      account: ['8BnEgHoWFysVcuFFX7QztDmzuH8r5ZFvyP3sYwn1XTh6'],
    },
  },
  transactions: {},
  blocks: {},
  blocksMeta: {},
  accountsDataSlice: [],
  commitment: CommitmentLevel.CONFIRMED,
}
  • "wsol/usdc" é uma etiqueta definida pelo cliente.
  • Vários filtros para contas, programas, blocos e slots podem ser combinados em uma única solicitação JSON.

Subscrever uma conta com account_data_slice

Este exemplo demonstra recuperar apenas uma parte específica dos dados da conta. Em vez de obter os dados inteiros (165 bytes) de uma conta token USDC, ele recupera 40 bytes a partir de offset 32. Esta gama inclui informações como o saldo do proprietário e dos lambrorts.
typescript
import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'

const request = {
  slots: {},
  accounts: {
    usdc: {
      owner: ['TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA'],
      filters: [
        {
          tokenAccountState: true,
        },
        {
          memcmp: {
            offset: 0,
            data: {
              base58: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',
            },
          },
        },
      ],
    },
  },
  transactions: {},
  blocks: {},
  blocksMeta: {},
  entry: {},
  commitment: CommitmentLevel.CONFIRMED,
  accountsDataSlice: [{ offset: 32, length: 40 }],
}

Subscrever um programa

Este exemplo demonstra a assinatura de atualizações de contas associadas a um programa específico.
Abaixo, assinamos as atualizações da conta para contas de propriedade do programa Solend no Processed nível de compromisso.
typescript
import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'

const request = {
  slots: {
    slots: {},
  },
  accounts: {
    solend: {
      owner: ['So1endDq2YkqhipRh3WViPa8hdiSpxWy6z3Z6tMCpAo'],
    },
  },
  transactions: {},
  blocks: {},
  blocksMeta: {},
  accountsDataSlice: [],
  commitment: CommitmentLevel.PROCESSED,
}
  • "solend" é uma etiqueta personalizada que pode ser livremente definida pelo cliente.
  • Para se inscrever em vários programas, consulte a próxima seção intitulada "Assine a vários programas".

Subscrever vários programas

Este exemplo demonstra como assinar as atualizações de contas associadas com vários programas de uma só vez.
O exemplo abaixo assina atualizações para contas de ambos os programas Solend e Serum.
typescript
import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'

const request = {
  slots: {
    slots: {},
  },
  accounts: {
    programs: {
      owner: [
        'So1endDq2YkqhipRh3WViPa8hdiSpxWy6z3Z6tMCpAo',
        '9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin',
      ],
    },
  },
  transactions: {},
  blocks: {},
  blocksMeta: {},
  accountsDataSlice: [],
  commitment: CommitmentLevel.PROCESSED,
}
Se preferir atribuir rótulos individuais a cada programa, use a seguinte abordagem:
typescript
import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'

const request = {
  slots: {
    slots: {},
  },
  accounts: {
    solend: {
      owner: ['So1endDq2YkqhipRh3WViPa8hdiSpxWy6z3Z6tMCpAo'],
    },
    serum: {
      owner: ['9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin'],
    },
  },
  transactions: {},
  blocks: {},
  blocksMeta: {},
  accountsDataSlice: [],
  commitment: CommitmentLevel.PROCESSED,
}

Subscrever todas as transações finalizadas sem votação e não falhas

Este exemplo demonstra a assinatura de todas as transações no Finalized nível de compromisso, excluindo transações de voto e transações falhadas.
typescript
import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'

const request = {
  slots: {
    slots: {},
  },
  accounts: {},
  transactions: {
    alltxs: {
      vote: false,
      failed: false,
    },
  },
  blocks: {},
  blocksMeta: {},
  accountsDataSlice: [],
  commitment: CommitmentLevel.FINALIZED,
}
  • vote: false exclui as transações de voto.
  • failed: false exclui transações falhadas.
  • Se os campos estiverem vazios, todas as transações serão recuperadas.
  • Quando vários campos são especificados, eles operam com uma condição AND.

Subscreva as transações sem votação mencionando uma conta

Este exemplo demonstra a assinatura de transações envolvendo uma conta específica, mas excluindo transações de voto.
O exemplo abaixo se inscreve em transações sem votação que mencionam contas associadas ao programa Serum.
typescript
import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'

const request = {
  slots: {
    slots: {},
  },
  accounts: {},
  transactions: {
    serum: {
      vote: false,
      accountInclude: ['9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin'],
    },
  },
  blocks: {},
  blocksMeta: {},
  accountsDataSlice: [],
  commitment: CommitmentLevel.PROCESSED,
}

Subscrever as transações, excluindo as contas

Este exemplo demonstra a assinatura de transações, excluindo as que envolvam contas específicas.
O exemplo abaixo recupera transações excluindo quaisquer contas pertencentes aos programas Serum e Tokenkeg.
typescript
import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'

const request = {
  slots: {
    slots: {},
  },
  accounts: {},
  transactions: {
    serum: {
      accountExclude: [
        '9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin',
        'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA',
      ],
    },
  },
  blocks: {},
  blocksMeta: {},
  accountsDataSlice: [],
  commitment: CommitmentLevel.PROCESSED,
}

Subscrever as transações que mencionam contas & excluindo determinadas contas

Este exemplo demonstra a assinatura de transações envolvendo determinadas contas, excluindo explicitamente outras contas especificadas.
O exemplo abaixo assina as transações que mencionam a conta do Serum, mas exclui uma conta especificada:
typescript
import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'

const request = {
  slots: {
    slots: {},
  },
  accounts: {},
  transactions: {
    serum: {
      accountInclude: ['9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin'],
      accountExclude: ['9wFFyRfZBsuAha4YcuxcXLKwMxJR43S7fPfQLusDBzvT'],
    },
  },
  blocks: {},
  blocksMeta: {},
  accountsDataSlice: [],
  commitment: CommitmentLevel.PROCESSED,
}

Subscrever uma assinatura de transação

Este exemplo demonstra a assinatura de atualizações em tempo real para uma assinatura de transacção específica, até atingir o Confirmed ou Finalized Estado.
typescript
import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'

const request = {
  slots: {},
  accounts: {},
  transactions: {
    sign: {
      signature:
        '5rp2hL9b6kexex11Mugfs3vfU9GhieKruj4CkFFSnu52WLxiGn4VcLLwsB62XURhMmT1j4CZiXT6FFtYbXsLq2Zs',
    },
  },
  blocks: {},
  blocksMeta: {},
  accountsDataSlice: [],
  commitment: CommitmentLevel.PROCESSED,
}

Subscrever aos slots

Este exemplo demonstra a assinatura de notificações de slots recebidos. Não são necessários detalhes adicionais além de atribuir um nome de etiqueta personalizado:
typescript
import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'

const request = {
  slots: {
    incoming_slots: {},
  },
  accounts: {},
  transactions: {},
  blocks: {},
  blocksMeta: {},
  accountsDataSlice: [],
  commitment: CommitmentLevel.PROCESSED,
}

Subscrever os blocos

Subscreva as atualizações em tempo real de todos os blocos gerados. Por padrão, todas as transações dentro de um bloco serão recuperadas:
typescript
import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'

const request = {
  slots: {},
  accounts: {},
  transactions: {},
  blocks: {
    blocks: {},
  },
  blocksMeta: {},
  accountsDataSlice: [],
  commitment: CommitmentLevel.PROCESSED,
}

Para excluir transações e apenas recuperar informações atualizadas da conta:

typescript
import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'

const request = {
  slots: {},
  accounts: {},
  transactions: {},
  blocks: {
    blocks: {
      includeTransactions: false,
      includeAccounts: true,
    },
  },
  blocksMeta: {},
  accountsDataSlice: [],
  commitment: CommitmentLevel.PROCESSED,
}

Para apenas recuperar transações/accounts envolver contas específicas:

typescript
import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'

const request = {
  slots: {},
  accounts: {},
  transactions: {},
  blocks: {
    blocks: {
      accountInclude: ['So1endDq2YkqhipRh3WViPa8hdiSpxWy6z3Z6tMCpAo'],
    },
  },
  blocksMeta: {},
  accountsDataSlice: [],
  commitment: CommitmentLevel.PROCESSED,
}

Subscrever os meta- dados do bloco

Subscrever apenas para bloquear notificações de metadados quando os blocos são processados. Dados detalhados da transação não estão incluídos.
typescript
import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'

const request = {
  slots: {},
  accounts: {},
  transactions: {},
  blocks: {},
  blocksMeta: {
    blockmetadata: {},
  },
  accountsDataSlice: [],
  commitment: CommitmentLevel.PROCESSED,
}

Gestão dos níveis de compromisso

O fluxo GRPC Solana Geyser é padrão para o Processed nível de compromisso.
Você pode especificar níveis de compromisso mais elevados, como Confirmed ou Finalized. Nestes casos, Geyser buffers os dados e envia notificações uma vez que o nível de compromisso especificado é alcançado.
Para o máximo desempenho, é recomendável lidar com a gestão de nível de compromisso do lado do cliente.
Veja como especificar níveis de compromisso:
typescript
import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'

enum CommitmentLevel {
  PROCESSED = 0,
  CONFIRMED = 1,
  FINALIZED = 2,
}
  • PROCESSED: Dados imediatos após o processamento. Recuperação rápida, mas ainda não confirmada.
  • CONFIRMED: Dados confirmados pelo cluster, proporcionando maior certeza.
  • FINALIZED: Dados totalmente finalizados sem risco de reorganização.

Benefícios do trabalho em Processed

A principal vantagem da Processed o nível de comprometimento é a recuperação imediata da transação, possibilitando o processamento rápido do lado do cliente. Os clientes podem posteriormente detectar transições para Confirmed ou Finalized, oferecendo resposta rápida.

Como gerir Confirmed e Finalized

Ao usar Confirmed ou Finalized níveis, eventos (transações ou atualizações da conta) devem ser tamponados por slot.
Entalhe de eventos de buffer por slot, subscreva notificações de slot e solte eventos do buffer uma vez que um slot específico atinja o compromisso desejado (Confirmed ou Finalized).
Os eventos serão inicialmente recebidos antes que um slot chegue Confirmed ou Finalized.

A coisa especial sobre Finalized

Devido às especificações Solana Geyser, nem todos os slots recebem notificações finalizadas explícitas. Portanto, quando você recebe uma notificação finalizada para um slot, você deve tratar todos os slots ancestrais como finalizados, mesmo que nenhuma notificação foi recebida explicitamente.
Especificamente, ao receber uma notificação finalizada, trata retroativamente todos os slots ancestrais como finalizados.