@@ -88,48 +88,64 @@ pub struct Generators {
8888 /// Bases for Pedersen commitments
8989 pub pedersen_gens : PedersenGenerators ,
9090 /// The maximum number of usable generators for each party.
91- capacity : usize ,
91+ pub gens_capacity : usize ,
9292 /// Number of values or parties
93- parties : usize ,
93+ pub party_capacity : usize ,
9494 /// Per-bit generators for the bit values
9595 G_vec : Vec < Vec < RistrettoPoint > > ,
9696 /// Per-bit generators for the bit blinding factors
9797 H_vec : Vec < Vec < RistrettoPoint > > ,
9898}
9999
100100impl Generators {
101- /// Creates `capacity` generators for the given number of `parties`.
102- pub fn new ( pedersen_gens : PedersenGenerators , capacity : usize , parties : usize ) -> Self {
101+ /// Create a new `Generators` object.
102+ ///
103+ /// # Inputs
104+ ///
105+ /// * `pedersen_gens` is a pair of generators used for Pedersen
106+ /// commitments.
107+ /// * `gens_capacity` is the number of generators to precompute
108+ /// for each party. For rangeproofs, it is sufficient to pass
109+ /// `64`, the maximum bitsize of the rangeproofs. For circuit
110+ /// proofs, the capacity must be greater than the number of
111+ /// multipliers, rounded up to the next power of two.
112+ /// * `party_capacity` is the maximum number of parties that can
113+ /// produce an aggregated proof.
114+ pub fn new (
115+ pedersen_gens : PedersenGenerators ,
116+ gens_capacity : usize ,
117+ party_capacity : usize ,
118+ ) -> Self {
103119 use byteorder:: { ByteOrder , LittleEndian } ;
104120
105- let G_vec = ( 0 ..parties )
121+ let G_vec = ( 0 ..party_capacity )
106122 . map ( |i| {
107123 let party_index = i as u32 ;
108124 let mut label = [ b'G' , 0 , 0 , 0 , 0 ] ;
109125 LittleEndian :: write_u32 ( & mut label[ 1 ..5 ] , party_index) ;
110126
111127 GeneratorsChain :: new ( & label)
112- . take ( capacity )
128+ . take ( gens_capacity )
113129 . collect :: < Vec < _ > > ( )
114130 } )
115131 . collect ( ) ;
116132
117- let H_vec = ( 0 ..parties )
133+ let H_vec = ( 0 ..party_capacity )
118134 . map ( |i| {
119135 let party_index = i as u32 ;
120136 let mut label = [ b'H' , 0 , 0 , 0 , 0 ] ;
121137 LittleEndian :: write_u32 ( & mut label[ 1 ..5 ] , party_index) ;
122138
123139 GeneratorsChain :: new ( & label)
124- . take ( capacity )
140+ . take ( gens_capacity )
125141 . collect :: < Vec < _ > > ( )
126142 } )
127143 . collect ( ) ;
128144
129145 Generators {
130146 pedersen_gens,
131- capacity ,
132- parties ,
147+ gens_capacity ,
148+ party_capacity ,
133149 G_vec ,
134150 H_vec ,
135151 }
@@ -145,25 +161,22 @@ impl Generators {
145161 }
146162 }
147163
148- /// Get the maximum number of generators that can be used in a proof.
149- pub fn capacity ( & self ) -> usize {
150- self . capacity
151- }
152-
153164 /// Return an iterator over the aggregation of the parties' G generators with given size `n`.
154- pub ( crate ) fn G ( & self , n : usize ) -> impl Iterator < Item = & RistrettoPoint > {
165+ pub ( crate ) fn G ( & self , n : usize , m : usize ) -> impl Iterator < Item = & RistrettoPoint > {
155166 AggregatedGensIter {
156167 n,
168+ m,
157169 array : & self . G_vec ,
158170 party_idx : 0 ,
159171 gen_idx : 0 ,
160172 }
161173 }
162174
163175 /// Return an iterator over the aggregation of the parties' H generators with given size `n`.
164- pub ( crate ) fn H ( & self , n : usize ) -> impl Iterator < Item = & RistrettoPoint > {
176+ pub ( crate ) fn H ( & self , n : usize , m : usize ) -> impl Iterator < Item = & RistrettoPoint > {
165177 AggregatedGensIter {
166178 n,
179+ m,
167180 array : & self . H_vec ,
168181 party_idx : 0 ,
169182 gen_idx : 0 ,
@@ -174,6 +187,7 @@ impl Generators {
174187struct AggregatedGensIter < ' a > {
175188 array : & ' a Vec < Vec < RistrettoPoint > > ,
176189 n : usize ,
190+ m : usize ,
177191 party_idx : usize ,
178192 gen_idx : usize ,
179193}
@@ -187,7 +201,7 @@ impl<'a> Iterator for AggregatedGensIter<'a> {
187201 self . party_idx += 1 ;
188202 }
189203
190- if self . party_idx >= self . array . len ( ) {
204+ if self . party_idx >= self . m {
191205 None
192206 } else {
193207 let cur_gen = self . gen_idx ;
@@ -197,7 +211,7 @@ impl<'a> Iterator for AggregatedGensIter<'a> {
197211 }
198212
199213 fn size_hint ( & self ) -> ( usize , Option < usize > ) {
200- let size = self . n * self . array . len ( ) ;
214+ let size = self . n * self . m ;
201215 ( size, Some ( size) )
202216 }
203217}
@@ -240,19 +254,21 @@ mod tests {
240254 fn aggregated_gens_iter_matches_flat_map ( ) {
241255 let gens = Generators :: new ( PedersenGenerators :: default ( ) , 64 , 8 ) ;
242256
243- let helper = |n : usize | {
244- let agg_G: Vec < RistrettoPoint > = gens. G ( n) . cloned ( ) . collect ( ) ;
257+ let helper = |n : usize , m : usize | {
258+ let agg_G: Vec < RistrettoPoint > = gens. G ( n, m ) . cloned ( ) . collect ( ) ;
245259 let flat_G: Vec < RistrettoPoint > = gens
246260 . G_vec
247261 . iter ( )
262+ . take ( m)
248263 . flat_map ( move |G_j | G_j . iter ( ) . take ( n) )
249264 . cloned ( )
250265 . collect ( ) ;
251266
252- let agg_H: Vec < RistrettoPoint > = gens. H ( n) . cloned ( ) . collect ( ) ;
267+ let agg_H: Vec < RistrettoPoint > = gens. H ( n, m ) . cloned ( ) . collect ( ) ;
253268 let flat_H: Vec < RistrettoPoint > = gens
254269 . H_vec
255270 . iter ( )
271+ . take ( m)
256272 . flat_map ( move |H_j | H_j . iter ( ) . take ( n) )
257273 . cloned ( )
258274 . collect ( ) ;
@@ -261,9 +277,17 @@ mod tests {
261277 assert_eq ! ( agg_H, flat_H) ;
262278 } ;
263279
264- helper ( 64 ) ;
265- helper ( 32 ) ;
266- helper ( 16 ) ;
267- helper ( 8 ) ;
280+ helper ( 64 , 8 ) ;
281+ helper ( 64 , 4 ) ;
282+ helper ( 64 , 2 ) ;
283+ helper ( 64 , 1 ) ;
284+ helper ( 32 , 8 ) ;
285+ helper ( 32 , 4 ) ;
286+ helper ( 32 , 2 ) ;
287+ helper ( 32 , 1 ) ;
288+ helper ( 16 , 8 ) ;
289+ helper ( 16 , 4 ) ;
290+ helper ( 16 , 2 ) ;
291+ helper ( 16 , 1 ) ;
268292 }
269293}
0 commit comments