这是一个用于从以太坊区块链获取指定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中
- 自动去重: 使用池地址作为唯一标识,自动更新已存在的记录
- 批量操作: 支持批量插入和更新,提高性能
- 索引优化: 建议在池地址字段上创建索引
- 快速访问: 交易对数据缓存在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来解析以太坊事件日志,自动将原始的十六进制数据转换为可读的参数值。
当前支持解析以下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
💾 已保存到数据库
在配置文件中设置 "enable_abi": false 即可禁用ABI解析功能:
{
"enable_abi": false
}工具支持两种区块号格式:
- 十进制格式(推荐): 直接使用数字,如
678935 - 十六进制格式: 使用
0x前缀,如0x678935
注意: 无论输入格式如何,工具都会在内部将区块号转换为十六进制格式发送给RPC节点,这是以太坊JSON-RPC协议的要求。
# 使用默认配置文件运行
go run .
# 创建默认配置文件
go run . -create-config
# 查看当前配置
go run . -show-config# 使用自定义配置文件
go run . -config my-config.json
# 创建自定义配置文件
go run . -create-config -config production.json创建 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
}# 开发环境
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
💾 已保存到数据库
{
"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 |
|---|---|
| ERC20 Transfer | 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef |
| ERC20 Approval | 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925 |
| ERC721 Transfer | 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef |
| ERC1155 TransferSingle | 0xc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62 |
- 请求频率: 工具内置了100ms的请求间隔,避免过于频繁的请求
- 区块范围: 如果结束区块小于开始区块,程序会自动交换它们
- 错误处理: 如果某个区间查询失败,程序会继续查询下一个区间
- RPC限制: 某些RPC节点可能有查询范围限制,建议使用较小的步长
- 文件输出: JSON文件包含完整的日志信息,便于后续分析
- 连接超时: 检查RPC节点URL是否正确,网络连接是否正常
- RPC错误: 某些节点可能不支持大范围查询,尝试减小步长
- 解析错误: 确保区块号格式正确(十进制或十六进制)
- 文件权限: 确保有写入输出文件的权限
- 对于大范围查询,建议使用较大的步长(如2000-5000)
- 对于精确查询,使用较小的步长(如100-500)
- 如果查询速度较慢,可以调整
time.Sleep的延迟时间 - 对于大量数据,建议使用输出文件功能保存结果
MIT License