Lição 163: IPFS e Armazenamento Descentralizado
Nesta lição, vamos explorar o Sistema InterPlanetário de Arquivos (IPFS) e como ele pode ser utilizado para soluções de armazenamento descentralizado. Vamos discutir os benefícios de usar IPFS, o básico de como ele funciona e fornecer exemplos de como integrar IPFS em um contrato inteligente Solidity.
O que é o IPFS?
O IPFS é um sistema de arquivos distribuído peer-to-peer que busca conectar todos os dispositivos de computação com o mesmo sistema de arquivos. Pense nele como um Dropbox descentralizado. Ele permite que os usuários armazenem e compartilhem dados de maneira segura e eficiente, tornando-o uma escolha ideal para aplicações descentralizadas (dApps).
Benefícios do IPFS
- Descentralização: Os dados são armazenados em uma rede de nós, reduzindo o risco de um único ponto de falha.
- Resistência à Censura: Uma vez que os dados são adicionados ao IPFS, não podem ser facilmente removidos ou alterados.
- Endereçamento por Conteúdo: Os arquivos são recuperados pelo seu hash de conteúdo, garantindo integridade e fácil recuperação.
- Eficiência: O IPFS pode distribuir dados de forma eficaz, permitindo acesso mais rápido e reduzindo o uso de largura de banda.
Como o IPFS Funciona?
O IPFS opera com alguns princípios fundamentais:
- Endereçamento por Conteúdo: Os arquivos são acessados através de um hash único (CID - Identificador de Conteúdo) derivado do conteúdo do arquivo. Isso significa que mesmo que o arquivo seja movido, ele ainda pode ser acessado usando o mesmo CID.
- Tabela de Hash Distribuída (DHT): O IPFS usa uma DHT para encontrar pares que armazenam o conteúdo desejado, levando a uma recuperação eficiente de dados em toda a rede.
- Versionamento: O IPFS permite controle de versão através de sua estrutura de bloco, permitindo que os usuários acompanhem as mudanças ao longo do tempo.
Configurando o IPFS
Antes de mergulharmos no código, você precisa configurar um nó IPFS. Você pode instalar o IPFS usando os seguintes comandos:
# Instalar o IPFS
npm install -g ipfs
# Inicializar um novo repositório IPFS
ipfs init
# Iniciar o daemon do IPFS
ipfs daemon
Agora que temos um nó IPFS em execução, podemos enviar e recuperar dados.
Adicionando Dados ao IPFS
Para adicionar um arquivo ao IPFS, você pode usar o seguinte comando no seu terminal:
ipfs add <seu-arquivo.ext>
Este comando retornará um CID que você pode usar para acessar este arquivo mais tarde.
Integrando IPFS com um Contrato Inteligente Solidity
Agora, vamos ver como podemos usar o IPFS em um contrato inteligente Solidity. Vamos criar um contrato simples que permite que os usuários façam upload de um documento para o IPFS e armazenem o CID na blockchain Ethereum.
Exemplo de Contrato Inteligente Solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract ArmazenamentoDeDocumentos {
// Estrutura para guardar informações do documento
struct Documento {
string cid; // Identificador de conteúdo do arquivo IPFS
string nome; // Nome do documento
address proprietario; // Proprietário do documento
}
// Mapeamento para armazenar documentos por id
mapping(uint256 => Documento) public documentos;
uint256 public quantidadeDocumentos;
event DocumentoEnviado(uint256 indexed documentoId, string cid, string nome, address proprietario);
// Função para enviar um documento
function enviarDocumento(string memory _cid, string memory _nome) public {
quantidadeDocumentos++;
documentos[quantidadeDocumentos] = Documento(_cid, _nome, msg.sender);
emit DocumentoEnviado(quantidadeDocumentos, _cid, _nome, msg.sender);
}
// Função para recuperar detalhes do documento
function obterDocumento(uint256 _documentoId) public view returns (string memory, string memory, address) {
Documento memory doc = documentos[_documentoId];
return (doc.cid, doc.nome, doc.proprietario);
}
}
Explicação
- Estrutura Documento: Esta estrutura representa um documento com um Identificador de Conteúdo (CID), seu nome e o endereço do proprietário.
- Mapeamento: Usamos um mapeamento para relacionar um ID de documento único com os metadados correspondentes do documento.
- Eventos: Quando um documento é enviado, um evento é emitido, facilitando o rastreamento de envios.
- Funções:
enviarDocumento
: Recebe um CID e nome do documento para armazenar o documento na blockchain.obterDocumento
: Permite que os usuários recuperem os detalhes do documento com base no ID do documento.
Implantando e Interagindo com o Contrato
Você pode implantar este contrato usando ferramentas como Remix, Truffle ou Hardhat. Uma vez implantado, você pode interagir com ele chamando a função enviarDocumento
com o CID correspondente que você obteve do IPFS ao adicionar um arquivo.
Conclusão
Nesta lição, cobrimos o básico do IPFS e como ele funciona como uma solução de armazenamento descentralizada. Também exploramos como integrar o IPFS com contratos inteligentes Solidity para criar um sistema de armazenamento de documentos. Utilizando o IPFS, os desenvolvedores podem aproveitar os benefícios da descentralização, garantindo que a integridade dos dados e a resistência à censura sejam mantidas.
À medida que você continua a desenvolver dApps, considere as vantagens de usar o IPFS para suas necessidades de armazenamento de dados!