Skip to content

Commit e5fdeb9

Browse files
feat(storage-proofs): add pedersen hash precompute for x86_64 (#967)
feat(storage-proofs): add pedersen hash precompute for x86_64
2 parents f5a2e0a + cb0e3a9 commit e5fdeb9

File tree

6 files changed

+60
-24
lines changed

6 files changed

+60
-24
lines changed

fil-proofs-tooling/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ chrono = { version = "0.4.7", features = ["serde"] }
2525
memmap = "0.7.0"
2626
bellperson = "0.4.1"
2727
paired = "0.16.0"
28-
fil-sapling-crypto = "0.2.0"
28+
fil-sapling-crypto = "0.2.1"
2929
rand = "0.7"
3030
storage-proofs = { path = "../storage-proofs"}
3131
filecoin-proofs = { path = "../filecoin-proofs"}

filecoin-proofs/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ ff = "0.5.0"
2828
blake2b_simd = "0.5"
2929
bellperson = "0.4.1"
3030
paired = "0.16.0"
31-
fil-sapling-crypto = "0.2.0"
31+
fil-sapling-crypto = "0.2.1"
3232
clap = "2"
3333
log = "0.4.7"
3434
fil_logger = "0.1"

storage-proofs/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ toml = "0.5"
4141
ff = "0.5.0"
4242
bellperson = "0.4.1"
4343
paired = { version = "0.16.0", features = ["serde"] }
44-
fil-sapling-crypto = "0.2.0"
44+
fil-sapling-crypto = "0.2.1"
4545
serde_json = "1.0"
4646
log = "0.4.7"
4747
pretty_assertions = "0.6.1"

storage-proofs/src/crypto/pedersen.rs

+19-6
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use ff::PrimeFieldRepr;
22
use fil_sapling_crypto::jubjub::JubjubBls12;
3-
use fil_sapling_crypto::pedersen_hash::{pedersen_hash, Personalization};
3+
use fil_sapling_crypto::pedersen_hash::Personalization;
44
use paired::bls12_381::{Bls12, Fr, FrRepr};
55

66
use crate::error::Result;
@@ -24,9 +24,15 @@ pub fn pedersen(data: &[u8]) -> Fr {
2424
}
2525

2626
pub fn pedersen_bits<'a, S: Iterator<Item = &'a [u8]>>(data: Bits<&'a [u8], S>) -> Fr {
27-
pedersen_hash::<Bls12, _>(Personalization::None, data, &JJ_PARAMS)
28-
.into_xy()
29-
.0
27+
let digest = if cfg!(target_arch = "x86_64") {
28+
use fil_sapling_crypto::pedersen_hash::pedersen_hash_bls12_381_with_precomp;
29+
pedersen_hash_bls12_381_with_precomp::<_>(Personalization::None, data, &JJ_PARAMS)
30+
} else {
31+
use fil_sapling_crypto::pedersen_hash::pedersen_hash;
32+
pedersen_hash::<Bls12, _>(Personalization::None, data, &JJ_PARAMS)
33+
};
34+
35+
digest.into_xy().0
3036
}
3137

3238
/// Pedersen hashing for inputs that have length mulitple of the block size `256`. Based on pedersen hashes and a Merkle-Damgard construction.
@@ -62,8 +68,15 @@ fn pedersen_compression_bits<T>(bits: T) -> FrRepr
6268
where
6369
T: IntoIterator<Item = bool>,
6470
{
65-
let (x, _) = pedersen_hash::<Bls12, _>(Personalization::None, bits, &JJ_PARAMS).into_xy();
66-
x.into()
71+
let digest = if cfg!(target_arch = "x86_64") {
72+
use fil_sapling_crypto::pedersen_hash::pedersen_hash_bls12_381_with_precomp;
73+
pedersen_hash_bls12_381_with_precomp::<_>(Personalization::None, bits, &JJ_PARAMS)
74+
} else {
75+
use fil_sapling_crypto::pedersen_hash::pedersen_hash;
76+
pedersen_hash::<Bls12, _>(Personalization::None, bits, &JJ_PARAMS)
77+
};
78+
79+
digest.into_xy().0.into()
6780
}
6881

6982
#[derive(Debug, Clone)]

storage-proofs/src/hasher/pedersen.rs

+14-5
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use bellperson::{ConstraintSystem, SynthesisError};
55
use ff::{Field, PrimeField, PrimeFieldRepr};
66
use fil_sapling_crypto::circuit::pedersen_hash as pedersen_hash_circuit;
77
use fil_sapling_crypto::jubjub::JubjubEngine;
8-
use fil_sapling_crypto::pedersen_hash::{pedersen_hash, Personalization};
8+
use fil_sapling_crypto::pedersen_hash::Personalization;
99
use merkletree::hash::{Algorithm as LightAlgorithm, Hashable};
1010
use merkletree::merkle::Element;
1111
use paired::bls12_381::{Bls12, Fr, FrRepr};
@@ -260,10 +260,19 @@ impl LightAlgorithm<PedersenDomain> for PedersenFunction {
260260
) -> PedersenDomain {
261261
let node_bits = NodeBits::new(&(left.0).0[..], &(right.0).0[..]);
262262

263-
pedersen_hash::<Bls12, _>(Personalization::None, node_bits, &pedersen::JJ_PARAMS)
264-
.into_xy()
265-
.0
266-
.into()
263+
let digest = if cfg!(target_arch = "x86_64") {
264+
use fil_sapling_crypto::pedersen_hash::pedersen_hash_bls12_381_with_precomp;
265+
pedersen_hash_bls12_381_with_precomp::<_>(
266+
Personalization::None,
267+
node_bits,
268+
&pedersen::JJ_PARAMS,
269+
)
270+
} else {
271+
use fil_sapling_crypto::pedersen_hash::pedersen_hash;
272+
pedersen_hash::<Bls12, _>(Personalization::None, node_bits, &pedersen::JJ_PARAMS)
273+
};
274+
275+
digest.into_xy().0.into()
267276
}
268277
}
269278

