Système Oracle
Le système Oracle de Savitri fournit des flux de données externes vérifiés aux contrats en chaîne. Il prend en charge les demandes de données, les réponses des fournisseurs, la vérification des preuves et la validation des schémas.
Architecture
External Data Source
│
Oracle Provider (off-chain)
│
submit_response()
│
Oracle Registry Contract (on-chain)
│
verify_data() + proof
│
Consumer Contract
Composants
Registre Oracle (oracle_registry.rs)
Registre central pour les fournisseurs d'oracles et les flux de données :
- Enregistrement et gestion des fournisseurs
- Configuration des flux de données
- Contrôle d'accès
Flux Oracle (oracle/feed.rs)
Gestion des flux de données :
- Création et mises à jour des flux
- Suivi des données historiques
- Support d'agrégation
Preuve Oracle (oracle/proof.rs)
Vérification cryptographique des données oracle :
- Preuves basées sur les signatures
- Consensus multi-fournisseurs
- Détection des altérations
Schéma Oracle (oracle/schema.rs)
Validation du format des données :
- Définitions de schémas pour les types de données
- Validation des entrées/sorties
- Vérification des types
Utilisation des Oracles via le SDK
Demander des Données
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?;
Soumettre une Réponse (Fournisseur)
let tx = oracle.submit_response(
&oracle_address,
request_id, // u64
b"25.5", // response bytes
).await?;
Vérifier des Données
let is_valid = oracle.verify_data(
&oracle_address,
b"data_to_verify",
).await?;
Utilisation de 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)?;
Types de Données Oracle
| Type | Format | Cas d'Usage |
|---|---|---|
| Flux de prix | u128 (18 décimales) | Prix de jetons, taux de change |
| Données capteur | bytes | Température IoT, humidité, etc. |
| Nombre aléatoire | [u8; 32] | Aléatoire vérifiable |
| Horodatage | u64 | Horodatages d'événements externes |
| Binaire | bool | Résultats oui/non |
Intégration avec l'IoT
Le système oracle s'intègre avec le connecteur IoT pour les données capteurs :
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)?;