Ter um sistema de propriedade confiável mudou a web como a conhecíamos e iniciou o que agora chamamos de Era da Blockchain. Agora, qualquer pessoa pode acessar as informações ali contidas e pode confiar no que vê. Mas devido à sua complexidade, embora esta informação esteja disponível para todos, muitas vezes não é muito simples encontrar o que procura.
A missão que temos aqui é descobrir quem são os proprietários de um token em um período de tempo específico. Para conseguir isso, precisamos encontrar os proprietários históricos do token, bem como os atuais, e determinar por quanto tempo eles o mantiveram em suas carteiras.
Este é o processo que fizemos para rastrear todos os Rakkudos não listados e os preKudos distribuídos, por meio de airdrop,nas carteiras dos titulares para esse período de tempo específico.
Encontrar os proprietários atuais é relativamente fácil, você pode fazer isso usando nós RPC para obter os dados da conta de uma conta de token existente e extrair o proprietário. Encontrar proprietários históricos é muito mais difícil.
Contas fechadas não podem ser baixadas de endpoints RPC, ou seja, não podem ser analisadas. Nesse caso, devemos raspar os dados históricos da cadeia e procurar “dicas” sobre transações mais antigas envolvendo a conta. Mas vamos lembrar que os nós Solana típicos contêm apenas algumas épocas de dados, portanto, para obter todas as transações, precisamos de uma fonte de dados de arquivo.
Assista ao vídeo de demonstração aqui:
https://www.youtube.com/watch?v=VhxrRpZVbBU
Uma Rápida Visão Geral Das Estruturas De Dados Solana
Primeiro, vamos ver os detalhes de como os dados do Solana estão sendo reunidos dentro da cadeia.
A blockchain da Solana é organizada em uma série ordenada de Slots, que possuem um Bloco associado.
Cada bloco tem um conjunto de transações nele.
Cada Transação tem um conjunto de Instruções e um array de endereços das Contas.
As instruções são associadas a um ID de programa (Endereço) e recebem um conjunto de entradas e um array de entradas de contas. Essas entradas de Contas são extraídas da lista de contas de toda a transação.
As Contas possuem uma quantidade de Lamports (SOL) e um Data Bucket anexado a ela e podem ser associadas a um Programa.
Agora que sabemos como os dados Solana são distribuídos dentro da cadeia, o próximo passo é encontrar Contas de Token SPL (Solana Program Library)
Encontrando Contas De Token SPL
Um conjunto de instruções para fazer operações como criar e destruir contas, tokens de transferência e tokens de cunhagem são armazenados em uma Conta na cadeia.
Como uma Conta Solana é um bucket de dados genérico, o SDK Solana não apresenta o valor mínimo ou a quantidade de Token em uma Conta Token por padrão, portanto, ela deve ser analisada usando o método unpack do SPL Token Program. Algumas fontes de dados fornecem isso para você, como nós RPC com “jsonParsed
”
Depois de analisar o array de dados, obtemos o Owner, Mint e Balance. Cada token exclusivo tem um ID chamado “mint” na estrutura do programa SPL. Por exemplo, para preKUDOS ele é pkudoFxGVV76UpZcjdXH9hn46ECbUn3VzNAcEphWox9
Este programa é usado para definir moedas e NFTs na Cadeia Solana Means esta nossa metodologia funciona tanto para dados NFT como link para imagem e recursos são armazenados em outras contas vinculadas a Mint. Para NFTs, cada NFT é considerado seu próprio “mint” com exatamente 1 unidade do token existente, então cada um dos 10k Rakkudos que cunhamos tem um id de mint único.
Agora que sabemos como encontrar as contas de que precisamos, o próximo passo é encontrar os proprietários.
Encontrando o proprietário
Embora a desserialização das contas nos torne o proprietário atual, não será útil para os proprietários anteriores. É aqui que precisamos começar a usar os dados históricos. Isso ocorre porque as contas de token são normalmente fechadas quando estão vazias, para pegar de volta o SOL do aluguel. Depois que uma conta é fechada, a matriz de dados é excluída dos nós, então não podemos mais desserilizá-la. Ainda há o problema de obter uma lista de IDs das Contas para verificar.
Nossa solução aqui é rastrear a cadeia em busca de outros indicadores que nos digam o proprietário. Precisaremos de uma lista de transações, que podemos obter solicitando-as do RPC pelo número do slot.
Os nós RPC geralmente não armazenam mais do que algumas épocas de dados, portanto, para a maioria dos dados, precisaremos de uma fonte confiável de dados de arquivo Solana, como uma instância BigTable ou banco de dados SQL preenchido por um plug-in Geyser.
Analisando as instruções
Encontrar as Instruções pode ser feito primeiro filtrando quaisquer Instruções com o Endereço de programa errado (qualquer coisa que não seja o Programa Token).
Em seguida, precisamos analisar isso executando-o através de um método unpack diferente no SPL Token Program, que nos dirá se é o tipo de instrução que queremos.
Como existem algumas maneiras de representar um evento Initialize Account, precisamos procurar InitializeAccount, InitializeAccount2 e InitializeAccount3. Felizmente, todos eles contêm os dados que queremos - o mint, o endereço do proprietário e o endereço da conta do token
Normalmente, quando interpretado dessa maneira, apenas o array de dados é decodificado.
As entradas de Conta geralmente não estão na estrutura de dados desserializada. Eles podem ser encontrados no array de entrada de contas. O significado de cada índice é normalmente especificado na documentação.
Uma Conta tem um campo de proprietário se você estiver usando o Rust SDK (possivelmente outros). Este não é o proprietário que estamos procurando, este “proprietário” é o Endereço do Programa que tem permissão para manipular a conta, portanto, no caso de Contas Token, todas elas são “de propriedade” de TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA (o Endereço do Programa Token).
O proprietário da conta que queremos está armazenado no array “data” e não está disponível em contas fechadas.
Até este ponto
Até agora temos uma lista de contas que foram criadas para o mint. Para alguns aplicativos, como obter o número total aproximado de usuários que entraram no sistema, isso é suficiente, pois também podemos extrair o proprietário inicial da conta dessas instruções InitializeAccount. No entanto, para rastrear a propriedade ao longo do tempo, especialmente de NFTs, precisamos ir mais fundo. Além disso, há casos extremos que essa abordagem não captura, como a transferência da propriedade da conta mint. Como nenhuma nova conta é criada nesta instância, esses proprietários são perdidos.
Encontrando o proprietário ao longo do tempo
Evidência
Podemos expandir o escopo de nossa pesquisa para procurar mais indicações de propriedade do token ao longo do tempo. Há 2 casos mais amplos que precisamos rastrear:
Alteração na propriedade da Conta Token.
Transferência de tokens entre contas.
SetAuthority define as permissões em uma conta, para nossos propósitos, precisamos filtrar as instruções SetAuthority
em que authority_type =
AuthorityType.AccountOwner
As transferências vêm em 2 formas, uma Transfer e uma TransferChecked.
Agora vamos obter os dados sobre possíveis transferências de tokens entre contas.
Obtendo as transferências
Assim, podemos expandir a pesquisa para incluir essas 5 Instruções, mas ainda faltam alguns dados. ChangeAuthority não tem dados de mint, portanto, sem mais dados, não sabemos que tipo de conta foi transferida, e as Transferências não têm dados de propriedade para o destinatário, portanto, não sabemos para quem o token foi transferido.
Agora, podemos tentar encontrar os dados de mint na transação de algumas maneiras.
Dados de Mint
Primeiro, podemos baixar a conta de um nó RPC, analisá-la e obter o mint dessa maneira. Infelizmente, isso não funcionará para contas fechadas, pois seus dados não são mantidos em cadeia após o fechamento. Portanto, devemos procurar outras evidências. Também não podemos obter o proprietário pelo mesmo motivo, temos que pegá-lo nas instruções que encontramos. Uma transação tem outro dado que pulamos antes, chame os arrays de saldo de token pré e pós. Eles têm um registro de todas as Contas Token SPL envolvidas na transação, sua cunhagem e seu saldo antes e depois da Transação. Podemos olhar aqui para ver se há Transferências com o mint que estamos procurando. Transferências de conta (instruções SetAuthority) também não têm isso. Podemos tentar preencher os dados com base em qualquer coisa que tenhamos visto neste mesmo lote do trabalho, mas não poderemos preencher esses eventos até que tenhamos uma conta de todas as contas criadas para o mint.
Resumo Do Algoritmo
Faça um loop em todos os Blocos, verificando todas as Transações. Para cada transação, verifique o array de contas para o endereço do programa de token SPL e examine as instruções, se estiverem presentes. Na primeira passagem, filtre estas instruções para dados do proprietário e do mint:
- InitializeAccount
- InitializeAccount2
- InitializeAccount3
- (Opcional) CloseAccount
E estas instruções para cunhagem e transferência de dados:
- Transfer
- TransferChecked
Registre o Endereço da Conta, Endereço do Proprietário, Slot, Mint e valor transferido. Este é um exemplo de dados que podemos extrair das instruções de transferência e como.
Resumindo
A partir das Transfers e SetAuthorities analisadas, podemos formar uma linha do tempo de transferências de propriedade para uma NFT, ordenando todos os eventos por número de Slot. Podemos destilar cada transferência e SetAuthority em um “OwnershipTransfer” que apenas registra o proprietário anterior, o novo proprietário, a casa da moeda e o slot. Ao classificá-los, podemos obter uma linha do tempo de propriedade do NFT. Podemos juntar as instruções InitAccount, CloseAccount e SetAuthority para formar uma espécie de “linha do tempo” para cada conta e sua propriedade ao longo do tempo. Para alguns projetos, isso pode ser suficiente.
Para rastrear a propriedade da NFT, precisamos revisar a lista de transferências e usar essas linhas do tempo para descobrir quem possui a conta do token em cada transferência, observando para quem o token foi transferido e quando. Também devemos usar os dados SetAuthority para preencher essa lista de transferências, tratando isso como uma transferência de propriedade da NFT. Ao final, temos uma lista de eventos de transferência com datas e a Carteira que possui no momento da transferência. Isso pode ser usado para calcular por quanto tempo um usuário manteve o NFT, por exemplo.
Esse artigo é uma tradução de Devon Hockley feita por @bananlabs. Você pode encontrar o artigo original aqui
Latest comments (0)