Skip to content

zhuangyun7/personal

Repository files navigation

以太坊日志获取工具

这是一个用于从以太坊区块链获取指定topic日志的Go工具。它支持在指定的区块范围内循环获取日志,并自动将大范围分割成小块进行查询。

功能特性

  • 🔍 日志获取: 支持指定区块范围获取以太坊日志
  • 📋 ABI解析: 自动解析日志数据,提取事件参数
  • 🏊 交易对识别: 自动识别Uniswap V3的PoolCreated事件
  • 💾 数据存储: 支持MongoDB和Redis存储
  • ⚙️ 配置管理: 支持JSON配置文件
  • 🔄 倒序查询: 从最新区块往前查询,避免早期区块超时问题
  • 🚀 性能优化: 事件签名缓存,避免重复计算

倒序查询优势

  • 避免超时: 早期区块查询容易超时,倒序查询从最新区块开始
  • 提高效率: 最新区块通常响应更快
  • 更好的用户体验: 优先获取最新的交易对信息

性能优化

事件签名缓存

  • 全局缓存: 使用全局map缓存已计算的事件签名
  • 避免重复计算: 相同的事件签名只计算一次
  • 动态计算: 支持不同合约的相同事件名但不同参数
  • 缓存统计: 程序结束时显示缓存使用情况

缓存示例

📊 事件签名缓存统计:
   缓存大小: 2
   缓存的签名:
     PoolCreated(address,address,uint24,int24,address) -> 0x783cca1c0412dd0d695e784568c96da2e9c22ff989357a2e8b1d9b2b4e6b7118
     Transfer(address,address,uint256) -> 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef

安装和运行

前置要求

  • Go 1.16 或更高版本

运行方式

# 使用默认配置文件运行
go run .

# 创建默认配置文件
go run . -create-config

# 查看当前配置
go run . -show-config

# 使用自定义配置文件
go run . -config my-config.json

# 禁用ABI解析功能(在配置文件中设置)
# 编辑 config.json 文件,设置 "enable_abi": false

配置文件

程序支持使用JSON配置文件来管理参数,默认配置文件为 config.json

配置文件格式

{
  "rpc_url": "https://rpc.hyperliquid.xyz/evm",
  "factory_contract": "0xb1c0fa0b789320044a6f623cfe5ebda9562602e3",
  "topic": "0x783cca1c0412dd0d695e784568c96da2e9c22ff989357a2e8b1d9b2b4e6b7118",
  "start_block": "6788111",
  "end_block": "6788311",
  "block_step": 1000,
  "output_file": "",
  "enable_abi": true,
  "mongo_uri": "mongodb://localhost:27017",
  "mongo_database": "dex_pool",
  "mongo_collection": "swap_pairs",
  "redis_addr": "localhost:6379",
  "redis_password": "",
  "redis_db": 0
}

配置参数说明

参数 类型 默认值 说明
rpc_url string https://rpc.hyperliquid.xyz/evm RPC节点URL
factory_contract string 0xb1c0fa0b789320044a6f623cfe5ebda9562602e3 要查询的合约地址
topic string 0x783cca1c0412dd0d695e784568c96da2e9c22ff989357a2e8b1d9b2b4e6b7118 要查询的topic
start_block string 6788111 开始区块(支持十进制或十六进制)
end_block string 6788311 结束区块(支持十进制或十六进制)
block_step int64 1000 每次查询的区块步长
output_file string `` 输出文件路径(可选,保存为JSON格式)
enable_abi bool true 是否启用ABI解析功能
mongo_uri string mongodb://localhost:27017 MongoDB连接URI
mongo_database string dex_pool MongoDB数据库名
mongo_collection string swap_pairs MongoDB集合名
redis_addr string localhost:6379 Redis服务器地址
redis_password string `` Redis密码
redis_db int 0 Redis数据库编号

命令行参数

参数 说明
-config 指定配置文件路径(默认:config.json)
-create-config 创建默认配置文件
-show-config 显示当前配置信息

数据库存储功能

工具支持将解析的交易对数据自动保存到MongoDB和Redis数据库中。

