From c9318ef92a1471a95b0c76c9b6f122bcef8e5f4b Mon Sep 17 00:00:00 2001 From: Sebastien Chapuis Date: Sat, 9 Mar 2024 20:53:57 +0100 Subject: [PATCH] Make `group_by_zkapp_command_rev` generic, to use it in tx pool --- ledger/src/proofs/zkapp.rs | 57 +++++++++++++++++++++++++------------- 1 file changed, 37 insertions(+), 20 deletions(-) diff --git a/ledger/src/proofs/zkapp.rs b/ledger/src/proofs/zkapp.rs index d0d5c6908..ba4a8da7e 100644 --- a/ledger/src/proofs/zkapp.rs +++ b/ledger/src/proofs/zkapp.rs @@ -87,7 +87,7 @@ pub struct ZkappParams<'a> { pub proved_path: Option<&'a str>, } -mod group { +pub mod group { use super::*; use crate::scan_state::transaction_logic::zkapp_command::{AccountUpdate, Control}; @@ -119,26 +119,31 @@ mod group { } #[derive(Debug)] - pub struct State { - pub global: GlobalState, - pub local: LocalStateEnv, + pub struct State { + pub global: GlobalState, + pub local: LocalState, } #[derive(Debug)] - pub struct ZkappCommandIntermediateState { + pub struct ZkappCommandIntermediateState { pub kind: Kind, pub spec: SegmentBasic, - pub state_before: State, - pub state_after: State, - pub connecting_ledger: Fp, + pub state_before: State, + pub state_after: State, + pub connecting_ledger: ConnectingLedgerHash, } - fn intermediate_state( + fn intermediate_state( kind: Kind, spec: SegmentBasic, - before: &(GlobalState, LocalStateEnv, Fp), - after: &(GlobalState, LocalStateEnv, Fp), - ) -> ZkappCommandIntermediateState { + before: &(GlobalState, LocalState, ConnectingLedgerHash), + after: &(GlobalState, LocalState, ConnectingLedgerHash), + ) -> ZkappCommandIntermediateState + where + GlobalState: Clone, + LocalState: Clone, + ConnectingLedgerHash: Clone, + { let (global_before, local_before, _) = before; let (global_after, local_after, connecting_ledger) = after; ZkappCommandIntermediateState { @@ -157,17 +162,24 @@ mod group { } // Note: Unlike OCaml, the returned value (the list) is not reversed, but we keep the same method name - pub fn group_by_zkapp_command_rev( + pub fn group_by_zkapp_command_rev( zkapp_command: Vec<&ZkAppCommand>, - stmtss: Vec, LocalStateEnv, Fp)>>, - ) -> Vec { + stmtss: Vec>, + ) -> Vec> + where + GlobalState: Clone, + LocalState: Clone, + ConnectingLedgerHash: Clone, + { let mut zkapp_account_updatess = zkapp_command .iter() .map(|zkapp_command| zkapp_command.all_account_updates_list()) .collect::>(); zkapp_account_updatess.insert(0, vec![]); - let mut acc = Vec::::with_capacity(32); + let mut acc = Vec::< + ZkappCommandIntermediateState, + >::with_capacity(32); // Convert to slices, to allow matching below let zkapp_account_updatess = zkapp_account_updatess @@ -177,11 +189,16 @@ mod group { let stmtss = stmtss.iter().map(|v| v.as_slice()).collect::>(); #[rustfmt::skip] - fn group_by_zkapp_command_rev_impl( + fn group_by_zkapp_command_rev_impl( zkapp_commands: &[&[AccountUpdate]], - stmtss: &[&[(GlobalState, LocalStateEnv, Fp)]], - acc: &mut Vec, - ) { + stmtss: &[&[(G, L, C)]], + acc: &mut Vec>, + ) + where + G: Clone, + L: Clone, + C: Clone, + { use Kind::{New, Same, TwoNew}; use Control::{Proof, Signature, NoneGiven};