2 个版本

0.1.1 2022年8月13日
0.1.0 2022年8月7日

#5 in #algorand

MIT 许可协议

22KB
344

sumhash

Crates.io Docs.rs CI

此存储库包含 Algorand 项目设计的子集求和哈希函数的 Rust 实现。

参考实现是用 Go 编写的,可以在 go-sumhash 仓库中找到。您还可以参考 spec 以查看哈希函数的正式描述。

此实现并非 Go 仓库的直接移植,因为官方实现不会导致 Rust 的惯用用法。在此库中,我们实现了一个可以包装在 CoreWrapper 中的 Sumhash512Core 内核。如果您对直接移植参考实现的早期版本感兴趣,请查看 legacyport 分支。

此库有一个 AlgorandSumhash512Core 类型别名,它简化了 Sumhash512Core 的默认配置,该配置使用 Algorand 区块链状态证明的官方种子。AlgorandSumhash512Core 使用查找表作为默认的底层压缩器设置,而不是矩阵。

此库 尚未 经过审计或准备好用于生产使用,也不是官方实现。

使用

使用 Algorand 实例配置

use sumhash::sumhash512core::AlgorandSumhash512Core;
use digest::{core_api::CoreWrapper, FixedOutput, Update};

fn main() {
  let mut h = CoreWrapper::<AlgorandSumhash512Core>::default();
  h.update("hello world".as_bytes());
  let output = h.finalize_fixed();
  println!("Result: {}", hex::encode(&output));
}

提供自己的种子的通用版本。

use sumhash::sumhash512core::Sumhash512Core;
use digest::{core_api::CoreWrapper, FixedOutput, Update};

fn main() {
  let mut salt = [0; 64];
  salt[0] = 0x13;
  salt[1] = 0x37;
  let mut h = CoreWrapper::from_core(Sumhash512Core::new_with_salt(salt));
  h.update("hello world".as_bytes());
  let output = h.finalize_fixed();
  println!("Result: {}", hex::encode(&output));
}

Cargo

构建

运行 cargo build

测试

go-sumhash 移植并通过的所有现有测试。这些测试依赖于使用 Shake256 生成随机矩阵,此库也尊重输入和预期精确输出匹配,从而增加了正确性的信心。

运行 cargo test

running 5 tests
test sumhash512core::test::sumhash512_salt ... ok
test sumhash512core::test::sumhash512 ... ok
test sumhash512core::test::sumhash512_reset ... ok
test sumhash512core::test::test_vector ... ok
test compress::test::compression ... ok

test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.59s

   Doc-tests sumhash

running 2 tests
test src/lib.rs - (line 37) ... ok
test src/lib.rs - (line 26) ... ok

test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.21s

基准测试

计划添加基准测试。

许可协议

MIT 许可协议 下许可。

贡献

请参阅 CONTRIBUTING.md

依赖关系

~2MB
~19K SLoC