WEB3DEV

Cover image for Como usar o Arweave para armazenar e acessar metadados de NFTs, parte 1
Diogo Jorge
Diogo Jorge

Posted on

Como usar o Arweave para armazenar e acessar metadados de NFTs, parte 1

Image description

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

Parte 2 está online! Aconselho vivamente a sua leitura após a leitura deste post, uma vez que aborda uma solução mais robusta para armazenar dados no Arweave.

Por que Arweave?

Primeiro, vamos abordar uma questão simples: por que usar Arweave para armazenar metadados de NFT? A resposta simples: os dados no Arweave não podem ser excluídos ou alterados.

Também podemos fazer essa pergunta de outra maneira: por que não usar IPFS ou Amazon S3?

O IPFS não é o ideal — embora use endereçamento de conteúdo para garantir que os metadados NFT não possam ser alterados, ele não faz nada para garantir que seus dados não sejam excluídos. Por exemplo, se você usar o serviço de fixação IPFS da Infura, seus dados são excluídos se não forem acessados ​​em 6 meses. Para NFTs, isso é um problema total. Como outro exemplo, nft.storage promete armazenamento “indefinido”, mas diz o seguinte em seus termos e condições.

Os dados serão armazenados sem custo para o usuário no IPFS enquanto o Protocol Labs, Inc. continuar a oferecer armazenamento gratuito para NFTs. A Protocol Labs, Inc. reserva-se o direito de encerrar o NFT.storage a seu exclusivo critério.

Os dados continuarão a ser armazenados ad infinitum ou até que a Protocol Labs decida concluir o projeto NFT.storage. Antes da rescisão, o Protocol Labs fornecerá um aviso de 90 dias aos usuários por e-mail para permitir que os usuários tenham tempo suficiente para tomar providências para armazenar seus dados por outros meios.

Pinata é outro serviço popular de fixação IPFS. Eu perguntei a eles sobre persistência de dados, e foi isso que eles disseram:

Contanto que seu conteúdo permaneça no estado “fixado” no Pinata e sua conta não fique atrasada em vários pagamentos, seu conteúdo não será excluído.

No entanto, se vários pagamentos falharem e nenhuma resposta for fornecida após várias tentativas de contato, seu conteúdo poderá ser excluído.

Isso significa que o plano gratuito pode fixar 1 GB de conteúdo indefinidamente, o que deve ser bom o suficiente para a maioria dos pequenos projetos baseados em fotos. Ainda assim - em geral, a persistência não é garantida!

Em geral, se você usar um serviço de fixação IPFS, você está contando com um serviço centralizado para manter seus dados persistidos.

Com o S3, não há garantia de que seus dados não serão excluídos ou alterados. O proprietário do bucket S3 tem liberdade para fazer o que quiser.

Carregando dados para o Arweave, lendo dados do Arweave

Nesta seção, abordarei como fazer upload de dados para o Arweave com seus SDK do JavaScript. Para executar este código você mesmo, você precisa gerar uma nova carteira Arweave. Siga estas instruções a fim de fazer isso.

Agora vamos ver o código. Vou passar por isso mais detalhadamente abaixo.

import Arweave from "arweave";
import dotenv from "dotenv";
dotenv.config();

const arweave = Arweave.init({
  host: "arweave.net",
  port: 443,
  protocol: "https",
  timeout: 20000, // Tempos limite de solicitação de rede em milissegundos
  logging: false, // Desabilita o log de solicitação de rede
});

