0

我是 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"
4

0 回答 0