Tipos Fundamentales y Criptografía
savitri-core proporciona los tipos base, las primitivas criptográficas y las utilidades utilizadas en todos los crates de Savitri Network.
Tipos Fundamentales
Transaction
pub struct Transaction {
pub from: String, // dirección del remitente (64 caracteres hex)
pub to: String, // dirección del destinatario (64 caracteres hex)
pub amount: u64, // monto de la transferencia
}
Account
pub struct Account {
pub balance: u128, // saldo en la unidad más pequeña (18 decimales)
pub nonce: u64, // contador de transacciones
}
Codificación: Formato fijo de 24 bytes (16 bytes de saldo LE + 8 bytes de nonce LE). Compatible hacia atrás con el formato antiguo de 16 bytes (solo saldo).
Seguridad: credit() y debit() utilizan aritmética verificada para prevenir desbordamiento/subdesbordamiento.
Límites de Comisión
pub struct FeeLimits {
pub min_fee: u128, // por defecto: 0.0001 SAVT (10^14)
pub max_fee: u128, // por defecto: 1.0 SAVT (10^18)
}
Primitivas Criptográficas
Firmas
| Algoritmo | Biblioteca | Uso |
|---|---|---|
| Ed25519 | ed25519-dalek | Firma de transacciones, firma de bloques, identidad de pares |
Tamaños de clave:
- Clave privada: 32 bytes
- Clave pública: 32 bytes
- Firma: 64 bytes
- Dirección: clave pública codificada en hex (64 caracteres hexadecimales)
Funciones de Hash
| Función | Biblioteca | Uso |
|---|---|---|
| SHA-256 | sha2 | Hash del mensaje de firma de transacciones |
| SHA-512 | sha2 | Hash de bloque (con etiqueta de dominio "BLK" + byte de versión) |
| BLAKE3 | blake3 | Cómputo de la raíz de estado, hash rápido |
| Keccak256 | sha3 | Derivación de ranuras de almacenamiento de contratos |
Hash con Etiqueta de Dominio
Para prevenir colisiones de hash entre dominios, todos los hashes incluyen etiquetas de dominio:
| Dominio | Etiqueta | Descripción |
|---|---|---|
| Bloque | "BLK" + byte de versión | Hash de bloque |
| Raíz de transacciones | Etiqueta de hoja "TXv1" | Acumulador progresivo sobre bincode |
| Raíz de estado | Semilla "STATEv1-LE" | Instantánea lexicográfica de la base de datos |
Gestión de Claves
pub struct KeyManager {
// Cargar o generar el par de claves de identidad
pub fn load_or_generate(path: &Path) -> Result<KeyPair>;
// Generar un par de claves nuevo
pub fn generate() -> KeyPair;
}
pub struct KeyPair {
pub signing_key: SigningKey,
pub verifying_key: VerifyingKey,
}
Las claves se persisten en disco en formato crudo de 32 bytes. MemoryKeyStorage proporciona almacenamiento en memoria para pruebas.
Cifrado
Cifrado AES-GCM para datos sensibles en reposo:
// Cifrar con clave derivada de contraseña
let encrypted = encrypt_aes_gcm(plaintext, password)?;
// Descifrar
let plaintext = decrypt_aes_gcm(ciphertext, password)?;
Planificador de Slots
Planificación determinista de slots para la rotación de líderes:
pub struct SlotScheduler {
slot_duration_ms: u64,
base_ms: u64,
validators: Vec<String>,
local_id: String,
}
pub enum SlotRole {
Leader, // produce bloques en este slot
Follower, // valida bloques
Observer, // solo observa (nodos guardianes)
}
pub struct SlotInfo {
pub slot: u64,
pub round: u32,
pub leader: Option<String>,
pub role: SlotRole,
pub start_ms: u64,
pub end_ms: u64,
}
Asignación de líder: leader_index = slot % validators.len(). Determinista dado el mismo conjunto de validadores y número de slot.
Monolith
Los Monoliths comprimen múltiples bloques en una única estructura para archivado y sincronización eficientes:
pub struct MonolithHeader {
pub exec_height: u64, // altura de ejecución
pub window_start: u64, // primer bloque en el monolith
pub epoch_id: u64, // identificador de época
pub block_count: u64, // número de bloques incluidos
pub size_bytes: u64, // tamaño total
pub monolith_id: String, // identificador único
pub produced_at_ms: u64, // marca de tiempo de producción
pub cosignatures: Vec<..>, // cofirmas de validadores
}
Métricas
El sistema de métricas proporciona métricas compatibles con Prometheus:
pub struct MetricsProvider {
// Registrar contadores, indicadores, histogramas
pub fn register_counter(name: &str, help: &str) -> Counter;
pub fn register_gauge(name: &str, help: &str) -> Gauge;
}
Categorías: blockchain, mempool, red, almacenamiento, ejecución, sistema, seguridad, tokenomics.
Endpoint: http://127.0.0.1:9090/metrics (intervalo de actualización de 5 segundos).
Estructura Dual del Núcleo
Existen dos directorios savitri-core:
| Ruta | Propósito | Dependencias |
|---|---|---|
Savitri-core/Savitri-core/ | Independiente (listo para crates.io) | Cero dependencias internas |
Savitri-core/ | Versión extendida | savitri-storage, savitri-zkp |
La versión independiente tiene licencia MIT y es adecuada para uso externo. La versión extendida agrega funcionalidades como integración con RocksDB, compresión y soporte para libp2p.