WEB3DEV

Cover image for Rastreamento de transferências NFT usando Astra DB e Web3
Dimitris Carvalho Calixto
Dimitris Carvalho Calixto

Posted on

Rastreamento de transferências NFT usando Astra DB e Web3

Esse artigo foi escrito por: DataStax e traduzido por Dimitris Calixto, artigo original disponível aqui

Este é o primeiro post da nossa novíssima série de blogs Astra DB Crypto, onde abordaremos tudo o que você precisa saber sobre a Web3. Para a estréia, apresentaremos os NFTs e lhe mostraremos como você pode carregá-los no DataStax Astra DB - um banco de dados multi-nuvem como serviço (DBaaS) construído sobre Apache Cassandra.

Neste primeiro post, vamos lhe dar uma rápida introdução aos NFTs e como você pode usar o DataStax Astra DB serverless para acessar seus NFTs facilmente e em escala. Você aprenderá exatamente o que são NFTs, os tipos de contratos inteligentes NFT, e como usar o carregador de dados Astra DB para carregar cada NFT já cunhado no Astra DB.

Vamos começar.

Noções básicas de NFT

NFTs significa "Non-Fungible Tokens". Em resumo, NFTs são:

  • Ativos digitais que representam objetos únicos como arte, ingressos, música e vídeos
  • Comprados e vendidos usando moedas criptográficas (como o Ether)
  • Únicos e não podem ser substituídos (não há dois NFTs iguais)
  • Criados através de um processo chamado cunhagem
  • Suportados em múltiplas blockchains. A maioria dos NFTs estão na blockchain Ethereum, mas outras cadeias como a Solana também possuem suporte
  • Seguem duas normas NFT (ERC-721 e ERC-1155)

Vamos aprofundar um pouco nesse último ponto.

Conheça as duas normas NFT

Pense em normas como um conjunto consistente de APIs para que os desenvolvedores possam interagir com os NFTs. Os dois padrões são:

ERC-721 (Norma de Token Único)

  • Um único contrato implantado para gerenciar um token
  • Exemplo: Bored Ape Yacht Club
  • Eventos: Transfer, Approval, ApprovalForAll
  • Funções_: balanceOf, ownerOf, safeTransferFrom, transferFrom, approve, setApprovalForAll, getApproved, isApprovedForAll, tokenURI_

ERC-1155 (Norma de Token Múltiplo)

  • Um único contrato para gerenciar um ou vários tokens
  • Exemplo: Billionaire NFT Club
  • Eventos: TransferSingle, TransferBatch, ApprovalForAll, URI
  • Funções_: safeTransferFrom, safeBatchTransferFrom, balanceOf, balanceOfBatch, setApprovalForAll, isApprovedForAll, uri_

Agora que estamos todos na mesma página, vamos percorrer os passos para puxar as transferências do NFT e pegar os metadados que você vai armazenar no Astra DB mais tarde.

Puxando transferências do NFT

1.Monitore novos blocos a serem minerados, obtenha o número do bloco para o bloco recém-minerado

web3.eth.subscribe("newBlockHeaders", (err, result) => {

    const { number } = result;

});

Enter fullscreen mode Exit fullscreen mode

2.Obtenha os detalhes do bloco usando o número do bloco.

 `const block = await web3.eth.getBlock(blockNumber);`
Enter fullscreen mode Exit fullscreen mode

3.Pegue os recibos das transações, iterando através das transações em bloco.

for (


          let transactionNo = 0;


          transactionNo < block.transactions.length;


          transactionNo++


        ) {


    const receipt = web3.eth.getTransactionReceipt(transaction);


    }
Enter fullscreen mode Exit fullscreen mode

4.O primeiro registro de cada destinatário da transação conterá uma assinatura do evento. Os NFTs podem ser transferidos de três maneiras: TransferSingle, TransferBatch, Transfer. Se o log descodificado corresponder a uma das três assinaturas de eventos de transferência, você detectou uma transferência NFT.

