Saltar al contenido principal

Sistema de Votación

El sistema de votación de gobernanza de Savitri permite la toma de decisiones en cadena ponderada por tokens.

Tipos de Voto

TipoSignificado
YesApoyar la propuesta
NoOponerse a la propuesta
AbstainContado para el quórum pero no para la aprobación

Ciclo de Vida de una Propuesta

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)

Quórum y Aprobación

UmbralValorDescripción
Quórum10%De los tokens de voto totales deben participar
Aprobación65%De los votos Sí (excluyendo Abstención)

Cálculo

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

Los votos de abstención cuentan para el quórum pero no para el cálculo de aprobación.

Bloqueo de Tokens de Voto

Cuando un usuario emite un voto, sus tokens de voto quedan bloqueados por la duración del período de votación. Esto previene:

  • Doble votación (votar con los mismos tokens en múltiples propuestas)
  • Transferencia de tokens para votar nuevamente desde una dirección diferente

Los tokens se desbloquean al finalizar el período de votación.

Mecanismo de Depósito

La creación de propuestas requiere un depósito (anti-spam):

  • El depósito se devuelve si la propuesta alcanza el quórum (independientemente del resultado)
  • El depósito se recorta si la propuesta no alcanza el quórum

Acciones de Propuestas

AcciónDescripción
SetParameterCambiar parámetros de red
TransferTreasuryTransferir fondos del tesoro
UpgradeContractActualizar un contrato inteligente
SetFlPolicyActualizar parámetros de entrenamiento FL
ApproveFlModelAprobar modelo FL para producción
AbortFlRoundAbortar de emergencia una ronda de entrenamiento FL
SlashValidatorPenalizar a un validador con mal comportamiento
CustomAcción de gobernanza personalizada

Resultados de Votación

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,
}

Distribución de Tokens de Voto

Los tokens de voto se obtienen mediante la participación de nodos:

Nivel PoURango de PuntajeTokens de Voto / Época
Bronce300-49910
Plata500-69925
Oro700-89950
Platino900-1000100

Mediante el SDK

Emitir un Voto

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?;

Verificar Estado de Propuesta

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);

Ejecutar Propuesta Aprobada

Cualquier participante puede activar la ejecución de una propuesta aprobada:

let tx = gov.execute(&governance_address, 42).await?;

Almacenamiento

Familia de ColumnasClaveValor
CF_GOVERNANCEproposal_id (u64 LE)Proposal (bincode)
CF_VOTE_TOKENSaddress (32 bytes)Saldo de tokens de voto

Línea de Tiempo

FaseDuraciónEstado
Revisión24 horasPending
Votación7 días (configurable)ActiveVoting
EjecuciónInmediata tras el conteoApprovedExecuted