跳到主要内容

预言机系统

Savitri 预言机系统向链上合约提供经过验证的外部数据馈送。它支持数据请求、提供者响应、证明验证和数据模式验证。

架构

External Data Source

Oracle Provider (off-chain)

submit_response()

Oracle Registry Contract (on-chain)

verify_data() + proof

Consumer Contract

组件

预言机注册表(oracle_registry.rs

预言机提供者和数据馈送的中央注册表:

  • 提供者注册和管理
  • 数据馈送配置
  • 访问控制

预言机馈送(oracle/feed.rs

数据馈送管理:

  • 馈送创建和更新
  • 历史数据跟踪
  • 聚合支持

预言机证明(oracle/proof.rs

预言机数据的加密验证:

  • 基于签名的证明
  • 多提供者共识
  • 篡改检测

预言机模式(oracle/schema.rs

数据格式验证:

  • 数据类型的模式定义
  • 输入/输出验证
  • 类型检查

通过 SDK 使用预言机

请求数据

use savitri_sdk::ContractClient;

let contract = ContractClient::from_url_and_wallet(url, wallet)?;
let oracle = contract.oracle();

// Request temperature data
let tx = oracle.request_data(
&oracle_address,
"temperature",
b"sensor_001",
).await?;

提交响应(提供者)

let tx = oracle.submit_response(
&oracle_address,
request_id, // u64
b"25.5", // response bytes
).await?;

验证数据

let is_valid = oracle.verify_data(
&oracle_address,
b"data_to_verify",
).await?;

使用 TransactionBuilder

use savitri_sdk::TransactionBuilder;

let tx = TransactionBuilder::new()
.oracle_call(
"oracle_contract_address",
"request_data",
b"params",
)
.nonce(nonce)
.fee(5_000_000_000_000_000)
.build_and_sign(&wallet)?;

预言机数据类型

类型格式使用场景
价格馈送u128(18位小数)代币价格、汇率
传感器数据bytesIoT 温度、湿度等
随机数[u8; 32]可验证随机性
时间戳u64外部事件时间戳
布尔值bool是/否结果

与 IoT 集成

预言机系统与 IoT 连接器集成以获取传感器数据:

let tx = TransactionBuilder::new()
.oracle_call(
"iot_oracle_address",
"submit_sensor_data",
&encode_sensor_data(sensor_id, value, timestamp),
)
.nonce(nonce)
.fee(50_000_000_000_000) // IoT rate: 0.00005 SAVT
.build_and_sign(&wallet)?;