tendermint提供的RPC接口(一)

区块链资讯区块链兄弟2019-09-11 11:06:23  阅读 -评论 0

准备工作:作者是在windows环境上进行的部署测试,其他环境也是大同小异。可参考往期文章windows环境下tendermint的编译与使用
本文用的是官方的KVStore的例子来测试api,为了更好的显示测试结果,修改了部分代码,详细如下:
DeliverTx
func (app *KVStoreApplication) DeliverTx(req types.RequestDeliverTx) types.ResponseDeliverTx {
   fmt.Println("----------------- kvStore DeliverTx")
   var key, value []byte
   parts := bytes.Split(req.Tx, []byte("="))
   if len(parts) == 2 {
      key, value = parts[0], parts[1]
   } else {
      key, value = req.Tx, req.Tx
   }
   app.state.db.Set(prefixKey(key), value)
   app.state.Size += 1
   events := []types.Event{
      {
         Type: "app",
         Attributes: []cmn.KVPair{
            {Key: []byte("creator"), Value: []byte("Cosmoshi Netowoko")},
            {Key: []byte("key"), Value: key},
         },
      },
   }
   return types.ResponseDeliverTx{Code: code.CodeTypeOK, Events: events,Log:"DeliverTx OK"} //此处增加Log,方便测试
}
CheckTx
func (app *KVStoreApplication) CheckTx(req types.RequestCheckTx) types.ResponseCheckTx {
   fmt.Println("----------------- kvStore CheckTx")
   return types.ResponseCheckTx{Code: code.CodeTypeOK, GasWanted: 1,Log:"CheckTx OK"} //此处增加Log,方便测试}
由于篇幅比较长,计划分为2-3篇。
下面开始正文
1,Tx(发送交易)
/broadcast_tx_sync
说明:发送同步交易,从CheckTx返回相应值,不会等待DeliverTx的结果。
如果想确保这笔交易被打包了,可以通过订阅来实现(详见下文Websocket模块)。如果几个块内没有收到任何消息的话,重新发送这笔交易,如果还是没有收到,可以向其他节点发送这笔交易。订阅频道收不到消息的原因可能有:
1,恶意节点丢弃了这笔交易。
2,恶意提议者(没有必要与你通信的人)丢弃了可能在将来生效的交易(https://github.com/tendermint/tendermint/issues/3322)。
示例:
C:\Users\ch>curl -s localhost:26657/broadcast_tx_sync?tx=\"author=caohuan\"
{
  "jsonrpc": "2.0",
  "id": "",
  "result": {
    "code": 0,
    "data": "",
    "log": "CheckTx OK", //可以看到这里的返回值就是CheckTx的返回值
    "hash": "B339C04B9163F0585B8DB0703E2A107A9B21034B2F5D18BF9B66BDEF5DD627E3"
  }
}
/broadcast_tx_async
说明:发送异步交易,无返回值,不等待CheckTx或者DeliverTx的执行结果
详细说明同上。
示例:
C:\Users\ch>curl -s localhost:26657/broadcast_tx_async?tx=\"author=caohuan1\"
{
  "jsonrpc": "2.0",
  "id": "",
  "result": {
    "code": 0,
    "data": "",
    "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,看起来好像都没有什么用处,填与不填对结果没什么影响。查证后再补充。

声明:链世界登载此文仅出于分享区块链知识,并不意味着赞同其观点或证实其描述。文章内容仅供参考,不构成投资建议。投资者据此操作,风险自担。此文如侵犯到您的合法权益,请联系我们kefu@lianshijie.com

参与讨论 (0 人参与讨论)

相关推荐

BM:B1将添加EOSIO的工具和接口,使得在区块链上部署应用程序更加容易

BM 今日在 Medium 发表一篇名为《为何区块链是更好的应用服务器/数据库架构》的文章。未来 B1 的一个目标是添加工具和接口,促使在区块链上部署业务的过程和传统互联网上部署业务相似。

ETH 2.0抵押合约接口早期原型图泄漏,Staking收益低于V神目前预期

ETH 2.0抵押合约接口早期原型图泄漏,Staking收益低于V神目前预期

区块律动 BlockBeats 消息,据 Trustnodes 报道,ETH 2.0 的抵押过程早期原型图已经泄漏,流出的截图显示,其 Staking 收益低于以太坊创始人 Vitalik Buterin 目前的预期。另一个密钥控制 ETH 的移动,这是冷钱包密钥或现在的私钥。

网传DCEP接口将开放,央行尚未公布,请防范风险

网传DCEP接口将开放,央行尚未公布,请防范风险

首先该网站并没有域名备案;其次网站 IP 地址显示为阿里云的香港服务器,央行数字货币的服务器应该在大陆;最后,DCEP 的 API 接口需要接受审核,不可能出现公开对外的情况。区块律动 BlockBeats 查询央行官网后,未在央行网站发现相关内容和链接。区块律动BlockBeats提醒用户注意风险,谨防上当受骗。

tendermint提供的RPC接口(三)

tendermint提供的RPC接口(三)

本文是系列文章第三篇,主要介绍如何自定义订阅事件。 /subscribe 说明:通过wensocket订阅事件。 想要订阅某个事件,需要提供一个字符串表达式,格式是“condition AND condition ”(只能用AND不能用OR)。condition的格式是“key operation operand”, key是一个字符串(\t\n\r()'"=&gt;&lt;不允许出现在key中)

是时候改变区块链和人交互的接口形象了——区块链搜索引擎

是时候改变区块链和人交互的接口形象了——区块链搜索引擎

第0章 引言 区块链浏览器里的东西除了熟悉币的人能看懂少部分内容外,还有谁懂,新人压根就不知道这么多字符是搞什么的。而且区块链浏览器里呈现的内容,只不过是区块链里有价值的内容的一小部分。 我们需要一个全新的人和区块链交互的接口。 第1章 从门户网站到搜索引擎 我开始上网是在2000前后,那时候互联网入口是新浪,搜狐,yahoo这样的门户网站,还有像hao123这样的导航网站。

Twitter 开放闪电网络打赏接口

Twitter 开放闪电网络打赏接口

如果你认为,仅仅为钟意的推文点“喜欢”还不够时,你还可以通过发送小额 BTC 进行打赏。   周六,测试版应用 Tippin 发布了一个新的 Chrome 扩展应用,可供谷歌浏览器用户使用。通过该应用程序,用户可以在 Twitter 上使用闪电网络发送 BTC 支付,这被认为首次实现了 BTC 的大规模使用。 启动拓展应用后,每条推文的“喜欢”和“转推”按钮旁边都会出现一个闪电符号。

PySEAL:一个全同态加密的Python接口库

PySEAL:一个全同态加密的Python接口库

宁波格密链网络科技有限公司一直致力于全同态加密的应用研究。最近陈智罡博士的团队开发了一个将SEAL全同态加密库映射到Python上的接口,解决了机器学习库与全同态加密库对接的问题,极大的方便了机器学习领域人员使用全同态加密算法,为其它领域需要用到全同态加密库的人们提供便利的工具。该库已经在GitHub上开源(github.com/Huelse/pyseal)。全世界各地的工程技术人员都可以使用该库

中信银行打造“区块链”信用证结算!

中信银行打造“区块链”信用证结算!

科技不会改变金融的实质,但却能让金融服务更高效,能让资金供、需方信息不对称的问题更好地解决。近期,中信银行首个区块链项目——基于区块链的国内信用证信息传输系统(简称BCLC)(一期)成功上线,这是国内银行业第一次将区块链技术应用于信用证结算领域。 据中信银行国际业务部总经理助理张栩青介绍,将现在流行的区块链技术应用在国内信用证中,改变了银行传统信用证业务模式,信用证的开立、通知、交单、承兑报文

麦妖榜
更新日期 2019-09-03
排名用户贡献值
1牛市来了30910
2BitettFan24187
3等待的宿命23810
4区块大康20369
5六叶树20310
6linjm122719429
7天下无双16192
8lizhen00215280
9让时间淡忘14586
10yelanyi050511349
返回顶部 ↑