@@ -7,7 +7,6 @@ use itertools::Itertools;
77use plonky2:: hash:: poseidon:: PoseidonHash ;
88use plonky2:: plonk:: config:: Hasher ;
99use std:: any:: Any ;
10- use std:: error:: Error ;
1110use std:: fmt;
1211
1312pub const VALUE_TYPE : & str = "MockMainPOD" ;
@@ -64,14 +63,6 @@ impl Operation {
6463 . collect :: < Result < Vec < crate :: middleware:: Statement > > > ( ) ?;
6564 middleware:: Operation :: op ( self . 0 , & deref_args)
6665 }
67- /// Argument method. Trailing Nones are filtered out.
68- pub fn args ( & self ) -> Vec < OperationArg > {
69- let maybe_last_arg_index = ( 0 ..self . 1 . len ( ) ) . rev ( ) . find ( |i| !self . 1 [ * i] . is_none ( ) ) ;
70- match maybe_last_arg_index {
71- None => vec ! [ ] ,
72- Some ( i) => self . 1 [ 0 ..i + 1 ] . to_vec ( ) ,
73- }
74- }
7566}
7667
7768#[ derive( Clone , Debug , PartialEq , Eq ) ]
@@ -124,13 +115,17 @@ impl TryFrom<Statement> for middleware::Statement {
124115 ) ;
125116 Ok ( match ( s. 0 , args, proper_args. len ( ) ) {
126117 ( NS :: None , _, 0 ) => S :: None ,
127- ( NS :: ValueOf , ( Some ( SA :: Key ( ak) ) , Some ( SA :: Literal ( v) ) , _) , 2 ) => S :: ValueOf ( ak, v) ,
128- ( NS :: Equal , ( Some ( SA :: Key ( ak1) ) , Some ( SA :: Key ( ak2) ) , _) , 2 ) => S :: Equal ( ak1, ak2) ,
129- ( NS :: NotEqual , ( Some ( SA :: Key ( ak1) ) , Some ( SA :: Key ( ak2) ) , _) , 2 ) => S :: NotEqual ( ak1, ak2) ,
130- ( NS :: Gt , ( Some ( SA :: Key ( ak1) ) , Some ( SA :: Key ( ak2) ) , _) , 2 ) => S :: Gt ( ak1, ak2) ,
131- ( NS :: Lt , ( Some ( SA :: Key ( ak1) ) , Some ( SA :: Key ( ak2) ) , _) , 2 ) => S :: Lt ( ak1, ak2) ,
132- ( NS :: Contains , ( Some ( SA :: Key ( ak1) ) , Some ( SA :: Key ( ak2) ) , _) , 2 ) => S :: Contains ( ak1, ak2) ,
133- ( NS :: NotContains , ( Some ( SA :: Key ( ak1) ) , Some ( SA :: Key ( ak2) ) , _) , 2 ) => {
118+ ( NS :: ValueOf , ( Some ( SA :: Key ( ak) ) , Some ( SA :: Literal ( v) ) , None ) , 2 ) => S :: ValueOf ( ak, v) ,
119+ ( NS :: Equal , ( Some ( SA :: Key ( ak1) ) , Some ( SA :: Key ( ak2) ) , None ) , 2 ) => S :: Equal ( ak1, ak2) ,
120+ ( NS :: NotEqual , ( Some ( SA :: Key ( ak1) ) , Some ( SA :: Key ( ak2) ) , None ) , 2 ) => {
121+ S :: NotEqual ( ak1, ak2)
122+ }
123+ ( NS :: Gt , ( Some ( SA :: Key ( ak1) ) , Some ( SA :: Key ( ak2) ) , None ) , 2 ) => S :: Gt ( ak1, ak2) ,
124+ ( NS :: Lt , ( Some ( SA :: Key ( ak1) ) , Some ( SA :: Key ( ak2) ) , None ) , 2 ) => S :: Lt ( ak1, ak2) ,
125+ ( NS :: Contains , ( Some ( SA :: Key ( ak1) ) , Some ( SA :: Key ( ak2) ) , None ) , 2 ) => {
126+ S :: Contains ( ak1, ak2)
127+ }
128+ ( NS :: NotContains , ( Some ( SA :: Key ( ak1) ) , Some ( SA :: Key ( ak2) ) , None ) , 2 ) => {
134129 S :: NotContains ( ak1, ak2)
135130 }
136131 ( NS :: SumOf , ( Some ( SA :: Key ( ak1) ) , Some ( SA :: Key ( ak2) ) , Some ( SA :: Key ( ak3) ) ) , 3 ) => {
@@ -276,11 +271,6 @@ fn fill_pad<T: Clone>(v: &mut Vec<T>, pad_value: T, len: usize) {
276271 }
277272}
278273
279- fn pad < T : Clone > ( v : Vec < T > , pad_value : T , len : usize ) -> Vec < T > {
280- let v_len = v. len ( ) ;
281- [ v, ( v_len..len) . map ( |_| pad_value. clone ( ) ) . collect ( ) ] . concat ( )
282- }
283-
284274impl MockMainPod {
285275 fn offset_input_signed_pods ( & self ) -> usize {
286276 0
@@ -295,14 +285,11 @@ impl MockMainPod {
295285 fn offset_public_statements ( & self ) -> usize {
296286 self . offset_input_statements ( ) + self . params . max_priv_statements ( )
297287 }
298- fn pad_statement ( params : & Params , s : Statement ) -> Statement {
299- Statement ( s . 0 , pad ( s. 1 , StatementArg :: None , params. max_statement_args ) )
288+ fn pad_statement ( params : & Params , s : & mut Statement ) {
289+ fill_pad ( & mut s. 1 , StatementArg :: None , params. max_statement_args )
300290 }
301- fn pad_operation ( params : & Params , op : Operation ) -> Operation {
302- Operation (
303- op. 0 ,
304- pad ( op. 1 , OperationArg :: None , params. max_operation_args ) ,
305- )
291+ fn pad_operation ( params : & Params , op : & mut Operation ) {
292+ fill_pad ( & mut op. 1 , OperationArg :: None , params. max_operation_args )
306293 }
307294
308295 fn layout_statements ( params : & Params , inputs : & MainPodInputs ) -> Vec < Statement > {
@@ -317,12 +304,16 @@ impl MockMainPod {
317304 . get ( i)
318305 . map ( |p| * p)
319306 . unwrap_or ( & none_sig_pod) ;
320- // TODO
321307 let sts = pod. pub_statements ( ) ;
322308 assert ! ( sts. len( ) <= params. max_signed_pod_values) ;
323309 for j in 0 ..params. max_signed_pod_values {
324- let mut st = sts. get ( j) . unwrap_or ( & middleware:: Statement :: None ) . clone ( ) ;
325- statements. push ( Self :: pad_statement ( params, st. into ( ) ) ) ;
310+ let mut st = sts
311+ . get ( j)
312+ . unwrap_or ( & middleware:: Statement :: None )
313+ . clone ( )
314+ . into ( ) ;
315+ Self :: pad_statement ( params, & mut st) ;
316+ statements. push ( st) ;
326317 }
327318 }
328319
@@ -338,8 +329,13 @@ impl MockMainPod {
338329 let sts = pod. pub_statements ( ) ;
339330 assert ! ( sts. len( ) <= params. max_public_statements) ;
340331 for j in 0 ..params. max_public_statements {
341- let mut st = sts. get ( j) . unwrap_or ( & middleware:: Statement :: None ) . clone ( ) ;
342- statements. push ( Self :: pad_statement ( params, st. into ( ) ) ) ;
332+ let mut st = sts
333+ . get ( j)
334+ . unwrap_or ( & middleware:: Statement :: None )
335+ . clone ( )
336+ . into ( ) ;
337+ Self :: pad_statement ( params, & mut st) ;
338+ statements. push ( st) ;
343339 }
344340 }
345341
@@ -350,27 +346,31 @@ impl MockMainPod {
350346 . statements
351347 . get ( i)
352348 . unwrap_or ( & middleware:: Statement :: None )
353- . clone ( ) ;
354- statements. push ( Self :: pad_statement ( params, st. into ( ) ) ) ;
349+ . clone ( )
350+ . into ( ) ;
351+ Self :: pad_statement ( params, & mut st) ;
352+ statements. push ( st) ;
355353 }
356354
357355 // Public statements
358356 assert ! ( inputs. public_statements. len( ) < params. max_public_statements) ;
359- statements . push ( Self :: pad_statement (
360- params ,
361- middleware:: Statement :: ValueOf (
362- AnchoredKey ( SELF , hash_str ( KEY_TYPE ) ) ,
363- middleware :: Value ( hash_str ( VALUE_TYPE ) . 0 ) ,
364- )
365- . into ( ) ,
366- ) ) ;
357+ let mut type_st = middleware :: Statement :: ValueOf (
358+ AnchoredKey ( SELF , hash_str ( KEY_TYPE ) ) ,
359+ middleware:: Value ( hash_str ( VALUE_TYPE ) . 0 ) ,
360+ )
361+ . into ( ) ;
362+ Self :: pad_statement ( params , & mut type_st ) ;
363+ statements . push ( type_st ) ;
364+
367365 for i in 0 ..( params. max_public_statements - 1 ) {
368- let st = inputs
366+ let mut st = inputs
369367 . public_statements
370368 . get ( i)
371369 . unwrap_or ( & middleware:: Statement :: None )
372- . clone ( ) ;
373- statements. push ( Self :: pad_statement ( params, st. into ( ) ) ) ;
370+ . clone ( )
371+ . into ( ) ;
372+ Self :: pad_statement ( params, & mut st) ;
373+ statements. push ( st) ;
374374 }
375375
376376 statements
@@ -385,8 +385,8 @@ impl MockMainPod {
385385 _ => statements
386386 . iter ( )
387387 . enumerate ( )
388- // TODO
389388 . find_map ( |( i, s) | {
389+ // TODO: Error handling
390390 ( & middleware:: Statement :: try_from ( s. clone ( ) ) . unwrap ( ) == op_arg) . then_some ( i)
391391 } )
392392 . map ( OperationArg :: Index )
@@ -399,21 +399,18 @@ impl MockMainPod {
399399 statements : & [ Statement ] ,
400400 input_operations : & [ middleware:: Operation ] ,
401401 ) -> Result < Vec < Operation > , OperationArgError > {
402- let op_none = Self :: operation_none ( params) ;
403-
404402 let mut operations = Vec :: new ( ) ;
405403 for i in 0 ..params. max_priv_statements ( ) {
406404 let op = input_operations
407405 . get ( i)
408406 . unwrap_or ( & middleware:: Operation :: None )
409407 . clone ( ) ;
410- let mut mid_args = op. args ( ) ;
411- Self :: pad_operation_args ( params, & mut mid_args) ;
412- let mut args = Vec :: with_capacity ( mid_args. len ( ) ) ;
413- for mid_arg in & mid_args {
414- let op_arg = Self :: find_op_arg ( statements, mid_arg) ?;
415- args. push ( op_arg)
416- }
408+ let mid_args = op. args ( ) ;
409+ let mut args = mid_args
410+ . iter ( )
411+ . map ( |mid_arg| Self :: find_op_arg ( statements, mid_arg) )
412+ . collect :: < Result < Vec < _ > , OperationArgError > > ( ) ?;
413+ Self :: pad_operation_args ( params, & mut args) ;
417414 operations. push ( Operation ( op. code ( ) , args) ) ;
418415 }
419416 Ok ( operations)
@@ -468,7 +465,11 @@ impl MockMainPod {
468465 . statements
469466 . iter ( )
470467 . cloned ( )
471- . map ( |s| Self :: pad_statement ( params, s. into ( ) ) )
468+ . map ( |s| {
469+ let mut s = s. into ( ) ;
470+ Self :: pad_statement ( params, & mut s) ;
471+ s
472+ } )
472473 . collect_vec ( ) ;
473474 let public_statements =
474475 statements[ statements. len ( ) - params. max_public_statements ..] . to_vec ( ) ;
@@ -495,15 +496,17 @@ impl MockMainPod {
495496 }
496497
497498 fn operation_none ( params : & Params ) -> Operation {
498- Self :: pad_operation ( params, Operation ( NativeOperation :: None , vec ! [ ] ) )
499+ let mut op = Operation ( NativeOperation :: None , vec ! [ ] ) ;
500+ fill_pad ( & mut op. 1 , OperationArg :: None , params. max_operation_args ) ;
501+ op
499502 }
500503
501504 fn pad_statement_args ( params : & Params , args : & mut Vec < StatementArg > ) {
502505 fill_pad ( args, StatementArg :: None , params. max_statement_args )
503506 }
504507
505- fn pad_operation_args ( params : & Params , args : & mut Vec < middleware :: Statement > ) {
506- fill_pad ( args, middleware :: Statement :: None , params. max_operation_args )
508+ fn pad_operation_args ( params : & Params , args : & mut Vec < OperationArg > ) {
509+ fill_pad ( args, OperationArg :: None , params. max_operation_args )
507510 }
508511}
509512
@@ -556,7 +559,7 @@ impl Pod for MockMainPod {
556559 s,
557560 )
558561 } )
559- . filter ( |( i , s) | s. 0 == NativeStatement :: ValueOf )
562+ . filter ( |( _ , s) | s. 0 == NativeStatement :: ValueOf )
560563 . flat_map ( |( i, s) | {
561564 if let StatementArg :: Key ( ak) = & s. 1 [ 0 ] {
562565 vec ! [ ( i, ak. 1 , ak. 0 ) ]
0 commit comments