// Submete uma transação e lê os dados
async function run() {
  // Os dados que estamos fazendo upload
  const imageDataUri =
    "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAACgCAYAAACLz2ctAAAAAXNSR0IArs4c6QAABLNJREFUeF7t28GO2zAMRdHk/z86RdtVAQ9AlmIoy2fWT6R1eaNEwPj9+Xw+L38IDBF4E3CIvLZ/CBCQCKMECDiKX3MCcmCUAAFH8WtOQA6MEiDgKH7NCciBUQIEHMWvOQE5MEqAgKP4NScgB0YJEHAUv+YE5MAoAQKO4tecgBwYJUDAUfyaE5ADowQIOIpf88cJ+H6//3vqXp/5b3Q/LiRggikBE7CCUQIGQf2OETABKxglYBAUAROgElECJmA5AROwgtFjBPzG5aLS42oehD7oveCKHFERKj0IeH0kOgETlwsCBr9XEzECEjChy/ooAQm43qpExe0FjH7tRX/HJdi0R0/eWxQeAaOkGnIEvMEt+OQhnby36OfVCRgl1ZAjoBOwQat4SQLeVMA7XjjiWj4recuvYAKeIykBz5nlLXdCwFuO7ZyHJuA5s7zlTrYS8OpW6PfeLb0KPzQBw6gEOwgQsIOqmmECBAyjEuwgQMAOqmqGCYwJ6MIRntHRQQIePd79N0fA/Wd09BMS8Ojx7r85Au4/o6Of8CsCunAc7VBpcwQs4bO4SoCAVYLWlwgQsITP4ioBAlYJWl8isFxAF47SPB63mICPG/leGybgXvN43NMQ8HEj32vDBNxrHo97mpKALhyP82X5hgm4HKmCGQIEzNCSXU6AgMuRKpghQMAMLdnlBAi4HKmCGQIEzNCSXU6AgMuRKpghQMAMLdnlBAi4HKmCGQIEzNCSXU6AgMuRKpghQMAMLdnlBAi4HKmCGQIEzNCSXU6AgMuRKpghQMAMLdnlBAi4HKmCGQIEzNCSXU6AgMuRKpghEBbQ+x8ZrLJRAgSMkpJrIUDAFqyKRgkQMEpKroUAAVuwKholQMAoKbkWAgRswapolAABo6TkWggQsAWrolECBIySkmshQMAWrIpGCRAwSkquhQABW7AqGiVAwCgpuRYCBGzBqmiUAAGjpORaCBCwBauiUQIEjJKSayFAwBasikYJEDBKSq6FwKWA3v9oYa3oBQEC0mKUAAFH8WtOQA6MEiDgKH7N3YI5MEqAgKP4NScgB0YJEHAUv+YE5MAoAQKO4tecgBwYJUDAUfyaE5ADowQIOIpf87CAV6j82xaBqgQIWCVofYkAAUv4LK4SIGCVoPUlAgQs4bO4SqAkoItJFb/1BOTAKAECjuLXnIAcGCVAwFH8mi8X0MWEVBkCBMzQkl1OgIDLkSqYIUDADC3Z5QQIuBypghkCXxEwejG5yn0+n8x+jsxe/dtbZaM7MSVgZZJfWkvABtBRqDt9WhswhEpGWYWKvV6vnZg6AaNTG8wRsAF+FOpOn9YGDKGSUVahYk7AKKa/uQr83eWN7m33feQm+m967Cs4+tDRId3xBh3dGwGjtjTkokMiYAP8L5R0An4B8k8toh8uJ+ANhuQEHBxSofX2J2Bhb6ULTKVvZe3Jp90VFwJWbGlYS8AGqFMlo7+xpp7vjj8bVrNyAq4mWqznBCwC3Gm5E3CnaVw/y9En4P74PSEBOTBKgICj+DUnIAdGCRBwFL/mBOTAKAECjuLXnIAcGCVAwFH8mhOQA6MECDiKX3MCcmCUAAFH8WtOQA6MEiDgKH7NfwER2jFdIT5jOQAAAABJRU5ErkJggg==";
  const imageBuffer = Buffer.from(imageDataUri.split(",")[1], "base64");

  // Criar e submeter transação
  const key = JSON.parse(process.env.KEY);
  const transaction = await arweave.createTransaction(
    {
      data: imageBuffer,
    },
    key
  );

  await arweave.transactions.sign(transaction, key);
  await arweave.transactions.post(transaction);

  // O ID da transação é atualizado após arweave.transactions.post, o que não é muito intuitivo

  console.log("transaction ID", transaction.id);

  // Ler dados de volta
  const transactionData = await arweave.transactions.getData(transaction.id);
  console.log(
    "transaction data",
    Buffer.from(transactionData, "base64").toString()
  );
}

