web3.eth.subscribe未针对web3版本1.0.0-beta.27实现

时间:2018-01-09 17:06:53

标签: node.js blockchain ethereum web3

我在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 

从某种意义上来说,当我在web3.eth.subscribe控制台node.js { [Function] call: undefined } 时,我不会感到惊讶:

web3-1.0.0

即使n的文档说明可以使用该功能:https://web3js.readthedocs.io/en/1.0/web3-eth-subscribe.html

  1. 这只是文档与实际实现不同步的问题吗?我用错了吗?

  2. 如果没有实现,那么收听链中变化的最佳方式是什么?例如,如果我想要实时更新用户的帐户余额?这是除了每隔List小时一秒对链进行调整的函数的天真实现。

2 个答案:

答案 0 :(得分:6)

正如错误所示,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的第4条评论。

答案 1 :(得分:0)

使用附加的JS控制台打开它的更好方法

您可以使用> geth附加“ ipc路径”(即,在我的情况下是/home/dev/.ethereum/geth.ipc)来附加

之后,您将连接到正在运行的geth节点并使用管理API。现在可以使用

  

admin.startWS(“ localhost”,'端口号')

,当您要关闭连接时,可以使用以下命令

  

admin.stopWS()

问候 开发人员