Aller au contenu principal

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

TypeFormatCas d'Usage
Flux de prixu128 (18 décimales)Prix de jetons, taux de change
Données capteurbytesTempérature IoT, humidité, etc.
Nombre aléatoire[u8; 32]Aléatoire vérifiable
Horodatageu64Horodatages d'événements externes
BinaireboolRé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)?;