WEB3DEV

Cover image for Como usar o Arweave para armazenar e acessar metadados NFT, parte 2
Diogo Jorge
Diogo Jorge

Posted on

Como usar o Arweave para armazenar e acessar metadados NFT, parte 2

Alternativamente, como o arbundles funciona!

Veja https://github.com/arcticmatt/arweave-simple-examples para os exemplos de código completos

O problema

Cobrimos o básico de como usar o Arweave para armazenar e acessar metadados de NFTs na parte 1. Aqui, vamos nos aprofundar em como lidar com esse aviso de que a documentação fornece:

N.B. Aconselhamos fortemente que você verifique o status e o número de confirmações de um determinado txid) antes de integrá-lo em outro lugar (por exemplo, se você planeja integrar um txid (ID da transação) em um contrato NFT), mesmo que tenha recebido uma resposta de status '200'.

Reafirmando o problema, se você usar arweave.transactions.post(transaction), não é garantido que a transação seja confirmada e minerada! Isso pode acontecer por vários motivos (nota: obtive esta informação no Arweave Dev Talk Discord):

  1. Uma reorganização de fork (bloco + txs tornam-se órfãos)
  2. A dificuldade do bloco mudou e a taxa de tx (transação) não é mais suficiente
  3. Você enviou muitas txs de uma vez e elas ficaram no mempool até ficarem obsoletas
  4. Você enviou muitas txs e elas começaram a ter limitação de taxa por algum servidor/nó
  5. Carteira sem saldo

Se a transação FALHAR em ser confirmada e minerada, então https://arweave.net/TX_ID acabará por parar de funcionar! Mais informações do Discord:

Se você fizer o upload de sua própria tx, ela será armazenado em cache no gateway arweave.net. Se a mineração não for bem-sucedida, ela será removida em uma coleta de lixo após algum tempo, então você precisa verificar /tx/{txid}/status a.k.a. getStatus

Resumindo, usar arweave.transactions.post(transaction) sem verificar o status da transação via arweave.transactions.getStatus pode fazer com que as coisas quebrem! Para o caso de uso simples de carregar alguns metadados e armazenar o URL de metadados em um NFT, isso é bastante irritante - não quero ter que esperar por arweave.transactions.getStatus antes de usar um ID de transação, especialmente porque leva alguns minutos para que uma transação seja confirmada e extraída. Então, como podemos resolver isso de uma maneira melhor?

Arbundles para o resgate

