Aller au contenu principal

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

TypeSignification
YesSoutenir la proposition
NoS'opposer à la proposition
AbstainCompté 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

SeuilValeurDescription
Quorum10 %Des jetons de vote totaux doivent participer
Approbation65 %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

ActionDescription
SetParameterModifier les paramètres du réseau
TransferTreasuryTransférer des fonds du trésor
UpgradeContractMettre à niveau un contrat intelligent
SetFlPolicyMettre à jour les paramètres d'entraînement FL
ApproveFlModelApprouver un modèle FL pour la production
AbortFlRoundAbandon d'urgence d'une session d'entraînement FL
SlashValidatorSanctionner un validateur malveillant
CustomAction 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 PoUPlage de ScoreJetons de Vote / Époque
Bronze300-49910
Silver500-69925
Gold700-89950
Platinum900-1000100

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 ColonnesCléValeur
CF_GOVERNANCEproposal_id (u64 LE)Proposition (bincode)
CF_VOTE_TOKENSaddress (32 bytes)Solde de jetons de vote

Calendrier

PhaseDuréeÉtat
Révision24 heuresPending
Vote7 jours (configurable)ActiveVoting
ExécutionImmédiate après décompteApprovedExecuted