WEB3DEV

Cover image for Como Obter Transações Solana Decodificadas
Panegali
Panegali

Posted on • Atualizado em

Como Obter Transações Solana Decodificadas

As transações na Solana contêm instruções a serem executadas pelo tempo de execução (runtime). Este artigo é sobre a busca de transações analisadas na Solana, simplificadas ao ponto de serem legíveis por humanos.

A execução de um programa na Solana geralmente começa com uma transação sendo enviada ao cluster. Uma transação na Solana normalmente consiste em um conjunto de instruções decodificadas e executadas pelo Solana Runtime para executar alguma tarefa na Blockchain. As transações também contêm um conjunto de contas de programa que estão envolvidas nas instruções a serem executadas. Isso é bastante semelhante a uma transação bancária ou financeira, em que uma certa quantia em moeda é adicionada ou deduzida de uma conta.

Se analisarmos qualquer uma dessas transações, podemos entender quais operações realmente ocorreram nessa transação, incluindo as contas associadas, endereço do token, cunhagem, alteração nos saldos dos tokens etc. A maioria dos aplicativos Web3 envolvendo cunhagem de tokens e NFTs ou exibindo dados da carteira podem exigir transações analisadas da carteira. Já que as carteiras contêm inúmeras transações, é importante buscarmos todos os dados da transação em etapas ou subetapas mínimas. A SHYFT fornece uma solução muito fácil de usar, baseada em API (Application Programming Interface ou Interface de Programação de Aplicação), para obter dados de transação analisados ​​na Solana. Vamos descobrir como podemos recuperar dados de transações analisados usando APIs SHYFT.

Leia a documentação da API SHYFT aqui.

Obtendo um histórico de transação analisadas

A SHYFT fornece uma solução baseada em API de uma etapa para obter detalhes de uma transação na Solana. O ponto de extremidade (endpoint) da API para obter dados relacionados a uma única transação.

GET < https : //api.shyft.to/sol/v1/transaction/parsed>
Enter fullscreen mode Exit fullscreen mode

Esta API aceita x-api-key no cabeçalho da solicitação da API, um parâmetro de autorização é usado pela SHYFT. Você pode obter aqui sua própria chave de API gratuitamente no site da SHYFT.

Os parâmetros necessários para esta chamada de API são:

  • network: Seleciona o cluster da rede Solana, que pode ser devnet, testnetou mainnet-beta.
  • txn_signature: Assinatura da transação a ser analisada. A transação deve ser do cluster especificado no campo network.

Depois de executada com sucesso, a resposta retornada se parece um pouco com esta.

{
   "success": true,
   "message": "Os detalhes da transação foram obtidos com sucesso",
   "result": {
       "timestamp": "2022-08-28T13:25:09.000Z",
       "fee": 0.000005,
       "fee_payer": "GyqoamVnBFR1eup3PRMF1uhBAB3cptiYHRsFa5H3YzPm",
       "signers": [
           "GyqtamVnBFS1eup3PRMF1uhBAB3cptiYHRsFa5H3YzPm"
       ],
       "signatures": [
           "2ktQS9BwubEjx46oN4j56qKcdubqURQy6bGNBHYDknTzitiMhqqDCvSkSrHtHYd1UdnqTBfUi7fRx4Tv7pznewoL"
       ],
       "protocol": {
           "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
           "name": "TOKEN_PROGRAM"
       },
       "type": "NFT_TRANSFER",
       "actions": [
           {
               "info": {
                   "amount": 1,
                   "receiver": "E791QW72VB9hSkNWzugAtuFm764FYgcw9d1oiPgSzu1C",
                   "sender": "GyqtamVnBFR1eqp3PRMF1uhBAB3cptiYHRsFa5H3YzPm",
                   "receiver_associated_account": "6jWL9PugCvyorggcc7J3KNBPicRP5fbCsHmmaT2w4HY7",
                   "nft_address": "3gWVjdwzWyZ9Md6PyJrwWjQcxySLkMvoJAYiuzidwxY6"
               },
               "source_protocol": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
               "type": "NFT_TRANSFER"
           }
       ]
   }
}
Enter fullscreen mode Exit fullscreen mode

Detalhes dos campos retornados

Embora os nomes dos campos sejam autoexplicativos, aqui está um breve detalhamento dos campos retornados na resposta. _O timestamp retorna a hora da transação de acordo com o formato UTC ISO String. O campo fee e fee_payer indica quanto foi cobrado (em SOL) e de quem, respectivamente. O campo actions é uma matriz de objetos, em que cada objeto indica todas as operações realizadas naquela transação. Cada objeto desta matriz, indica o tipo de operação realizada no campo type, o tipo e a quantidade de token envolvido em token_address e amount respectivamente, e receiver_address também (tudo isso está contido no objeto info). O campo protocol indica o nome e o endereço do protocolo. Os signatários da transação são indicados pela matriz signers. Você pode saber mais sobre os tipos de transações analisadas em nosso documento de desenvolvimento, ou também pode verificar os detalhes da API aqui.

