Перейти к основному содержимому

Система оракулов

Система оракулов 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)?;