Passa al contenuto principale

Sistema Oracle

Il sistema Oracle di Savitri fornisce feed di dati esterni verificati ai contract on-chain. Supporta richieste di dati, risposte dei provider, verifica delle prove e validazione degli schemi.

Architettura

Fonte Dati Esterna

Provider Oracle (off-chain)

submit_response()

Contract Registry Oracle (on-chain)

verify_data() + proof

Contract Consumatore

Componenti

Registry Oracle (oracle_registry.rs)

Registry centrale per i provider oracle e i feed di dati:

  • Registrazione e gestione dei provider
  • Configurazione dei feed di dati
  • Controllo degli accessi

Feed Oracle (oracle/feed.rs)

Gestione dei feed di dati:

  • Creazione e aggiornamento dei feed
  • Tracciamento dei dati storici
  • Supporto all'aggregazione

Prova Oracle (oracle/proof.rs)

Verifica crittografica dei dati oracle:

  • Prove basate su firma
  • Consenso multi-provider
  • Rilevamento delle manomissioni

Schema Oracle (oracle/schema.rs)

Validazione del formato dei dati:

  • Definizioni di schema per i tipi di dati
  • Validazione input/output
  • Controllo dei tipi

Utilizzo degli Oracle tramite SDK

Richiesta Dati

use savitri_sdk::ContractClient;

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

// Richiedi dati di temperatura
let tx = oracle.request_data(
&oracle_address,
"temperature",
b"sensor_001",
).await?;

Invio Risposta (Provider)

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

Verifica Dati

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

Utilizzo di 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)?;

Tipi di Dati Oracle

TipoFormatoCaso d'Uso
Feed prezziu128 (18 decimali)Prezzi token, tassi di cambio
Dati sensorebytesTemperatura IoT, umidità, ecc.
Numero casuale[u8; 32]Casualità verificabile
Timestampu64Timestamp di eventi esterni
BinarioboolEsiti sì/no

Integrazione con IoT

Il sistema oracle si integra con il connettore IoT per i dati dei sensori:

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)?;