在为Kaleido节点连接到Websocket之后,我立即收到“在send()上未打开连接”错误。我正在尝试使用来自web3js版本1.0.0-beta.34的WebsocketProvider。
我用于连接的代码如下所示,其中username
,password
和wssUrl
是包含有关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。谢谢!
答案 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?
我将看一下是否可以破解补丁才能使它正常工作。