事件过滤器

过滤想要的智能合约事件

Posted by Lengzhao Blog on November 3, 2022

 合约事件监听

监听链上事件,保存到数据库,并可以推送到指定服务。

当前只支持EVM的链,ethereum、polygon、BSC……

github代码

说明

主程序路径:cmd/event_filter

log_file:
log_level: 3
chain:
  rpc_node: https://eth-mainnet.g.alchemy.com/v2/kk6oTEe0a35zzK3Ia67SZtzzibO2N8Fq
  delay_block: 7
db:
  engine: sqlite
  dsn: sqlite.db
  log_level: 2
subscriptions:
  - alias: token
    contract: 
      - 0x2260fac5e5542a773aa44fbcfedf7c193bc2c599
    abi_file: erc20
    event_name: Transfer
    filter: 
    start_block: 15817750
    blocks_per_req: 5
    wait_per_req: 1000
    web_hook: http://127.0.0.1:8080/notify/001
  - alias: token2
    contract: 
      - 0x2260fac5e5542a773aa44fbcfedf7c193bc2c599
    abi_file: erc20
    event_name: Approve
    filter: 
    start_block: 15817750
    blocks_per_req: 5
    wait_per_req: 1000
    web_hook: 
http:
  port: 8080
  prefix_path: /blockchain/event/
  1. 只需要修改好配置文件,启动程序就可以
  2. chain
    1. rpc_node:区块链节点的RPC地址
    2. delay_block: 区块链的区块确认数,防止分叉导致日志不准确
  3. db: 数据库的相关配置
    1. engine:数据库类型,支持本地的sqlite,支持mysql/postgres/sqlserver
    2. dsn:连接数据库的参数,如果是sqlite,对应的是文件名
  4. subscriptions:要订阅/过滤的事件,它是一个数组,可以同时监听多个事件
    1. alias:别名,不允许重名,不同的alias的事件,存储在不同的数据库表中
    2. contract:要监听的智能合约地址,它是一个数组,允许监听多个相同类型合约
    3. abi_file:智能合约的abi文件,默认支持erc20/erc721/erc1155(这3个配置将使用内置的abi文件)
    4. event_name:要监听的事件名(要在abi文件中);如果为空,则监听合约的所有事件
    5. filter:它是map[string]string,想要进一步过滤的事件,比如转账的收款地址,则可以设置 to:0x1234…
    6. start_block: 从该区块开始过滤事件
    7. web_hook:允许为空,非空则表示想要接受事件推送,有新的事件,将用http.POST数据到对应url
  5. http: 启动一个http服务,可以让业务按需主动查询事件
    1. port:服务端口
    2. prefix_path:服务的path的前缀,具体有两个子路径”/logs”和”/unnotified_logs”
    3. 请求方法都是GET,请求参数有alias,offset,limit(默认20)