知世金融网专注于股票行情,期货开户,外汇储备等最新相关资讯信息提供投资者参考学习!

当前位置:网站首页 > 区块链 > 正文

tendermint提供的RPC接口(三)

原创
文章作者
知世-金融领域资深作者
知名金融领域作者,从事金融超过十余年,在行业内有一定影响力。
金融风险管理师认证证书 常识职业资格认证 特许金融分析师 国际金融理财师认证证书
发布时间:2020-02-16 18:50:36 发布来源:区块链兄弟 文章点击:137

本文是系列文章第三篇,主要介绍如何自定义订阅事件。 /subscribe 说明:通过wensocket订阅事件。 想要订阅某个事件,需要提供一个字符串表达式,格式是“condition AND condition ”(只能用...

目录

    本文标题tendermint提供的RPC接口(三),作者:知世,本文有1479个文字,大小约为5KB,预计阅读时间4分钟,请您欣赏。知世金融网众多优秀文章,如果想要浏览更多相关文章,请使用网站导航的搜索进行搜索。本站虽然不乏优秀之作,但仅作为投资者学习参考。

    本文是系列文章第三篇,主要介绍如何自定义订阅事件。

    /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.event,tx.hash,tx.height。但是用户可以通过重定义DeliverTx的响应来增加key,用以订阅其他的事件。例如定义以下event

    types.ResponseDeliverTx{
    Events: []types.Event{
    {
    Type: "rewards.withdraw",
    Attributes:
    common.KVPairs{
    common.KVPair{Key: []byte("address"), Value: []byte("AddrA")},
    common.KVPair{Key: []byte("source"), Value: []byte("SrcX")},
    common.KVPair{Key: []byte("amount"), Value: []byte("...")},
    common.KVPair{Key: []byte("balance"), Value: []byte("...")},
    },
    },
    {
    Type: "rewards.withdraw",
    Attributes: common.KVPairs{
    common.KVPair{Key: []byte("address"), Value: []byte("AddrB")},
    common.KVPair{Key: []byte("source"), Value: []byte("SrcY")},
    common.KVPair{Key: []byte("amount"), Value: []byte("...")},
    common.KVPair{Key: []byte("balance"), Value: []byte("...")},
    },
    },
    {
    Type: "transfer",
    Attributes: common.KVPairs{
    common.KVPair{Key: []byte("sender"), Value: []byte("AddrC")},
    common.KVPair{Key: []byte("recipient"), Value: []byte("AddrD")},
    common.KVPair{Key: []byte("amount"), Value: []byte("...")},
    },
    },
    },
    }

    所有事件都由eventType和eventAttrKey形式的符合键索引,在上面的示例中,将对以下键进行索引:

    rewards.withdraw.address

    rewards.withdraw.source

    rewards.withdraw.amount

    rewards.withdraw.balance

    transfer.sender

    transfer.recipient

    transfer.amount

    允许多个事件类型具有重复的键,并且可以用于对唯一和不同事件进行分类。

    在上面的示例中,在密钥rewards.withdraw.address下索引的所有事件将具有以下存储和可查询的值:AddrA,AddrB

    创建各种类型的交易订阅:

    query.MustParse("tm.event = 'Tx' AND rewards.withdraw.address = 'AddrA'")

    query.MustParse("tm.event = 'Tx' AND rewards.withdraw.address = 'AddrA' AND rewards.withdraw.source = 'Y'")

    query.MustParse("tm.event = 'Tx' AND transfer.sender = 'AddrA'")

    这几种是无返回值的:

    query.MustParse("tm.event = 'Tx' AND transfer.sender = 'AddrZ'")

    query.MustParse("tm.event = 'Tx' AND rewards.withdraw.address = 'AddrZ'")

    query.MustParse("tm.event = 'Tx' AND rewards.withdraw.source = 'W'")

    下面是示例。

    自定义的event代码:

    var events []types.Event
    if strings.HasPrefix(k,"a"){
    events = []types.Event{
    {
    Type: "string",
    Attributes: []common.KVPair{
    {Key: []byte("startWith"), Value: []byte("a")},
    {Key: []byte("key"), Value: key},
    },
    },
    }
    }
    if strings.HasPrefix(k,"b"){
    events = []types.Event{
    {
    Type: "string",
    Attributes: []common.KVPair{
    {Key: []byte("startWith"), Value: []byte("b")},
    {Key: []byte("key"), Value: key},
    },
    },
    }
    }

    订阅代码分为2个线程:

    func main() {
    cli := client.NewHTTP("http://localhost:26657", "/websocket")
    err := cli.Start()
    if err != nil {
    fmt.Println(err)
    return
    }
    defer cli.Stop()
    ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second)
    defer cancel()
    //query := "app.key='author'"
    txs, err := cli.Subscribe(ctx, "test-client", "string.startWith = 'a'")
    if err != nil {
    fmt.Println("错误信息", err)
    return
    }
    for tx := range txs {
    fmt.Println("startWithA接收到消息:\n", tx)
    }
    }
    func main() {
    cli := client.NewHTTP("http://localhost:26657", "/websocket")
    err := cli.Start()
    if err != nil {
    fmt.Println(err)
    return
    }
    defer cli.Stop()
    ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second)
    defer cancel()
    //query := "app.key='author'"
    txs, err := cli.Subscribe(ctx, "test-client", "string.startWith = 'b'")
    if err != nil {
    fmt.Println("错误信息", err)
    return
    }
    for tx := range txs {
    fmt.Println("startWithB接收到消息:\n", tx)
    }
    }

    分别发送交易:

    curl -s localhost:26657/broadcast_tx_commit?tx=\"aunt=a1234\"

    curl -s localhost:26657/broadcast_tx_commit?tx=\"buss=b5678\"

    可以看到两个窗口分别收到消息:

    这只是一个示例,在实际使用过程中会更加复杂一些,例如对某个交易地址的监控,对大额转账的监控等等。

    文章发布只为分享区块链技术内容,版权归原作者所有,观点仅代表作者本人,绝不代表区块链兄弟赞同其观点或证实其描述。

    本文相关推荐: 什么是 ABI?

    以上便是知世金融网给大家分享的关于tendermint提供的RPC接口(三)/qkl/27416.html的相关信息了,希望能帮助到大家,更多金融相关信息,敬请关注知世金融网!

    网站内容均来自互联网,如侵害您的利益联系客服进行删除!

    关键词:接口
    (0)
    (0)

    上一篇:稀缺性与biteb估值

    下一篇:Miller Lite基于区块链的Trivia游戏涉及PayPal和加密货币

    本文标题:tendermint提供的RPC接口(三)

    本文地址:/index.php?s=article&c=search&keyword=%E6%8E%A5%E5%8F%A3

    金融知名领域

    南方财富网 | 金融界 | 金融界 |

    更多推荐

    • 茅台吃饱,经销商哭倒
      茅台吃饱,经销商哭倒
    • 汇金的五次增持从短期看具有一定的“稳定器“作用,但从市场表现看效果逐次递减
      汇金的五次增持从短期看具有一定的“稳定器“作用,但从市场表现看效果逐次递减
    • 158亿元!比亚迪收购!
      158亿元!比亚迪收购!
    • 9月价格回落近五成 “冷静期”酒店业备战“十一”市场
      9月价格回落近五成 “冷静期”酒店业备战“十一”市场
    • 2023哈马博览会哈尔滨银行展区精彩纷呈
      2023哈马博览会哈尔滨银行展区精彩纷呈
    • 大额解禁撂倒股价 医疗影像龙头跌出千亿俱乐部 葛兰二季度大幅减仓
      大额解禁撂倒股价 医疗影像龙头跌出千亿俱乐部 葛兰二季度大幅减仓
    • A股,又上了热搜!数字要素概念走高多股涨停,锂电池板块走低恩捷股份大举跌停
      A股,又上了热搜!数字要素概念走高多股涨停,锂电池板块走低恩捷股份大举跌停
    • 最新!巨头出手,加仓宁王51%
      最新!巨头出手,加仓宁王51%
    • 600亿巨头暴雷
      600亿巨头暴雷
    • 一天32家!科创板回购潮涌来
      一天32家!科创板回购潮涌来
    • 提振信心实招来了!30余家上市公司密集出手 最高要买10亿
      提振信心实招来了!30余家上市公司密集出手 最高要买10亿
    • 高盛再发50年后预测:2075年印度股市全球市值占比将升4倍 中国升3成
      高盛再发50年后预测:2075年印度股市全球市值占比将升4倍 中国升3成

    新闻资讯栏目

    站长QQ: 2397470084