MongoDB存储

  • 持久化存储: 交易对数据永久保存在MongoDB中
  • 自动去重: 使用池地址作为唯一标识,自动更新已存在的记录
  • 批量操作: 支持批量插入和更新,提高性能
  • 索引优化: 建议在池地址字段上创建索引

Redis缓存

  • 快速访问: 交易对数据缓存在Redis中,提供快速查询
  • 自动过期: 缓存数据24小时后自动过期
  • 批量操作: 支持pipeline批量设置,提高性能
  • 统计信息: 支持存储池的实时统计信息

数据格式

MongoDB中的数据结构:

{
  "_id": "ObjectId",
  "b": 1,
  "s": "uniswap_v3",
  "fc": "0xb1c0fa0b789320044a6f623cfe5ebda9562602e3",
  "p": "0x1234567890abcdef...",
  "t0": "0xabcdef1234567890...",
  "t1": "0xfedcba0987654321...",
  "sb0": "USDC",
  "sb1": "ETH",
  "r0": 1000000.0,
  "r1": 500.0,
  "mv": 1000000.0,
  "qmv": 500000.0,
  "pr": 2000.0,
  "pu": 2000.0,
  "ts": 1640995200,
  "bn": 678936,
  "ch": "0x1234567890abcdef...",
  "ct": 1640995200
}

数据库配置示例

{
  "mongo_uri": "mongodb://username:password@localhost:27017",
  "mongo_database": "dex_pool",
  "mongo_collection": "swap_pairs",
  "redis_addr": "localhost:6379",
  "redis_password": "your_redis_password",
  "redis_db": 0
}

使用方式

# 启用数据库存储(需要配置数据库连接信息)
go run . -config config-with-db.json

# 仅使用MongoDB(不配置Redis)
go run . -config mongo-only.json

# 仅使用Redis(不配置MongoDB)
go run . -config redis-only.json

ABI解析功能

工具支持使用指定的ABI来解析以太坊事件日志,自动将原始的十六进制数据转换为可读的参数值。

支持的事件类型

当前支持解析以下Uniswap V3事件:

  • PoolCreated: 池创建事件

    • token0: 代币0地址
    • token1: 代币1地址
    • fee: 手续费率
    • tickSpacing: 价格刻度间距
    • pool: 创建的池地址
  • FeeAmountEnabled: 手续费启用事件

    • fee: 手续费率
    • tickSpacing: 价格刻度间距
  • OwnerChanged: 所有者变更事件

    • oldOwner: 原所有者地址
    • newOwner: 新所有者地址

解析示例

启用ABI解析后,日志输出将显示解析后的参数:

开始获取日志,区块范围: 11648 - 12647,步长: 1000(倒序查询)
目标Topic: 0x783cca1c0412dd0d695e784568c96da2e9c22ff989357a2e8b1d9b2b4e6b7118
✅ 已启用ABI解析功能
============================================================
请求 #1: 获取区块 11648 - 12647 的日志...
✅ 找到 1 条日志
  日志 #1: 区块 12345, 交易 0x1234..., 地址 0x0000...
  📋 事件: PoolCreated
  📊 参数:
    token0: 0x1234567890123456789012345678901234567890
    token1: 0x0987654321098765432109876543210987654321
    fee: 3000
    pool: 0xabcdef1234567890abcdef1234567890abcdef12
  🏊 创建池: 0xabcdef1234567890abcdef1234567890abcdef12
  🪙 Token0: 0x1234567890123456789012345678901234567890
  🪙 Token1: 0x0987654321098765432109876543210987654321
  💾 已保存到数据库

禁用ABI解析

在配置文件中设置 "enable_abi": false 即可禁用ABI解析功能:

{
  "enable_abi": false
}

区块号格式说明

工具支持两种区块号格式:

  1. 十进制格式(推荐): 直接使用数字,如 678935
  2. 十六进制格式: 使用 0x 前缀,如 0x678935

注意: 无论输入格式如何,工具都会在内部将区块号转换为十六进制格式发送给RPC节点,这是以太坊JSON-RPC协议的要求。

使用示例

1. 基本使用

# 使用默认配置文件运行
go run .

# 创建默认配置文件
go run . -create-config

# 查看当前配置
go run . -show-config

2. 自定义配置

# 使用自定义配置文件
go run . -config my-config.json

