Система оракулов
Система оракулов 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 знаков) | Цены токенов, обменные курсы |
| Данные датчиков | bytes | IoT: температура, влажность и т.д. |
| Случайное число | [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)?;