使用Websocket连接进行Kaleido时出现“ send()上连接未打开”错误

时间:2018-07-12 12:15:22

标签: web3js kaleido

在为Kaleido节点连接到Websocket之后,我立即收到“在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。谢谢!

1 个答案:

答案 0 :(得分: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标头,但这实际上是另一种攻击的协议对策。您可以在以下问题中了解更多信息:What is Sec-WebSocket-Key for?

我将看一下是否可以破解补丁才能使它正常工作。