libzeropool_zkbob/native/sample/
mod.rs

1use crate::native::account::Account;
2use crate::native::boundednum::BoundedNum;
3use crate::native::note::Note;
4use crate::native::key::derive_key_p_d;
5use crate::native::params::PoolParams;
6use crate::constants;
7use fawkes_crypto::ff_uint::{Num, NumRepr, PrimeField, PrimeFieldParams, Uint};
8
9
10impl<Fr:PrimeField> Account<Fr>
11{
12    #[inline]
13    pub fn sample<R: fawkes_crypto::rand::Rng + ?Sized, P:PoolParams<Fr=Fr>>(rng: &mut R, params:&P) -> Account<Fr> {
14        let n_bits = (<Fr as PrimeFieldParams>::Inner::NUM_WORDS*<Fr as PrimeFieldParams>::Inner::WORD_BITS) as u32;
15        let b_num = rng.gen::<NumRepr<<Fr as PrimeFieldParams>::Inner>>()>>(n_bits - constants::BALANCE_SIZE_BITS as u32/2);
16        let e_num = rng.gen::<NumRepr<<Fr as PrimeFieldParams>::Inner>>()>>(n_bits - constants::ENERGY_SIZE_BITS as u32/2);
17
18        let b = BoundedNum::new(Num::from_uint(b_num).unwrap());
19        let e = BoundedNum::new(Num::from_uint(e_num).unwrap());
20
21        let d:BoundedNum<_, {constants::DIVERSIFIER_SIZE_BITS}> = rng.gen();
22        let p_d = derive_key_p_d::<P, Fr>(d.to_num(), rng.gen(), params).x;
23
24        Account {
25            d,
26            p_d,
27            i: rng.gen(),
28            b,
29            e,
30        }
31    }
32}
33
34
35impl<Fr:PrimeField, const L: usize> fawkes_crypto::rand::distributions::Distribution<BoundedNum<Fr, L>>
36    for fawkes_crypto::rand::distributions::Standard
37{
38    #[inline]
39    fn sample<R: fawkes_crypto::rand::Rng + ?Sized>(&self, rng: &mut R) -> BoundedNum<Fr, L> {
40        let mut t : NumRepr<Fr::Inner> = rng.gen();
41        t >>= (Fr::Inner::NUM_WORDS*Fr::Inner::WORD_BITS) as u32 - L as u32;
42        BoundedNum::new(Num::from_uint_unchecked(t))
43    }
44}
45
46
47impl<Fr:PrimeField> Note<Fr> {
48    #[inline]
49    pub fn sample<R: fawkes_crypto::rand::Rng + ?Sized, P:PoolParams<Fr=Fr>>(rng: &mut R, params:&P) -> Note<Fr> {
50        let n_bits = (<Fr as PrimeFieldParams>::Inner::NUM_WORDS*<Fr as PrimeFieldParams>::Inner::WORD_BITS) as u32;
51        let b_num = rng.gen::<NumRepr<<Fr as PrimeFieldParams>::Inner>>() >> (n_bits - constants::BALANCE_SIZE_BITS as u32/2);
52        let b = BoundedNum::new(Num::from_uint(b_num).unwrap());
53        let d:BoundedNum<_, {constants::DIVERSIFIER_SIZE_BITS}> = rng.gen();
54        let p_d = derive_key_p_d::<P, Fr>(d.to_num(), rng.gen(), params).x;
55
56        Note {
57            d,
58            p_d,
59            b,
60            t: rng.gen()
61        }
62    }
63}