Se você tem acompanhado o desenvolvimento de Polkadot, Ethereum 2.0 ou Substrate, você já deve ter ouvido falar de libp2p. Libp2p é uma estrutura de rede que permite que você escreva aplicativos ponto a ponto descentralizados. Originalmente o protocolo de rede do IPFS, desde então foi criado para se tornar seu próprio projeto de primeira classe.
Como parte do processo de desenvolvimento da Polkadot, criamos nossa própria implementação de libp2p escrito em Rust, com a intenção de usá-lo em Polkadot e Substrate. Embora não esteja completamente maduro, ele já está bastante robusto e está alimentando com sucesso as redes de testnets atuais.
Então, o que é libp2p e por que a escolhemos como a camada de rede de Polkadot e Substrate?
Objetivos
Todas as redes ponto a ponto distribuídas têm uma série de desafios que são distintos das redes tradicionais. Libp2p é um kit de ferramentas generalizado para que os desenvolvedores possam usar plug-and-play em rede com seu aplicativo distribuído.
Uma mudança fundamental na computação distribuída é que o modelo "cliente/servidor" não se sustenta mais. Vamos dar uma olhada no que seu roteador caseiro faz. Cada dispositivo em sua rede doméstica tem um endereço IP privado. Quando você solicita dados de um servidor, o roteador substitui o endereço privado do seu dispositivo pelo endereço IP público da sua casa e memoriza para qual dispositivo enviar a resposta.
Isso funciona bem se todos os seus dispositivos são clientes, mas e quando um pedido do mundo externo aparece no seu roteador? Não é uma resposta a um pedido, é um pedido, então o solicitante acha que você é um servidor. Um de seus dispositivos está agindo como um servidor, mas seu roteador não sabe qual deles. Este é um problema chamado travessia NAT, e a libp2p fornece ferramentas para ajudar a lidar com isso.
A libp2p também opera com protocolos peer discovery e de handshake. Em um mundo onde os clientes também atuam como servidores, inevitavelmente haverá uma variedade de hardware, sistemas operacionais e protocolos de comunicação entre os nós. A criptografia e a segurança sustentam o design da Web3 e a libp2p suporta tanto protocolos não criptografados (por exemplo, TCP, UDP) quanto os criptografados (por exemplo, TLS, Noise) fora da caixa.
Muitos protocolos web estão presos nos anos 90, e à medida que os buracos na segurança são rompidos, mais e mais remendos são acrescentados. É aí que entra a modularidade da libp2p. A libp2p foi projetada para que se possa atualizar qualquer elemento que quiser, tudo isso enquanto permanece compatível com as versões anteriores.
Modularidade
A libp2p foi projetada desde o início para ser muito modular, de modo que possa ser implementada em muitos projetos ponto a ponto diferentes. Embora os nós em aplicativos ponto a ponto tradicionais sejam referidos por um endereço IP e uma combinação de porta, a libp2p usa o conceito de um multiaddress em vez disso. Alguns exemplos:
- /ip4/90.46.231.22/udp/25000 indica o nó cujo endereço IP é 90.46.231.22 ,que acessa na porta UDP 25000.
- /ip6/fe80::0202:b3ff:fe1e:8329/udp/1567 quic singnifica que devemos usar o protocolo QUIC acoplado em cima da porta UDP 1567 com um endereço IPv6.
- /dnsaddr/example.com/tcp/80/ws significa que nós devemos usar o protocolo WebSocket acoplado em cima da porta TCP 80, usando DNS para resolver o nome do host example.com.
Nem todos os projetos que usam libp2p precisam suportar todos os protocolos. Na verdade, o conceito de multiaddress existe para possibilitar a extensão da libp2p com novos protocolos (como foi feito, por exemplo, com o QUIC no passado). No futuro, poderemos, por exemplo, adicionar Bluetooth como protocolo de transporte.
O segundo aspecto principal da modularidade da libp2p é seu processo de negociação de protocolos. Uma vez estabelecida uma conexão entre dois pares, a única coisa que a libp2p maneja é a negociação dos protocolos que são usados nessa conexão.
Embora os nós sejam incentivados a suportar um conjunto específico de protocolos comuns, nenhum deles é tecnicamente obrigatório. Isto torna possível experimentar facilmente novos protocolos ou novas ideias, e implementar novas versões de protocolos enquanto ainda suportam versões antigas sem prejuízos técnicos.
Os principais protocolos libp2p
Embora não haja protocolo obrigatório, na prática os nós são encorajados a apoiar os protocolos mais comumente suportados. Isso inclui:
- secio, que é responsável por criptografar comunicações.
- mplex or yamux, que são protocolos em cima do secio que são responsáveis pela multiplexação.
Multiplexação é o processo em que vários fluxos individuais de dados são agrupados numa única conexão. Tal como, você provavelmente possui um cabo coaxial ou de fibra chegando no seu apartamento, mas você e seu colega de quarto querem ambos reproduzir filmes diferentes na Netflix. Os dados devem ser multiplexados para viajar até sua casa e “desmultiplexados” para chegar ao dispositivo correto.
Uma vez que tenhamos a capacidade de fazer isso, podemos, quase de graça, abrir quantos subfluxos quisermos usando quantos protocolos diferentes quisermos. Estes protocolos incluem:
identify, que possibilita a obtenção de informação sobre um nó, incluindo os múltiplos endereços que ele está escutando e o multiaddress pelo qual ele nos vê, semelhante ao que o protocolo STUN faz.
- ping, que permite fazer ping no controle remoto para determinar se ele ainda está vivo.
- kademlia, para peer discovery e armazenamento de registros distribuídos.
- floodsub and gossipsub, dois protocolos pub-sub.
- E vários outros, incluindo, é claro, qualquer protocolo personalizado que se deseje criar.
No contexto do Substrate, cada projeto é capaz de definir seu próprio protocolo de rede. Por exemplo, o protocolo usado pela testnet do BBQ Birch é chamado bbq enquanto o protocolo usado pela Polkadot é chamado dot.
A visão global da libp2p
Um outro motivo para usar libp2p é seu engajamento nos projetos descentralizados. Ela vem potencializando o IPFS desde o início e vai potencializar vários projetos emergentes tais como, Filecoin, provavelmente a Ethereum 2.0, Agoric, e certamente o Substrate e o Polkadot.
Ter vários projetos compartilhando o mesmo protocolo de rede tem uma grande vantagem: torna possível que os nós compartilhem sua capacidade em várias redes. Para dar um exemplo, vamos pegar o protocolo relay.
Num ambiente descentralizado, sempre se deseja ter os nós diretamente conectados uns com os outros. Entretanto, na prática, muitos nós não são acessíveis, já que estão atrás das NATs (Network Address Translations) ou usam plataformas que não permitem conexões externas.
Para resolver esse problema, a libp2p fornece um protocolo chamado relay que permite que um nó aja com um proxy entre dois outros nós. Todas as comunicações são criptografadas e a identidade do controle remoto é verificada, de modo que o proxy não pode agir como um man-in-the-middle.
Ao ter vários projetos usando a libp2p como sua stack de rede, todos eles serão capazes de se beneficiar dos mesmos nós relay e, portanto, compartilhar recursos.
A libp2p foi projetada para ser o protocolo de rede que alimenta o futuro da descentralização. Quando as empresas lançam aplicativos tradicionais, elas se concentram apenas na experiência e lógica do aplicativo — elas não precisam reinventar TCP/IP. Esse é o objetivo final da libp2p: permitir que desenvolvedores de aplicativos desenvolvam aplicativos sabendo que seus serviços serão acessíveis e disponíveis. Com implementações em Rust, JavaScript e Go e desenvolvimento em Java, Haskell e Python, a libp2p está crescendo rapidamente.
Você pode encontrar o código Rust aqui: libp2p/rust-libp2p
Se você deseja contribuir, comece checando instruções para contribuição.
Este artigo foi escrito por tomaka, traduzido por Fátima Lima e seu original pode ser lido aqui.
Latest comments (0)