DEV Community

Pedro Pietroluongo
Pedro Pietroluongo

Posted on

A série IPFS com o Nabu

Esta série apresenta o IPFS (InterPlanetary File System, o sistema de arquivos interplanetário) para quem está chegando agora, usando o Nabu como implementação concreta. O Nabu é um nó IPFS em Java, usado em produção pelo Peergos. Cada post explica o conceito, soletra as siglas e, no fim, percorre a classe que o realiza.

A proposta

A proposta da série é separar um nó em peças que dá para ler uma de cada vez. Na documentação, IPFS, libp2p, CID, DHT e Bitswap aparecem juntos. Libp2p é a biblioteca de rede par a par em que o IPFS se apoia: conexão, identidade e protocolos. CID (Content Identifier) é o identificador do conteúdo, o nome de um bloco. DHT (Distributed Hash Table) é a tabela de hash distribuída que responde "quem tem isto?". Bitswap é o protocolo que pede e entrega os bytes desse bloco.

Um processo real faz tudo isso ao mesmo tempo: escuta endereços, troca blocos, anuncia conteúdo e guarda registros de nomes. A série propõe uma ordem. Cada post entrega uma sigla com o nome por extenso e o trecho de Java que a implementa.

A Demonstração

O caminho de um bloco, do nome até a chamada HTTP (Hypertext Transfer Protocol, o protocolo da web):

  1. O endereço do conteúdo. O hash dos bytes vira um CID.
  2. A identidade de quem guarda o bloco: uma chave, um PeerId (identificador do par) e um multiaddr (o endereço de rede em camadas).
  3. A conexão: TCP (Transmission Control Protocol), QUIC (transporte sobre UDP, User Datagram Protocol), cifra e vários protocolos no mesmo fio.
  4. A entrada na rede: achar outros pares e descobrir se eles conseguem discar de volta, atravessando NAT (Network Address Translation, a tradução de endereços que o roteador de casa faz).
  5. O pedido do bloco, via Bitswap.
  6. A descoberta de quem tem o bloco, via DHT Kademlia.
  7. Um nome que muda, o IPNS (InterPlanetary Name System), apontando para o CID atual.
  8. O disco, ou o S3 (Simple Storage Service), onde a cópia fica.
  9. A API (Application Programming Interface) HTTP local, no estilo do Kubo, a implementação de referência do IPFS em Go.
  10. HTTP carregado dentro do libp2p, de um par para outro.
  11. Os programas de exemplo do repositório, que exercitam os passos anteriores.
flowchart LR
  intro[whatIsIpfs] --> id[identity]
  id --> transports[transports]
  transports --> reachability[reachability]
  reachability --> bitswap[bitswap]
  bitswap --> dht[dht]
  dht --> ipns[ipns]
  ipns --> store[blockstore]
  store --> api[api]
  api --> http[p2pHttp]
  http --> examples[examples]

Os arquivos têm nome em inglês de propósito. Uma tradução futura copia docs/artigos/pt/ para docs/artigos/en/ e reescreve a prosa. Os links relativos, os blocos de código e os identificadores de protocolo permanecem. O vocabulário travado está em docs/artigos/glossary.yml. Títulos e descrições nos dois idiomas estão em docs/artigos/series.yml.

No Nabu

O nó inteiro cabe em EmbeddedIpfs, em src/main/java/org/peergos/EmbeddedIpfs.java. Os campos públicos são o mapa da série:

public final Host node;
public final Blockstore blockstore;
public final Optional<BlockService> blockRetriever;
public final RecordStore records;
public final Kademlia dht;
public final Optional<HttpProtocol.Binding> p2pHttp;
Enter fullscreen mode Exit fullscreen mode

node é o host libp2p: identidade, transportes e a lista de protocolos. blockstore guarda os blocos e responde has, get e put por CID. blockRetriever pede à rede o que o store local não tem. No nó completo ele é um BitswapBlockService. records guarda registros IPNS. dht é a Kademlia, protocolo /ipfs/kad/1.0.0. p2pHttp é o HTTP entre pares, protocolo /http, e só existe quando a aplicação registra um handler.

EmbeddedIpfs.build monta esse conjunto numa ordem fixa. Recebe o store de registros, o blockstore, a flag provideBlocks (se este nó anuncia os CIDs que grava), os multiaddrs de escuta, o bootstrap, a IdentitySection e o BlockRequestAuthoriser. Por dentro cria um RamAddressBook, restaura a chave, instancia KademliaEngine com um RamProviderStore de 10.000 entradas, e registra ping, AutoNAT (o protocolo que testa se o nó é discável de fora), Bitswap, a DHT e, se houver handler, o HTTP. Em seguida chama enableRelay e enableDcutr. start sobe o host, faz o bootstrap e liga o mDNS (multicast DNS, a descoberta na rede local).

Dois pontos em que o README e o código divergem, e a série segue o código. HostBuilder.create e EmbeddedIpfs.build chamam enableRelay e enableDcutr. DCUtR significa Direct Connection Upgrade through Relay: um furo de NAT combinado por uma conexão emprestada. O canal seguro registrado em HostBuilder.build é Noise. A linha que registraria TLS (Transport Layer Security) está comentada.

Nesta série

Não há post anterior. O próximo é O que é IPFS.

  1. O que é IPFS
  2. Identidade e endereços
  3. Transportes, criptografia e multiplexação
  4. Entrar na rede
  5. Bitswap, o pedido de um bloco
  6. A DHT Kademlia
  7. IPNS, um nome que muda
  8. Onde o bloco mora
  9. A API HTTP e como rodar o Nabu
  10. HTTP entre pares
  11. Os exemplos do repositório

Top comments (0)