# 创建自定义配置文件
go run . -create-config -config production.json

3. 配置文件示例

创建 my-config.json 文件:

{
  "rpc_url": "https://mainnet.infura.io/v3/YOUR_PROJECT_ID",
  "factory_contract": "0xb1c0fa0b789320044a6f623cfe5ebda9562602e3",
  "topic": "0x783cca1c0412dd0d695e784568c96da2e9c22ff989357a2e8b1d9b2b4e6b7118",
  "start_block": "678935",
  "end_block": "6789405",
  "block_step": 500,
  "output_file": "logs.json",
  "enable_abi": true,
  "mongo_uri": "mongodb://localhost:27017",
  "mongo_database": "dex_pool",
  "mongo_collection": "swap_pairs",
  "redis_addr": "localhost:6379",
  "redis_password": "",
  "redis_db": 0
}

4. 不同环境配置

# 开发环境
go run . -config dev-config.json

# 生产环境
go run . -config prod-config.json

# 测试环境
go run . -config test-config.json

输出示例

控制台输出

开始获取日志,区块范围: 11648 - 12647,步长: 1000(倒序查询)
目标Topic: 0x783cca1c0412dd0d695e784568c96da2e9c22ff989357a2e8b1d9b2b4e6b7118
✅ 已启用ABI解析功能
============================================================
请求 #1: 获取区块 11648 - 12647 的日志...
✅ 找到 1 条日志
  日志 #1: 区块 12345, 交易 0x1234..., 地址 0x0000...
  📋 事件: PoolCreated
  📊 参数:
    token0: 0x1234567890123456789012345678901234567890
    token1: 0x0987654321098765432109876543210987654321
    fee: 3000
    pool: 0xabcdef1234567890abcdef1234567890abcdef12
  🏊 创建池: 0xabcdef1234567890abcdef1234567890abcdef12
  🪙 Token0: 0x1234567890123456789012345678901234567890
  🪙 Token1: 0x0987654321098765432109876543210987654321
  💾 已保存到数据库

JSON文件格式

{
  "total_count": 15,
  "timestamp": "2025-06-26 15:09:41",
  "logs": [
    {
      "address": "0x039e2fb66102314ce7b64ce5ce3e5183bc94ad38",
      "topics": [
        "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
        "0x0000000000000000000000000000000000000000000000000000000000000000",
        "0x000000000000000000000000ca13a0a221ef0c5a1343ff262c94d6eb58562e59"
      ],
      "data": "0x00000000000000000000000000000000000000000000000006f05b59d3b20000",
      "blockNumber": "0xa5c17",
      "transactionHash": "0x2096b4437d52dfe5f65628ac9909257489343ff172b006d9a5716f502c549ffe",
      "transactionIndex": "0x0",
      "blockHash": "0x913d38cfae0c85a0c632ad2f8a2076669e050404563adade3d80958957f6b6f1",
      "logIndex": "0x0",
      "removed": false
    }
  ]
}

常见Topic

事件类型 Topic
ERC20 Transfer 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef
ERC20 Approval 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925
ERC721 Transfer 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef
ERC1155 TransferSingle 0xc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62

注意事项

  1. 请求频率: 工具内置了100ms的请求间隔,避免过于频繁的请求
  2. 区块范围: 如果结束区块小于开始区块,程序会自动交换它们
  3. 错误处理: 如果某个区间查询失败,程序会继续查询下一个区间
  4. RPC限制: 某些RPC节点可能有查询范围限制,建议使用较小的步长
  5. 文件输出: JSON文件包含完整的日志信息,便于后续分析

故障排除

常见错误

  1. 连接超时: 检查RPC节点URL是否正确,网络连接是否正常
  2. RPC错误: 某些节点可能不支持大范围查询,尝试减小步长
  3. 解析错误: 确保区块号格式正确(十进制或十六进制)
  4. 文件权限: 确保有写入输出文件的权限

性能优化

  • 对于大范围查询,建议使用较大的步长(如2000-5000)
  • 对于精确查询,使用较小的步长(如100-500)
  • 如果查询速度较慢,可以调整time.Sleep的延迟时间
  • 对于大量数据,建议使用输出文件功能保存结果

许可证

MIT License

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages