7 个版本
0.3.4 | 2022 年 3 月 3 日 |
---|---|
0.2.4 | 2022 年 2 月 27 日 |
0.1.0 | 2021 年 12 月 14 日 |
#2910 in 神奇豆子
120KB
2K SLoC
默克尔计数树
这是在 Rust 中实现的默克尔计数树。默克尔计数树可以高效地统计电子投票。它可以扩展到数百万张选票,同时仍然能够高效地向每位选民证明计票是公平的。使用默克尔计数树,您可以创建
- 关于投票结果中投票已被计数的有效证明(投票包含)。
- 关于投票结果中投票未被计数的有效证明(投票排除)。
- 关于计票中包含的选票数量的有效证明(无选票保留)。
参考文档描述了证明是如何设计的。
请参阅比特币无限的区块链投票技术文章中的白皮书。
示例
use tallytree::generate::generate_tree;
use tallytree::hash::hash_node_ref;
use tallytree::proof::{
create_inclusion_exclusion_proof, create_proof_of_vote_count, verify_exclusion_proof,
verify_inclusion_proof, verify_proof_of_vote_count,
};
use tallytree::Validation;
// A vote with 3 voters where:
//
// - 0xaa votes for the first option
// - 0xcc votes for the first option
// - 0xdd votes for the second option.
let tree = generate_tree(vec![
([0xaa; 32], vec![1, 0]),
([0xcc; 32], vec![1, 0]),
([0xdd; 32], vec![0, 1]),
], true)
.unwrap();
let v = &Validation::Strict;
let merkle_root_hash = hash_node_ref(&tree, v).unwrap().unwrap().0;
// Create a proof and verify that 0xaa's vote was tallied.
let (inclusion, _) = create_inclusion_exclusion_proof(&tree, &[0xaa; 32], v).unwrap();
let (proof_hash, _, vote) = verify_inclusion_proof(&inclusion, &[0xaa; 32], v).unwrap();
assert_eq!(proof_hash, merkle_root_hash);
// Create a proof and verify that 0xbb's vote was not tallied.
let (_, exclusion) = create_inclusion_exclusion_proof(&tree, &[0xbb; 32], v).unwrap();
let (proof_hash, _) = verify_exclusion_proof(&exclusion, &[0xbb; 32], v).unwrap();
assert_eq!(proof_hash, merkle_root_hash);
// Create a proof and verify that there are 3 voters in the tally.
let votes_proof = create_proof_of_vote_count(&tree, v).unwrap();
let (votes, proof_hash, _) = verify_proof_of_vote_count(&votes_proof).unwrap();
assert_eq!(proof_hash, merkle_root_hash);
assert_eq!(votes, 3);
许可证
本项目采用 MIT 许可证。
联系方式
本项目是比特币无限的一部分。请加入 比特币无限电报频道。
贡献
欢迎合并请求。建议在做出较大更改之前联系项目负责人(dagurval)。
基准测试
基准测试需要 Rust 夜间版,并且需要通过功能标志启用。要运行基准测试: cargo +nightly bench --features=with-benchmarks
。
依赖项
~350–710KB
~16K SLoC