2

我使用的是 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.subscribenode.js控制台上这样做时,我得到:

{ [Function] call: undefined }

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

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

  2. 如果没有实现,那么在链中监听变化的最佳方式是什么?例如,如果我想实时更新用户的账户余额?除了一个简单的实现功能之外,它每隔n几分之一秒就对链进行 ping 操作。

4

2 回答 2

7

正如错误所暗示的,pub/sub 不能通过 HTTP 使用。但是,您可以通过 WS 使用它。因此,您引用的文档并非 100% 错误,它只是省略了代码的提供者部分。

尝试使用 Web 套接字连接(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) }
});

请参阅此讨论票的第 4 条评论。

于 2018-01-09T18:12:12.650 回答
0

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

您可以使用 > geth attach 'ipc path' 附加它(即在我的情况下它是/home/dev/.ethereum/geth.ipc)

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

admin.startWS("localhost", '端口号')

当你想关闭连接时,你可以使用下面的命令

admin.stopWS()

问候开发

于 2019-02-19T16:47:32.670 回答