Skip to content

git-yao/multi-chain-scanner

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

多链区块链扫描器

项目简介

这是一个支持多链的区块链扫描器,可以监控以太坊系链(ETH/BSC)和 Solana 链上的转账事件,并将数据存储到 MySQL 数据库中。

项目架构

  • 链客户端: 通过 ChainClient 接口实现多链适配
  • 扫描器: 批次扫描 + 定时扫描机制
  • 数据库: MySQL 存储事件和扫描记录
  • 并发控制: 信号量控制并发数,避免 RPC 压力过大

环境要求

  • Go 1.24.0 或更高版本
  • MySQL 数据库
  • 支持的区块链 RPC 服务

快速开始

1. 克隆项目

git clone <repository-url>
cd multi-chain-scanner

2. 安装依赖

go mod tidy

3. 配置文件

修改 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"

4. 启动项目

cd cmd/scanner
go run main.go

项目结构

multi-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

功能特性

1. 多链支持

  • 以太坊系链: 使用 eth_getLogs API 获取事件
  • Solana: 使用 getSignaturesForAddress + getTransaction 方式

2. 高可用性

  • 断点续扫: 自动从上次扫描位置继续
  • 重试机制: 网络异常自动重试
  • 并发控制: 限制并发数量,保护 RPC 服务

3. 数据管理

  • 自动建表: 启动时自动创建数据库表
  • 防重复: 基于交易哈希的唯一索引
  • 扫描记录: 记录扫描状态和错误信息

常见问题

  1. 数据库连接失败: 检查 database.dsn 配置
  2. RPC 调用失败: 检查 RPC URL 是否正确,API 密钥是否有效
  3. 并发过高: 调整 max_concurrency 参数

日志查看

  • 日志文件路径: ./logs/scanner.log
  • 日志级别: 可通过 logger.level 配置

注意事项

  1. API 密钥: 使用主流区块链 API 服务时需要替换为自己的 API 密钥
  2. 性能调优: 根据 RPC 服务限制调整并发数和批次大小
  3. 存储容量: 长期运行会产生大量数据,注意数据库存储空间

项目状态

  • ✅ 多链支持
  • ✅ 断点续扫
  • ✅ 并发控制
  • ✅ 重试机制
  • ✅ 日志记录

项目已具备基本功能,可直接部署使用。

About

多链区块链扫描器

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages