下文中
{version} 段是可选的。启用版本模式后,Kafka topic、S3 键和 etcd 键都会带上版本命名空间,用于在同一套基础设施上并行运行多个数据版本。Kafka
内部 topic
写节点发布,leafage-evm 和 consistency-checker 消费。外部 topic
consistency-checker 发布,外部消费者订阅。leafage-evm 不消费这个 topic。is_fork 区分。版本模式下 checker 同时写 version topic 和 singleton topic,后者只有持有 etcd 锁的 Leader 才写。
S3
两个桶按消费者划分,键都以chainID 开头,因此多条链可以共用同一个桶。
内部桶(NodeX Bucket)
StateDiff 以 state root 而非区块哈希为键:state root 相同的相邻区块共享同一个对象,空块因此不产生新对象。leafage-evm 在父块与当前块 state root 相同时会跳过拉取,直接视为空差异。
外部桶(ChainTable Bucket)
BlockFile 包含区块、交易、调用追踪和事件日志,是外部消费者的主要数据来源。BlockValidation 是同一份数据的校验摘要,同时充当按高度的索引:
{chainID}[/{version}]/{height}/ 下列出的对象即该高度的所有候选区块。两个组件依赖这个索引:
- consistency-checker 把非规范的对象重写为
is_fork: true - leafage-evm 在 S3 追赶时用它把高度解析为规范区块哈希
docs/protocol.md。
etcd 键空间
所有键以chainID 开头(可选 version 段),不同链天然隔离。
节点信息的结构:
版本切换
{chainID}/version 是版本模式的控制点,两个组件同时读它:
- consistency-checker 比较自身
version配置与 etcd 中的值,一致时争抢{chainID}/outer_block_notice锁,成为向 singleton topic 发布的 Leader。 - nodex-proxy 把请求里的基础
chainId改写为{chainId}-{version},路由到版本化的节点池。
RPC 契约
trace_debankBlock
写节点提供,用于在没有 Kafka 的场景下获取单个区块的完整执行输出。leafage-evm 的 HTTP 回退模式依赖它。
DebankOutPut,包含 BlockFile、Header、StateDiff 和 ValidationHash——与 S3 上四类对象的内容一一对应。
健康检查
nodex-proxy 的健康检查每 5 秒重试一次,直到
node_health_check_max_wait(默认 300 秒)。只有通过检查的节点才会进入负载均衡池。
路由相关错误码
leafage-evm 返回这些错误码时,nodex-proxy 会自动改选节点池重试一次。兼容性约定
改动跨组件接口时需要注意:- Kafka 消息结构只增字段、不改语义。消费者用 JSON 解码,多余字段会被忽略,但缺字段会导致零值误判。
- S3 键格式是 leafage-evm、consistency-checker 和外部消费者共同依赖的硬编码约定,改动需要同步三方并考虑存量对象。
- etcd 键格式同样硬编码在三个组件里,
{chainID}与{version}段的拼接方式必须一致。 - 错误码是路由行为的一部分,新增需要在 nodex-proxy 侧同步处理逻辑。