Skip to main content
Leafage 是一套 EVM 状态查询与区块数据分发架构。它把传统全节点里耦合在一起的同步执行、状态存储、RPC 服务和数据导出拆开:一个写节点参与 P2P 同步并执行区块,执行产生的状态差异区块数据经 Kafka + S3 分发给任意数量的查询节点和外部消费者。客户端不直接访问任何节点,而是通过网关按区块上下文被路由到合适的查询节点。

一次执行,多处消费

Leafage 的本质是把“执行”和“消费执行结果”分开:
  • 写侧:这条链原本的执行客户端加上 pipeline 库。它是唯一执行区块的角色,执行时把状态差异、区块头、交易 / 追踪 / 事件导出到 S3,并向 Kafka 发布区块变更通知。
  • 读侧:leafage-evm 查询节点。它不同步、不执行区块、不维护 Merkle Patricia Trie,只按通知顺序把状态差异应用到本地状态,并用 revm 执行只读调用。
所有查询节点消费同一条单分区 Kafka 通知流,按相同顺序应用相同差异,因此不存在 P2P 同步的非确定性。新增查询能力只需要多启动一个查询节点,而不是再同步一次全链。

五个组件与它们的角色

组件之间不直接调用,只通过三样中间件协作:Kafka 传通知,S3 传数据体,etcd 传运行时状态。

在链路上流动的数据

写节点每执行一个区块,产出四类对象和一条通知: 内部桶和内部 topic 服务于 Leafage 自身的查询节点;外部桶和外部 topic 面向索引器、分析平台这类外部消费者。外部 topic 由 consistency-checker 发布,只包含已确认的区块。

三种查询节点

leafage-evm 按启动参数决定保留多少历史,分成 State 和 Archive 两种;Native 节点是原链的全节点,用来兜底。 nodex-proxy 按请求携带的区块上下文在三个节点池之间路由,并在 State 节点返回 -39006-39008 时自动改选 Archive 或 Native 节点重试。

区块的三种身份

同一个区块在链路上会经过三个阶段,分清它们才能读懂各组件的接口:

隔离单元:链与版本

一条链是一个独立的部署单元。Kafka topic、S3 键和 etcd 键都以 chainID 开头,多条链可以共用同一套 Kafka、S3 和 etcd。 启用版本模式后,键空间再加一段 version,让同一条链的两个数据版本在同一套基础设施上并行运行,并通过 etcd 的 {chainID}/version 切换,客户端无感知。

术语速查

小结

  • Leafage 是一套 EVM 状态查询与区块数据分发架构:只有写节点执行区块,其余角色消费执行结果。
  • 写侧导出 StateDiff、Header、BlockFile、BlockValidation 四类对象和一条区块变更通知;Kafka 只传通知,数据体走 S3。
  • 查询节点分 State / Archive / Native 三种,nodex-proxy 按区块上下文路由,并靠错误码自动兜底。
  • 一个区块有已发布、已确认、分叉块三种身份,外部消费者应当只依赖已确认的通知。
继续阅读: