【问题标题】:web3.eth.subscribe not implemented for web3 version 1.0.0-beta.27web3.eth.subscribe 未针对 web3 版本 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

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

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

【问题讨论】:

    标签: node.js blockchain ethereum web3


    【解决方案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()

    问候 开发

    【讨论】:

      猜你喜欢
      • 2018-09-30
      • 1970-01-01
      • 2018-11-16
      • 1970-01-01
      • 2019-11-27
      • 2019-06-30
      • 1970-01-01
      • 2019-09-01
      • 1970-01-01
      相关资源
      最近更新 更多