我是 libp2p 的新手,我正在尝试通过标准 TCP 传输建立从一个 libp2p 对等体 (erlang-p2p) 到另一个 (go-libp2p) 的成功连接。erlang 客户端是稳定和维护的客户端,我正在尝试在 golang 中复制所述客户端。
两个 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"