Obtendo transações analisadas de sua carteira

Frequentemente, dApps como Wallet explorers ou Mercados Web3 exigem que todas as transações ou transações recentes sejam obtidas de uma carteira e analisadas, para que seus usuários tenham uma ideia clara de exatamente quais tokens estão sendo usados, quanto SOL está sendo cobrado, etc. Vamos ver como podemos obter transações analisadas de uma carteira usando APIs SHYFT. O ponto de extremidade da API para obter o histórico de transações de uma conta on-chain:

GET <https://api.shyft.to/sol/v1/transaction/history>
Enter fullscreen mode Exit fullscreen mode

Esta API aceita x-api-key no cabeçalho da solicitação API, um parâmetro de autorização é usado pela SHYFT. Você pode obter gratuitamente aqui sua própria chave de API no site da SHYFT. Esta API suporta paginação.

Parâmetros usados ​​para esta solicitação de API

  • network: Selecione o cluster da rede Solana, que pode ser devnet, testnet ou mainnet-beta. As transações pertencentes a este cluster serão buscadas.
  • account: Endereço da conta on-chain cuja transação tentaremos obter. Este será o endereço da carteira.
  • tx_num(opcional): Número de transações analisadas a serem buscadas de uma só vez. Este é um parâmetro opcional que aceita um número, digamos X, a API irá buscar um número X de transações sendo a mais recente a primeira. Um máximo de 10 transações podem ser buscadas de uma só vez.
  • before_tx_signature(opcional): assinatura da transação antes da qual X número de transações analisadas serão buscadas, sendo a mais recente a primeira.
  • enable_raw(opcional): É um parâmetro bool (boleano) opcional, que pode ser true (verdadeiro) ou false (falso). Se definido como true, a transação bruta também será retornada junto com a transação analisada.

Esta é uma resposta de amostra para a solicitação de API enable_rawdefinida como true.

{
   "success": true,
   "message": "Histórico de transações obtido com sucesso",
   "result": [
       {
           "timestamp": "2023-02-17T05:59:59.000Z",
           "fee": 0.000005,
           "fee_payer": "9B5XszUGdMaxCZ7uSQhPzdks5ZQSmWxrmzCSvtJ6Ns6g",
           "signers": [
               "9B5XszUGdMaxCZ7uSQhPzdks5ZQSmWxrmzCSvtJ6Ns6g"
           ],
           "signatures": [
               "WVvRzZbHCSuji7MuQxbzV9X7YtUUNvNpBdLrw3qudHrqw8Mn3nKu3WXtR9CfEqctLav9NyDS7HnxYHmD6PpEoab"
           ],
           "protocol": {
               "address": "11111111111111111111111111111111",
               "name": ""
           },
           "type": "SOL_TRANSFER",
           "actions": [
               {
                   "info": {
                       "sender": "9B5XszUGdMaxCZ7uSQhPzdks5ZQSmWxrmzCSvtJ6Ns6g",
                       "receiver": "Apeng15Pm8EjpAcaAXpNUxZjS2jMmGqikfs281Fz9hNj",
                       "amount": 0.1
                   },
                   "source_protocol": "11111111111111111111111111111111",
                   "type": "SOL_TRANSFER"
               }
           ],
           "raw": {
               "blockTime": 1676613599,
               "meta": {
                   "computeUnitsConsumed": 0,
                   "err": null,
                   "fee": 5000,
                   "innerInstructions": [],
                   "logMessages": [
                       "Program 11111111111111111111111111111111 invoke [1]",
                       "Program 11111111111111111111111111111111 success"
                   ],
                   "postBalances": [
                       39019203960013220,
                       12380456480,
                       1
                   ],
                   "postTokenBalances": [],
                   "preBalances": [
                       39019204060018216,
                       12280456480,
                       1
                   ],
                   "preTokenBalances": [],
                   "rewards": [],
                   "status": {
                       "Ok": null
                   }
               },
               "slot": 196287434,
               "transaction": {
                   "message": {
                       "accountKeys": [
                           {
                               "pubkey": "9B5XszUGdMaxCZ7uSQhPzdks5ZQSmWxrmzCSvtJ6Ns6g",
                               "signer": true,
                               "source": "transaction",
                               "writable": true
                           },
                           {
                               "pubkey": "Apeng15Pm8EjpAcaAXpNUxZjS2jMmGqikfs281Fz9hNj",
                               "signer": false,
                               "source": "transaction",
                               "writable": true
                           },
                           {
                               "pubkey": "11111111111111111111111111111111",
                               "signer": false,
                               "source": "transaction",
                               "writable": false
                           }
                       ],
                       "addressTableLookups": null,
                       "instructions": [
                           {
                               "parsed": {
                                   "info": {
                                       "destination": "Apeng15Pm8EjpAcaAXpNUxZjS2jMmGqikfs281Fz9hNj",
                                       "lamports": 100000000,
                                       "source": "9B5XszUGdMaxCZ7uSQhPzdks5ZQSmWxrmzCSvtJ6Ns6g"
                                   },
                                   "type": "transfer"
                               },
                               "program": "system",
                               "programId": "11111111111111111111111111111111"
                           }
                       ],
                       "recentBlockhash": "47xjhFKQL8GAfCJdmA29qUKzzb84s3hbY8sT2oeoY3iL"
                   },
                   "signatures": [
                       "WVvRzZbHCSuji7MuQxbzV9X7YtUUNvNpBdLrw3qudHrqw8Mn3nKu3WXtR9CfEqctLav9NyDS7HnxYHmD6PpEoab"
                   ]
               },
               "version": "legacy"
           }
       },
       {
           "timestamp": "2023-02-17T05:55:54.000Z",
           "fee": 0.000005,
           "fee_payer": "9B5XszUGdMaxCZ7uSQhPzdks5ZQSmWxrmzCSvtJ6Ns6g",
           "signers": [
               "9B5XszUGdMaxCZ7uSQhPzdks5ZQSmWxrmzCSvtJ6Ns6g"
           ],
           "signatures": [
               "4RGrpBwAmZAKkC4endaRdZPZd9w2d6XEorjScNfa3HqFoH8v74NQBC1MgFYe8V9nQctaB6FGyzmVJTYKQg4Vg8cn"
           ],
          .........//response trimmed down
               "version": "legacy"
           }
       }
   ]
}
Enter fullscreen mode Exit fullscreen mode

