tendermint提供的RPC接口(一)

2019-09-11 10:46 栏目:经验之谈 来源: 查看()
准备工作:作者是Windows环境下的部署测试,与其他环境类似。可以参考前一篇文章的windows环境,对tendermint的编译和使用 本文使用官方的KVStore示例来测试api,为了更好地显示测试结果,修改了一些代码,如下: DeliverTx Func(app * KVStoreApplication)DeliverTx(req types.RequestDeliverTx)types.ResponseDeliverTx { fmt.Println('----------------- kvStore DeliverTx') Var键,值[]字节 零件:=bytes.Split(req.Tx,[] byte('=')) 如果len(parts)==2 { 键,值=部分[0],部分[1] } else { 键,值=req.Tx,req.Tx } app.state.db.Set(prefixKey(key),value) app.state.Size +=1 事件:=[] types.Event { { 输入:'app', 属性: [] cmn.KVPair { {Key: [] byte('creator'),Value: [] byte('Cosmoshi Netowoko')}, {Key: [] byte('key'),Value: key}, }, }, } 返回类型.ResponseDeliverTx {代码: code.CodeTypeOK,事件:事件,日志:'DeliverTx OK'} //在此处添加日志以便于测试 } CheckTx Func(app * KVStoreApplication)CheckTx(req types.RequestCheckTx)types.ResponseCheckTx { fmt.Println('----------------- kvStore CheckTx') 返回类型.ResponseCheckTx {代码: code.CodeTypeOK,GasWanted: 1,Log:'CheckTx OK'} //在此处添加日志以便于测试} 由于文章的篇幅,该计划分为2-3篇文章。 开始下面的文字 1,Tx(发送交易) /broadcast_tx_sync 说明:发送同步事务,从CheckTx返回相应的值,并且不等待DeliverTx的结果。 如果您想确保交易是打包的,您可以通过订阅来完成(请参阅下面的Websocket模块)。如果在几个块内没有收到消息,则重新发送事务,如果仍未收到,则可以将事务发送到其他节点。订阅频道未收到消息的原因可能是: 1.恶意节点丢弃了该事务。 2。恶意提议者(不需要与您通信的人)放弃可能在将来生效的交易(https://github.com/tendermint/tendermint/issues/3322)。 例子: c:用户ch>;curl-s本地主机: 267/广播发送同步?TX=作者=曹欢\\ { 'jsonrpc':'2.0', “ID”:’ '结果':{ '代码':0, '数据':', 'log':'checktx ok',/可以看到这里的返回值是checktx的返回值。 '哈希':'b339c04b9163f0585b8db0703e2a07a9b21034b2f5d18b9b66bdef5dd627e3' } } /广播异步 描述:发送异步事务,不返回值,不等待checktx或delivertx执行结果 同上。 例子: c: users ch>;curl-s本地主机: 267/broadcast_tx_async?TX=作者=曹焕1\\\\\\\\\\\\\\\ { 'jsonrpc':'2.0', “ID”:’ '结果':{ '代码':0, '数据':', 'log': '', //既不是CheckTx也不是DeliverTx 'hash': 'ED86886438919C7673ACBD0C649688D95A2D0CA3425A1350E68644AE367411AA' } } /broadcast_tx_commit 说明:既返回CheckTx的执行结果也返回DeliverTx的执行结果。 需要注意的是,官方建议仅仅在测试和开发的时候使用此接口,在生产环境,尽可能的使用同步或者异步的方式发送交易,如果要确认交易成功,可以使用订阅的功能。 如果CheckTx或则DeliverTx失败了,不会返回任何的错误信息,只会返回一个包含non-OK的ABCI code。 示例: C: \Users\ch>curl -s localhost: 26657/broadcast_tx_commit?tx=\'author=caohuan12\' { 'jsonrpc': '2.0', 'id': '', 'result': { 'check_tx': { //CheckTx的返回值 'log': 'CheckTx OK', 'gasWanted': '1' }, 'deliver_tx': { //DeliverTx的返回值 'log': 'DeliverTx OK', 'events': { 'type': 'app', 'attributes': [ { 'key': 'Y3JlYXRvcg==', 'value': 'Q29zbW9zaGkgTmV0b3dva28=' }, { 'key': 'a2V5', 'value': 'YXV0aG9y' } ] } ] }, 'hash': '95C3A05EC5FBE8E4F5D4FC690398E0D9AD8B7777A4D9A130982853F9647633C9', 'height': '7' } } 2,Websocket(订阅及取消订阅) /subscribe 说明:通过wensocket订阅事件。 想要订阅某个事件,需要提供一个字符串表达式,格式是“condition AND condition ”(只能用AND不能用OR)。condition的格式是“key operation operand”, key是一个字符串(\t\n\r()''=><不允许出现在key中) operation可以是“=”,“<”,“<=”,“>”,“>=”, 'CONTAINS' operand可以是一个字符串(要用单引号转义),数字,日期或者事件。 比如: tm.event='NewBlock' //新区快产生 tm.event='CompleteProposal' //完成一个提案 tm.event='Tx' AND tx.hash='XYZ' //某一笔交易 tm.event='Tx' AND tx.height=5 //第五个块的所有交易 tx.height=5 //第五个块的所有交易 tendermint提供了几个预定义的key:tm.ecent,tx.hash,tx.height。但是用户可以通过重定义DeliverTx的响应来增加key,用以订阅其他的事件。这个比较复杂,改天重新写一篇文章来详细阐述。 示例: 循环发送十笔交易

tendermint提供的RPC接口(一)

结果:

tendermint提供的RPC接口(一)

上面代码里面的tx是可以解析的。 /unsubscribe 说明:取消订阅 示例: 订阅的代码中设置一个计数器,超过十笔交易,即取消订阅

tendermint提供的RPC接口(一)

/unsubscribe_all 说明:取消所有订阅 示例:

tendermint提供的RPC接口(一)

结果和上面取消单个订阅的一样,不再截图了 3,ABCI /abci_info 说明:获取应用的一些信息 示例: C: \Users\ch>curl -s localhost: 26657/abci_info { 'jsonrpc': '2.0', 'id': '', 'result': { 'response': { 'data': '{\'size\': 88}', //所有交易数量 'version': '0.16.1', //abci-cli的版本信息 'app_version': '1' } } } /abci_query 说明:查询某一笔交易,四个参数:data,path,height,prove,前两个为必填 示例: C: \Users\ch>curl -s localhost: 26657/abci_query?data=\'author\' { 'jsonrpc': '2.0', 'id': '', 'result': { 'response': { 'log': 'exists', 'key': 'YXV0aG9y', 'value': 'Y2FvaHUxYW4xMjMxMTQxMTExMTExMQ==' } } } 官方文档里还有一个必填参数path,实际操作中发现不填也没有关系,还有两个选填参数height和prove,看起来好像都没有什么用处,填与不填对结果没什么影响。查证后再补充。

微信二维码
售前客服二维码

文章均源于网络收集编辑侵删

提示:仅接受技术开发咨询!

郑重申明:资讯文章为网络收集整理,官方公告以外的资讯内容与本站无关!
NFT开发,NFT交易所开发,DAPP开发 Keywords: NFT开发 NFT交易所开发 DAPP开发