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
| Algoritmo | Libreria | Utilizzo |
|---|---|---|
| Ed25519 | ed25519-dalek | Firma 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
| Funzione | Libreria | Utilizzo |
|---|---|---|
| SHA-256 | sha2 | Hash del messaggio di firma della transazione |
| SHA-512 | sha2 | Hash del blocco (con tag di dominio "BLK" + byte versione) |
| BLAKE3 | blake3 | Calcolo della state root, hashing veloce |
| Keccak256 | sha3 | Derivazione 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:
| Dominio | Tag | Descrizione |
|---|---|---|
| Blocco | "BLK" + byte versione | Hash del blocco |
| Transaction root | "TXv1" tag foglia | Accumulatore progressivo su bincode |
| State root | "STATEv1-LE" seed | Snapshot 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:
| Percorso | Scopo | Dipendenze |
|---|---|---|
Savitri-core/Savitri-core/ | Standalone (pronto per crates.io) | Nessuna dipendenza interna |
Savitri-core/ | Versione estesa | savitri-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.