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;
});
2.Obtenha os detalhes do bloco usando o número do bloco.
`const block = await web3.eth.getBlock(blockNumber);`
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);
}
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).
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');
}
}
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 ↓↓ 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);
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;
```
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
});
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.
Crie um banco de dados no Astra DB
1.Primeiro, dirija-se ao painel e aperte o botão "Criar Banco de Dados".
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
3.Em seguida, navegue até o Data Loader e carregue o conjunto de dados da amostra, que neste caso é Ethereum NFTs.
4.Navegue até o Console CQL e faça consultas ao conjunto de dados Ethereum NFT que você carregou anteriormente.
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
SELECT * FROM eth.nfts WHERE
contract_address='0x76e51bc8fa0beebcf3e45de408fa43c9dc5ffb27' AND token_id='9257';
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
- 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
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
- DataStax Astra DB
- Astra DB Data Loader | Documentação do DataStax
- Desenvolvendo com a documentação do Astra DB API
- EIP-721: Non-Fungible Token Standard
- 9257 — Primate Social Society | OpenSea
- EIP-1155: Multi Token Standard
- Baby Dragon Club #3573 — Billionaire NFT Club | OpenSea
- Banco de Dados de Assinaturas Ethereum
Latest comments (0)