博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
readme
阅读量:5102 次
发布时间:2019-06-13

本文共 1626 字,大约阅读时间需要 5 分钟。

如何使用 geth1.8来监听合约事件

新功能介绍

geth1.8版本带来了新的事件处理方式,使用 abigen 可以自动生成包含合约事件监听以及过滤相关代码.

这样就不用自己去写代码解析 log.
比如:

abigen --sol token.sol --pkg token --out token.go

一个例子

通过监听谁给我转账,来说明如何使用新的接口

创建 Filter

只需指定合约地址即可.

filter, err := token.NewTokenFilterer(tokenAddr, c)

监听将要发生的事件

这个应该放在过滤历史事件之前,因为有可能在处理历史事件过程中产生了新的事件.如果顺序错了,就会造成事件丢失.

ch := make(chan *token.TokenTransfer, 10)    sub, err := filter.WatchTransfer(nil, ch, nil, []common.Address{toAddr})    if err != nil {        log.Fatalf("watch transfer err %s", err)    }    go func() {        for {            select {            case <-sub.Err():                return            case e := <-ch:                log.Printf("new transfer event from %s to %s value=%s,at %d",                    e.From.String(), e.To.String(), e.Value, e.Raw.BlockNumber)            }        }    }()

简单直观,不用去关心 log 的细节.

感兴趣的话,可以看一下 TokenTranser 结构

// TokenTransfer represents a Transfer event raised by the Token contract.type TokenTransfer struct {    From  common.Address    To    common.Address    Value *big.Int    Raw   types.Log // Blockchain specific contextual infos

过滤历史事件

也很直观,把你感兴趣的事件范围传递进去,会返回一个 Iterator, 遍历就 ok 了.

history, err := filter.FilterTransfer(&bind.FilterOpts{Start: 480000}, nil, []common.Address{toAddr})    for history.Next() {        e := history.Event        log.Printf("%s transfer to %s value=%s, at %d", e.From.String(), e.To.String(), e.Value, e.Raw.BlockNumber)    }

结论

有了这些自动生成的代码以后,我们就不用费劲去理解过滤时候的 Topic 怎么设置,Log怎么解析. 直接关注我们想要的事件本身就可以了.

当然也不是没有问题,如果我关注的不是某个合约上发生了转账事件,而是所有的ERC20token, 那么该怎么写呢?
目前我是没想到怎么实现,要想这么做还是要回到老办法上.

转载于:https://www.cnblogs.com/baizx/p/9032817.html

你可能感兴趣的文章
【ASP.NET】演绎GridView基本操作事件
查看>>
ubuntu无法解析主机错误与解决的方法
查看>>
尚学堂Java面试题整理
查看>>
08-【jsp重点】
查看>>
小记:xml画一个爱心。
查看>>
MySQL表的四种分区类型
查看>>
7.26
查看>>
dll--二进制层面的复用
查看>>
linux 压缩/解压缩/打包命令
查看>>
守护进程
查看>>
CLR 关于强命名程序集 .
查看>>
[BZOJ 3489] A simple rmq problem 【可持久化树套树】
查看>>
如何制作并更改项目icon文件
查看>>
设计模式:迭代器模式(Iterator)
查看>>
cmd批处理常用符号详解
查看>>
关于给构造函数传达参数方法
查看>>
mysql忘记密码时如何修改root用户密码
查看>>
STM32单片机使用注意事项
查看>>
在linux中出现there are stopped jobs 的解决方法
查看>>
获取浏览器版本信息
查看>>