#miden #hash #merkle #crypto

no-std bin+lib miden-crypto

Miden密码学原语

22个不稳定版本 (9个破坏性版本)

新版本 0.10.0 2024年8月7日
0.9.3 2024年4月24日
0.9.0 2024年3月24日
0.7.1 2023年10月10日
0.1.0 2022年12月2日

#1 in #miden

Download history 2320/week @ 2024-04-20 1578/week @ 2024-04-27 1302/week @ 2024-05-04 1150/week @ 2024-05-11 749/week @ 2024-05-18 906/week @ 2024-05-25 978/week @ 2024-06-01 1149/week @ 2024-06-08 913/week @ 2024-06-15 1037/week @ 2024-06-22 1403/week @ 2024-06-29 792/week @ 2024-07-06 867/week @ 2024-07-13 1092/week @ 2024-07-20 1630/week @ 2024-07-27 1479/week @ 2024-08-03

5,247 每月下载量
23 个crate中使用 (2个直接使用)

MIT 许可证

715KB
15K SLoC

Miden Crypto

LICENSE test no-std RUST_VERSION CRATE

本crate包含Polygon Miden中使用的密码学原语。

哈希

哈希模块提供了一组Miden VM和Miden rollup使用的密码学哈希函数。目前,这些函数包括

  • BLAKE3 哈希函数,输出为256位、192位或160位。192位和160位输出是通过截断标准BLAKE3的256位输出获得的。
  • RPO 哈希函数,输出为256位。这是一个适合递归STARKs的代数哈希函数。
  • RPX 哈希函数,输出为256位。与RPO类似,这个哈希函数适合递归STARKs,但比RPO快约2倍。

有关这些哈希函数的性能基准和与其他流行哈希函数的比较,请参阅此处

Merkle

Merkle模块提供了一组与Merkle树相关的数据结构。所有这些数据结构都使用上述描述的RPO哈希函数实现。数据结构包括

  • MerkleStore:不同高度的Merkle树集合,旨在高效存储具有共同子树的树。当与RecordingMap一起实例化时,Merkle存储记录原始数据的所有访问。
  • MerkleTree:一个常规的完全平衡的二叉Merkle树。此树的深度最多为64。
  • Mmr:一个Merkle山脉结构,设计为只追加日志。
  • PartialMerkleTree:Merkle树的部分视图,其中某些子树可能未知。这类似于所有解析到同一根的Merkle路径集合。路径长度最多为64。
  • PartialMmr:Merkle山脉结构的部分视图。
  • SimpleSmt:稀疏Merkle树(无压缩),将64位键映射到4元素值。
  • Smt:一种稀疏默克尔树(深度压缩至64层),将4元素键映射到4元素值。

该模块还包含一些附加的支持组件,如NodeIndexMerklePathMerkleError,以协助树索引、开启证明和报告不一致的论证/状态。

签名

DSA模块提供了Miden虚拟机默认支持的数字签名方案。目前,这些方案包括

  • RPO Falcon512:Falcon签名方案的一种变体。这种变体与标准方案的不同之处在于,在“散列到点”算法中,我们使用RPO256代替SHAKE256哈希函数。这使得签名在Miden虚拟机中更容易验证。

对于上述签名,键生成、签名和签名验证在stdno_std上下文中都可用(请参阅下面的crate功能)。然而,在no_std上下文中,用户负责为键生成和签名过程提供一个随机数生成器。

伪随机元素生成器

伪随机元素生成器模块提供了一套特性和数据结构,有助于在Miden虚拟机和Miden汇总上下文中生成伪随机元素。该模块目前包括

  • FeltRng:一个用于生成随机域元素和随机4域元素的特质。
  • RpoRandomCoin:一个结构体,实现了FeltRng以及使用RPO哈希函数的RandomCoin特质。
  • RpxRandomCoin:一个结构体,实现了FeltRng以及使用RPX哈希函数的RandomCoin特质。

包功能

此包可以使用以下功能进行编译

  • std - 默认启用,并依赖于Rust标准库。
  • no_std不依赖于Rust标准库,并启用将代码编译为WebAssembly。

这两个功能都意味着使用alloc来支持堆分配的集合。

要使用no_std编译,请启用avx2目标功能。例如

AVX2加速

在支持AVX2的平台,可以使用向量处理单元加速RPO和RPX哈希函数。要启用AVX2加速,需要将代码编译为带有avx2目标功能的代码。例如

cargo make build-avx2

SVE加速

在支持SVE的平台,可以使用向量处理单元加速RPO和RPX哈希函数。要启用SVE加速,需要将代码编译为带有sve目标功能的代码。例如

cargo make build-sve

测试

测试库的最佳方式是使用我们的Makefile.tomlcargo-make,这将使您能够使用我们预定义的优化测试命令

cargo make test-all

例如,一些函数较重,如果仅使用cargo test进行测试,可能需要较长时间才能完成。为了在发布和优化模式下进行测试,我们必须复制开发模式的测试条件,以便验证所有调试断言。

我们通过启用编译的一些特殊标志(我们在Makefile.toml中将其设置为默认值)来实现这一点。

RUSTFLAGS="-C debug-assertions -C overflow-checks -C debuginfo=2" cargo test --release

许可证

本项目采用MIT许可证

依赖项

~5.5MB
~99K SLoC