From 43bd2a831485eb67c42a0842f9f8f32185cb3743 Mon Sep 17 00:00:00 2001 From: Rostyslav Tyshko Date: Fri, 7 Feb 2025 15:16:31 -0500 Subject: [PATCH 01/16] fix error handing in zkvm module --- zkvm/src/lib.rs | 99 ++++++++++++++++++++++++------------------------- 1 file changed, 49 insertions(+), 50 deletions(-) diff --git a/zkvm/src/lib.rs b/zkvm/src/lib.rs index aff0ced..19fa8be 100644 --- a/zkvm/src/lib.rs +++ b/zkvm/src/lib.rs @@ -56,7 +56,7 @@ pub fn prove_mint_utxo( let digest: UTXOPayload = receipt.journal.decode()?; - Ok((UTXO::create_utxo_from_payload(digest), receipt)) + Ok((UTXO::create_utxo_from_payload(digest).map_err(ExecutionFailureKind::write_error)?, receipt)) } pub fn prove_send_utxo( @@ -95,8 +95,8 @@ pub fn prove_send_utxo( Ok(( digest .into_iter() - .map(|(payload, addr)| (UTXO::create_utxo_from_payload(payload), addr)) - .collect(), + .map(|(payload, addr)| (UTXO::create_utxo_from_payload(payload).map(|sel| (sel, addr)))) + .collect::>>().map_err(ExecutionFailureKind::write_error)?, receipt, )) } @@ -144,12 +144,12 @@ pub fn prove_send_utxo_multiple_assets_one_receiver( .0 .into_iter() .map(|payload| UTXO::create_utxo_from_payload(payload)) - .collect(), + .collect::>>().map_err(ExecutionFailureKind::write_error)?, digest .1 .into_iter() .map(|payload| UTXO::create_utxo_from_payload(payload)) - .collect(), + .collect::>>().map_err(ExecutionFailureKind::write_error)?, receipt, )) } @@ -170,7 +170,7 @@ pub fn prove_send_utxo_shielded( asset: vec![], amount, privacy_flag: true, - }); + }).map_err(ExecutionFailureKind::write_error)?; let utxo_payload = temp_utxo_to_spend.into_payload(); let mut builder = ExecutorEnv::builder(); @@ -198,8 +198,8 @@ pub fn prove_send_utxo_shielded( Ok(( digest .into_iter() - .map(|(payload, addr)| (UTXO::create_utxo_from_payload(payload), addr)) - .collect(), + .map(|(payload, addr)| (UTXO::create_utxo_from_payload(payload).map(|sel| (sel, addr)))) + .collect::>>().map_err(ExecutionFailureKind::write_error)?, receipt, )) } @@ -280,24 +280,24 @@ pub fn prove_mint_utxo_multiple_assets( digest .into_iter() .map(UTXO::create_utxo_from_payload) - .collect(), + .collect::>>().map_err(ExecutionFailureKind::write_error)?, receipt, )) } -pub fn execute_mint_utxo(amount_to_mint: u128, owner: AccountAddress) -> UTXO { +pub fn execute_mint_utxo(amount_to_mint: u128, owner: AccountAddress) -> anyhow::Result { let mut builder = ExecutorEnv::builder(); - builder.write(&amount_to_mint).unwrap(); - builder.write(&owner).unwrap(); + builder.write(&amount_to_mint)?; + builder.write(&owner)?; - let env = builder.build().unwrap(); + let env = builder.build()?; let executor = default_executor(); - let receipt = executor.execute(env, test_methods::MINT_UTXO_ELF).unwrap(); + let receipt = executor.execute(env, test_methods::MINT_UTXO_ELF)?; - let digest: UTXOPayload = receipt.journal.decode().unwrap(); + let digest: UTXOPayload = receipt.journal.decode()?; UTXO::create_utxo_from_payload(digest) } @@ -305,76 +305,75 @@ pub fn execute_mint_utxo(amount_to_mint: u128, owner: AccountAddress) -> UTXO { pub fn execute_send_utxo( spent_utxo: UTXO, owners_parts: Vec<(u128, AccountAddress)>, -) -> (UTXO, Vec<(UTXO, AccountAddress)>) { +) -> anyhow::Result<(UTXO, Vec<(UTXO, AccountAddress)>)> { let mut builder = ExecutorEnv::builder(); let utxo_payload = spent_utxo.into_payload(); - builder.write(&utxo_payload).unwrap(); - builder.write(&owners_parts).unwrap(); + builder.write(&utxo_payload)?; + builder.write(&owners_parts)?; - let env = builder.build().unwrap(); + let env = builder.build()?; let executor = default_executor(); - let receipt = executor.execute(env, test_methods::SEND_UTXO_ELF).unwrap(); + let receipt = executor.execute(env, test_methods::SEND_UTXO_ELF)?; let digest: (UTXOPayload, Vec<(UTXOPayload, AccountAddress)>) = - receipt.journal.decode().unwrap(); + receipt.journal.decode()?; - ( - UTXO::create_utxo_from_payload(digest.0), + Ok(( + UTXO::create_utxo_from_payload(digest.0)?, digest .1 .into_iter() - .map(|(payload, addr)| (UTXO::create_utxo_from_payload(payload), addr)) - .collect(), - ) + .map(|(payload, addr)| (UTXO::create_utxo_from_payload(payload).map(|sel| (sel, addr)))) + .collect::>>().map_err(ExecutionFailureKind::write_error)?, + )) } -pub fn prove(input_vec: Vec, elf: &[u8]) -> (u64, Receipt) { +pub fn prove(input_vec: Vec, elf: &[u8]) -> anyhow::Result<(u64, Receipt)> { let mut builder = ExecutorEnv::builder(); for input in input_vec { - builder.write(&input).unwrap(); + builder.write(&input)?; } - let env = builder.build().unwrap(); + let env = builder.build()?; let prover = default_prover(); - let receipt = prover.prove(env, elf).unwrap().receipt; + let receipt = prover.prove(env, elf)?.receipt; - let digest = receipt.journal.decode().unwrap(); - (digest, receipt) + let digest = receipt.journal.decode()?; + Ok((digest, receipt)) } // This only executes the program and does not generate a receipt. pub fn execute serde::Deserialize<'de>>( input_vec: Vec, elf: &[u8], -) -> T { +) -> anyhow::Result { let mut builder = ExecutorEnv::builder(); for input in input_vec { - builder.write(&input).unwrap(); + builder.write(&input)?; } - let env = builder.build().unwrap(); + let env = builder.build()?; let exec = default_executor(); - let session = exec.execute(env, elf).unwrap(); + let session = exec.execute(env, elf)?; // We read the result committed to the journal by the guest code. - let result: T = session.journal.decode().unwrap(); + let result: T = session.journal.decode()?; - result + Ok(result) } -pub fn verify(receipt: Receipt, image_id: impl Into) { - receipt - .verify(image_id) - .expect("receipt verification failed"); +pub fn verify(receipt: Receipt, image_id: impl Into) -> anyhow::Result<()> { + Ok(receipt + .verify(image_id)?) } #[cfg(test)] @@ -389,7 +388,7 @@ mod tests { let message = 1; let message_2 = 2; - let (digest, receipt) = prove(vec![message, message_2], SUMMATION_ELF); + let (digest, receipt) = prove(vec![message, message_2], SUMMATION_ELF).unwrap(); verify(receipt, SUMMATION_ID); assert_eq!(digest, message + message_2); @@ -400,7 +399,7 @@ mod tests { let message = 123476; let message_2 = 2342384; - let (digest, receipt) = prove(vec![message, message_2], SUMMATION_ELF); + let (digest, receipt) = prove(vec![message, message_2], SUMMATION_ELF).unwrap(); verify(receipt, SUMMATION_ID); assert_eq!(digest, message + message_2); @@ -411,7 +410,7 @@ mod tests { let message = 1; let message_2 = 2; - let (digest, receipt) = prove(vec![message, message_2], MULTIPLICATION_ELF); + let (digest, receipt) = prove(vec![message, message_2], MULTIPLICATION_ELF).unwrap(); verify(receipt, MULTIPLICATION_ID); assert_eq!(digest, message * message_2); @@ -422,7 +421,7 @@ mod tests { let message = 3498; let message_2 = 438563; - let (digest, receipt) = prove(vec![message, message_2], MULTIPLICATION_ELF); + let (digest, receipt) = prove(vec![message, message_2], MULTIPLICATION_ELF).unwrap(); verify(receipt, MULTIPLICATION_ID); assert_eq!(digest, message * message_2); @@ -433,7 +432,7 @@ mod tests { let message: u64 = 1; let message_2: u64 = 2; - let result = execute(vec![message, message_2], SUMMATION_ELF); + let result = execute(vec![message, message_2], SUMMATION_ELF).unwrap(); assert_eq!(result, message + message_2); } @@ -442,7 +441,7 @@ mod tests { let message: u64 = 123476; let message_2: u64 = 2342384; - let result = execute(vec![message, message_2], SUMMATION_ELF); + let result = execute(vec![message, message_2], SUMMATION_ELF).unwrap(); assert_eq!(result, message + message_2); } @@ -451,7 +450,7 @@ mod tests { let message: u128 = 1; let message_2: u128 = 2; - let result = execute(vec![message, message_2], BIG_CALCULATION_ELF); + let result = execute(vec![message, message_2], BIG_CALCULATION_ELF).unwrap(); assert_eq!(result, big_calculation(message, message_2)); } @@ -460,7 +459,7 @@ mod tests { let message: u128 = 20; let message_2: u128 = 10; - let result = execute(vec![message, message_2], BIG_CALCULATION_ELF); + let result = execute(vec![message, message_2], BIG_CALCULATION_ELF).unwrap(); assert_eq!(result, big_calculation(message, message_2)); } From ffad7c48d2bab71ccd97f5fd2f26f5ed58e27888 Mon Sep 17 00:00:00 2001 From: Rostyslav Tyshko Date: Fri, 7 Feb 2025 15:16:47 -0500 Subject: [PATCH 02/16] errors in utxo_tree --- utxo/src/utxo_tree.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/utxo/src/utxo_tree.rs b/utxo/src/utxo_tree.rs index 89df4f4..f711e64 100644 --- a/utxo/src/utxo_tree.rs +++ b/utxo/src/utxo_tree.rs @@ -88,7 +88,7 @@ mod tests { } } - fn sample_utxo() -> UTXO { + fn sample_utxo() -> anyhow::Result { UTXO::create_utxo_from_payload(sample_utxo_payload()) } @@ -102,7 +102,7 @@ mod tests { #[test] fn test_insert_item() { let mut smt = UTXOSparseMerkleTree::new(); - let utxo = sample_utxo(); + let utxo = sample_utxo().unwrap(); let result = smt.insert_item(utxo.clone()); @@ -119,8 +119,8 @@ mod tests { #[test] fn test_insert_items() { let mut smt = UTXOSparseMerkleTree::new(); - let utxo1 = sample_utxo(); - let utxo2 = sample_utxo(); + let utxo1 = sample_utxo().unwrap(); + let utxo2 = sample_utxo().unwrap(); let result = smt.insert_items(vec![utxo1.clone(), utxo2.clone()]); @@ -138,7 +138,7 @@ mod tests { #[test] fn test_get_item_exists() { let mut smt = UTXOSparseMerkleTree::new(); - let utxo = sample_utxo(); + let utxo = sample_utxo().unwrap(); smt.insert_item(utxo.clone()).unwrap(); @@ -151,7 +151,7 @@ mod tests { #[test] fn test_get_item_not_exists() { let mut smt = UTXOSparseMerkleTree::new(); - let utxo = sample_utxo(); + let utxo = sample_utxo().unwrap(); // Insert one UTXO and try to fetch a different hash smt.insert_item(utxo).unwrap(); @@ -166,7 +166,7 @@ mod tests { #[test] fn test_get_membership_proof() { let mut smt = UTXOSparseMerkleTree::new(); - let utxo = sample_utxo(); + let utxo = sample_utxo().unwrap(); smt.insert_item(utxo.clone()).unwrap(); From 49750b600f2ebe61b030dc73125e23c39111f2dd Mon Sep 17 00:00:00 2001 From: Rostyslav Tyshko Date: Fri, 7 Feb 2025 15:17:03 -0500 Subject: [PATCH 03/16] propagation in utxo_core --- utxo/src/utxo_core.rs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/utxo/src/utxo_core.rs b/utxo/src/utxo_core.rs index 745950c..c2e0fce 100644 --- a/utxo/src/utxo_core.rs +++ b/utxo/src/utxo_core.rs @@ -29,8 +29,8 @@ pub struct UTXOPayload { } impl UTXO { - pub fn create_utxo_from_payload(payload_with_asset: UTXOPayload) -> Self { - let raw_payload = serde_json::to_vec(&payload_with_asset).unwrap(); + pub fn create_utxo_from_payload(payload_with_asset: UTXOPayload) -> anyhow::Result { + let raw_payload = serde_json::to_vec(&payload_with_asset)?; let mut hasher = sha2::Sha256::new(); @@ -38,14 +38,14 @@ impl UTXO { let hash = ::from(hasher.finalize_fixed()); - Self { + Ok(Self { hash, owner: payload_with_asset.owner, nullifier: None, asset: payload_with_asset.asset, amount: payload_with_asset.amount, privacy_flag: payload_with_asset.privacy_flag, - } + }) } pub fn consume_utxo(&mut self, nullifier: UTXONullifier) -> Result<()> { @@ -123,7 +123,7 @@ mod tests { #[test] fn test_create_utxo_from_payload() { let payload = sample_payload(); - let utxo = UTXO::create_utxo_from_payload(payload.clone()); + let utxo = UTXO::create_utxo_from_payload(payload.clone()).unwrap(); // Ensure hash is created and the UTXO fields are correctly assigned assert_eq!(utxo.owner, payload.owner); @@ -134,7 +134,7 @@ mod tests { #[test] fn test_consume_utxo() { let payload = sample_payload(); - let mut utxo = UTXO::create_utxo_from_payload(payload); + let mut utxo = UTXO::create_utxo_from_payload(payload).unwrap(); let nullifier = sample_nullifier(); @@ -150,7 +150,7 @@ mod tests { #[test] fn test_interpret_asset() { let payload = sample_payload(); - let utxo = UTXO::create_utxo_from_payload(payload); + let utxo = UTXO::create_utxo_from_payload(payload).unwrap(); // Interpret asset as TestAsset let interpreted: TestAsset = utxo.interpret_asset().unwrap(); @@ -168,7 +168,7 @@ mod tests { fn test_interpret_invalid_asset() { let mut payload = sample_payload(); payload.asset = vec![0, 1, 2, 3]; // Invalid data for deserialization - let utxo = UTXO::create_utxo_from_payload(payload); + let utxo = UTXO::create_utxo_from_payload(payload).unwrap(); // This should fail because the asset is not valid JSON for TestAsset let result: Result = utxo.interpret_asset(); From a52bf50a0fb2fd0d617c0e0586ef82418ed7d27c Mon Sep 17 00:00:00 2001 From: Rostyslav Tyshko Date: Fri, 7 Feb 2025 15:17:20 -0500 Subject: [PATCH 04/16] errors in account_core --- accounts/src/account_core/mod.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/accounts/src/account_core/mod.rs b/accounts/src/account_core/mod.rs index b478550..91bdfe8 100644 --- a/accounts/src/account_core/mod.rs +++ b/accounts/src/account_core/mod.rs @@ -110,7 +110,7 @@ impl Account { privacy_flag, }; - let asset_utxo = UTXO::create_utxo_from_payload(payload_with_asset); + let asset_utxo = UTXO::create_utxo_from_payload(payload_with_asset)?; self.utxo_tree.insert_item(asset_utxo)?; @@ -138,7 +138,7 @@ mod tests { UTXONullifier::default() } - fn generate_dummy_utxo(address: TreeHashType, amount: u128) -> UTXO { + fn generate_dummy_utxo(address: TreeHashType, amount: u128) -> anyhow::Result { let payload = UTXOPayload { owner: address, asset: vec![], @@ -159,7 +159,7 @@ mod tests { #[test] fn test_mark_spent_utxo() { let mut account = Account::new(); - let utxo = generate_dummy_utxo(account.address, 100); + let utxo = generate_dummy_utxo(account.address, 100).unwrap(); account.add_new_utxo_outputs(vec![utxo]).unwrap(); let mut utxo_nullifier_map = HashMap::new(); @@ -174,8 +174,8 @@ mod tests { #[test] fn test_add_new_utxo_outputs() { let mut account = Account::new(); - let utxo1 = generate_dummy_utxo(account.address, 100); - let utxo2 = generate_dummy_utxo(account.address, 200); + let utxo1 = generate_dummy_utxo(account.address, 100).unwrap(); + let utxo2 = generate_dummy_utxo(account.address, 200).unwrap(); let result = account.add_new_utxo_outputs(vec![utxo1.clone(), utxo2.clone()]); From bfb79e38d6584d5369a778f92e0189e6f2cb55d0 Mon Sep 17 00:00:00 2001 From: Rostyslav Tyshko Date: Fri, 7 Feb 2025 15:17:42 -0500 Subject: [PATCH 05/16] propagation in node_core --- node_core/src/lib.rs | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/node_core/src/lib.rs b/node_core/src/lib.rs index 239bc6a..6722968 100644 --- a/node_core/src/lib.rs +++ b/node_core/src/lib.rs @@ -7,7 +7,7 @@ use k256::elliptic_curve::group::GroupEncoding; use ::storage::transaction::{Transaction, TransactionPayload, TxKind}; use accounts::account_core::{Account, AccountAddress}; -use anyhow::Result; +use anyhow::{anyhow, Result}; use config::NodeConfig; use executions::{ private_exec::{generate_commitments, generate_nullifiers}, @@ -474,8 +474,7 @@ impl NodeCore { .viewing_secret_key .to_bytes() .to_vec(), - ) - .unwrap(), + ).map_err(|err| anyhow!("{:?}", err)).map_err(ExecutionFailureKind::write_error)?, generator_blinding_factor: Tweak::new(&mut thread_rng()), }; @@ -782,8 +781,7 @@ impl NodeCore { let acc = write_guard.acc_map.get_mut(&acc_addr).unwrap(); acc.utxo_tree - .get_item(new_utxo_hash) - .unwrap() + .get_item(new_utxo_hash)? .unwrap() .clone() }; @@ -963,8 +961,7 @@ impl NodeCore { acc.log(); acc.utxo_tree - .get_item(new_utxo_hash) - .unwrap() + .get_item(new_utxo_hash)? .unwrap() .clone() }; @@ -1007,8 +1004,7 @@ impl NodeCore { acc.log(); acc.utxo_tree - .get_item(new_utxo_hash) - .unwrap() + .get_item(new_utxo_hash)? .unwrap() .clone() }; @@ -1057,8 +1053,7 @@ impl NodeCore { let new_utxo = acc .utxo_tree - .get_item(new_utxo_hash) - .unwrap() + .get_item(new_utxo_hash)? .unwrap() .clone(); @@ -1082,8 +1077,7 @@ impl NodeCore { let new_utxo = acc .utxo_tree - .get_item(new_utxo_hash) - .unwrap() + .get_item(new_utxo_hash)? .unwrap() .clone(); From 818f58e2f91b0210be6cf48eb51a40b441c5d451 Mon Sep 17 00:00:00 2001 From: Rostyslav Tyshko Date: Fri, 7 Feb 2025 15:17:55 -0500 Subject: [PATCH 06/16] fmt --- node_core/src/lib.rs | 31 ++++++++----------------------- zkvm/src/lib.rs | 37 ++++++++++++++++++++++++------------- 2 files changed, 32 insertions(+), 36 deletions(-) diff --git a/node_core/src/lib.rs b/node_core/src/lib.rs index 6722968..946908c 100644 --- a/node_core/src/lib.rs +++ b/node_core/src/lib.rs @@ -474,7 +474,9 @@ impl NodeCore { .viewing_secret_key .to_bytes() .to_vec(), - ).map_err(|err| anyhow!("{:?}", err)).map_err(ExecutionFailureKind::write_error)?, + ) + .map_err(|err| anyhow!("{:?}", err)) + .map_err(ExecutionFailureKind::write_error)?, generator_blinding_factor: Tweak::new(&mut thread_rng()), }; @@ -780,10 +782,7 @@ impl NodeCore { let acc = write_guard.acc_map.get_mut(&acc_addr).unwrap(); - acc.utxo_tree - .get_item(new_utxo_hash)? - .unwrap() - .clone() + acc.utxo_tree.get_item(new_utxo_hash)?.unwrap().clone() }; new_utxo.log(); @@ -960,10 +959,7 @@ impl NodeCore { let acc = write_guard.acc_map.get_mut(&acc_addr_rec).unwrap(); acc.log(); - acc.utxo_tree - .get_item(new_utxo_hash)? - .unwrap() - .clone() + acc.utxo_tree.get_item(new_utxo_hash)?.unwrap().clone() }; new_utxo.log(); info!( @@ -1003,10 +999,7 @@ impl NodeCore { let acc = write_guard.acc_map.get_mut(&acc_addr_rec).unwrap(); acc.log(); - acc.utxo_tree - .get_item(new_utxo_hash)? - .unwrap() - .clone() + acc.utxo_tree.get_item(new_utxo_hash)?.unwrap().clone() }; new_utxo.log(); info!( @@ -1051,11 +1044,7 @@ impl NodeCore { let acc = write_guard.acc_map.get_mut(&acc_addr_rec).unwrap(); acc.log(); - let new_utxo = acc - .utxo_tree - .get_item(new_utxo_hash)? - .unwrap() - .clone(); + let new_utxo = acc.utxo_tree.get_item(new_utxo_hash)?.unwrap().clone(); new_utxo.log(); info!( @@ -1075,11 +1064,7 @@ impl NodeCore { let acc = write_guard.acc_map.get_mut(&acc_addr).unwrap(); acc.log(); - let new_utxo = acc - .utxo_tree - .get_item(new_utxo_hash)? - .unwrap() - .clone(); + let new_utxo = acc.utxo_tree.get_item(new_utxo_hash)?.unwrap().clone(); new_utxo.log(); info!( diff --git a/zkvm/src/lib.rs b/zkvm/src/lib.rs index 19fa8be..a3dcf82 100644 --- a/zkvm/src/lib.rs +++ b/zkvm/src/lib.rs @@ -56,7 +56,10 @@ pub fn prove_mint_utxo( let digest: UTXOPayload = receipt.journal.decode()?; - Ok((UTXO::create_utxo_from_payload(digest).map_err(ExecutionFailureKind::write_error)?, receipt)) + Ok(( + UTXO::create_utxo_from_payload(digest).map_err(ExecutionFailureKind::write_error)?, + receipt, + )) } pub fn prove_send_utxo( @@ -96,7 +99,8 @@ pub fn prove_send_utxo( digest .into_iter() .map(|(payload, addr)| (UTXO::create_utxo_from_payload(payload).map(|sel| (sel, addr)))) - .collect::>>().map_err(ExecutionFailureKind::write_error)?, + .collect::>>() + .map_err(ExecutionFailureKind::write_error)?, receipt, )) } @@ -144,12 +148,14 @@ pub fn prove_send_utxo_multiple_assets_one_receiver( .0 .into_iter() .map(|payload| UTXO::create_utxo_from_payload(payload)) - .collect::>>().map_err(ExecutionFailureKind::write_error)?, + .collect::>>() + .map_err(ExecutionFailureKind::write_error)?, digest .1 .into_iter() .map(|payload| UTXO::create_utxo_from_payload(payload)) - .collect::>>().map_err(ExecutionFailureKind::write_error)?, + .collect::>>() + .map_err(ExecutionFailureKind::write_error)?, receipt, )) } @@ -170,7 +176,8 @@ pub fn prove_send_utxo_shielded( asset: vec![], amount, privacy_flag: true, - }).map_err(ExecutionFailureKind::write_error)?; + }) + .map_err(ExecutionFailureKind::write_error)?; let utxo_payload = temp_utxo_to_spend.into_payload(); let mut builder = ExecutorEnv::builder(); @@ -199,7 +206,8 @@ pub fn prove_send_utxo_shielded( digest .into_iter() .map(|(payload, addr)| (UTXO::create_utxo_from_payload(payload).map(|sel| (sel, addr)))) - .collect::>>().map_err(ExecutionFailureKind::write_error)?, + .collect::>>() + .map_err(ExecutionFailureKind::write_error)?, receipt, )) } @@ -280,7 +288,8 @@ pub fn prove_mint_utxo_multiple_assets( digest .into_iter() .map(UTXO::create_utxo_from_payload) - .collect::>>().map_err(ExecutionFailureKind::write_error)?, + .collect::>>() + .map_err(ExecutionFailureKind::write_error)?, receipt, )) } @@ -319,8 +328,7 @@ pub fn execute_send_utxo( let receipt = executor.execute(env, test_methods::SEND_UTXO_ELF)?; - let digest: (UTXOPayload, Vec<(UTXOPayload, AccountAddress)>) = - receipt.journal.decode()?; + let digest: (UTXOPayload, Vec<(UTXOPayload, AccountAddress)>) = receipt.journal.decode()?; Ok(( UTXO::create_utxo_from_payload(digest.0)?, @@ -328,11 +336,15 @@ pub fn execute_send_utxo( .1 .into_iter() .map(|(payload, addr)| (UTXO::create_utxo_from_payload(payload).map(|sel| (sel, addr)))) - .collect::>>().map_err(ExecutionFailureKind::write_error)?, + .collect::>>() + .map_err(ExecutionFailureKind::write_error)?, )) } -pub fn prove(input_vec: Vec, elf: &[u8]) -> anyhow::Result<(u64, Receipt)> { +pub fn prove( + input_vec: Vec, + elf: &[u8], +) -> anyhow::Result<(u64, Receipt)> { let mut builder = ExecutorEnv::builder(); for input in input_vec { @@ -372,8 +384,7 @@ pub fn execute serde::Deserialize<'de>>( } pub fn verify(receipt: Receipt, image_id: impl Into) -> anyhow::Result<()> { - Ok(receipt - .verify(image_id)?) + Ok(receipt.verify(image_id)?) } #[cfg(test)] From c4bff550bb9ceff1e9731ee1bb05b4bda053ddca Mon Sep 17 00:00:00 2001 From: Rostyslav Tyshko Date: Sun, 9 Feb 2025 11:44:10 -0500 Subject: [PATCH 07/16] lock file changes --- Cargo.lock | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index 00ae759..8f56826 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3824,8 +3824,10 @@ dependencies = [ "anyhow", "env_logger", "log", + "sequencer_core", "serde", "serde_json", + "storage", ] [[package]] From d34d87c274e8a66b5707d8e541d4395f394ea921 Mon Sep 17 00:00:00 2001 From: Rostyslav Tyshko Date: Sun, 9 Feb 2025 11:44:24 -0500 Subject: [PATCH 08/16] rm redundunt structures in json --- node_core/src/sequencer_client/json.rs | 32 +------------------------- 1 file changed, 1 insertion(+), 31 deletions(-) diff --git a/node_core/src/sequencer_client/json.rs b/node_core/src/sequencer_client/json.rs index 7683ea8..93a3231 100644 --- a/node_core/src/sequencer_client/json.rs +++ b/node_core/src/sequencer_client/json.rs @@ -1,16 +1,9 @@ use rpc_primitives::errors::RpcError; use serde::{Deserialize, Serialize}; -use storage::{block::Block, transaction::Transaction}; +use storage::transaction::Transaction; //Requests -#[derive(Serialize, Deserialize, Debug)] -pub struct RegisterAccountRequest { - pub nullifier_public_key: Vec, - pub viewing_public_key: Vec, - pub address: [u8; 32], -} - #[derive(Serialize, Deserialize, Debug)] pub struct SendTxRequest { pub transaction: Transaction, @@ -18,37 +11,14 @@ pub struct SendTxRequest { pub tx_roots: [[u8; 32]; 3], } -#[derive(Serialize, Deserialize, Debug)] -pub struct GetBlockDataRequest { - pub block_id: u64, -} - -#[derive(Serialize, Deserialize, Debug)] -pub struct GetGenesisIdRequest {} - //Responses -#[derive(Serialize, Deserialize, Debug)] -pub struct RegisterAccountResponse { - pub status: String, -} - #[derive(Serialize, Deserialize, Debug)] pub struct SendTxResponse { pub status: String, pub additional_data: Option, } -#[derive(Serialize, Deserialize, Debug)] -pub struct GetBlockDataResponse { - pub block: Block, -} - -#[derive(Serialize, Deserialize, Debug)] -pub struct GetGenesisIdResponse { - pub genesis_id: u64, -} - //General #[derive(Debug, Clone, Serialize)] From 809cc090e5885e198a8062362b7f33ad3f15ab5b Mon Sep 17 00:00:00 2001 From: Rostyslav Tyshko Date: Sun, 9 Feb 2025 11:44:41 -0500 Subject: [PATCH 09/16] rm parse --- node_rpc/src/types/mod.rs | 1 - node_rpc/src/types/parse.rs | 1 - 2 files changed, 2 deletions(-) delete mode 100644 node_rpc/src/types/parse.rs diff --git a/node_rpc/src/types/mod.rs b/node_rpc/src/types/mod.rs index 6084ddd..4901b7f 100644 --- a/node_rpc/src/types/mod.rs +++ b/node_rpc/src/types/mod.rs @@ -1,3 +1,2 @@ pub mod err_rpc; -pub mod parse; pub mod rpc_structs; diff --git a/node_rpc/src/types/parse.rs b/node_rpc/src/types/parse.rs deleted file mode 100644 index 8b13789..0000000 --- a/node_rpc/src/types/parse.rs +++ /dev/null @@ -1 +0,0 @@ - From f472c253496cbada427ab6a71fef86bb202e6ee4 Mon Sep 17 00:00:00 2001 From: Rostyslav Tyshko Date: Sun, 9 Feb 2025 11:44:55 -0500 Subject: [PATCH 10/16] rm node_core reduncunt code --- sequencer_rpc/src/types/rpc_structs.rs | 73 -------------------------- 1 file changed, 73 deletions(-) delete mode 100644 sequencer_rpc/src/types/rpc_structs.rs diff --git a/sequencer_rpc/src/types/rpc_structs.rs b/sequencer_rpc/src/types/rpc_structs.rs deleted file mode 100644 index 1c95fb8..0000000 --- a/sequencer_rpc/src/types/rpc_structs.rs +++ /dev/null @@ -1,73 +0,0 @@ -use rpc_primitives::errors::RpcParseError; -use rpc_primitives::parse_request; -use rpc_primitives::parser::parse_params; -use rpc_primitives::parser::RpcRequest; -use sequencer_core::transaction_mempool::TransactionMempool; -use serde::{Deserialize, Serialize}; -use serde_json::Value; -use storage::block::Block; - -#[derive(Serialize, Deserialize, Debug)] -pub struct HelloRequest {} - -#[derive(Serialize, Deserialize, Debug)] -pub struct RegisterAccountRequest { - pub nullifier_public_key: Vec, - pub viewing_public_key: Vec, - pub address: [u8; 32], -} - -#[derive(Serialize, Deserialize, Debug)] -pub struct SendTxRequest { - pub transaction: TransactionMempool, - ///Nullifier Root, UTXO Commitment Root, Pub Tx Root - pub tx_roots: [[u8; 32]; 3], -} - -#[derive(Serialize, Deserialize, Debug)] -pub struct GetBlockDataRequest { - pub block_id: u64, -} - -#[derive(Serialize, Deserialize, Debug)] -pub struct GetGenesisIdRequest {} - -#[derive(Serialize, Deserialize, Debug)] -pub struct GetLastBlockRequest {} - -parse_request!(HelloRequest); -parse_request!(RegisterAccountRequest); -parse_request!(SendTxRequest); -parse_request!(GetBlockDataRequest); -parse_request!(GetGenesisIdRequest); -parse_request!(GetLastBlockRequest); - -#[derive(Serialize, Deserialize, Debug)] -pub struct HelloResponse { - pub greeting: String, -} - -#[derive(Serialize, Deserialize, Debug)] -pub struct RegisterAccountResponse { - pub status: String, -} - -#[derive(Serialize, Deserialize, Debug)] -pub struct SendTxResponse { - pub status: String, -} - -#[derive(Serialize, Deserialize, Debug)] -pub struct GetBlockDataResponse { - pub block: Block, -} - -#[derive(Serialize, Deserialize, Debug)] -pub struct GetGenesisIdResponse { - pub genesis_id: u64, -} - -#[derive(Serialize, Deserialize, Debug)] -pub struct GetLastBlockResponse { - pub last_block: u64, -} From 8815eb836c65a0653eb1962a3125da980b0e0e69 Mon Sep 17 00:00:00 2001 From: Rostyslav Tyshko Date: Sun, 9 Feb 2025 11:45:01 -0500 Subject: [PATCH 11/16] unused --- sequencer_rpc/src/types/mod.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/sequencer_rpc/src/types/mod.rs b/sequencer_rpc/src/types/mod.rs index 6084ddd..a4c0397 100644 --- a/sequencer_rpc/src/types/mod.rs +++ b/sequencer_rpc/src/types/mod.rs @@ -1,3 +1,2 @@ pub mod err_rpc; pub mod parse; -pub mod rpc_structs; From 01b370d9b6e5350500add966e5afec3d01198181 Mon Sep 17 00:00:00 2001 From: Rostyslav Tyshko Date: Sun, 9 Feb 2025 11:45:16 -0500 Subject: [PATCH 12/16] create common requests module --- rpc_primitives/src/requests.rs | 73 ++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 rpc_primitives/src/requests.rs diff --git a/rpc_primitives/src/requests.rs b/rpc_primitives/src/requests.rs new file mode 100644 index 0000000..b5f0beb --- /dev/null +++ b/rpc_primitives/src/requests.rs @@ -0,0 +1,73 @@ +use crate::errors::RpcParseError; +use crate::parse_request; +use crate::parser::parse_params; +use crate::parser::RpcRequest; +use sequencer_core::transaction_mempool::TransactionMempool; +use serde::{Deserialize, Serialize}; +use serde_json::Value; +use storage::block::Block; + +#[derive(Serialize, Deserialize, Debug)] +pub struct HelloRequest {} + +#[derive(Serialize, Deserialize, Debug)] +pub struct RegisterAccountRequest { + pub nullifier_public_key: Vec, + pub viewing_public_key: Vec, + pub address: [u8; 32], +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct SendTxRequest { + pub transaction: TransactionMempool, + ///Nullifier Root, UTXO Commitment Root, Pub Tx Root + pub tx_roots: [[u8; 32]; 3], +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct GetBlockDataRequest { + pub block_id: u64, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct GetGenesisIdRequest {} + +#[derive(Serialize, Deserialize, Debug)] +pub struct GetLastBlockRequest {} + +parse_request!(HelloRequest); +parse_request!(RegisterAccountRequest); +parse_request!(SendTxRequest); +parse_request!(GetBlockDataRequest); +parse_request!(GetGenesisIdRequest); +parse_request!(GetLastBlockRequest); + +#[derive(Serialize, Deserialize, Debug)] +pub struct HelloResponse { + pub greeting: String, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct RegisterAccountResponse { + pub status: String, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct SendTxResponse { + pub status: String, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct GetBlockDataResponse { + pub block: Block, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct GetGenesisIdResponse { + pub genesis_id: u64, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct GetLastBlockResponse { + pub last_block: u64, +} From a0580238a64147a160616e703fddcdd063aaef32 Mon Sep 17 00:00:00 2001 From: Rostyslav Tyshko Date: Sun, 9 Feb 2025 11:45:31 -0500 Subject: [PATCH 13/16] add needed deps --- rpc_primitives/Cargo.toml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/rpc_primitives/Cargo.toml b/rpc_primitives/Cargo.toml index f015302..15bbfd1 100644 --- a/rpc_primitives/Cargo.toml +++ b/rpc_primitives/Cargo.toml @@ -9,3 +9,9 @@ serde_json.workspace = true env_logger.workspace = true log.workspace = true serde.workspace = true + +[dependencies.storage] +path = "../storage" + +[dependencies.sequencer_core] +path = "../sequencer_core" From e8c14f91858e7c9e44aaea53dfcc63cfa546c923 Mon Sep 17 00:00:00 2001 From: Rostyslav Tyshko Date: Sun, 9 Feb 2025 11:45:45 -0500 Subject: [PATCH 14/16] rm node_rps redundunt code --- node_rpc/src/types/rpc_structs.rs | 58 ++----------------------------- 1 file changed, 2 insertions(+), 56 deletions(-) diff --git a/node_rpc/src/types/rpc_structs.rs b/node_rpc/src/types/rpc_structs.rs index 563db03..6d7d8a3 100644 --- a/node_rpc/src/types/rpc_structs.rs +++ b/node_rpc/src/types/rpc_structs.rs @@ -4,23 +4,8 @@ use rpc_primitives::parser::parse_params; use rpc_primitives::parser::RpcRequest; use serde::{Deserialize, Serialize}; use serde_json::Value; -use storage::block::Block; -use storage::transaction::Transaction; use storage::transaction::TxKind; -#[derive(Serialize, Deserialize, Debug)] -pub struct RegisterAccountRequest {} - -#[derive(Serialize, Deserialize, Debug)] -pub struct SendTxRequest { - pub transaction: Transaction, -} - -#[derive(Serialize, Deserialize, Debug)] -pub struct GetBlockDataRequest { - pub block_id: u64, -} - #[derive(Serialize, Deserialize, Debug)] pub struct ExecuteSubscenarioRequest { pub scenario_id: u64, @@ -38,12 +23,6 @@ pub struct ExecuteScenarioMultipleSendRequest { pub number_to_send: usize, } -#[derive(Serialize, Deserialize, Debug)] -pub struct GetGenesisIdRequest {} - -#[derive(Serialize, Deserialize, Debug)] -pub struct GetLastBlockRequest {} - #[derive(Serialize, Deserialize, Debug)] pub struct ShowAccountPublicBalanceRequest { pub account_addr: String, @@ -111,14 +90,11 @@ pub struct WriteSplitUTXORequest { pub utxo_commitment: String, } -parse_request!(RegisterAccountRequest); -parse_request!(SendTxRequest); -parse_request!(GetBlockDataRequest); -parse_request!(GetGenesisIdRequest); +// parse_request!(GetGenesisIdRequest); parse_request!(ExecuteSubscenarioRequest); parse_request!(ExecuteScenarioSplitRequest); parse_request!(ExecuteScenarioMultipleSendRequest); -parse_request!(GetLastBlockRequest); +// parse_request!(GetLastBlockRequest); parse_request!(ShowAccountPublicBalanceRequest); parse_request!(ShowAccountUTXORequest); @@ -132,26 +108,6 @@ parse_request!(WriteSendShieldedUTXORequest); parse_request!(WriteSendDeshieldedBalanceRequest); parse_request!(WriteSplitUTXORequest); -#[derive(Serialize, Deserialize, Debug)] -pub struct HelloResponse { - pub greeting: String, -} - -#[derive(Serialize, Deserialize, Debug)] -pub struct RegisterAccountResponse { - pub status: String, -} - -#[derive(Serialize, Deserialize, Debug)] -pub struct SendTxResponse { - pub status: String, -} - -#[derive(Serialize, Deserialize, Debug)] -pub struct GetBlockDataResponse { - pub block: Block, -} - #[derive(Serialize, Deserialize, Debug)] pub struct ExecuteSubscenarioResponse { pub scenario_result: String, @@ -167,16 +123,6 @@ pub struct ExecuteScenarioMultipleSendResponse { pub scenario_result: String, } -#[derive(Serialize, Deserialize, Debug)] -pub struct GetGenesisIdResponse { - pub genesis_id: u64, -} - -#[derive(Serialize, Deserialize, Debug)] -pub struct GetLastBlockResponse { - pub last_block: u64, -} - #[derive(Serialize, Deserialize, Debug)] pub struct ShowAccountPublicBalanceResponse { pub addr: String, From 9c5b4fb3d4cd98d261a438bb4493ee531eb05ee4 Mon Sep 17 00:00:00 2001 From: Rostyslav Tyshko Date: Sun, 9 Feb 2025 11:45:53 -0500 Subject: [PATCH 15/16] fix imports --- node_core/src/sequencer_client/mod.rs | 7 +++++-- node_rpc/src/process.rs | 5 +++-- rpc_primitives/src/lib.rs | 1 + sequencer_rpc/src/process.rs | 2 +- 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/node_core/src/sequencer_client/mod.rs b/node_core/src/sequencer_client/mod.rs index 6a65b9e..4282ecd 100644 --- a/node_core/src/sequencer_client/mod.rs +++ b/node_core/src/sequencer_client/mod.rs @@ -1,8 +1,11 @@ use accounts::account_core::Account; use anyhow::Result; -use json::{ +use rpc_primitives::requests::{ GetBlockDataRequest, GetBlockDataResponse, GetGenesisIdRequest, GetGenesisIdResponse, - RegisterAccountRequest, RegisterAccountResponse, SendTxRequest, SendTxResponse, + RegisterAccountRequest, RegisterAccountResponse, +}; +use json::{ + SendTxResponse, SendTxRequest, SequencerRpcError, SequencerRpcRequest, SequencerRpcResponse, }; use k256::elliptic_curve::group::GroupEncoding; diff --git a/node_rpc/src/process.rs b/node_rpc/src/process.rs index 38b5843..1bd367d 100644 --- a/node_rpc/src/process.rs +++ b/node_rpc/src/process.rs @@ -11,11 +11,12 @@ use rpc_primitives::{ }; use storage::transaction::ActionData; +use rpc_primitives::requests::{GetLastBlockRequest, GetLastBlockResponse, RegisterAccountRequest, RegisterAccountResponse, GetBlockDataRequest, GetBlockDataResponse}; + use crate::types::rpc_structs::{ ExecuteScenarioMultipleSendRequest, ExecuteScenarioMultipleSendResponse, ExecuteScenarioSplitRequest, ExecuteScenarioSplitResponse, ExecuteSubscenarioRequest, - ExecuteSubscenarioResponse, GetBlockDataRequest, GetBlockDataResponse, GetLastBlockRequest, - GetLastBlockResponse, RegisterAccountRequest, RegisterAccountResponse, + ExecuteSubscenarioResponse, ShowAccountPublicBalanceRequest, ShowAccountPublicBalanceResponse, ShowAccountUTXORequest, ShowAccountUTXOResponse, ShowTransactionRequest, ShowTransactionResponse, UTXOShortEssentialStruct, WriteDepositPublicBalanceRequest, WriteDepositPublicBalanceResponse, diff --git a/rpc_primitives/src/lib.rs b/rpc_primitives/src/lib.rs index 5e3d870..ffa8564 100644 --- a/rpc_primitives/src/lib.rs +++ b/rpc_primitives/src/lib.rs @@ -5,6 +5,7 @@ use serde::{Deserialize, Serialize}; pub mod errors; pub mod message; pub mod parser; +pub mod requests; #[derive(Serialize, Deserialize, Clone, Copy, Debug)] pub struct RpcPollingConfig { diff --git a/sequencer_rpc/src/process.rs b/sequencer_rpc/src/process.rs index 294878e..b89960c 100644 --- a/sequencer_rpc/src/process.rs +++ b/sequencer_rpc/src/process.rs @@ -8,7 +8,7 @@ use rpc_primitives::{ parser::RpcRequest, }; -use crate::types::rpc_structs::{ +use rpc_primitives::requests::{ GetBlockDataRequest, GetBlockDataResponse, GetGenesisIdRequest, GetGenesisIdResponse, GetLastBlockRequest, GetLastBlockResponse, HelloRequest, HelloResponse, RegisterAccountRequest, RegisterAccountResponse, SendTxRequest, SendTxResponse, From b88358949cc46ec6cfeb097efe384c0e5125b540 Mon Sep 17 00:00:00 2001 From: Rostyslav Tyshko Date: Sun, 9 Feb 2025 11:46:08 -0500 Subject: [PATCH 16/16] fmt --- node_core/src/sequencer_client/mod.rs | 11 +++++------ node_rpc/src/process.rs | 17 ++++++++++------- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/node_core/src/sequencer_client/mod.rs b/node_core/src/sequencer_client/mod.rs index 4282ecd..60f9d9d 100644 --- a/node_core/src/sequencer_client/mod.rs +++ b/node_core/src/sequencer_client/mod.rs @@ -1,15 +1,14 @@ use accounts::account_core::Account; use anyhow::Result; +use json::{ + SendTxRequest, SendTxResponse, SequencerRpcError, SequencerRpcRequest, SequencerRpcResponse, +}; +use k256::elliptic_curve::group::GroupEncoding; +use reqwest::Client; use rpc_primitives::requests::{ GetBlockDataRequest, GetBlockDataResponse, GetGenesisIdRequest, GetGenesisIdResponse, RegisterAccountRequest, RegisterAccountResponse, }; -use json::{ - SendTxResponse, SendTxRequest, - SequencerRpcError, SequencerRpcRequest, SequencerRpcResponse, -}; -use k256::elliptic_curve::group::GroupEncoding; -use reqwest::Client; use serde_json::Value; use storage::transaction::Transaction; diff --git a/node_rpc/src/process.rs b/node_rpc/src/process.rs index 1bd367d..b174619 100644 --- a/node_rpc/src/process.rs +++ b/node_rpc/src/process.rs @@ -11,17 +11,20 @@ use rpc_primitives::{ }; use storage::transaction::ActionData; -use rpc_primitives::requests::{GetLastBlockRequest, GetLastBlockResponse, RegisterAccountRequest, RegisterAccountResponse, GetBlockDataRequest, GetBlockDataResponse}; +use rpc_primitives::requests::{ + GetBlockDataRequest, GetBlockDataResponse, GetLastBlockRequest, GetLastBlockResponse, + RegisterAccountRequest, RegisterAccountResponse, +}; use crate::types::rpc_structs::{ ExecuteScenarioMultipleSendRequest, ExecuteScenarioMultipleSendResponse, ExecuteScenarioSplitRequest, ExecuteScenarioSplitResponse, ExecuteSubscenarioRequest, - ExecuteSubscenarioResponse, - ShowAccountPublicBalanceRequest, ShowAccountPublicBalanceResponse, ShowAccountUTXORequest, - ShowAccountUTXOResponse, ShowTransactionRequest, ShowTransactionResponse, - UTXOShortEssentialStruct, WriteDepositPublicBalanceRequest, WriteDepositPublicBalanceResponse, - WriteMintPrivateUTXOMultipleAssetsRequest, WriteMintPrivateUTXOMultipleAssetsResponse, - WriteMintPrivateUTXORequest, WriteMintPrivateUTXOResponse, WriteSendDeshieldedBalanceRequest, + ExecuteSubscenarioResponse, ShowAccountPublicBalanceRequest, ShowAccountPublicBalanceResponse, + ShowAccountUTXORequest, ShowAccountUTXOResponse, ShowTransactionRequest, + ShowTransactionResponse, UTXOShortEssentialStruct, WriteDepositPublicBalanceRequest, + WriteDepositPublicBalanceResponse, WriteMintPrivateUTXOMultipleAssetsRequest, + WriteMintPrivateUTXOMultipleAssetsResponse, WriteMintPrivateUTXORequest, + WriteMintPrivateUTXOResponse, WriteSendDeshieldedBalanceRequest, WriteSendDeshieldedUTXOResponse, WriteSendPrivateUTXORequest, WriteSendPrivateUTXOResponse, WriteSendShieldedUTXORequest, WriteSendShieldedUTXOResponse, WriteSendSplitUTXOResponse, WriteSplitUTXORequest,