模块
两种集成模式
- Live Tracer
- RPC Tracer
追踪器嵌入区块执行流程,实时采集并上传。零额外延迟,但需要修改执行客户端的核心代码。
采集机制
CallTracer
维护调用栈并构建调用树。OnEnter 压栈,OnExit 出栈并挂到父帧下。
- 存储变更标记:识别
SSTORE指令,把StorageChange向上传播到祖先调用 - 失败隔离:调用失败时标记自身及所有子调用的
ParentFailed,展平后进入ErrorTraces/ErrorEvents - ID 生成:trace ID 为
hash(tx_id, parent_trace_id, position),event ID 为hash(parent_trace_id, position),保证跨区块可复现
StateDiff 的两条路径
第二种用于没有 commit hook 的客户端。
originRoot == root 时不生成差异对象。
上传与发布
OnCommit 里并发执行四路上传:
- StateDiff 用 RLP:只被内部组件消费,体积比 JSON 小得多。
- BlockFile 用 JSON:外部消费者需要能直接解析。
s3_temp_dir 后启用本地缓存:先落盘再异步上传,上传成功后删除本地文件。
S3 返回 5xx 时按退避重试,重试次数计入 pipeline/s3_upload_retry。
Leader 选举
多个写节点可以同时运行 pipeline,但只有 Leader 向 Kafka 发布通知,所有实例都上传 S3。S3 对象以哈希和 state root 为键,重复上传是幂等的。- etcd 自动选举
- 手动指定
配置
etcd_endpoints,把 is_backup 留空。- 键不存在时抢占,存在时 watch。
- 键被删除后随机退避再抢,避免惊群。
- 成为 Leader 前等待
grace_period(默认 10 秒),让上一任 Leader 完成收尾。
{chainID}[/{version}]/writers/{nodeID},节点故障时自动清理。nodex-proxy 的 /{chainId}/writers 管理接口读的就是这份数据。
配置
传给NewPipelineTracer 的 JSON(即 geth 的 --vmtrace.jsonconfig):
指标
通过 go-ethereum 的 metrics 体系暴露。开发
相关文档
仓库内还有三份更细的文档:docs/architecture.md— 模块细节、数据流、部署docs/protocol.md— 所有数据类型的字段级定义docs/integration-modes.md— 两种集成模式的对比
接口契约
Kafka 消息与 S3 键的精确格式。
接入新链
把 pipeline 适配到 Geth、旧版 Geth 或 Reth 分叉。