web3.eth.subscribe 未针对 web3 版本 1.0.0-beta.27 实现
Posted
技术标签:
【中文标题】web3.eth.subscribe 未针对 web3 版本 1.0.0-beta.27 实现【英文标题】:web3.eth.subscribe not implemented for web3 version 1.0.0-beta.27 【发布时间】:2018-06-18 18:57:38 【问题描述】:我在 web3 版本 1.0.0-beta.27
上运行私有以太坊区块链以进行测试。区块链正在挖矿并且有两个用户,现在我想subscribe
到区块链中的事件并执行一些操作。代码如下:
var Web3 = require("web3");
var ether_port = 'http://localhost:8545'
var web3 = new Web3(new Web3.providers.HttpProvider(ether_port));
web3.eth.subscribe("pendingTransactions"
, function(err, result)
if (err) console.log(err)
else console.log("result: ", result)
);
我得到类似的东西:
Error: The current provider doesn't support subscriptions: HttpProvider
at Subscription.subscribe
在某种意义上并不奇怪,因为当我在 node.js
控制台上执行 web3.eth.subscribe
时,我得到:
[Function] call: undefined
尽管web3-1.0.0
的文档声明该函数可以使用:https://web3js.readthedocs.io/en/1.0/web3-eth-subscribe.html。
那么这仅仅是文档与实际实现不同步的问题吗?是我用错了吗?
如果没有实现,监听链中变化的最佳方式是什么?例如,如果我想实时更新用户的账户余额?除了一个简单的函数实现之外,该函数每n
几分之一秒对链执行一次 ping 操作。
【问题讨论】:
【参考方案1】:正如错误提示的那样,pub/sub 不能通过 HTTP 使用。但是,您可以通过 WS 使用它。因此,您引用的文档并非 100% 错误,它只是省略了代码的提供程序部分。
尝试使用网络套接字连接启动您的节点(geth --ws --wsport 8545 ...
,假设您使用的是geth
),然后更改为WebsocketProvider
。
var Web3 = require("web3");
var ether_port = 'ws://localhost:8545'
var web3 = new Web3(new Web3.providers.WebsocketProvider(ether_port));
web3.eth.subscribe("pendingTransactions"
, function(err, result)
if (err) console.log(err)
else console.log("result: ", result)
);
查看此discussion ticket 的第四条评论。
【讨论】:
您能帮我了解在 geth 中打开 websocket 的正确方法吗?当做geth --identity "node" --nodiscover --maxpeers 0 --datadir /path/to/data --networkid 123 --ws --wsport 8546 console
,然后尝试在节点中打开一个连接,我得到WARN [01-09|14:54:48] origin '' not allowed on WS-RPC interface
。
试试geth --identity "node" --nodiscover --maxpeers 0 --datadir /path/to/data --networkid 123 --ws --wsport 8545 --wsaddr 0.0.0.0 --wsorigins "*" console
。请注意,我使用端口 8545 来匹配答案中的代码。显然在那里使用你想要的任何东西。
嗯,效果很好,谢谢。最后一个问题,为什么当我在浏览器中导航到ws://127.0.0.1:8546/
(我最终用于 ws 端口的地址)时,无法访问此站点。但是当我打开http
端口时,我可以导航到http://127.0.0.1:8546/
?
我不确定。我从来没有尝试通过浏览器通过 ws 来点击它。我建议使用网络套接字插件来获取更多信息。此外,您可以同时启用 JSON-RPC (HTTP) 和 WS 连接。只需在不同的端口上运行它们。我还应该提到,如果您需要访问 eth/web3/net 以外的库并且对 HTTP/WS 有安全问题,您应该能够通过 IPC 进行发布/订阅。【参考方案2】:
使用附加的 JS 控制台打开它的更好方法
您可以使用 > geth attach 'ipc path' 附加(即在我的情况下是 /home/dev/.ethereum/geth.ipc)
之后,您将连接到正在运行的 geth 节点并使用管理 API。现在您可以使用
admin.startWS("localhost", '端口号')
当你想关闭连接时,你可以使用下面的命令
admin.stopWS()
问候 开发
【讨论】:
以上是关于web3.eth.subscribe 未针对 web3 版本 1.0.0-beta.27 实现的主要内容,如果未能解决你的问题,请参考以下文章
英语we’re sparking wild fires怎么翻译?
为啥本地通知未针对 UNCalendarNotificationTrigger 触发