这是一个支持多链的区块链扫描器,可以监控以太坊系链(ETH/BSC)和 Solana 链上的转账事件,并将数据存储到 MySQL 数据库中。
- 链客户端: 通过 ChainClient 接口实现多链适配
- 扫描器: 批次扫描 + 定时扫描机制
- 数据库: MySQL 存储事件和扫描记录
- 并发控制: 信号量控制并发数,避免 RPC 压力过大
- Go 1.24.0 或更高版本
- MySQL 数据库
- 支持的区块链 RPC 服务
git clone <repository-url>
cd multi-chain-scannergo mod tidy修改 config/config.yaml 文件:
修改 database.dsn 为你的 MySQL 连接信息(格式:用户名:密码@tcp(地址:端口)/数据库名?参数)
# 多链配置
chains:
- chain_id: "eth-mainnet"
chain_type: "ethereum"
rpc_url: "https://mainnet.infura.io/v3/YOUR_API_KEY" # 替换为你的 RPC URL
contract_configs:
- contract_address: "0xdAC17F958D2ee523a2206206994597C13D831ec7" # USDT
start_block: 463442 # USDT部署块高
topic0: "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef" # Transfer事件签名
- chain_id: "bsc-mainnet"
chain_type: "ethereum"
rpc_url: "https://bsc-dataseed1.binance.org/"
contract_configs:
- contract_address: "0x55d398326f99059fF775485246999027B3197955" # USDT
start_block: 2508353 # USDT部署块高
topic0: "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"
- chain_id: "sol-mainnet"
chain_type: "solana"
rpc_url: "https://api.mainnet-beta.solana.com"
contract_configs:
- contract_address: "Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB" # USDT
start_block: 0 # Solana从创世块开始
# 扫描参数配置
scan:
max_batch: 1000 # 单次最大扫块数
scan_interval: 180 # 定时扫描间隔(秒)
max_concurrency: 5 # 最大并发数
retry_max: 3 # RPC请求重试次数
retry_delay: 2 # 重试延迟(秒)
# 数据库配置
database:
dsn: "root:your_password@tcp(127.0.0.1:3306)/chain_scanner?charset=utf8mb4&parseTime=True&loc=Local" # 修改为你的数据库连接信息
max_open_conns: 20
max_idle_conns: 10
conn_max_lifetime: 3600 # 连接最大存活时间(秒)
# 日志配置
logger:
level: "info"
path: "./logs"cd cmd/scanner
go run main.gomulti-chain-scanner/
├── cmd/
│ └── scanner/
│ └── main.go // 程序入口
├── config/
│ ├── config.go // 配置加载逻辑
│ └── config.yaml // 多链配置文件
├── internal/
│ ├── chain/
│ │ ├── client.go // 多链RPC客户端管理
│ │ ├── eth_client.go // ETH/BSC客户端实现
│ │ └── sol_client.go // Solana客户端实现
│ ├── db/
│ │ ├── db.go // 数据库连接与迁移
│ │ └── model/
│ │ ├── scan_record.go // 扫描记录模型
│ │ └── transfer_event.go // 转账事件模型
│ ├── scanner/
│ │ ├── batch_scanner.go // 分批扫描逻辑
│ │ ├── event_filter.go // 事件过滤(eth_getLogs封装)
│ │ ├── periodic.go // 定时扫描任务
│ │ └── state_manager.go // 扫描状态管理(断点续扫)
│ └── util/
│ ├── concurrency.go // 并发控制工具
│ ├── logger.go // 日志工具
│ └── retry.go // 重试工具
├── go.mod
└── go.sum
- 以太坊系链: 使用
eth_getLogsAPI 获取事件 - Solana: 使用
getSignaturesForAddress+getTransaction方式
- 断点续扫: 自动从上次扫描位置继续
- 重试机制: 网络异常自动重试
- 并发控制: 限制并发数量,保护 RPC 服务
- 自动建表: 启动时自动创建数据库表
- 防重复: 基于交易哈希的唯一索引
- 扫描记录: 记录扫描状态和错误信息
- 数据库连接失败: 检查
database.dsn配置 - RPC 调用失败: 检查 RPC URL 是否正确,API 密钥是否有效
- 并发过高: 调整
max_concurrency参数
- 日志文件路径:
./logs/scanner.log - 日志级别: 可通过
logger.level配置
- API 密钥: 使用主流区块链 API 服务时需要替换为自己的 API 密钥
- 性能调优: 根据 RPC 服务限制调整并发数和批次大小
- 存储容量: 长期运行会产生大量数据,注意数据库存储空间
- ✅ 多链支持
- ✅ 断点续扫
- ✅ 并发控制
- ✅ 重试机制
- ✅ 日志记录
项目已具备基本功能,可直接部署使用。