Você pode usar uma ferramenta como [4Byte.directory para decodificar assinaturas](https://www.4byte.directory/event-signatures/?bytes_signature=0xc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62).
Enter fullscreen mode Exit fullscreen mode
    const ERC1155_TRANSFER_SINGLE_TOPIC =

  "0xc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62";

for (let logNo = 0; logNo < transactionReceipt.logs.length; logNo++) {

const firstTopic = transactionReceipt.logs[logNo].topics[0];

            if (firstTopic === ERC1155_TRANSFER_SINGLE_TOPIC) {

        console.log('Transferência NFT detectada');

    }

}
Enter fullscreen mode Exit fullscreen mode

5.Uma vez detectada uma transferência NFT, você pode puxar metadados adicionais no NFT, usando a função uri: tokenUri (para 721s) ou função uri (para 1155s).

    const abi: AbiItem = isErc1155


          ? {


              name: "uri(uint256)",


              type: "function",


              inputs: [


                {


                  type: "uint256",


                  name: "id",


                },


              ],


            }


<p id="gdcalert1" ><span style="color: red; font-weight: bold">>>>>>  gd2md-html alert: Definition &darr;&darr; outside of definition list. Missing preceding term(s)? </span><br>(<a href="#">Back to top</a>)(<a href="#gdcalert2">Next alert</a>)<br><span style="color: red; font-weight: bold">>>>>> </span></p>



          : {


              name: "tokenURI(uint256)",


              type: "function",


              inputs: [


                {


                  type: "uint256",


                  name: "_tokenId",


                },


              ],


            };


        const res = await web3.eth.call({


          to: contractAddress,


          data: web3.eth.abi.encodeFunctionCall(abi, [tokenId.toString()]),


        });


        uri = web3.eth.abi.decodeParameters(["string"], res);
Enter fullscreen mode Exit fullscreen mode

6.O IPFS (Interplanetary File System) é comumente usado para armazenar metadados NFT. Você pode converter links IPFS para JSON usando o _gateway _ipfs.io.

```Solidity

const res = await axios.get(

    `https://gateway.ipfs.io/ipfs/${url?.replace("ipfs://", "")}`

    );

 return res?.data;

