7 个版本

0.3.4 2022 年 3 月 3 日
0.2.4 2022 年 2 月 27 日
0.1.0 2021 年 12 月 14 日

#2910 in 神奇豆子

MIT 许可证

120KB
2K SLoC

默克尔计数树

Merkle Tally Tree Icon

这是在 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