SwiftHTML & CSSSolidityDesenvolvimento de JogosSolana/Rust
28.11.2024

Aula 164: Armazenando Dados com IPFS

Nesta aula, vamos explorar como armazenar dados usando o Sistema de Arquivos InterPlanetário (IPFS) em um contrato inteligente Solidity. O IPFS é um sistema de armazenamento de arquivos distribuído que permite armazenar e compartilhar arquivos de maneira descentralizada. Ao integrar o IPFS com contratos inteligentes Ethereum, você pode armazenar grandes quantidades de dados de forma segura e eficiente fora da cadeia, mantendo as referências na cadeia.

O que é IPFS?

O IPFS é um protocolo e uma rede projetada para criar um método peer-to-peer para armazenar e compartilhar hipermídia de forma versionada. Em vez de armazenar dados diretamente na blockchain, o que pode ser caro e ineficiente, você pode armazenar dados no IPFS e salvar uma referência (hash) no seu contrato inteligente.

Configurando o IPFS

Antes de nos aprofundarmos no código, certifique-se de ter configurado um nó do IPFS. Você pode executar seu nó IPFS local usando a CLI do IPFS ou usar um serviço como o Infura para acessar o IPFS.

Instalando o IPFS (Nó Local)

  1. Baixe e instale o IPFS a partir do site oficial: Instalação do IPFS.
  2. Inicialize o IPFS:
    ipfs init
  3. Inicie o daemon do IPFS:
    ipfs daemon

Armazenando Dados no IPFS

Para armazenar dados no IPFS, você pode usar o seguinte comando no seu terminal:

echo "Olá, IPFS!" > hello.txt
ipfs add hello.txt

Você receberá uma saída contendo o hash IPFS do arquivo. O hash parecerá algo assim:

added QmTzQ1sHdGe... hello.txt

Integrando o IPFS com Solidity

Agora, vamos escrever um simples contrato inteligente em Solidity que interage com o IPFS. Este contrato armazenará referências de dados (hashes IPFS) na blockchain Ethereum.

Exemplo de Contrato Solidity

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract IPFSStorage {
    struct Documento {
        string ipfsHash;
        string descricao;
        address proprietario;
    }

    mapping(uint256 => Documento) public documentos;
    uint256 public contagemDocumentos;

    event DocumentoCarregado(uint256 idDocumento, string ipfsHash, string descricao, address proprietario);

    function carregarDocumento(string memory _ipfsHash, string memory _descricao) public {
        contagemDocumentos++;
        documentos[contagemDocumentos] = Documento(_ipfsHash, _descricao, msg.sender);
        emit DocumentoCarregado(contagemDocumentos, _ipfsHash, _descricao, msg.sender);
    }

    function obterDocumento(uint256 _idDocumento) public view returns (string memory, string memory, address) {
        Documento memory doc = documentos[_idDocumento];
        return (doc.ipfsHash, doc.descricao, doc.proprietario);
    }
}

Explicação do Contrato

  1. Struct: Definimos uma struct Documento para armazenar o hash IPFS (ipfsHash), uma descrição do documento (descricao) e o endereço do proprietário (proprietario).

  2. Mapping: Usamos um mapping para vincular um idDocumento único a um Documento. A contagemDocumentos mantém o controle do número de documentos carregados.

  3. Eventos: O evento DocumentoCarregado é emitido sempre que um novo documento é carregado para registrar a ação.

  4. Funções:

    • carregarDocumento: Esta função recebe um hash IPFS e uma descrição como parâmetros, armazena-os no mapping e emite o evento DocumentoCarregado.
    • obterDocumento: Esta função recupera os detalhes do documento para um determinado idDocumento.

Implantando o Contrato

Você pode implantar o contrato usando ferramentas como Remix, Truffle ou Hardhat. Certifique-se de se conectar a uma rede de teste Ethereum (como Rinkeby ou Ropsten) para evitar custos na rede principal.

Adicionando Documentos

Uma vez que o contrato está implantado, você pode carregar documentos chamando a função carregarDocumento com o hash IPFS e a descrição do documento.

Por exemplo, se seu hash IPFS for QmTzQ1sHdGe...:

await ipfsStorage.carregarDocumento("QmTzQ1sHdGe...", "Meu primeiro documento");

Recuperando Documentos

Você pode recuperar os detalhes do documento chamando a função obterDocumento:

const idDocumento = 1; // Exemplo de ID do documento
const detalhesDocumento = await ipfsStorage.obterDocumento(idDocumento);
console.log(detalhesDocumento); // Registra o hash ipfs, a descrição e o endereço do proprietário

Conclusão

Nesta aula, abordamos como armazenar dados usando o IPFS e integrá-lo a um contrato inteligente Solidity. Ao seguir essa abordagem, você pode gerenciar eficientemente grandes arquivos fora da cadeia e manter suas transações Ethereum eficientes e econômicas. À medida que você constrói aplicações mais complexas, considere como aproveitar o IPFS para suas necessidades de armazenamento de dados.

Video

Did you like this article? Rate it from 1 to 5:

Thank you for voting!