Alfabeto libp2p têxtil, parte 2

Tradução  de um artigo  básico no blog  do projeto  Têxtil de 12 de dezembro de 2019.





No  artigo anterior,  começamos com a pergunta: "Como você aborda seu primeiro aplicativo p2p?" Depois de pensar um pouco, concluímos rapidamente que a decisão de  não confiar em um servidor centralizado  e focar em fazer um aplicativo  ponto a ponto veio com muita complexidade adicional. Os dois grupos principais de "problemas" são o  estado do aplicativo  e a  diversidade do protocolo da infraestrutura . Felizmente, descobrimos que não precisamos reinventar a roda resolvendo novamente um monte de problemas de infraestrutura - em vez disso, podemos usar uma ótima pilha de rede p2p: a biblioteca libp2p.





No post de hoje, iremos um pouco mais além e apresentaremos um aplicativo "brinquedo" para ter uma ideia de como você pode realmente desenvolver algo com libp2p e, esperançosamente, motivá-lo a criar seu próprio aplicativo p2p. Sério, você ficaria surpreso com o quão fácil é!





aplicativo

Vamos fazer uma reserva agora mesmo , nosso programa agora será escrito na linguagem  Go , usando a  biblioteca go-libp2p . Se você ainda não está familiarizado com esse idioma, recomendamos enfaticamente que se familiarize. É muito bom para aplicativos que lidam com concorrência e rede (como lidar com muitas conexões p2p). A maioria das bibliotecas IPFS / libp2p tem suas implementações básicas escritas em Go. O tour golang.org é uma ótima introdução ao Go  .





Portanto, nosso programa será um aplicativo simples de pingue-pongue com alguns ajustes adicionais para torná-lo mais interessante do que os exemplos simples usuais. Aqui estão alguns dos recursos de nosso aplicativo (não se preocupe, vamos abordá-los com mais detalhes posteriormente):





  • Por padrão, o aplicativo se apega a uma porta TCP livre.





  • Se o sinalizador quic for especificado, ele também se conectará a uma porta de escuta QUIC, que se tornará o endereço de host preferido para jogar pingue-pongue.





  • O host usará o serviço mDNS para descobrir novos hosts na rede local.





  • Em cada nó recém-descoberto (digamos, nó A), nosso aplicativo executará seu próprio protocolo sayMyAddr (vamos implementá-lo), que aprenderá para nós o endereço preferido para jogar ping-pong para este nó.





  • , - «» -. , , Ping, A Pong. !





( p2p-) . , :





  • (TCP, QUIC ..) ?





  • (, mDNS) - , , ?





  • (Streams) ? - , ?





, , , libp2p -   . , !





!

. ,   !  , , . , :









git clone git@github.com:textileio/go-libp2p-primer-article.git
cd go-libp2p-primer-article
code . //   VSCode,    -    ;)
      
      



:  main.go, , libp2p. , . , -quic true, QUIC. ! , : RegisterSayPreferAddr RegisterPingPong. ,  mDNS.





 discovery.go, mDNS. , , mDNS , . -  discovery.Notifee, , mDNS , .  :





  1. - ; -. …





  2. SayPreferAddr, , (addr) -. , …





  3. , PingPong, , ( ).





,  pingpong.go  RegisterPingPong, main.go, :





  • Handler: , PingPong. Handler HTTP REST.  Stream, io.ReadWriteCloser, , - .





  • playPingPong: ;  Stream  PingPong.





, - , . , , . , , ,  saymyaddr.go, pingpong.go.





, , , , , libp2p.





-, : go run * .go , go run * .go -quic . , -quic:





, , , , mDNS . "" -. "" , (- 5- , mDNS) "" , , ,    -.





, PingPong , - (multiaddr), , , QUIC.    -quic , !





, -quic, - , PingPong , QUIC.    -, ,   . , ?





?

. p2p- . PingPong , , - ! , , . pingpong.go:









const (
    protoPingPong = "/pingpong/1.0.0"
)
...
func RegisterPingPong(h host.Host) {
    pp := &pingPong{host: h}
    //     _pingpong_ .
    //  ,   /  ,
    //        ,
    //    , 
    //      .
    //  ,     semver,
    // . : http://bit.ly/2YaJsJr
    h.SetStreamHandler(protoPingPong, pp.Handler)
}
      
      



.





, mDNS. , ?  Kademlia DHT   pubsub - , .





, , .  - , , libp2p .  libp2p!





Libp2p    , p2p-.    - libp2p, , . , .





: , libp2p Go-, go get, , .  Usage readme- go-libp2p.





, , , , p2p- , ! - , ! ,   Slack, p2p-,  Twitter,  Textile. ,   , , P2P!





Ignacio Hagopian





: (StarVer)








All Articles