diff --git a/risc0-selective-privacy-poc/examples/mocked_components/mod.rs b/risc0-selective-privacy-poc/examples/mocked_components/mod.rs index 49cb55f..aa3ae1c 100644 --- a/risc0-selective-privacy-poc/examples/mocked_components/mod.rs +++ b/risc0-selective-privacy-poc/examples/mocked_components/mod.rs @@ -1,2 +1,4 @@ -pub mod sequencer; pub mod client; +pub mod sequencer; + +pub const ACCOUNTS_PRIVATE_KEYS: [Key; 3] = [[1; 8], [2; 8], [3; 8]]; diff --git a/risc0-selective-privacy-poc/examples/mocked_components/sequencer.rs b/risc0-selective-privacy-poc/examples/mocked_components/sequencer.rs deleted file mode 100644 index ef0be79..0000000 --- a/risc0-selective-privacy-poc/examples/mocked_components/sequencer.rs +++ /dev/null @@ -1,226 +0,0 @@ -use core::{ - account::Account, - bytes_to_words, - types::{Address, AuthenticationPath, Commitment, Key, Nullifier, ProgramId}, -}; -use std::collections::{BTreeMap, HashSet}; - -use nssa; -use program_methods::{PINATA_ID, TRANSFER_ID, TRANSFER_MULTIPLE_ID}; -use risc0_zkvm::Receipt; -use sparse_merkle_tree::SparseMerkleTree; - -pub struct MockedSequencer { - accounts: BTreeMap
, - commitment_tree: SparseMerkleTree, - nullifier_set: HashSet(&input_accounts, instruction_data)?; - - // Consistency checks - self.inputs_outputs_are_consistent(&input_accounts, &inputs_outputs)?; - - // Update accounts - inputs_outputs - .into_iter() - .skip(input_accounts.len()) - .for_each(|account_post_state| { - self.accounts - .insert(account_post_state.address, account_post_state); - }); - Ok(()) - } - - fn inputs_outputs_are_consistent( - &self, - input_accounts: &[Account], - inputs_outputs: &[Account], - ) -> Result<(), ()> { - let num_inputs = input_accounts.len(); - if inputs_outputs.len() != num_inputs * 2 { - return Err(()); - } - - let (claimed_accounts_pre, accounts_post) = inputs_outputs.split_at(num_inputs); - if claimed_accounts_pre != input_accounts { - return Err(()); - } - - for (account_pre, account_post) in input_accounts.iter().zip(accounts_post) { - if account_pre.address != account_post.address { - return Err(()); - } - if account_pre.nonce != account_post.nonce { - return Err(()); - } - // Redundant with previous checks, but better make it explicit. - if !self.accounts.contains_key(&account_post.address) { - return Err(()); - } - } - let accounts_pre_total_balance: u128 = - input_accounts.iter().map(|account| account.balance).sum(); - let accounts_post_total_balance: u128 = - accounts_post.iter().map(|account| account.balance).sum(); - if accounts_pre_total_balance != accounts_post_total_balance { - return Err(()); - } - return Ok(()); - } - - pub fn addresses(&self) -> Vec
{ - self.accounts.keys().cloned().collect() - } - - pub fn print(&self) { - println!("{:<20} | {:>10}", "Address (first u32)", "Balance"); - println!("{:-<20}-+-{:-<10}", "", ""); - - for account in self.accounts.values() { - println!("{:<20x} | {:>10}", account.address[0], account.balance); - } - println!("{:-<20}-+-{:-<10}", "", ""); - println!("Commitments: {:?}", self.commitment_tree.values()); - let formatted: Vec(&input_accounts, instruction_data)?; + + // Consistency checks + self.inputs_outputs_are_consistent(&input_accounts, &inputs_outputs)?; + + // Update accounts + inputs_outputs + .into_iter() + .skip(input_accounts.len()) + .for_each(|account_post_state| { + self.accounts + .insert(account_post_state.address, account_post_state); + }); + Ok(()) + } + + fn inputs_outputs_are_consistent( + &self, + input_accounts: &[Account], + inputs_outputs: &[Account], + ) -> Result<(), ()> { + let num_inputs = input_accounts.len(); + if inputs_outputs.len() != num_inputs * 2 { + return Err(()); + } + + let (claimed_accounts_pre, accounts_post) = inputs_outputs.split_at(num_inputs); + if claimed_accounts_pre != input_accounts { + return Err(()); + } + + for (account_pre, account_post) in input_accounts.iter().zip(accounts_post) { + if account_pre.address != account_post.address { + return Err(()); + } + if account_pre.nonce != account_post.nonce { + return Err(()); + } + // Redundant with previous checks, but better make it explicit. + if !self.accounts.contains_key(&account_post.address) { + return Err(()); + } + } + let accounts_pre_total_balance: u128 = + input_accounts.iter().map(|account| account.balance).sum(); + let accounts_post_total_balance: u128 = + accounts_post.iter().map(|account| account.balance).sum(); + if accounts_pre_total_balance != accounts_post_total_balance { + return Err(()); + } + return Ok(()); + } +} + diff --git a/risc0-selective-privacy-poc/examples/mocked_components/sequencer/mod.rs b/risc0-selective-privacy-poc/examples/mocked_components/sequencer/mod.rs new file mode 100644 index 0000000..16a0b0b --- /dev/null +++ b/risc0-selective-privacy-poc/examples/mocked_components/sequencer/mod.rs @@ -0,0 +1,99 @@ +use core::{ + account::Account, + bytes_to_words, + types::{Address, AuthenticationPath, Commitment, Key, Nullifier, ProgramId}, +}; +use std::collections::{BTreeMap, HashSet}; + +use nssa; +use program_methods::{PINATA_ID, TRANSFER_ID, TRANSFER_MULTIPLE_ID}; +use risc0_zkvm::Receipt; +use sparse_merkle_tree::SparseMerkleTree; + +use crate::mocked_components::ACCOUNTS_PRIVATE_KEYS; + +pub mod invoke_privacy_execution; +pub mod invoke_public_execution; + +pub struct MockedSequencer { + accounts: BTreeMap
, + commitment_tree: SparseMerkleTree, + nullifier_set: HashSet