Saltar al contenido principal

Sistema de Oráculos

El sistema de oráculos de Savitri proporciona fuentes de datos externos verificados a contratos en cadena. Soporta solicitudes de datos, respuestas de proveedores, verificación de pruebas y validación de esquemas.

Arquitectura

External Data Source

Oracle Provider (off-chain)

submit_response()

Oracle Registry Contract (on-chain)

verify_data() + proof

Consumer Contract

Componentes

Registro de Oráculos (oracle_registry.rs)

Registro central para proveedores de oráculos y fuentes de datos:

  • Registro y gestión de proveedores
  • Configuración de fuentes de datos
  • Control de acceso

Fuente de Oráculo (oracle/feed.rs)

Gestión de fuentes de datos:

  • Creación y actualización de fuentes
  • Seguimiento de datos históricos
  • Soporte de agregación

Prueba de Oráculo (oracle/proof.rs)

Verificación criptográfica de datos de oráculos:

  • Pruebas basadas en firmas
  • Consenso multi-proveedor
  • Detección de manipulaciones

Esquema de Oráculo (oracle/schema.rs)

Validación del formato de datos:

  • Definiciones de esquema para tipos de datos
  • Validación de entradas/salidas
  • Verificación de tipos

Uso de Oráculos mediante el SDK

Solicitar Datos

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

Enviar Respuesta (Proveedor)

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

Verificar Datos

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

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

Tipos de Datos de Oráculos

TipoFormatoCaso de Uso
Fuente de preciosu128 (18 decimales)Precios de tokens, tipos de cambio
Datos de sensoresbytesTemperatura IoT, humedad, etc.
Número aleatorio[u8; 32]Aleatoriedad verificable
Marca de tiempou64Marcas de tiempo de eventos externos
BinarioboolResultados sí/no

Integración con IoT

El sistema de oráculos se integra con el conector IoT para datos de sensores:

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