readme

简介: 如何使用 geth1.8来监听合约事件新功能介绍geth1.8版本带来了新的事件处理方式,使用 abigen 可以自动生成包含合约事件监听以及过滤相关代码.这样就不用自己去写代码解析 log.比如:abigen --sol token.

如何使用 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, 那么该怎么写呢?
目前我是没想到怎么实现,要想这么做还是要回到老办法上.

目录
相关文章
|
SQL IDE Java
IDEA控制台如何查看格式化的SQL(MyBatis Log插件)
IDEA控制台如何查看格式化的SQL(MyBatis Log插件)
2375 0
|
C++ 索引
vscode clangd c++开发常见问题和解决方案
vscode clangd c++开发常见问题和解决方案
3392 0
|
11月前
|
存储 关系型数据库 分布式数据库
基于PolarDB Ganos的气象数据处理:恶劣气象预警
本文介绍了在航海恶劣天气预警的场景中,PolarDB Ganos利用栅格模型对基于NetCDF的气象预测数据入库,利用数据库函数计算恶劣天气范围,并将其存储在PolarDB中。通过Ganos实时电子围栏功能,对船只位置并与恶劣天气范围对比,实现航海恶劣气象预警功能。
Error:java: 错误: 无效的源发行版:13, 类文件具有错误的版本 61.0, 应为 55.0 请删除该文件或确保该文件位于正确的类路径子目录中。
Error:java: 错误: 无效的源发行版:13, 类文件具有错误的版本 61.0, 应为 55.0 请删除该文件或确保该文件位于正确的类路径子目录中。
|
NoSQL Linux 开发工具
百度搜索:蓝易云【VSCode+GDB+Qemu调试ARM64 linux内核教程。】
请注意,根据你的具体环境和需求,上述步骤可能会有所调整和修改。建议参考相关文档和资源,以获得更详细的配置和调试指南。
273 0
|
存储 Java 关系型数据库
分布式定时任务框架Quartz总结和实践(2)—持久化到Mysql数据库
本文主要介绍分布式定时任务框架Quartz集成SpringBoot持久化数据到Mysql数据库的操作,上一篇文章使用Quartz创建定时任务都是保存在内存中,如果服务重启定时任务就会失效,所以Quartz官方也提供将定时任务等信息持久化到Mysql数据库的功能,本文主要实现这种Quartz的这种使用方式。
1804 0
分布式定时任务框架Quartz总结和实践(2)—持久化到Mysql数据库
|
Web App开发 Java 测试技术
2022 PlantUML 这款 IDEA 插件能搞,流程图、架构图,N种图... 简直神器!
2022 PlantUML 这款 IDEA 插件能搞,流程图、架构图,N种图... 简直神器!
1032 0
|
前端开发 JavaScript IDE
【Java基础知识3】Java注释:单行、多行、文档注释(如何通过 javadoc 命令生成代码文档、如何在IEDA配置自动为所有的类都添加创建者和创建日期)
【Java基础知识3】Java注释:单行、多行、文档注释(如何通过 javadoc 命令生成代码文档、如何在IEDA配置自动为所有的类都添加创建者和创建日期)
581 0
【Java基础知识3】Java注释:单行、多行、文档注释(如何通过 javadoc 命令生成代码文档、如何在IEDA配置自动为所有的类都添加创建者和创建日期)
|
开发框架 缓存 安全
Hibernate Validator的应用实践
Hibernate Validation目前最新的稳定版本是:5.1.3。 下载地址 官网地址 官方英文使用手册 官方中文使用手册地址 (中文版目前最新的是4.3版本) 具体用法可以参考官方文档。
349 0