Sistema di Votazione
Il sistema di votazione per la governance di Savitri consente un processo decisionale on-chain ponderato per token.
Tipi di Voto
| Tipo | Significato |
|---|---|
Yes | Supporta la proposta |
No | Si oppone alla proposta |
Abstain | Conta per il quorum ma non per l'approvazione |
Ciclo di Vita della Proposta
Creazione (+ deposito)
│
Periodo di Revisione (24 ore)
│ Stato Pending, votazione non consentita
▼
Periodo di Votazione (7 giorni predefiniti)
│ Stato ActiveVoting
▼
Conteggio
├── Quorum raggiunto + Approvazione raggiunta → Approvata
├── Quorum raggiunto + Approvazione non raggiunta → Respinta
└── Quorum non raggiunto → Respinta (partecipazione insufficiente)
│
▼
Esecuzione (se Approvata)
Quorum e Approvazione
| Soglia | Valore | Descrizione |
|---|---|---|
| Quorum | 10% | Dei token di voto totali deve partecipare |
| Approvazione | 65% | Dei voti Sì (esclusi gli Astenuti) |
Calcolo
total_votes = yes_votes + no_votes + abstain_votes
quorum_met = total_votes >= (total_vote_supply * 0.10)
approval = yes_votes / (yes_votes + no_votes) >= 0.65
I voti di astensione contano per il quorum ma non per il calcolo dell'approvazione.
Blocco dei Token di Voto
Quando un utente esprime un voto, i suoi token di voto vengono bloccati per la durata del periodo di votazione. Ciò impedisce:
- Il doppio voto (votare con gli stessi token su più proposte)
- Il trasferimento di token per votare nuovamente da un indirizzo diverso
I token vengono sbloccati al termine del periodo di votazione.
Meccanismo di Deposito
La creazione di una proposta richiede un deposito (anti-spam):
- Il deposito viene restituito se la proposta raggiunge il quorum (indipendentemente dall'esito)
- Il deposito viene sottratto se la proposta non raggiunge il quorum
Azioni della Proposta
| Azione | Descrizione |
|---|---|
SetParameter | Modifica i parametri di rete |
TransferTreasury | Trasferisci fondi del tesoro |
UpgradeContract | Aggiorna uno smart contract |
SetFlPolicy | Aggiorna i parametri di addestramento FL |
ApproveFlModel | Approva il modello FL per la produzione |
AbortFlRound | Interruzione di emergenza del round di addestramento FL |
SlashValidator | Penalizza un validatore inadempiente |
Custom | Azione di governance personalizzata |
Risultati della Votazione
pub struct VotingResult {
pub yes_votes: u64,
pub no_votes: u64,
pub abstain_votes: u64,
pub total_eligible: u64,
pub quorum_reached: bool,
pub approved: bool,
pub participation_rate: f64,
}
Distribuzione dei Token di Voto
I token di voto vengono guadagnati tramite la partecipazione ai nodi:
| Livello PoU | Intervallo Punteggio | Token di Voto / Epoca |
|---|---|---|
| Bronze | 300-499 | 10 |
| Silver | 500-699 | 25 |
| Gold | 700-899 | 50 |
| Platinum | 900-1000 | 100 |
Tramite SDK
Espressione di un Voto
use savitri_sdk::{ContractClient, Wallet};
let contract = ContractClient::from_url_and_wallet(url, wallet)?;
let gov = contract.governance();
// Vota SÌ sulla proposta #42
let tx = gov.vote(&governance_address, 42, true).await?;
// Vota NO
let tx = gov.vote(&governance_address, 42, false).await?;
Verifica dello Stato della Proposta
let status = gov.get_proposal_status(&governance_address, 42).await?;
println!("Votes: {} for / {} against", status.votes_for, status.votes_against);
println!("Status: {} (executed: {})", status.status, status.executed);
Esecuzione di una Proposta Approvata
Qualsiasi partecipante può attivare l'esecuzione di una proposta approvata:
let tx = gov.execute(&governance_address, 42).await?;
Storage
| Famiglia di Colonne | Chiave | Valore |
|---|---|---|
CF_GOVERNANCE | proposal_id (u64 LE) | Proposta (bincode) |
CF_VOTE_TOKENS | address (32 byte) | Saldo token di voto |
Tempistiche
| Fase | Durata | Stato |
|---|---|---|
| Revisione | 24 ore | Pending |
| Votazione | 7 giorni (configurabile) | ActiveVoting |
| Esecuzione | Immediata dopo il conteggio | Approved → Executed |