Os campos na resposta são os mesmos que foram explicados na seção anterior, exceto por algumas adições, pois podemos receber a transação bruta na resposta também.

Tipos de transações suportadas

O suporte de análise para os seguintes tipos de transações está atualmente disponível por meio de APIs SHYFT.

NFT_MINT, TOKEN_MINT, TOKEN_CREATE, SOL_TRANSFER, TOKEN_TRANSFER, NFT_TRANSFER, NFT_BURN, TOKEN_BURN, NFT_SALE, NFT_BID, NFT_LIST, NFT_LIST_CANCEL, MARKETPLACE_WITHDRAW
Enter fullscreen mode Exit fullscreen mode

Estamos trabalhando constantemente para adicionar mais e mais tipos de transação suportadas, você pode encontrar os detalhes aqui.

Transações brutas x analisadas: uma comparação

As transações brutas contêm os dados completos sobre uma transação e as instruções que foram executadas relacionadas a ela. No entanto, todos os detalhes relacionados à transação raramente são usados, e temos que aplicar alguma forma de processo de decodificação nessa transação antes que possamos entender seu significado ou que ela seja exibida ao usuário.

Transação Bruta

Por outro lado, as transações analisadas fornecidas pelas APIs SHYFT fornecem informações já processadas que são legíveis por humanos e podem ser exibidas diretamente no front-end sem nenhuma sobrecarga de processamento. A seguir, um exemplo de uma transação analisada da SHYFT, se observarmos atentamente as ações e os campos do protocolo, podemos ter uma ideia clara de que ocorreu uma NFT_TRANSFER e as partes envolvidas são indicadas nos campos e receiver e sender.

Dados de transação analisadas ​​usando APIs SHYFT.

Transações analisadas legíveis por humanos podem ser úteis em vários dApps, como exploradores de carteira, mercados NFT ou qualquer outro aplicativo em que dados de transação decodificados são exibidos para os usuários. O suporte adicionado para paginação remove várias sobrecargas adicionais, tornando esta API uma solução abrangente para desenvolvimento de aplicativos em torno de transações analisadas na Solana.

Se você gostou de construir junto com este artigo, sinta-se à vontade para conferir nossos outros artigos sobre como obter dados de carteira na Solana ou criar uma plataforma de lançamento de NFTs na Solana, usando APIs SHYFT. Esperamos que você se divirta criando dApps na Solana com APIs SHYFT.

Observação: Adicionamos um JavaScript SDK totalmente novo ao nosso arsenal, sinta-se à vontade para conferir aqui.

Fontes (em inglês)

Documentação da API SHYFT

Site da Shyft

Obtenha a chave da API

GitHub

Junte-se ao nosso Discord

JavaScript SDK

Experimente nossas APIs na Interface de Usuário Swagger


Artigo escrito por Team Shyft e traduzido por Marcelo Panegali.


Explore o conceito de Web3 e como ele está transformando a internet. Descubra como se preparar para o futuro descentralizado!

Top comments (0)