本文介绍了Suffragium,一个利用零知识证明(ZKP)和全同态加密(FHE)构建的链上加密投票系统,该系统利用Zama的fhEVM来保护投票的隐私性、完整性和可验证性。Suffragium旨在通过加密技术,实现安全、私密且防篡改的投票过程,同时确保投票结果的透明和可信。
这是一篇由 Alessandro Manfredi 撰写的客座博客文章。
TLDR: Suffragium 是一个安全、保护隐私的投票系统,它结合了零知识证明 (ZKP) 和全同态加密 (FHE),以创建一个无需信任且防篡改的投票平台。利用 Zama 的 fhEVM,Suffragium 保留了安全投票系统的所有基本属性。
传统的投票系统虽然是民主的基础,但也面临着诸如以下的挑战:
随着技术的快速发展,改进投票过程的新机会不断涌现——但潜在的威胁也随之而来。为了保护和加强民主价值观,创新和改进我们的投票系统至关重要,使其适应现代安全和隐私标准。
探索 Suffragium — 一个旨在改变选举过程的新投票系统。Suffragium 利用全同态加密 (FHE) 和零知识证明 (ZK proofs),旨在维护安全投票的核心属性:隐私性、完整性、透明性和可验证性。这种方法不仅保护了选民的匿名性,还确保了每次投票都被准确计算,并免受操纵。
在 Suffragium 中,零知识证明在保护投票过程和维护隐私方面发挥着关键作用。选民通过注册时由当局发送的电子邮件生成的身份证明,获得匿名投票的权利。这些加密证明不包含任何可识别的信息,除了用于注册的电子邮件的哈希值。其他匿名措施,例如选择使用一次性电子邮件地址,可以保护选民免受可能泄露其参与情况的潜在攻击。
为了参与,用户需要经过了解你的客户 (KYC) 流程,以类似于传统选票验证的方式验证他们的身份。但是,此 KYC 流程的结构旨在防止当局了解用户是否或如何投票。ZK 证明是确定性生成的,防止同一选民重复投票。虽然理论上,当局可以通过创建不同的电子邮件地址来提交多个选票,但 Suffragium 秉承诚信原则运作,信任当局维护良好治理。请注意,可能还有其他(有时更简单的)验证选民身份的方式,但此示例更普遍地展示了如何将电子邮件地址与链上机密智能合约相关联。
一旦选民成功生成其加密证明,他们就可以投票。为了保护区块链上的选民隐私,Suffragium 避免以纯文本形式存储选票。相反,它利用 Zama 的 fhEVM,从而可以使用 FHE 在以太坊虚拟机 (EVM) 上实现机密智能合约。这项技术确保个人选票保持私密、安全且无法被任何人(包括当局)访问,从而在投票过程中保持机密性和信任。
投票。
要投票,用户调用 castVote 函数:
function castVote(
uint256 voteId,
einput encryptedSupport,
bytes calldata supportProof,
bytes calldata identityPublicValues,
bytes calldata identityProofBytes
) external {
bytes32 voterId = verifyProofAndGetVoterId(identityPublicValues, identityProofBytes);
if (_castedVotes[voteId][voterId]) revert AlreadyVoted();
_castedVotes[voteId][voterId] = true;
Vote storage vote = _getVote(voteId);
if (block.number > vote.endBlock) revert VoteClosed();
ebool support = TFHE.asEbool(encryptedSupport, supportProof);
vote.encryptedResult = TFHE.add(vote.encryptedResult, TFHE.asEuint64(support));
TFHE.allow(vote.encryptedResult, address(this));
vote.voteCount++;
emit VoteCasted(voteId);
}
投票期结束后,任何人都可以通过调用 requestRevealVote 来启动结果解密:
function requestRevealVote(uint256 voteId) external {
Vote storage vote = _getVote(voteId);
if (block.number <= vote.endBlock) revert VoteNotClosed();
uint256[] memory cts = new uint256[](1);
cts[0] = Gateway.toUint256(vote.encryptedResult);
uint256 requestId = Gateway.requestDecryption(cts, this.revealVote.selector, 0, block.timestamp + 100, false);
addParamsUint256(requestId, voteId);
vote.state = VoteState.RequestedToReveal;
emit VoteRevealRequested(voteId);
}
此调用触发链下中继器与持有解密密钥的密钥管理系统 (KMS) 进行交互。解密后,中继器调用回调函数 revealVote,以将最终结果存储在链上。
revealVote 函数使用解密后的结果更新 Suffragium 智能合约,使所有参与者都可以访问它们:
function revealVote(uint256 requestId, uint256 result) external onlyGateway {
uint256[] memory params = getParamsUint256(requestId);
uint256 voteId = params[0];
// Update state and publish results
Vote storage vote = _getVote(voteId);
vote.state = VoteState.Revealed;O
emit VoteRevealed(voteId);
}
调用 revealVote 后,所有人都可以看到最终的投票数,从而确保透明度和问责制,同时在整个过程中保持选民隐私。
考虑一下典型的政府投票流程:你开车前往指定的投票站,在长队中等待,然后在其他人包围的实体投票站投票。然后,你的选票被放入一个盒子中,稍后手动清点。此系统感觉过时,主要迎合习惯了亲自投票的年长人群,同时限制了年轻的、在数字时代出生的几代人的可访问性。
Suffragium 提供了一种变革性的替代方案。通过使用安全保密的智能合约将整个过程转移到链上,它可以确保投票是私密的、防篡改的,并且可以从任何地方访问。Suffragium 为现代投票解决方案树立了新的基准,使每个人都可以更轻松、更安全、更具包容性地参与民主进程。
- 原文链接: zama.ai/post/encrypted-o...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!