oracle-system
概述
Lido 的 Oracle 体系本质上是一个 分层 + 解耦的状态同步与执行系统,由三类核心组件组成:
HashConsensus -> BaseOracle -> 具体 Oracle(Accounting / ExitBus)
其中:
HashConsensus:负责对 report hash 达成共识BaseOracle:负责管理 processing 状态机- 各类 Oracle:负责具体业务执行
在 Lido 中,Oracle 并不是单一模块,而是拆分为两条核心链路:
🔥 AccountingOracle(状态同步) + ValidatorsExitBusOracle(退出触发)
1. Oracle 分层架构
1.1 HashConsensus:只做“选 hash“
职责:
- 管理 oracle committee 成员
- 管理 frame / refSlot / deadline
- 收集 member 提交的 report hash
- 达成 quorum 共识
特点:
只处理 hash,不处理业务数据
1.2 BaseOracle: processing 状态机
职责:
- 接收已达成共识的
(hash, refSlot) - 存储当前可处理的 report
- 控制 processing 生命周期:
- 是否可以开始处理
- 是否已经处理过
- 是否锁定当前 frame
特点:
只管理“什么时候处理”,不关心“处理什么”
1.3 业务 Oracle:执行真实逻辑
在 BaseOracle 之上,Lido 实现了两类 Oracle:
✅ AccountingOracle(状态同步)
负责:
- 同步 CL balance / validators
- 同步 module exited validators(汇总 + 明细)
- 处理 withdrawal finalization
- 归集 vault ETH(EL rewards + withdrawals)
- 计算 rewards / fee 并分配
- 执行 stETH rebase
本质:
一个“状态机 + 结算引擎”
✅ ValidatorsExitBusOracle(退出触发)
负责:
- 决定哪些 validator 应该 exit
- emit exit request
- 调用 Gateway 触发 CL exit
本质:
一个“执行触发器”
2. 两条 Oracle 主链路
Lido Oracle 实际运行中存在两条完全独立的链路:
2.1 AccountingOracle(状态同步链)
HashConsensus
↓
BaseOracle
↓
AccountingOracle.submitReportData
↓
Lido.handleOracleReport
↓
更新状态:
- CL balance
- validators
- exited validators
- withdrawal finalization
- rewards / fee - rebase
特点:
- 周期性执行(每个 frame)
- 驱动整个协议账本更新
- 不触发 validator exit
2.2 ValidatorsExitBusOracle(退出触发链)
HashConsensus / 或 Bus路径
↓
submitReportData / submitExitRequestsData
↓
emit ValidatorExitRequest
↓
triggerExits
↓
TriggerableWithdrawalsGateway
↓
Beacon Chain exit
特点:
- 负责“让 validator 退出”
- 不处理资金结算
- 不更新 Lido accounting
3. Withdrawal 与 Oracle 的关系
很多人容易误解:
❗ 用户提现 ≠ 触发 validator exit
正确关系如下:
3.1 WithdrawalQueue 的作用
requestWithdrawals()
-> 记录请求
-> mint unstETH NFT
只是表达需求,不做任何执行
3.2 exit 由 ExitBusOracle 触发
ValidatorsExitBusOracle
-> 决定哪些 validator exit
与用户 request 解耦
3.3 ETH 回流由 Oracle 同步
CL withdrawal
↓
WithdrawalVault
↓
AccountingOracle report
↓
Lido buffer 更新
3.4 finalize + claim
AccountingOracle
-> finalize withdrawal
用户
-> claimWithdrawal()
完整链路:
用户 request
↓
(等待)
↓
ExitBus 触发 validator exit
↓
CL 执行 withdrawal
↓
ETH 到 WithdrawalVault
↓
AccountingOracle finalize
↓
用户 claim
4. 解耦设计
Lido Oracle 的设计关键在于三条链路完全解耦。
1. 用户链路(request / claim)
2. exit 链路(ExitBusOracle)
3. accounting 链路(AccountingOracle)
用户 request ≠ 立即
exit exit ≠ 立即到账
到账 ≠ 立即 claim
Oracle 是“周期驱动”,不是“用户驱动”,Oracle 每个 frame 执行 不是用户触发。Lido 是“pull-based + oracle-driven system”,不是同步执行系统。
总体调用关系:
用户
-> submit / requestWithdrawals
Oracle(周期运行)
-> AccountingOracle(同步状态)
-> ExitBusOracle(触发 exit)
系统执行
-> CL exit
-> ETH 回流 vault
Oracle
-> finalize withdrawal
用户
-> claimWithdrawal
Summary
1. Oracle 分三层:
HashConsensus -> BaseOracle -> 业务 Oracle
2. 两条核心链路:
- AccountingOracle:状态同步 + 结算
- ExitBusOracle:触发 validator exit
3. Withdrawal 是独立系统:
request ≠ exit ≠ finalize ≠ claim
4. 所有流程由 Oracle 周期驱动,而不是用户触发
5. 核心设计思想:
解耦 + 分层 + 异步执行