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
| Tipo | Significado |
|---|---|
Yes | Apoyar la propuesta |
No | Oponerse a la propuesta |
Abstain | Contado 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
| Umbral | Valor | Descripción |
|---|---|---|
| Quórum | 10% | De los tokens de voto totales deben participar |
| Aprobación | 65% | 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ón | Descripción |
|---|---|
SetParameter | Cambiar parámetros de red |
TransferTreasury | Transferir fondos del tesoro |
UpgradeContract | Actualizar un contrato inteligente |
SetFlPolicy | Actualizar parámetros de entrenamiento FL |
ApproveFlModel | Aprobar modelo FL para producción |
AbortFlRound | Abortar de emergencia una ronda de entrenamiento FL |
SlashValidator | Penalizar a un validador con mal comportamiento |
Custom | Acció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 PoU | Rango de Puntaje | Tokens de Voto / Época |
|---|---|---|
| Bronce | 300-499 | 10 |
| Plata | 500-699 | 25 |
| Oro | 700-899 | 50 |
| Platino | 900-1000 | 100 |
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 Columnas | Clave | Valor |
|---|---|---|
CF_GOVERNANCE | proposal_id (u64 LE) | Proposal (bincode) |
CF_VOTE_TOKENS | address (32 bytes) | Saldo de tokens de voto |
Línea de Tiempo
| Fase | Duración | Estado |
|---|---|---|
| Revisión | 24 horas | Pending |
| Votación | 7 días (configurable) | ActiveVoting |
| Ejecución | Inmediata tras el conteo | Approved → Executed |