前言
在 Web3 领域,链上交易数据是上层应用的基础。无论是聪明钱追踪、代币数据服务、还是实时 K 线系统,都依赖同一个底层能力:
将区块链上的原始交易数据解析成结构化、可消费的业务事件。
但构建这样的解析层面临几个核心挑战:
- 多链异构:Solana 和 EVM 链(BSC、Base)的区块结构、交易模型、RPC 接口完全不同。Solana 有 Account Model、指令嵌套和 CPI(Cross-Program Invocation);EVM 链有
types.Block、Receipt、Event Log。解析器需要统一这两种范式。 - 协议多样性:仅 Solana 生态就有 Raydium、Meteora、PumpFun、Orca、Pancake 等十几种 DEX 协议,每种协议的指令编码方式(Borsh/自定)和账本结构各不相同。
- 实时性要求高:从区块产生 → 扫链 → 解析 → 发送下游,需要在秒级完成。区块不能积压,解析失败需自动重试。
- 可观测性:生产环境需要监控解析延迟、失败率、Kafka 生产速率、RPC 可用性等指标。
本文介绍一个用 Golang 构建的生产级多链交易解析服务。该服务已覆盖 Solana、BSC、Base、Polygon 四条链,支持 12+ DEX 协议,每日处理百万级交易。
一、系统架构
1.1 整体架构
整个系统分为两个独立微服务:Scanner(扫链)和 Parser(解析),通过 Kafka 解耦。
另外对于高实时要求的链如Solana会有GRPC(监听),redis里用lua脚本去重存到待解析tx队列,解析都是基于tx,而扫链也会结合ws监听出块已减少rpc请求(rpc节点压力过大性能会下降)。
flowchart TB
subgraph Blockchain["区块链网络"]
BSC["BSC Node"]
BASE["Base Node"]
POLYGON["Polygon Node"]
SOLANA["Solana Node"]
end
subgraph Scanner["Scanner Service"]
EVM1["EVM Scanner BSC
轮询 + RLP编码"]
EVM2["EVM Scanner Base
轮询 + RLP编码"]
EVM3["EVM Scanner Polygon
轮询 + RLP编码"]
SOL["Solana Scanner
轮询 + Vote过滤 + 拆分"]
RedisScan["Redis
扫描状态
最后区块号"]
end
subgraph Kafka["Kafka Message Queue"]
TOPIC_BSC["raw_block_BSC"]
TOPIC_BASE["raw_block_BASE"]
TOPIC_POLYGON["raw_block_POLYGON"]
TOPIC_SOL["raw_block_SOLANA"]
end
subgraph Parser["Parser Service"]
EP1["EVM Parser BSC
Receipt解析 + ERC20提取 + 并行"]
EP2["EVM Parser Base
Receipt解析 + ERC20提取 + 并行"]
SOLP["Solana Parser
Plugin 指令解析器
Token → DEX 两阶段"]
Sub["Submitter
多Topic分发"]
end
subgraph Output["下游 Kafka Topics"]
BT["block_topic
完整区块"]
TT["transfer_topic
钱包转账"]
LQ["liquidity_events
流动性变化"]
CT["token_events
代币创建/更新/发射"]
BL["balance_topic
余额快照"]
TL["trade_events
交易记录/币对创建"]
end
subgraph Storage["存储"]
PG[("PostgreSQL
钱包配置")]
RC[("Redis
状态/缓存/回溯")]
end
BSC --> EVM1
BASE --> EVM2
POLYGON --> EVM3
SOLANA --> SOL
EVM1 --> TOPIC_BSC
EVM2 --> TOPIC_BASE
EVM3 --> TOPIC_POLYGON
SOL --> TOPIC_SOL
RedisScan -.-> EVM1 & EVM2 & EVM3 & SOL
TOPIC_BSC --> EP1
TOPIC_BASE --> EP2
TOPIC_POLYGON --> EP2
TOPIC_SOL --> SOLP
EP1 & EP2 & SOLP --> Sub
Sub --> BT & TT & LQ & CT & BL
PG -.-> Parser
RC -.-> Scanner & Parser
more >>