私は libp2p を初めて使用し、標準の TCP トランスポートを介して、ある libp2p ピア (erlang-p2p) から別の (go-libp2p) への正常な接続を確立しようとしています。erlang クライアントは安定して維持されているクライアントであり、golang でそのクライアントを複製しようとしています。
2 つの erlang クライアント間の最初のネゴシエーション プロセスは、送受信される生データの読み取りに基づいて次のようになります (クライアント A がクライアント B に接続しています)。
Client A | | Client B
| 1. Raw data protocol negotiation |
| |
| -------- /multistream/1.0.0 -------> |
| <------- /multistream/1.0.0 -------- |
| |
| 2. Mux protocol negotiation |
| |
| ----------- yamux/1.0.0 -----------> |
| <---------- yamux/1.0.0 ------------ |
| |
注: yamux プロトコル ID の先頭のバックスラッシュが省略されているのは意図的なものであり、これは erlang クライアントによって送信されているものです。
上記が確立された後、セッションを作成することができます。ただし、クライアント B を単純な go-libp2p ホストに交換すると、ステップ 2 のネゴシエーションがうまくいきません。単純な go-libp2p クライアントに使用しているコードは次のとおりです。
func main() {
run()
}
func run() {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
h2, err := libp2p.New(ctx,
libp2p.ListenAddrStrings(
"/ip4/0.0.0.0/tcp/54435", // <- Random port
),
libp2p.Muxer("/yamux/1.0.0", yamux.DefaultTransport),
)
if err != nil {
panic(err)
}
log.Printf("Listen addresses are %s\n", h2.Addrs())
select {}
}
erlang クライアントが go クライアントに接続しようとすると、マルチストリーム プロトコルは正常にネゴシエートされますが、yamux プロトコル ID を受信した後、go クライアントは、na
libp2p を明示的に指定したにもかかわらず、このプロトコルをサポートしていないことを示す返信を返します。設定オプションで yamux を使用します。さらに、こちらのドキュメントによると、デフォルトの構成オプションでも yamux/1.0.0 をサポートする必要があるようです。
何か基本的なことが欠けているように感じます。助けていただければ幸いです。
私がすでに試したこと:
- すべての構成を削除し、デフォルトの libp2p 設定を使用する
- 構成にオプションを追加し
NoSecurity
ます (私が知る限り、erlang クライアントはセキュリティをネゴシエートしていないように見えます) - Muxer ID を
"yamux/1.0.0"
に変更する"/yamux/1.0.0"