3个不稳定版本
0.2.0 | 2020年10月19日 |
---|---|
0.1.1 | 2019年10月7日 |
0.1.0 | 2019年10月7日 |
#850 in 数学
每月47次下载
用于5个crate(4个直接使用)
275KB
6K SLoC
OpenZKP素域
适用于FFT的251位素域。
目标
- 性能针对本地和WebAssembly优化
- 通用性
- 以后:恒时操作。
- 优先使用
const fn
而不是过程宏。
优化时存在几种不同的场景
注意:模数始终假设为256位或更少。
- 程序员时间已知字段。程序员可以提供各种算法的手动调优优化实现。理想情况下应提供性能良好的默认设置。
- 编译器时间已知字段。编译器可以计算常数,例如Montgomery表示。域参数应该内联。
- 静态运行时已知字段。模数在编译时未知(但大小已知)。特定域的元素成员资格在编译时已知。域参数应该静态分配,指针内联。
- 动态运行时已知字段。模数在编译时未知(但大小已知)。特定域的元素成员资格在编译时未知。域元素应该携带指向域参数的指针。
基准测试
检出master分支
cargo bench --bench benchmark -- --save-baseline master
cargo bench --bench benchmark -- --baseline master
open target/criterion/report/index.html
使用Mac OS的仪器进行基准测试。为此,我们需要Cargo的cargo-instruments
插件。
cargo install cargo-instruments
然后您可以在分析下运行测试。建议筛选特定测试。
cargo instruments --release --bench benchmark --open [test name]
instruments -t "Time Profiler" target/release/deps/benchmark-c7230d017f7da1a3 --bench cache
参考和基准
- Curve25519的复杂Rust实现。https://github.com/dalek-cryptography/curve25519-dalek
- 一个用于常数时间算法的 Rust 库。 https://github.com/dalek-cryptography/subtle
- 可能是最调优的曲线。 https://github.com/bitcoin-core/secp256k1
- Rust 绑定: https://crates.io/crates/secp256k1
- Rust 端口: https://crates.io/crates/libsecp256k1
- 一个优先考虑性能而不是常数时间的 secp256k1 分支。 https://github.com/llamasoft/secp256k1_fast_unsafe
- ZCash 实现的 Sappling: https://github.com/zkcrypto/bellman
- Java 中 zksnark 的快速实现 https://github.com/scipr-lab/dizk
参考
依赖
~2.1–4MB
~71K SLoC