Saltar al contenido principal

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

AlgoritmoBibliotecaUso
Ed25519ed25519-dalekFirma 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ónBibliotecaUso
SHA-256sha2Hash del mensaje de firma de transacciones
SHA-512sha2Hash de bloque (con etiqueta de dominio "BLK" + byte de versión)
BLAKE3blake3Cómputo de la raíz de estado, hash rápido
Keccak256sha3Derivació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:

DominioEtiquetaDescripción
Bloque"BLK" + byte de versiónHash de bloque
Raíz de transaccionesEtiqueta de hoja "TXv1"Acumulador progresivo sobre bincode
Raíz de estadoSemilla "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:

RutaPropósitoDependencias
Savitri-core/Savitri-core/Independiente (listo para crates.io)Cero dependencias internas
Savitri-core/Versión extendidasavitri-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.