我的区块链在本地运行。我正在使用 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。
答案 0 :(得分:0)
目前我们有两种不同的API。您正在使用的那个我们称之为' v0' API。它针对长轮询Javascript客户端进行了优化。我的猜测是,在某个硬编码的超时(恰好是10秒)之前,你的订阅就会被收获。在eventPoll
来电之后,您是否尝试过eventSubscribe
电话快速成功?
这是' v0'收割功能:https://github.com/eris-ltd/eris-db/blob/master/event/event_cache.go#L72。它在循环中运行,清除最近未轮询的旧订阅。如果您在轮询之前等待的时间超过10秒,那么您的订阅可能已被收回(已删除)。
我们还有另一种针对连锁管理优化的API,称为“嫩白粉”。 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.
通过将NewBlock
作为一行粘贴到终端来订阅{ "jsonrpc": "2.0", "method": "subscribe", "params": ["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/