两种语义:Equals 与 Contains
DeBank 命名空间的方法(contractMultiCall、estimateGas、getAddressBalance 等)接受一个可选的 blockCtx 参数:
Contains 适合“数据不比某个高度旧就行”的场景,例如读取一个很久没变过的配置槽位。Equals 适合需要可复现结果的场景,例如对账和历史回溯。
省略 blockCtx 等同于 { "block_id": "latest", "type": "Equals" }。
block_id 的写法
标准 eth_* 方法的区块参数
eth_call、eth_getBalance 这类方法沿用以太坊的区块参数("latest"、十六进制高度或 {"blockHash": …})。leafage-evm 按 Equals 语义处理它们:请求哪个高度就在哪个高度的状态上执行。
nodex-proxy 只把 blockCtx 形式的对象解析为区块上下文,eth_* 方法的区块参数不参与选池。这类请求先发往 State 节点,State 节点返回 -39006 时再由 proxy 改发 Archive 节点。要跳过这一跳,在请求头里显式指定:
路由规则
nodex-proxy 先按区块上下文选节点池,再在池内按权重或轮询选具体节点。链头高度来自 etcd 的{chainID}[/{version}]/lastBlockNumber,即 consistency-checker 写入的已确认高度。
两个池互为兜底:State 池为空时用 Archive 池,反之亦然。只有一个池的链会跳过上下文解析。
proxy 侧的“64”是硬编码,leafage-evm 侧的窗口由
--diff-depth-limit 控制,默认值恰好也是 64。把查询节点的窗口调小而 proxy 不变,会让一部分本该去 Archive 的请求先在 State 节点上失败一次。错误码驱动的兜底
三个错误码把“节点没有这份状态”翻译成路由动作:
已经在 Archive 节点上的请求不会再次重试。直连 leafage-evm 的客户端需要自己处理这三个错误码。
小结
- 区块上下文回答“要哪个区块的状态”,有
Equals(精确)和Contains(不早于即可)两种语义,省略即latest。 Contains在 leafage-evm 侧永远走latest状态,在 proxy 侧永远走 State 节点。eth_*方法的区块参数不参与选池,靠-39006回退到 Archive;x-nodex-node-type: archive可以强制。- 路由阈值以 etcd 中的已确认高度为基准,前后 64 块分界。
- 发送 RPC 请求:带
blockCtx的完整请求示例。 - nodex-proxy 组件文档:负载均衡策略与方法级路由。
- RPC 参考:完整错误码表。