基础投票 DApp 完成后,以下扩展将带你从"教学项目"进入"工程实践"。
选做 1:多签管理员
rust
// 修改 close_poll 为 2/3 多签
#[account]
pub struct VoteAccount {
// ...原有字段
pub admins: Vec<Pubkey>, // 3 个管理员
pub admin_threshold: u8, // 2
pub close_signatures: Vec<Pubkey>, // 已签名关闭的管理员
}
pub fn close_poll_multisig(ctx: Context<ClosePollMultisig>) -> Result<()> {
let vote = &mut ctx.accounts.vote_account;
let signer = ctx.accounts.creator.key();
require!(vote.admins.contains(&signer), VoteError::NotAdmin);
if !vote.close_signatures.contains(&signer) {
vote.close_signatures.push(signer);
}
if vote.close_signatures.len() >= vote.admin_threshold as usize {
vote.is_active = false;
}
Ok(())
}选做 2:投票委托
rust
// 用户A可将投票权委托给B
#[account]
pub struct VoteAccount {
pub delegations: Vec<(Pubkey, Pubkey)>, // (委托人, 被委托人)
}
// B 投票时,检查 B 是否有委托授权选做 3:隐私投票
| 方案 | 技术 | 难度 |
|---|---|---|
| 盲签名 | Chaum 盲签名 | ⭐⭐ |
| 零知识承诺 | Pedersen 承诺 + 范围证明 | ⭐⭐⭐⭐ |
| 同态加密 | Paillier 加密累加 | ⭐⭐⭐⭐ |
选做 4:Gas 优化
| 优化 | 方法 | 节省 |
|---|---|---|
| 账户复用 | 批量创建投票,共享存储 | ~30% |
| 压缩投票 | 位图代替数组 | ~50% |
| 程序拆分 | 投票逻辑与计数分离 | ~20% |
, 前往 → ch17-summary(本章总结) |*
评论
0评论加载中…