arkworks_gadgets/leaf/basic/
mod.rs1use ark_crypto_primitives::{crh::CRH, Error};
2use ark_ff::{fields::PrimeField, to_bytes};
3use ark_std::{marker::PhantomData, rand::Rng};
4
5#[cfg(feature = "r1cs")]
6pub mod constraints;
7
8#[derive(Default, Clone)]
9pub struct Private<F: PrimeField> {
10 r: F,
11 nullifier: F,
12}
13
14impl<F: PrimeField> Private<F> {
15 pub fn generate<R: Rng>(rng: &mut R) -> Self {
16 Self {
17 r: F::rand(rng),
18 nullifier: F::rand(rng),
19 }
20 }
21}
22
23pub struct BasicLeaf<F: PrimeField, H: CRH> {
24 _field: PhantomData<F>,
25 _hasher: PhantomData<H>,
26}
27
28impl<F: PrimeField, H: CRH> BasicLeaf<F, H> {
29 pub fn create_leaf(private: &Private<F>, h: &H::Parameters) -> Result<H::Output, Error> {
30 let bytes = to_bytes![private.r, private.nullifier]?;
31 H::evaluate(h, &bytes)
32 }
33
34 pub fn create_nullifier(private: &Private<F>, h: &H::Parameters) -> Result<H::Output, Error> {
35 let bytes = to_bytes![private.nullifier, private.nullifier]?;
36 H::evaluate(h, &bytes)
37 }
38}
39
40#[cfg(test)]
41mod test {
42 use super::*;
43 use crate::poseidon::CRH;
44 use ark_bls12_381::Fq;
45 use ark_crypto_primitives::crh::CRH as CRHTrait;
46 use ark_ff::to_bytes;
47 use ark_std::test_rng;
48 use arkworks_utils::utils::common::setup_params_x5_3;
49
50 type PoseidonCRH3 = CRH<Fq>;
51
52 type Leaf = BasicLeaf<Fq, PoseidonCRH3>;
53 #[test]
54 fn should_create_leaf() {
55 let rng = &mut test_rng();
56 let curve = arkworks_utils::utils::common::Curve::Bls381;
57
58 let secrets = Private::<Fq>::generate(rng);
59
60 let inputs_leaf = to_bytes![secrets.r, secrets.nullifier].unwrap();
61
62 let params = setup_params_x5_3(curve);
63 let ev_res = PoseidonCRH3::evaluate(¶ms, &inputs_leaf).unwrap();
64
65 let leaf = Leaf::create_leaf(&secrets, ¶ms).unwrap();
66 assert_eq!(ev_res, leaf);
67 }
68}