【问题标题】:Not able to invoke erisdb.eventPoll rpc call无法调用 erisdb.eventPoll rpc 调用
【发布时间】:2025-12-05 16:45:01
【问题描述】:

我的区块链在本地运行。我正在使用 node-json-rpc 模块进行 rpc 调用。我能够拨打几个电话,例如 erisdb.getBlockchainInfo。 我尝试了 erisdb.eventSubscribe 调用:

client.call(
  {
    "jsonrpc": "2.0", "method": "erisdb.eventSubscribe", "params": {
      "event_id": "NewBlock"
    }, "id": "0"
  },

它成功地返回了一个 sub_id 给我:

{ result: { sub_id: '7878EB2ECC668AEE19D958B89C4ED6E145D9298E91366D67F93CD2A20E995829' },
      error: null,
      id: '0',
      jsonrpc: '2.0' }

我使用该 sub_id 来调用 erisdb.eventPoll 调用:

client.call(
  {
    "jsonrpc": "2.0", "method": "erisdb.eventPoll", "params": {
      "sub_id":"7878EB2ECC668AEE19D958B89C4ED6E145D9298E91366D67F93CD2A20E995829"
    }, "id": "1"
  },

但它给出了以下错误

{ result: null,
  error:
   { code: -32603,
     message: 'Subscription not active. ID: 7878EB2ECC668AEE19D958B89C4ED6E145D9298E91366D67F93CD2A20E995829' },
  id: '1',
  jsonrpc: '2.0' }

我的 eris-db 版本是 0.12.1。

【问题讨论】:

    标签: blockchain eris-blockchain


    【解决方案1】:

    目前我们有两种不同的 API。您正在使用的我们称为“v0”API。它针对长轮询 Javascript 客户端进行了优化。我的猜测是,您的订阅会在某个硬编码超时(恰好是 10 秒)之前获得。您是否尝试过在eventSubscribe 通话后快速接听eventPoll 通话?

    这是“v0”收割函数:https://github.com/eris-ltd/eris-db/blob/master/event/event_cache.go#L72。它循环运行,清除最近未轮询的旧订阅。如果您在轮询前等待超过 10 秒,则您的订阅可能已被删除(删除)。

    我们还有另一个针对链管理优化的 API,称为“tendermint”API(因为它继承自 Tendermint 共识引擎)。它是一种并行 API,由 eris-pm 工具使用。它还有一个可通过 websocket 端点访问的订阅方法。这可能对您有用,因为它的订阅永远不会被收割。

    你可以这样试试:

    开始你的连锁店:

    $ eris chains start testchain
    

    获取一个简单的 websocket 客户端:

    $ go get github.com/raphael/wsc
    

    连接到 websocket 端点:

    $ wsc ws://0.0.0.0:46657/websocket
    2017/01/21 01:03:51 connecting to ws://0.0.0.0:46657/websocket...
    2017/01/21 01:03:51 ready, exit with CTRL+C.
    

    通过将{ "jsonrpc": "2.0", "method": "subscribe", "params": ["NewBlock"] } 作为单行粘贴到终端中来订阅NewBlock 事件:

    >> { "jsonrpc": "2.0", "method": "subscribe", "params": ["NewBlock"] }
    

    然后你应该会收到一个新的块事件流(大约每秒 1 个),例如:

    << {"jsonrpc":"2.0","id":"#event","result":[19 {"event":"NewBlock","data":[1,{"block":{"header":{"chain_id":"testchain","height":206320,"time":"2017-01-21T01:04:01.095Z","num_txs":0,"last_block_hash":"2DB0D0AE6D92DA6DA07F8E7D1605AAB6CB96D8D2","last_block_parts":{"total":1,"hash":"A4AD1708714CF0BE3E5125B65F495DDDFA1ED8D9"},"last_commit_hash":"4C301C0367B7CECDD4E00C955D2F155802B2377E","data_hash":"","validators_hash":"46E43215C6C332446114BF7320D2D007114C5EEB","app_hash":"9A72DE9AAD6BD820A64DB98462CD706594217E1
    << 1"},"data":{"txs":[]},"last_commit":{"precommits":[{"height":206319,"round":0,"type":2,"block_hash":"2DB0D0AE6D92DA6DA07F8E7D1605AAB6CB96D8D2","block_parts_header":{"total":1,"hash":"A4AD1708714CF0BE3E5125B65F495DDDFA1ED8D9"},"signature":"45A6C3D0B0BD380A239F014681A29FD6217B52653CC7FC189FF5B7DC840A61062CF12FC652687A30A5CBBF0270937F32542D6075BA94A12180568560B322EC07"}]}}}]}],"error":""}
    

    您可以使用您选择的程序化 websocket 客户端与使用此 websocket API 的链进行交互,您的订阅将永远不会被收割。

    很快将计划对这些 API 进行大统一,这应该会使它们更易于使用并有更好的文档记录。

    如果您需要调试帮助,请加入我们:https://monax.slack.com/

    【讨论】: