投票系统
Savitri 治理投票系统实现基于代币加权的链上决策。
投票类型
| 类型 | 含义 |
|---|---|
Yes | 支持提案 |
No | 反对提案 |
Abstain | 计入法定人数但不计入批准 |
提案生命周期
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)
法定人数与批准
| 阈值 | 值 | 描述 |
|---|---|---|
| 法定人数 | 10% | 总投票代币中必须参与的比例 |
| 批准率 | 65% | 赞成票比例(不含弃权票) |
计算方式
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
弃权票计入法定人数,但不计入批准率计算。
投票代币锁定
用户投票时,其投票代币在投票期内被锁定。这可防止:
- 重复投票(用同一代币对多个提案投票)
- 转移代币后从不同地址再次投票
投票期结束后代币解锁。
押金机制
创建提案需要押金(防垃圾):
- 若提案达到法定人数,押金退还(无论结果如何)
- 若提案未达到法定人数,押金被没收
提案操作
| 操作 | 描述 |
|---|---|
SetParameter | 修改网络参数 |
TransferTreasury | 转移国库资金 |
UpgradeContract | 升级智能合约 |
SetFlPolicy | 更新 FL 训练参数 |
ApproveFlModel | 批准 FL 模型用于生产 |
AbortFlRound | 紧急中止 FL 训练轮次 |
SlashValidator | 惩罚行为不当的验证者 |
Custom | 自定义治理操作 |
投票结果
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,
}
投票代币分配
投票代币通过节点参与获得:
| PoU 层级 | 分数范围 | 每轮投票代币 |
|---|---|---|
| 铜牌 | 300-499 | 10 |
| 银牌 | 500-699 | 25 |
| 金牌 | 700-899 | 50 |
| 铂金 | 900-1000 | 100 |
通过 SDK
投票
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?;
查询提案状态
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);
执行已批准提案
任何参与者均可触发已批准提案的执行:
let tx = gov.execute(&governance_address, 42).await?;
存储
| 列族 | 键 | 值 |
|---|---|---|
CF_GOVERNANCE | proposal_id(u64 小端序) | 提案(bincode) |
CF_VOTE_TOKENS | address(32 字节) | 投票代币余额 |
时间线
| 阶段 | 时长 | 状态 |
|---|---|---|
| 审查 | 24 小时 | Pending |
| 投票 | 7 天(可配置) | ActiveVoting |
| 执行 | 计票后立即执行 | Approved → Executed |