Passa al contenuto principale

Tipi Fondamentali e Crittografia

savitri-core fornisce i tipi fondamentali, le primitive crittografiche e le utilità utilizzate in tutte le crate della Savitri Network.

Tipi Fondamentali

Transaction

pub struct Transaction {
pub from: String, // indirizzo mittente (64 caratteri hex)
pub to: String, // indirizzo destinatario (64 caratteri hex)
pub amount: u64, // importo del trasferimento
}

Account

pub struct Account {
pub balance: u128, // saldo nell'unità più piccola (18 decimali)
pub nonce: u64, // contatore delle transazioni
}

Codifica: Formato fisso a 24 byte (16 byte saldo LE + 8 byte nonce LE). Compatibile con il vecchio formato a 16 byte (solo saldo).

Sicurezza: credit() e debit() usano aritmetica controllata per prevenire overflow/underflow.

Limiti delle Commissioni

pub struct FeeLimits {
pub min_fee: u128, // default: 0.0001 SAVT (10^14)
pub max_fee: u128, // default: 1.0 SAVT (10^18)
}

Primitive Crittografiche

Firme

AlgoritmoLibreriaUtilizzo
Ed25519ed25519-dalekFirma transazioni, firma blocchi, identità peer

Dimensioni delle chiavi:

  • Chiave privata: 32 byte
  • Chiave pubblica: 32 byte
  • Firma: 64 byte
  • Indirizzo: chiave pubblica in codifica hex (64 caratteri hex)

Funzioni Hash

FunzioneLibreriaUtilizzo
SHA-256sha2Hash del messaggio di firma della transazione
SHA-512sha2Hash del blocco (con tag di dominio "BLK" + byte versione)
BLAKE3blake3Calcolo della state root, hashing veloce
Keccak256sha3Derivazione dello slot di storage dei contratti

Hashing con Tag di Dominio

Per prevenire collisioni hash tra domini diversi, tutti gli hash includono tag di dominio:

DominioTagDescrizione
Blocco"BLK" + byte versioneHash del blocco
Transaction root"TXv1" tag fogliaAccumulatore progressivo su bincode
State root"STATEv1-LE" seedSnapshot DB lessicografico

Gestione delle Chiavi

pub struct KeyManager {
// Carica o genera la coppia di chiavi di identità
pub fn load_or_generate(path: &Path) -> Result<KeyPair>;
// Genera una nuova coppia di chiavi
pub fn generate() -> KeyPair;
}

pub struct KeyPair {
pub signing_key: SigningKey,
pub verifying_key: VerifyingKey,
}

Le chiavi vengono salvate su disco in formato grezzo da 32 byte. MemoryKeyStorage fornisce storage in memoria per i test.

Cifratura

Cifratura AES-GCM per dati sensibili a riposo:

// Cifra con chiave derivata dalla password
let encrypted = encrypt_aes_gcm(plaintext, password)?;

// Decifra
let plaintext = decrypt_aes_gcm(ciphertext, password)?;

Scheduler degli Slot

Pianificazione deterministica degli slot per la rotazione del leader:

pub struct SlotScheduler {
slot_duration_ms: u64,
base_ms: u64,
validators: Vec<String>,
local_id: String,
}

pub enum SlotRole {
Leader, // produce blocchi in questo slot
Follower, // valida i blocchi
Observer, // solo osservatore (nodi guardian)
}

pub struct SlotInfo {
pub slot: u64,
pub round: u32,
pub leader: Option<String>,
pub role: SlotRole,
pub start_ms: u64,
pub end_ms: u64,
}

Assegnazione del leader: leader_index = slot % validators.len(). Deterministica dato lo stesso insieme di validatori e numero di slot.

Monolith

I Monolith comprimono più blocchi in un'unica struttura per archiviazione e sincronizzazione efficienti:

pub struct MonolithHeader {
pub exec_height: u64, // altezza di esecuzione
pub window_start: u64, // primo blocco nel monolith
pub epoch_id: u64, // identificatore dell'epoch
pub block_count: u64, // numero di blocchi inclusi
pub size_bytes: u64, // dimensione totale
pub monolith_id: String, // identificatore unico
pub produced_at_ms: u64, // timestamp di produzione
pub cosignatures: Vec<..>, // co-firme dei validatori
}

Metriche

Il sistema di metriche fornisce metriche compatibili con Prometheus:

pub struct MetricsProvider {
// Registra contatori, gauge, istogrammi
pub fn register_counter(name: &str, help: &str) -> Counter;
pub fn register_gauge(name: &str, help: &str) -> Gauge;
}

Categorie: blockchain, mempool, rete, storage, esecuzione, sistema, sicurezza, tokenomics.

Endpoint: http://127.0.0.1:9090/metrics (intervallo di aggiornamento 5 secondi).

Struttura Dual Core

Esistono due directory savitri-core:

PercorsoScopoDipendenze
Savitri-core/Savitri-core/Standalone (pronto per crates.io)Nessuna dipendenza interna
Savitri-core/Versione estesasavitri-storage, savitri-zkp

La versione standalone è licenziata MIT ed è adatta al consumo esterno. La versione estesa aggiunge funzionalità come l'integrazione RocksDB, la compressione e il supporto libp2p.