run();
Enter fullscreen mode Exit fullscreen mode

A maior parte do código é bastante direta. Primeiro, inicializamos um cliente Arweave com Arweave.init. Em seguida, criamos uma transação que carregará os dados com arweave.createTransaction. Por fim, assinamos e enviamos a transação e, em seguida, lemos os dados de volta.

duas coisas complicadas sobre este código:

Primeiro, o transaction.id só é preenchido depois que você chama arweave.transactions.post. Logo após criar a transação, transaction.id === "".

Em segundo lugar, se arweave.transactions.postfor bem-sucedido, não significa que a transação foi confirmada e extraída! Dos documentos:

N.B. Essa resposta 200 não significa que a transação foi extraída e confirmada e que um txid pode ser usado como se fosse imutável. Significa apenas que um nó recebeu sua transação. Consulte obter um status de transação para obter mais detalhes sobre como determinar corretamente que sua transação foi extraída e confirmada. Isso também se aplica ao método de upload.

Em termos simples - arweave.transactions.post retorna uma resposta. Só porque o status da resposta é 200 não significa que a transação foi extraída e confirmada. Em outras palavras, a transação não aparecerá no https://viewblock.io/arweave/address/YOUR_ADDRESS. No entanto, você ainda pode ler os dados usando arweave.transactions.getData ou acessando https://arweave.net/TX_ID.

Custo

Você pode usar a Calculadora de taxa Arweave para obter uma estimativa de preço para armazenar um certo número de bytes. Os dados que armazenamos em nosso exemplo são 1273 bytes, para os quais a calculadora cobra uma taxa de 0,000002001211 AR. Isso é consistente com a taxa que vejo em https://viewblock.io/arweave. Enquanto escrevo isso, o preço do AR é $ 38,54, o que significa que custa ~ $ 0,000077 para armazenar os dados de exemplo. Isso significa que com apenas $ 1, posso armazenar mais de 10.000 arquivos como este!

Uma palavra de cautela

a documentação emite este aviso:

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 em um contrato NFT), mesmo que tenha recebido uma resposta de status '200'.

Em outras palavras, mesmo se await arweave.transactions.post(transaction) for bem-sucedido, é recomendável aguardar até que await arweave.transactions.getStatus(txId) retorne uma resposta de status 200 antes de usar o ID da transação. Isso não é grande coisa se você está usando cunhagem preguiçosa, mas é impraticável para o caso de uso simples de carregar alguns metadados para o Arweave e, em seguida, criar um NFT vinculado aos metadados.

Não tenho certeza com que frequência as transações falham em ser mineradas e confirmadas (embora isso possa acontecer, por exemplo, porque a dificuldade do bloco muda e a taxa de transação não é mais suficiente, porque você envia muitas transações de uma só vez e elas ficam obsoletas, porque você envia muitas transações e elas começam a receber taxa limitada, porque sua carteira está desequilibrada, etc.). Eu também não tenho certeza do que acontece quando você vai para https://arweave.net/TX_ID se a transação correspondente não for minerada e confirmada. Vou atualizar este post se eu descobrir.

ATUALIZAÇÃO: em vez de explicar uma solução para este problema aqui, escrevi um post de acompanhamento. Confira para ver como construir uma solução mais robusta que leva em consideração as falhas de transação.

É isso! Se você tiver quaisquer comentários ou perguntas pode deixá-los aqui ou perguntar-me no Twitter.

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

Oldest comments (0)