多符号 — 设计

概述

解决 OracleHub addSymbol(bytes32)onlySystemCall 权限限制,使 Operator 可以在运行时动态注册新的价格符号(BTC/USD, USDC/USD, SOL/USD, BNB/USD),同时在 genesis 初始化阶段批量注册所有初始符号。

方案:A + B 组合

  • 方案 A(Genesis): 扩展 initialize() 调用,一次性注册 5 个符号

  • 方案 B(Runtime):addSymbol 添加 onlyOperator 备选路径 + 新增 batchAddSymbols


架构

权限模型变更

当前:
  addSymbol()       → onlySystemCall
  removeSymbol()    → onlySystemCall
  setConfig()       → onlySystemCall
  setOperator()     → onlySystemCall
  batchUpdatePrices → onlyOperator

变更后:
  addSymbol()        → onlySystemCall OR onlyOperator  ← 放宽
  batchAddSymbols()  → onlySystemCall OR onlyOperator  ← 新增
  removeSymbol()     → onlySystemCall                  ← 不变(高危操作)
  setConfig()        → onlySystemCall                  ← 不变
  setOperator()      → onlySystemCall                  ← 不变
  batchUpdatePrices  → onlyOperator                    ← 不变

安全考量: addSymbol 是低风险操作(只添加新符号,不影响现有价格数据)。removeSymbol 保持 onlySystemCall 因为删除符号可能影响依赖该价格的 DApp。

合约改动

文件: era-contracts-l1/system-contracts/contracts/OracleHub.sol

  1. 新增内部函数 _isSystemCallOrOperator()

  2. addSymbol() 使用新权限检查

  3. 新增 batchAddSymbols(bytes32[]) 批量接口

  4. IOracleHub 接口同步更新

Genesis 扩展

初始化调用传入 5 个符号:

配置更新

文件: config/baby-chain.toml

取消注释 BTC/USD, USDC/USD, SOL/USD, BNB/USD 符号配置,使 oracle-wiring 服务获取并编码所有 5 个符号的价格数据。

Rust 侧

无 Rust 代码改动。oracle-wiring 已支持多符号 — encode_oracle_calldata() 自动编码 config.symbols 中的所有符号。


测试计划

Foundry 测试 (6 个新测试)

测试
验证

test_addSymbol_by_operator

operator 可以注册新符号

test_addSymbol_by_systemCall

system call 仍然可以注册

test_addSymbol_by_random_reverts

非授权地址被拒绝

test_batchAddSymbols_by_operator

批量注册成功

test_batchAddSymbols_empty_reverts

空数组拒绝

test_removeSymbol_by_operator_reverts

operator 不能删除符号

E2E 验证

  1. 重新编译系统合约

  2. Genesis 重部署(5 个符号)

  3. 取消 baby-chain.toml 注释

  4. 重启节点 → 验证 batch 中 Oracle tx 包含 5 个符号价格

  5. getLatestPrice 查询所有 5 个符号返回正确价格


文件清单

文件
改动

era-contracts-l1/system-contracts/contracts/OracleHub.sol

_isSystemCallOrOperator + addSymbol 权限 + batchAddSymbols

era-contracts-l1/system-contracts/contracts/interfaces/IOracleHub.sol

添加 batchAddSymbols 接口

era-contracts-l1/system-contracts/contracts-preprocessed/OracleHub.sol

同步更新

era-contracts-l1/system-contracts/contracts-preprocessed/interfaces/IOracleHub.sol

同步更新

contracts/test/OracleHub.t.sol

6 个新测试

config/baby-chain.toml

取消注释 4 个符号

Last updated