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,用以订阅其他的事件。这个比较复杂,改天重新写一篇文章来详细阐述。
示例:
循环发送十笔交易
结果:
上面代码里面的tx是可以解析的。
/unsubscribe
说明:取消订阅
示例:
订阅的代码中设置一个计数器,超过十笔交易,即取消订阅
/unsubscribe_all
说明:取消所有订阅
示例:
结果和上面取消单个订阅的一样,不再截图了
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,看起来好像都没有什么用处,填与不填对结果没什么影响。查证后再补充。
售前客服二维码
文章均源于网络收集编辑侵删
提示:仅接受技术开发咨询!
郑重申明:资讯文章为网络收集整理,官方公告以外的资讯内容与本站无关!