2019年12月12日から のテキスタイルプロジェクトブログのエントリーレベルの 記事の翻訳 。
では 前の記事、 我々は質問で開始しました:「どのようにあなたはあなたの最初のP2Pアプリケーションにアプローチしますか?」少し考えた結果、 一元化されたサーバーに依存せず 、ピアツーピアアプリケーションの作成に 集中するという決定には、さらに複雑さが伴うとすぐに結論付けました。 「問題」の2つの主要なグループは、 アプリケーションの状態 と インフラストラクチャプロトコルの多様性です。幸い、インフラストラクチャの問題を解決することで車輪の再発明を行う必要がないことがわかりました。代わりに、優れたp2pネットワークスタックであるlibp2pライブラリを使用できます。
今日の投稿では、もう少し進んで「おもちゃ」アプリケーションを紹介し、libp2pを使用して実際に何かを開発する方法を理解し、独自のp2pアプリケーションを作成する動機付けをしていきます。真剣に、あなたはそれがどれほど簡単であるかに驚くでしょう!
応用
すぐに予約しましょう。プログラムは、go-libp2pライブラリを使用してGo言語で 記述され ます。この言語にまだ慣れていない場合は、よく理解しておくことを強くお勧めします。これは、並行性とネットワーキングを扱うアプリケーション(多くのp2p接続の処理など)に非常に適しています。ほとんどのIPFS / libp2pライブラリには、Goで記述された基本実装があります。golang.orgツアーは、Goの優れた入門書 です。
したがって、私たちのプログラムは、通常のアートレスの例よりも面白くするためにいくつかの追加の調整を加えた単純なピンポンアプリケーションになります。アプリの機能の一部を次に示します(心配しないでください。後で詳しく説明します)。
デフォルトでは、アプリケーションは空きTCPポートにしがみついています。
quicフラグが指定されている場合、それはリスニングポートQUICにも接続します。これは、ピンポンを再生するための優先ホストアドレスになります。
ホストはmDNSサービスを使用して、ローカルネットワーク上の新しいホストを検出します。
新しく検出された各ノード(たとえば、ノードA)で、アプリケーションは独自のsayMyAddrプロトコル(実装します)を実行します。これにより、このノードのピンポンを再生するための優先アドレスが学習されます。
, - «» -. , , 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)