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
| Tipo | Formato | Caso de Uso |
|---|---|---|
| Fuente de precios | u128 (18 decimales) | Precios de tokens, tipos de cambio |
| Datos de sensores | bytes | Temperatura IoT, humedad, etc. |
| Número aleatorio | [u8; 32] | Aleatoriedad verificable |
| Marca de tiempo | u64 | Marcas de tiempo de eventos externos |
| Binario | bool | Resultados 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)?;