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 , . :
- ; -. …
SayPreferAddr, , (addr) -. , …
, 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!
: (StarVer)