```
Enter fullscreen mode Exit fullscreen mode

Você terminou! Agora você está pronto para armazenar os metadados do NFT com a API de Documentação do Astra DB.


const astraClient = await createClient({

    astraDatabaseId: process.env.ASTRA_DB_ID,

    astraDatabaseRegion: process.env.ASTRA_DB_REGION,

    applicationToken: process.env.ASTRA_DB_APPLICATION_TOKEN,

});

const nftsCollection = astraClient.namespace("app").collection("eth");

const nft = await nftsCollection.create(contractAddress, {

  tokenId,

metadata

});

Enter fullscreen mode Exit fullscreen mode
Você pode [criar uma conta Astra gratuita](https://dtsx.io/3x8QQYE) ou simplesmente clonar o conjunto de dados NFT para sua conta Astra com as etapas abaixo.
Enter fullscreen mode Exit fullscreen mode

Crie um banco de dados no Astra DB

1.Primeiro, dirija-se ao painel e aperte o botão "Criar Banco de Dados".

Image

2.Digite o nome do banco de dados e o nome do keyspace, depois selecione um provedor e a região.

Nome do banco de dados: NFT

Keyspace: eth

Provedor: Google Cloud

Região: us-east1

Image

3.Em seguida, navegue até o Data Loader e carregue o conjunto de dados da amostra, que neste caso é Ethereum NFTs.

Image

4.Navegue até o Console CQL e faça consultas ao conjunto de dados Ethereum NFT que você carregou anteriormente.

Image

5.Agora que tudo está trancado e carregado, podemos passar à procura por um NFT em seu banco de dados.

Procure por um NFT individual

Eis o que queremos ver quando procuramos por um NFT

Image


SELECT * FROM eth.nfts WHERE 

contract_address='0x76e51bc8fa0beebcf3e45de408fa43c9dc5ffb27' AND token_id='9257';

Enter fullscreen mode Exit fullscreen mode

Sua saída deve ser parecida com esta:


contract_address | 0x76e51bc8fa0beebcf3e45de408fa43c9dc5ffb27

 token_id         | 9257

 block_number     | 13319231

 metadata         | {image:https://tbziw4f7f4.execute-api.us-west-2.amazonaws.com/dev/images/9257.png,tokenId:9257,name:Primate Social Society #9257,attributes:[{trait_type:Background,value:Whoops_glitch},{trait_type:SkinColor,value:salmon},{trait_type:HairColor,value:brown},{trait_type:Frame,value:hawaiian_shirt},{trait_type:Mouth,value:V_happy},{trait_type:Eyes,value:Brown_Eyes},{trait_type:Ears,value:red_yellow_trucker},{trait_type:Rarity Score,value:108.3463031301733,max_value:256},{trait_type:Rarity Rank,display_type:number,value:8583,max_value:10000}]}

 name             | Primate Social Society

 owner_of         | 0x0000000000000000000000000000000000000000000000000000000000000000

 symbol           | PSS

 token_standard   | ERC721

 token_uri        | https://tbziw4f7f4.execute-api.us-west-2.amazonaws.com/dev/tokens/9257

Enter fullscreen mode Exit fullscreen mode
  • Procure por todos os NFTs em um bloco utilizando índices anexos de armazenamento

SELECT * FROM eth.nfts WHERE block_number=13319231 ALLOW FILTERING;

Isto devolverá todos os NFTs que foram transacionados durante o bloco 13319231.

  • Procure pelos os NFTs com nome = 'Primate Social Society'

SELECT * FROM eth.nfts WHERE name='Primate Social Society' LIMIT 2 ALLOW FILTERING;

Isto retorna os dois primeiros resultados no conjunto de dados, como mostrado abaixo.


@ Row 1

 contract_address | 0x76e51bc8fa0beebcf3e45de408fa43c9dc5ffb27

 token_id         | 9257

 block_number     | 13319231

 block_number_hour| 36998

 metadata         | {image:https://tbziw4f7f4.execute-api.us-west-2.amazonaws.com/dev/images/9805.png,tokenId:9805,name:Primate Social Society #9805,attributes:[{trait_type:Background,value:warm_glow},{trait_type:SkinColor,value:salmon},{trait_type:HairColor,value:black},{trait_type:Frame,value:Raglan_Tee},{trait_type:Mouth,value:Blaaah},{trait_type:Eyes,value:Surprised_eyes},{trait_type:Ears,value:antlers},{trait_type:Rarity Score,value:124.68061951252119,max_value:256},{trait_type:Rarity Rank,display_type:number,value:6893,max_value:10000}]}

 name             | Primate Social Society

 owner_of         | 0x0000000000000000000000000000000000000000000000000000000000000000

 symbol           | PSS

 token_standard   | ERC721

 token_uri        | https://tbziw4f7f4.execute-api.us-west-2.amazonaws.com/dev/tokens/9805

@ Row 2

 contract_address | 0x76e51bc8fa0beebcf3e45de408fa43c9dc5ffb27

 token_id         | 9805

 block_number     | 13319315

 block_number_hour| 36998

 metadata         | {image:https://tbziw4f7f4.execute-api.us-west-2.amazonaws.com/dev/images/9805.png,tokenId:9805,name:Primate Social Society #9805,attributes:[{trait_type:Background,value:warm_glow},{trait_type:SkinColor,value:salmon},{trait_type:HairColor,value:black},{trait_type:Frame,value:Raglan_Tee},{trait_type:Mouth,value:Blaaah},{trait_type:Eyes,value:Surprised_eyes},{trait_type:Ears,value:antlers},{trait_type:Rarity Score,value:124.68061951252119,max_value:256},{trait_type:Rarity Rank,display_type:number,value:6893,max_value:10000}]}

 name             | Primate Social Society

 owner_of         | 0x0000000000000000000000000000000000000000000000000000000000000000

 symbol           | PSS

 token_standard   | ERC721

 token_uri        | https://tbziw4f7f4.execute-api.us-west-2.amazonaws.com/dev/tokens/9805

Enter fullscreen mode Exit fullscreen mode

E aí está! Você acabou de carregar um conjunto de dados completos de NFTs em seu banco de dados Astra em apenas alguns passos.

Esta é apenas a ponta do iceberg de como você pode usar o Astra DB para gerenciar facilmente NFTs, portanto fique atento para os próximos posts nesta série de blogs Astra DB Crypto para aprender muito mais. Entretanto, se você tiver alguma dúvida ou precisar de ajuda com qualquer uma das instruções acima, mande uma mensagem para [email protected].

Siga DataStax no Medium para postagens exclusivas em todas as coisas sobre código aberto, incluindo Pulsar, Cassandra, streaming, Kubernetes, e muito mais. Para se juntar a uma comunidade de desenvolvedores de todo o mundo e permanecer no loop de dados, siga DataStaxDevs no Twitter e no LinkedIn.

Recursos

  1. DataStax Astra DB
  2. Astra DB Data Loader | Documentação do DataStax
  3. Desenvolvendo com a documentação do Astra DB API
  4. EIP-721: Non-Fungible Token Standard
  5. 9257 — Primate Social Society | OpenSea
  6. EIP-1155: Multi Token Standard
  7. Baby Dragon Club #3573 — Billionaire NFT Club | OpenSea
  8. Banco de Dados de Assinaturas Ethereum

Latest comments (0)