storage-proofs/src/test_helper.rs

+24-10
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use ff::{BitIterator, Field, PrimeField, PrimeFieldRepr};
2-
use fil_sapling_crypto::pedersen_hash;
2+
use fil_sapling_crypto::pedersen_hash::Personalization;
33
use paired::bls12_381::{Bls12, Fr};
44
use rand::Rng;
55

@@ -161,15 +161,29 @@ pub fn random_merkle_path_with_value<R: Rng>(
161161
lhs.reverse();
162162
rhs.reverse();
163163

164-
cur = pedersen_hash::pedersen_hash::<Bls12, _>(
165-
pedersen_hash::Personalization::None,
166-
lhs.into_iter()
167-
.take(Fr::NUM_BITS as usize)
168-
.chain(rhs.into_iter().take(Fr::NUM_BITS as usize)),
169-
&crypto::pedersen::JJ_PARAMS,
170-
)
171-
.into_xy()
172-
.0;
164+
cur = if cfg!(target_arch = "x86_64") {
165+
use fil_sapling_crypto::pedersen_hash::pedersen_hash_bls12_381_with_precomp;
166+
pedersen_hash_bls12_381_with_precomp::<_>(
167+
Personalization::None,
168+
lhs.into_iter()
169+
.take(Fr::NUM_BITS as usize)
170+
.chain(rhs.into_iter().take(Fr::NUM_BITS as usize)),
171+
&crypto::pedersen::JJ_PARAMS,
172+
)
173+
.into_xy()
174+
.0
175+
} else {
176+
use fil_sapling_crypto::pedersen_hash::pedersen_hash;
177+
pedersen_hash::<Bls12, _>(
178+
Personalization::None,
179+
lhs.into_iter()
180+
.take(Fr::NUM_BITS as usize)
181+
.chain(rhs.into_iter().take(Fr::NUM_BITS as usize)),
182+
&crypto::pedersen::JJ_PARAMS,
183+
)
184+
.into_xy()
185+
.0
186+
};
173187
}
174188

175189
(auth_path, cur)

0 commit comments

Comments
 (0)