Arbundles permite enviar uma transação e usá-la instantaneamente (ou seja, acessar instantaneamente https://arweave.net/TX_ID).). Mais importante ainda, garante que seu ID de transação sempre será utilizável. Em outras palavras, uma vez que seus dados estejam disponíveis em https://arweave.net/TX_ID, estarão sempre disponíveis.

Vejamos como usar o arbundles.

import { ArweaveSigner, createData } from "arbundles";
import axios from "axios";
import dotenv from "dotenv";
dotenv.config();

const sendToBundler = async () => {
  const jwk = JSON.parse(process.env.KEY);
  const signer = new ArweaveSigner(jwk);
  const item = createData("hello", signer);
  await item.sign(signer);
  // Este ID de transação é garantido para ser usado
  console.log("item id", item.id);

  const response = await item.sendToBundler("http://bundler.arweave.net:10000");
  console.log("bundler response status", response.status);

  // Lê os dados de volta
  // Não use arweave.transactions.getData, os dados não estão disponíveis instantaneamente via
  // essa API (resulta em um erro TX_PENDING). Aqui está a explicação do Discord:
  //
  // mas essencialmente se /{txid} retornar 202
  // está "pendente"
  // que com txs regulares é verdadeiro
  // mas também retorna 202 para txs Bundlr não propagados
  // então os dados existem em Bundlr - mas não em L1 (Arweave)

  const data = await axios.get(`https://arweave.net/${item.id}`);
  console.log("data", data.data);
};

sendToBundler();
Enter fullscreen mode Exit fullscreen mode

Estas três linhas são as mais importantes:

const item = createData("hello", signer);
await item.sign(signer);
const response = await item.sendToBundler("http://bundler.arweave.net:10000");
Enter fullscreen mode Exit fullscreen mode

Esse código cria um DataItem, que é um objeto que contém os dados a serem enviados ao Arweave. item.id será preenchido após a execução de await item.sign(signer)e é o ID da transação do item de dados. Este ID de transação é garantido para ser sempre utilizável e é instantaneamente acessível. Explicar exatamente como isso funciona está fora do escopo desta postagem, mas aqui está uma explicação rápida do Discord:

arbundles garante dataItem txids, uma vez que lida com a tx de inclusão L1 para você. Ele verifica a disponibilidade de mineração de dados e recarrega ou faz o que for necessário para que suas txs estejam disponíveis para que você não precise entrar em tudo isso sozinho

DataItem é tratado como uma tx normal, mas na verdade ele é incluído em uma Bundlr tx e enviados como 1 L1 tx

Em outras palavras, item.idnão se refere a uma transação L1 (embora possa ser acessado como uma). Isso ocorre porque as transações L1 podem falhar ao serem mineradas e confirmadas, como discutimos acima. arbundles lida com o envio e reenvio (se necessário) da transação L1 para você, para que você não precise se preocupar com isso.

Lendo dados carregados com arbundles

Isso é simples e é abordado no código acima - basta executar const data = await axios.get(https://arweave.net/${item.id});.

Há uma coisa complicada a observar aqui. Embora os dados estejam instantaneamente disponíveis em https://arweave.net/DATA_ITEM_TX_ID, eles NÃO estarão disponíveis instantaneamente por meio de arweave.transactions.getData. Chamar essa função logo após chamar sendToBundler resultará em um erro de “transação pendente”. Aqui está o porquê, novamente do Discord:

é um pouco difícil de explicar
mas essencialmente se /{txid} retornar 202
está "pendente"
que com txs regulares é verdadeiro
mas também retorna 202 para txs Bundlr não semeadas
então os dados existem em Bundlr - mas não em L1 (Arweave)

Na prática, esse problema não importa muito - basta buscar os dados com a API HTTP e você não tem nada com que se preocupar.

Está o arbundles pronto para produção?

Há uma seção um pouco preocupante no README do repositório:

Esta API é experimental, então evite o uso em produção. Existe um problema que pode afetar sua funcionalidade geral e pode levar a alterações importantes.

A API de arquivo armazena os itens no sistema de arquivos, o que significa que você pode agrupar mais itens sem atingir o limite de memória do NodeJS.

Documentos em breve…

Esclareci com o proprietário do repositório (https://github.com/joshbenaron) que isso se refere apenas à API do arquivo e não afeta a API regular (que é a que usamos no exemplo acima).

Também perguntei diretamente se está pronto para produção e recebi esta resposta:

https://i.imgur.com/jI8CktJ.png

Então a resposta é sim! Bem, a menos que você esteja usando a API do arquivo.

Custo / Taxas

No momento da redação deste artigo (29/09/2021), o uso de arbundles é gratuito! A equipe está atualmente cobrindo os custos enquanto estabiliza a rede de teste.

Além de taxas Arweave, os bundlers cobrarão uma taxa. Eles poderão definir suas próprias taxas, criando um mercado competitivo. Assim que a rede de testes estiver totalmente lançada (o que deve ocorrer nas próximas semanas), você poderá consultar as taxas. Depois que os bundlers começarem a cobrar, o custo total ficará assim:

total_cost = arweave_storage_cost + bundler_base_fee + bundler_item_size_fee(item_num_bytes - 64)

Simplificando, além do custo de armazenamento do Arweave, os bundlers cobrarão duas taxas. A primeira é uma taxa básica, que cobre 64 bytes de armazenamento. A segunda é baseada no tamanho do item, e será paga se o tamanho do item exceder 64 bytes.

Observe que, no momento, há apenas um bundler, que possui um URL de http://bundler.arweave.net:10000/ (nós usamos isso no exemplo acima). No futuro haverá mais.

É isso! Se você tiver quaisquer comentários ou perguntas, você pode deixá-los aqui ou perguntar-me no Twitter. Por último, muito obrigado a joshbenaron e Ros 🌭 por me ajudar no Pacote não e Arweave Dev Talk nos servidores de Discord! Basicamente, todas essas informações são deles, acabei de consolidá-las.

Este artigo foi escrito por Matt e traduzido por Diogo Jorge. O artigo original pode ser encontrado aqui.

Latest comments (0)