"connection not open on send()" 为 Kaleido 使用 Websocket 连接时出错

"connection not open on send()" error when using Websocket connection for Kaleido

我在连接到 Kaleido 节点的 Websocket 后立即收到 'connection not open on send()' 错误。我正在尝试使用 web3js 版本 1.0.0-beta.34 中的 WebsocketProvider。

我的连接代码如下所示,其中 usernamepasswordwssUrl 是包含 Kaleido 节点信息的局部变量。

const web3 = new Web3(new Web3.providers.WebsocketProvider(`wss://${username}:${password}@${wssUrl}`))

我已经尝试了 this Github issue 中列出的建议步骤 -- 如果连接丢失,尝试重新连接,但错误仍然存​​在。我认为这可能是 Kaleido 问题,因为我可以将 WebsocketProvider 用于本地 Ganache 帐户。

如果 Kaleido 节点能够使用 Websocket 连接会很有帮助,所以我可以使用 web3js 1.0 版。 HTTP 连接工作得很好,但在 web3js 1.0 中,不推荐使用 HttpProvider 监听事件,因此迫使您使用 WebsocketProvider。谢谢!

更新

web3js 1.0.0-beta.34 将回退到 Node JS 的遗留 URL 解析器。更改已交付给 ethereum/web3.js 的 1.0 分支以解决此问题。

要解决此问题:

npm i -g lerna
npm i https://github.com/ethereum/web3.js.git\#1.0

lerna只是web3项目在开发过程中依赖的构建工具


我刚刚查看了此请求的 Wireshark 日志,似乎 web3js 在 WebSocket 升级请求期间未通过基本 Authn headers。

GET / HTTP/1.1 
Upgrade: websocket 
Connection: Upgrade 
Sec-WebSocket-Version: 13 
Sec-WebSocket-Key: XXXX==
Host: zzzzz-zzzzz-wss.us-east-2.kaleido.io 

有人可能认为 Sec-WebSocket-Key 是一个 Authn header,但它实际上是另一种攻击的协议对策。您可以在这个问题上阅读更多内容:What is Sec-WebSocket-Key for?

我会看看是否可以破解一个补丁来让它工作。