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
| Tipo | Formato | Caso d'Uso |
|---|---|---|
| Feed prezzi | u128 (18 decimali) | Prezzi token, tassi di cambio |
| Dati sensore | bytes | Temperatura IoT, umidità, ecc. |
| Numero casuale | [u8; 32] | Casualità verificabile |
| Timestamp | u64 | Timestamp di eventi esterni |
| Binario | bool | Esiti 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)?;