Système de Vote
Le système de vote de gouvernance Savitri permet une prise de décision en chaîne pondérée par les jetons.
Types de Vote
| Type | Signification |
|---|---|
Yes | Soutenir la proposition |
No | S'opposer à la proposition |
Abstain | Compté pour le quorum mais pas pour l'approbation |
Cycle de Vie d'une Proposition
Creation (+ deposit)
│
Review Period (24 hours)
│ Pending state, no voting allowed
▼
Voting Period (7 days default)
│ ActiveVoting state
▼
Tally
├── Quorum met + Approval met → Approved
├── Quorum met + Approval not met → Rejected
└── Quorum not met → Rejected (insufficient participation)
│
▼
Execution (if Approved)
Quorum et Approbation
| Seuil | Valeur | Description |
|---|---|---|
| Quorum | 10 % | Des jetons de vote totaux doivent participer |
| Approbation | 65 % | Des votes Oui (excluant Abstention) |
Calcul
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
Les votes d'abstention comptent pour le quorum mais pas pour le calcul de l'approbation.
Verrouillage des Jetons de Vote
Lorsqu'un utilisateur vote, ses jetons de vote sont verrouillés pour la durée de la période de vote. Cela empêche :
- Le double vote (voter avec les mêmes jetons sur plusieurs propositions)
- Le transfert de jetons pour voter à nouveau depuis une adresse différente
Les jetons sont déverrouillés après la fin de la période de vote.
Mécanisme de Dépôt
La création d'une proposition nécessite un dépôt (anti-spam) :
- Le dépôt est restitué si la proposition atteint le quorum (quel que soit le résultat)
- Le dépôt est confisqué si la proposition n'atteint pas le quorum
Actions de Proposition
| Action | Description |
|---|---|
SetParameter | Modifier les paramètres du réseau |
TransferTreasury | Transférer des fonds du trésor |
UpgradeContract | Mettre à niveau un contrat intelligent |
SetFlPolicy | Mettre à jour les paramètres d'entraînement FL |
ApproveFlModel | Approuver un modèle FL pour la production |
AbortFlRound | Abandon d'urgence d'une session d'entraînement FL |
SlashValidator | Sanctionner un validateur malveillant |
Custom | Action de gouvernance personnalisée |
Résultats de Vote
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,
}
Distribution des Jetons de Vote
Les jetons de vote sont gagnés par la participation aux nœuds :
| Niveau PoU | Plage de Score | Jetons de Vote / Époque |
|---|---|---|
| Bronze | 300-499 | 10 |
| Silver | 500-699 | 25 |
| Gold | 700-899 | 50 |
| Platinum | 900-1000 | 100 |
Via le SDK
Voter
use savitri_sdk::{ContractClient, Wallet};
let contract = ContractClient::from_url_and_wallet(url, wallet)?;
let gov = contract.governance();
// Vote YES on proposal #42
let tx = gov.vote(&governance_address, 42, true).await?;
// Vote NO
let tx = gov.vote(&governance_address, 42, false).await?;
Vérifier le Statut d'une Proposition
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);
Exécuter une Proposition Approuvée
N'importe quel participant peut déclencher l'exécution d'une proposition approuvée :
let tx = gov.execute(&governance_address, 42).await?;
Stockage
| Famille de Colonnes | Clé | Valeur |
|---|---|---|
CF_GOVERNANCE | proposal_id (u64 LE) | Proposition (bincode) |
CF_VOTE_TOKENS | address (32 bytes) | Solde de jetons de vote |
Calendrier
| Phase | Durée | État |
|---|---|---|
| Révision | 24 heures | Pending |
| Vote | 7 jours (configurable) | ActiveVoting |
| Exécution | Immédiate après décompte | Approved → Executed |