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 实现的主要内容,如果未能解决你的问题,请参考以下文章

cpp-ethereum/aleth 监听智能合约事件问题

英语we’re sparking wild fires怎么翻译?

ABP官方文档翻译 5.2 动态We API层

为啥本地通知未针对 UNCalendarNotificationTrigger 触发

Amazon CloudFront 未针对未更改的静态内容始终返回 304(未修改)?

UICollectionView 中未显示 UILabel