libzeropool_zkbob/native/sample/
mod.rs1use 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}