10 个版本
0.2.0 | 2023年11月8日 |
---|---|
0.1.2 | 2023年10月29日 |
0.0.6 | 2023年7月12日 |
0.0.4 | 2023年2月24日 |
0.0.2 | 2022年12月18日 |
#1368 in 魔法豆
135,802 每月下载量
用于 1,063 个 (6 个直接使用) 仓库
1.5MB
43K SLoC
light-poseidon
light-poseidon 是 Rust 编写的 Poseidon 哈希实现,为 Light Protocol 创建。
参数
该库提供了基于 BN254 曲线的预生成参数,但它可以使用任何提供的参数,只要开发者注意生成轮常数。
库提供的参数包括
- x^5 S-boxes
- 宽度 - 2 ≤ t ≤ 13
- 输入 - 1 ≤ n ≤ 12
- 8 个完整轮和部分轮,具体取决于 t:[56, 57, 56, 60, 60, 63, 64, 63, 60, 66, 60, 65]
参数可以使用
cargo xtask generate-poseidon-parameters
输出类型
Poseidon
类型实现了两个特性,用于返回不同表示的计算哈希
PoseidonBytesHasher
使用hash_bytes_be
和hash_bytes_le
方法返回一个字节数组。PoseidonHasher
具有返回ark_ff::PrimeField
的hash
方法。如果您想要立即使用与ark_ff::PrimeField
类型兼容的库处理结果,这可能很有用。
示例
使用两个简单的字节输入(转换为字段元素)和由库提供的基于 BN254 的参数的示例,使用 PoseidonBytesHasher
特性和字节数组结果
use light_poseidon::{Poseidon, PoseidonBytesHasher, parameters::bn254_x5};
use ark_bn254::Fr;
use ark_ff::{BigInteger, PrimeField};
let mut poseidon = Poseidon::<Fr>::new_circom(2).unwrap();
let hash = poseidon.hash_bytes_be(&[&[1u8; 32], &[2u8; 32]]).unwrap();
println!("{:?}", hash);
// Should print:
// [
// 13, 84, 225, 147, 143, 138, 140, 28, 125, 235, 94, 3, 85, 242, 99, 25, 32, 123, 132,
// 254, 156, 162, 206, 27, 38, 231, 53, 200, 41, 130, 25, 144
// ]
使用 PoseidonHasher
特性和 ark_ff::PrimeField
结果
use light_poseidon::{Poseidon, PoseidonHasher, parameters::bn254_x5};
use ark_bn254::Fr;
use ark_ff::{BigInteger, PrimeField};
let mut poseidon = Poseidon::<Fr>::new_circom(2).unwrap();
let input1 = Fr::from_be_bytes_mod_order(&[1u8; 32]);
let input2 = Fr::from_be_bytes_mod_order(&[2u8; 32]);
let hash = poseidon.hash(&[input1, input2]).unwrap();
// Do something with `hash`.
实现
该实现与 原始 SageMath 实现 兼容,但也受到了以下实现的启发
性能
此存储库包含一个基准测试,用于测量给定 1 - 12 个随机 32 字节输入的 Poseidon 实现的性能。
要运行它们,请简单使用
cargo bench
这是具有以下硬件的主机上的结果
- 第 12 代英特尔® 酷睿™ i7-1260P × 16
poseidon_bn254_x5_1 time: [17.543 µs 18.303 µs 19.133 µs]
Found 9 outliers among 100 measurements (9.00%)
9 (9.00%) high mild
poseidon_bn254_x5_2 time: [25.020 µs 25.866 µs 26.830 µs]
poseidon_bn254_x5_3 time: [36.076 µs 37.549 µs 38.894 µs]
poseidon_bn254_x5_4 time: [50.333 µs 52.598 µs 54.806 µs]
poseidon_bn254_x5_5 time: [64.184 µs 66.324 µs 68.706 µs]
poseidon_bn254_x5_6 time: [87.356 µs 90.259 µs 93.437 µs]
poseidon_bn254_x5_7 time: [120.08 µs 125.26 µs 130.23 µs]
poseidon_bn254_x5_8 time: [134.28 µs 139.65 µs 145.71 µs]
poseidon_bn254_x5_9 time: [161.99 µs 168.93 µs 175.94 µs]
poseidon_bn254_x5_10 time: [208.11 µs 215.27 µs 222.99 µs]
Found 1 outliers among 100 measurements (1.00%)
1 (1.00%) high mild
poseidon_bn254_x5_11 time: [239.47 µs 249.05 µs 258.35 µs]
poseidon_bn254_x5_12 time: [295.47 µs 305.80 µs 316.41 µs]
安全性
依赖项
~5MB
~96K SLoC