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

Posted

技术标签:

【中文标题】为 Kaleido 使用 Websocket 连接时出现“连接未在 send() 上打开”错误【英文标题】:"connection not open on send()" error when using Websocket connection for Kaleido 【发布时间】:2018-07-12 12:15:22 【问题描述】:

在连接到 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】:

更新

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?

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

【讨论】:

啊,这是有道理的,为什么它在我的 Ganache 端点上没有身份验证而在本地工作。感谢您对此进行调查! 这仍然是web3@1.0.0-beta.36 中的一个问题!我使用Kovan 网络,有时我会收到connection not open on send()。是否有可能强制此错误,以便我可以使用它并为其构建处理程序? 对我来说,从 1.0.0-beta.33 升级到 1.0.0-beta.34 后它可以工作 @callmeroot,你是如何解决这个问题的?我使用 ganache 进行本地检查,更新到 6.1.6 版后我有这个错误,但没有更新我有这个ethereum.stackexchange.com/questions/41991/…

以上是关于为 Kaleido 使用 Websocket 连接时出现“连接未在 send() 上打开”错误的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 CloudFormation 为 API 网关 v2 websocket 连接设置 VPC

为 WebSocket 连接更新令牌的最佳做法是啥

使用 websockets 时,我应该为每个不同的任务打开一个新的 websocket 连接吗?还是我应该在一个连接中完成所有事情?

2018-03-26(websocket自动断开连接)

如何使用 cpprestsdk 设置 websocket SSL 连接?

Websocket客户端重新连接空闲连接