0

在连接到 Kaleido 节点的 Websocket 后,我​​立即收到“连接未在 send() 上打开”错误。我正在尝试使用 web3js 版本 1.0.0-beta.34 中的 WebsocketProvider。

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

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

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

能够为 Kaleido 节点使用 Websocket 连接会很有帮助,因此我可以使用 web3js 1.0 版。HTTP 连接工作得很好,但在 web3js 1.0 中使用 HttpProvider 监听事件已被弃用,从而迫使您使用 WebsocketProvider。谢谢!

4

1 回答 1

0

更新

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 标头。

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 标头,但它实际上是针对另一种攻击的协议对策。您可以在这个问题上阅读更多信息:Sec-WebSocket-Key 是做什么用的?

我会看一下,看看我是否可以拼凑一个补丁来让它工作。

于 2018-07-12T14:28:42.997 回答