diff --git a/Cargo.lock b/Cargo.lock index 202c734a..a629e794 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5294,7 +5294,6 @@ dependencies = [ "serde", "serde_json", "serde_with", - "sha2", "thiserror 2.0.18", ] diff --git a/artifacts/program_methods/amm.bin b/artifacts/program_methods/amm.bin index 263a6bd4..28a855d7 100644 Binary files a/artifacts/program_methods/amm.bin and b/artifacts/program_methods/amm.bin differ diff --git a/artifacts/program_methods/associated_token_account.bin b/artifacts/program_methods/associated_token_account.bin index 7a4483ae..40d734e5 100644 Binary files a/artifacts/program_methods/associated_token_account.bin and b/artifacts/program_methods/associated_token_account.bin differ diff --git a/artifacts/program_methods/authenticated_transfer.bin b/artifacts/program_methods/authenticated_transfer.bin index 1cf8375e..86ea94a6 100644 Binary files a/artifacts/program_methods/authenticated_transfer.bin and b/artifacts/program_methods/authenticated_transfer.bin differ diff --git a/artifacts/program_methods/pinata.bin b/artifacts/program_methods/pinata.bin index a778abee..a87a553b 100644 Binary files a/artifacts/program_methods/pinata.bin and b/artifacts/program_methods/pinata.bin differ diff --git a/artifacts/program_methods/pinata_token.bin b/artifacts/program_methods/pinata_token.bin index 9bfa4b99..93006e3e 100644 Binary files a/artifacts/program_methods/pinata_token.bin and b/artifacts/program_methods/pinata_token.bin differ diff --git a/artifacts/program_methods/privacy_preserving_circuit.bin b/artifacts/program_methods/privacy_preserving_circuit.bin index dc887e3f..3b841c81 100644 Binary files a/artifacts/program_methods/privacy_preserving_circuit.bin and b/artifacts/program_methods/privacy_preserving_circuit.bin differ diff --git a/artifacts/program_methods/token.bin b/artifacts/program_methods/token.bin index 01829caf..9284ba71 100644 Binary files a/artifacts/program_methods/token.bin and b/artifacts/program_methods/token.bin differ diff --git a/artifacts/test_program_methods/burner.bin b/artifacts/test_program_methods/burner.bin index 4d2f00f6..2daeec51 100644 Binary files a/artifacts/test_program_methods/burner.bin and b/artifacts/test_program_methods/burner.bin differ diff --git a/artifacts/test_program_methods/chain_caller.bin b/artifacts/test_program_methods/chain_caller.bin index 2ff4c381..602b32ad 100644 Binary files a/artifacts/test_program_methods/chain_caller.bin and b/artifacts/test_program_methods/chain_caller.bin differ diff --git a/artifacts/test_program_methods/changer_claimer.bin b/artifacts/test_program_methods/changer_claimer.bin index 4028b20b..4ab3632f 100644 Binary files a/artifacts/test_program_methods/changer_claimer.bin and b/artifacts/test_program_methods/changer_claimer.bin differ diff --git a/artifacts/test_program_methods/claimer.bin b/artifacts/test_program_methods/claimer.bin index f09e4b13..d9a67792 100644 Binary files a/artifacts/test_program_methods/claimer.bin and b/artifacts/test_program_methods/claimer.bin differ diff --git a/artifacts/test_program_methods/data_changer.bin b/artifacts/test_program_methods/data_changer.bin index fa7d2af8..2b21071d 100644 Binary files a/artifacts/test_program_methods/data_changer.bin and b/artifacts/test_program_methods/data_changer.bin differ diff --git a/artifacts/test_program_methods/extra_output.bin b/artifacts/test_program_methods/extra_output.bin index 5c373390..8999810e 100644 Binary files a/artifacts/test_program_methods/extra_output.bin and b/artifacts/test_program_methods/extra_output.bin differ diff --git a/artifacts/test_program_methods/malicious_authorization_changer.bin b/artifacts/test_program_methods/malicious_authorization_changer.bin index 8228ec90..5e09378d 100644 Binary files a/artifacts/test_program_methods/malicious_authorization_changer.bin and b/artifacts/test_program_methods/malicious_authorization_changer.bin differ diff --git a/artifacts/test_program_methods/minter.bin b/artifacts/test_program_methods/minter.bin index 5cc0b24f..21bb85d8 100644 Binary files a/artifacts/test_program_methods/minter.bin and b/artifacts/test_program_methods/minter.bin differ diff --git a/artifacts/test_program_methods/missing_output.bin b/artifacts/test_program_methods/missing_output.bin index bb8c00db..6946618b 100644 Binary files a/artifacts/test_program_methods/missing_output.bin and b/artifacts/test_program_methods/missing_output.bin differ diff --git a/artifacts/test_program_methods/modified_transfer.bin b/artifacts/test_program_methods/modified_transfer.bin index ecb059d7..8dc5420f 100644 Binary files a/artifacts/test_program_methods/modified_transfer.bin and b/artifacts/test_program_methods/modified_transfer.bin differ diff --git a/artifacts/test_program_methods/nonce_changer.bin b/artifacts/test_program_methods/nonce_changer.bin index 95b0b5ec..6bdbee2f 100644 Binary files a/artifacts/test_program_methods/nonce_changer.bin and b/artifacts/test_program_methods/nonce_changer.bin differ diff --git a/artifacts/test_program_methods/noop.bin b/artifacts/test_program_methods/noop.bin index af871aa1..080985a5 100644 Binary files a/artifacts/test_program_methods/noop.bin and b/artifacts/test_program_methods/noop.bin differ diff --git a/artifacts/test_program_methods/program_owner_changer.bin b/artifacts/test_program_methods/program_owner_changer.bin index 1778126a..6f09512c 100644 Binary files a/artifacts/test_program_methods/program_owner_changer.bin and b/artifacts/test_program_methods/program_owner_changer.bin differ diff --git a/artifacts/test_program_methods/simple_balance_transfer.bin b/artifacts/test_program_methods/simple_balance_transfer.bin index 8ac9752d..b54284d7 100644 Binary files a/artifacts/test_program_methods/simple_balance_transfer.bin and b/artifacts/test_program_methods/simple_balance_transfer.bin differ diff --git a/artifacts/test_program_methods/validity_window.bin b/artifacts/test_program_methods/validity_window.bin index 4e716848..be9bea6f 100644 Binary files a/artifacts/test_program_methods/validity_window.bin and b/artifacts/test_program_methods/validity_window.bin differ diff --git a/artifacts/test_program_methods/validity_window_chain_caller.bin b/artifacts/test_program_methods/validity_window_chain_caller.bin index 784024ce..2c779cb8 100644 Binary files a/artifacts/test_program_methods/validity_window_chain_caller.bin and b/artifacts/test_program_methods/validity_window_chain_caller.bin differ diff --git a/integration_tests/tests/tps.rs b/integration_tests/tests/tps.rs index 647c8b22..a3cd74ce 100644 --- a/integration_tests/tests/tps.rs +++ b/integration_tests/tests/tps.rs @@ -256,6 +256,7 @@ fn build_privacy_transaction() -> PrivacyPreservingTransaction { vec![1, 2], vec![(sender_npk, sender_ss), (recipient_npk, recipient_ss)], vec![sender_nsk], + vec![], //TODO: marvin fix vec![Some(proof)], &program.into(), ) diff --git a/nssa/core/Cargo.toml b/nssa/core/Cargo.toml index 47f9d423..e52f1487 100644 --- a/nssa/core/Cargo.toml +++ b/nssa/core/Cargo.toml @@ -12,7 +12,6 @@ risc0-zkvm.workspace = true borsh.workspace = true serde.workspace = true serde_with.workspace = true -sha2.workspace = true rand.workspace = true thiserror.workspace = true bytemuck.workspace = true diff --git a/nssa/core/src/circuit_io.rs b/nssa/core/src/circuit_io.rs index 67ba7699..6c592f32 100644 --- a/nssa/core/src/circuit_io.rs +++ b/nssa/core/src/circuit_io.rs @@ -22,6 +22,8 @@ pub struct PrivacyPreservingCircuitInput { pub private_account_keys: Vec<(NullifierPublicKey, SharedSecretKey)>, /// Nullifier secret keys for authorized private accounts. pub private_account_nsks: Vec, + /// Identifiers used to generate `AccountId` (TODO: marvin double check logic). + pub private_account_identifiers: Vec, /// Membership proofs for private accounts. Can be [`None`] for uninitialized accounts. pub private_account_membership_proofs: Vec>, /// Program ID. diff --git a/nssa/src/privacy_preserving_transaction/circuit.rs b/nssa/src/privacy_preserving_transaction/circuit.rs index a4e08b41..384a3b82 100644 --- a/nssa/src/privacy_preserving_transaction/circuit.rs +++ b/nssa/src/privacy_preserving_transaction/circuit.rs @@ -63,13 +63,14 @@ impl From for ProgramWithDependencies { /// Generates a proof of the execution of a NSSA program inside the privacy preserving execution /// circuit. -/// TODO: too many parameters. +#[expect(clippy::too_many_arguments, reason = "TODO: fix this later")] pub fn execute_and_prove( pre_states: Vec, instruction_data: InstructionData, visibility_mask: Vec, private_account_keys: Vec<(NullifierPublicKey, SharedSecretKey)>, private_account_nsks: Vec, + private_account_identifiers: Vec, private_account_membership_proofs: Vec>, program_with_dependencies: &ProgramWithDependencies, ) -> Result<(PrivacyPreservingCircuitOutput, Proof), NssaError> { @@ -128,6 +129,7 @@ pub fn execute_and_prove( visibility_mask, private_account_keys, private_account_nsks, + private_account_identifiers, private_account_membership_proofs, program_id: program_with_dependencies.program.id(), }; @@ -236,6 +238,7 @@ mod tests { vec![0, 2], vec![(recipient_keys.npk(), shared_secret)], vec![], + vec![], // TODO check (Marvin) vec![None], &Program::authenticated_transfer_program().into(), ) @@ -337,6 +340,7 @@ mod tests { (recipient_keys.npk(), shared_secret_2), ], vec![sender_keys.nsk], + vec![], // TODO check (Marvin) vec![commitment_set.get_proof_for(&commitment_sender), None], &program.into(), ) @@ -403,6 +407,7 @@ mod tests { vec![2], vec![(account_keys.npk(), shared_secret)], vec![], + vec![], // TODO check (Marvin) vec![None], &program_with_deps, ); diff --git a/nssa/src/state.rs b/nssa/src/state.rs index deaae23a..7d7750cd 100644 --- a/nssa/src/state.rs +++ b/nssa/src/state.rs @@ -978,6 +978,7 @@ pub mod tests { vec![0, 2], vec![(recipient_keys.npk(), shared_secret)], vec![], + vec![], // TODO check (Marvin) vec![None], &Program::authenticated_transfer_program().into(), ) @@ -1026,6 +1027,7 @@ pub mod tests { (recipient_keys.npk(), shared_secret_2), ], vec![sender_keys.nsk], + vec![], // TODO check (Marvin) vec![state.get_proof_for_commitment(&sender_commitment), None], &program.into(), ) @@ -1074,6 +1076,7 @@ pub mod tests { vec![1, 0], vec![(sender_keys.npk(), shared_secret)], vec![sender_keys.nsk], + vec![], // TODO check (Marvin) vec![state.get_proof_for_commitment(&sender_commitment)], &program.into(), ) @@ -1291,6 +1294,7 @@ pub mod tests { vec![0], vec![], vec![], + vec![], // TODO check (Marvin) vec![], &program.into(), ); @@ -1317,6 +1321,7 @@ pub mod tests { vec![0], vec![], vec![], + vec![], // TODO check (Marvin) vec![], &program.into(), ); @@ -1343,6 +1348,7 @@ pub mod tests { vec![0], vec![], vec![], + vec![], // TODO check (Marvin) vec![], &program.into(), ); @@ -1369,6 +1375,7 @@ pub mod tests { vec![0], vec![], vec![], + vec![], // TODO check (Marvin) vec![], &program.into(), ); @@ -1403,6 +1410,7 @@ pub mod tests { vec![0], vec![], vec![], + vec![], // TODO check (Marvin) vec![], &program.into(), ); @@ -1429,6 +1437,7 @@ pub mod tests { vec![0], vec![], vec![], + vec![], // TODO check (Marvin) vec![], &program.into(), ); @@ -1464,6 +1473,7 @@ pub mod tests { vec![0, 0], vec![], vec![], + vec![], // TODO check (Marvin) vec![], &program.into(), ); @@ -1490,6 +1500,7 @@ pub mod tests { vec![0], vec![], vec![], + vec![], // TODO check (Marvin) vec![], &program.into(), ); @@ -1526,6 +1537,7 @@ pub mod tests { vec![], vec![], vec![], + vec![], // TODO check (Marvin) &program.into(), ); @@ -1562,6 +1574,7 @@ pub mod tests { visibility_mask.to_vec(), vec![], vec![], + vec![], // TODO check (Marvin) vec![], &program.into(), ); @@ -1603,6 +1616,7 @@ pub mod tests { ), ], vec![sender_keys.nsk], + vec![], // TODO check (Marvin) vec![Some((0, vec![]))], &program.into(), ); @@ -1638,6 +1652,7 @@ pub mod tests { vec![1, 2], private_account_keys.to_vec(), vec![sender_keys.nsk], + vec![], // TODO check (Marvin) vec![Some((0, vec![]))], &program.into(), ); @@ -1681,6 +1696,7 @@ pub mod tests { ), ], vec![sender_keys.nsk], + vec![], // TODO check (Marvin) private_account_membership_proofs.to_vec(), &program.into(), ); @@ -1724,6 +1740,7 @@ pub mod tests { ), ], private_account_nsks.to_vec(), + vec![], // TODO check (Marvin) vec![], &program.into(), ); @@ -1774,6 +1791,7 @@ pub mod tests { vec![1, 2], private_account_keys.to_vec(), private_account_nsks.to_vec(), + vec![], // TODO check (Marvin) private_account_membership_proofs.to_vec(), &program.into(), ); @@ -1822,6 +1840,7 @@ pub mod tests { ), ], vec![sender_keys.nsk], + vec![], // TODO check (Marvin) vec![Some((0, vec![]))], &program.into(), ); @@ -1870,6 +1889,7 @@ pub mod tests { ), ], vec![sender_keys.nsk], + vec![], // TODO check (Marvin) vec![Some((0, vec![]))], &program.into(), ); @@ -1918,6 +1938,7 @@ pub mod tests { ), ], vec![sender_keys.nsk], + vec![], // TODO check (Marvin) vec![Some((0, vec![]))], &program.into(), ); @@ -1966,6 +1987,7 @@ pub mod tests { ), ], vec![sender_keys.nsk], + vec![], // TODO check (Marvin) vec![Some((0, vec![]))], &program.into(), ); @@ -2012,6 +2034,7 @@ pub mod tests { ), ], vec![sender_keys.nsk], + vec![], // TODO check (Marvin) vec![Some((0, vec![]))], &program.into(), ); @@ -2042,6 +2065,7 @@ pub mod tests { vec![], vec![], vec![], + vec![], // TODO check (Marvin) &program.into(), ); @@ -2082,6 +2106,7 @@ pub mod tests { ), ], vec![sender_keys.nsk], + vec![], // TODO check (Marvin) vec![Some((0, vec![]))], &program.into(), ); @@ -2130,6 +2155,7 @@ pub mod tests { vec![1, 2], private_account_keys.to_vec(), vec![sender_keys.nsk], + vec![], // TODO check (Marvin) vec![Some((0, vec![]))], &program.into(), ); @@ -2176,6 +2202,7 @@ pub mod tests { ), ], private_account_nsks.to_vec(), + vec![], // TODO check (Marvin) private_account_membership_proofs.to_vec(), &program.into(), ); @@ -2267,6 +2294,7 @@ pub mod tests { (sender_keys.npk(), shared_secret), ], private_account_nsks.to_vec(), + vec![], // TODO check (Marvin) private_account_membership_proofs.to_vec(), &program.into(), ); @@ -2563,6 +2591,7 @@ pub mod tests { vec![0], vec![], vec![], + vec![], // TODO check (Marvin) vec![], &program.into(), ); @@ -2602,6 +2631,7 @@ pub mod tests { vec![1, 0], vec![(sender_keys.npk(), shared_secret)], vec![sender_keys.nsk], + vec![], // TODO check (Marvin) vec![state.get_proof_for_commitment(&sender_commitment)], &program.into(), ) @@ -2966,6 +2996,7 @@ pub mod tests { vec![1], vec![(private_keys.npk(), shared_secret)], vec![private_keys.nsk], + vec![], // TODO check (Marvin) vec![None], &program.into(), ) @@ -3013,6 +3044,7 @@ pub mod tests { vec![2], vec![(private_keys.npk(), shared_secret)], vec![], + vec![], // TODO check (Marvin) vec![None], &program.into(), ) @@ -3064,6 +3096,7 @@ pub mod tests { vec![1], vec![(private_keys.npk(), shared_secret)], vec![private_keys.nsk], + vec![], // TODO check (Marvin) vec![None], &claimer_program.into(), ) @@ -3109,6 +3142,7 @@ pub mod tests { vec![1], vec![(private_keys.npk(), shared_secret2)], vec![private_keys.nsk], + vec![], // TODO check (Marvin) vec![None], &noop_program.into(), ); @@ -3181,6 +3215,7 @@ pub mod tests { SharedSecretKey::new(&[3; 32], &sender_keys.vpk()), )], vec![sender_keys.nsk], + vec![], // TODO check (Marvin) vec![Some((0, vec![]))], &program.into(), ); @@ -3208,6 +3243,7 @@ pub mod tests { SharedSecretKey::new(&[3; 32], &sender_keys.vpk()), )], vec![sender_keys.nsk], + vec![], // TODO check (Marvin) vec![Some((0, vec![]))], &program.into(), ); @@ -3261,6 +3297,7 @@ pub mod tests { vec![0, 1], vec![(recipient_keys.npk(), recipient)], vec![recipient_keys.nsk], + vec![], // TODO check (Marvin) vec![state.get_proof_for_commitment(&recipient_commitment)], &program_with_deps, ); diff --git a/program_methods/guest/src/bin/privacy_preserving_circuit.rs b/program_methods/guest/src/bin/privacy_preserving_circuit.rs index 048177cf..432d04be 100644 --- a/program_methods/guest/src/bin/privacy_preserving_circuit.rs +++ b/program_methods/guest/src/bin/privacy_preserving_circuit.rs @@ -295,6 +295,7 @@ fn compute_circuit_output( visibility_mask: &[u8], private_account_keys: &[(NullifierPublicKey, SharedSecretKey)], private_account_nsks: &[NullifierSecretKey], + private_account_identifiers: &[u128], private_account_membership_proofs: &[Option], ) -> PrivacyPreservingCircuitOutput { let mut output = PrivacyPreservingCircuitOutput { @@ -317,6 +318,7 @@ fn compute_circuit_output( let mut private_keys_iter = private_account_keys.iter(); let mut private_nsks_iter = private_account_nsks.iter(); let mut private_membership_proofs_iter = private_account_membership_proofs.iter(); + let mut private_identifiers_iter = private_account_identifiers.iter(); let mut output_index = 0; for (account_visibility_mask, (pre_state, post_state)) in @@ -333,10 +335,15 @@ fn compute_circuit_output( panic!("Missing private account key"); }; + // TODO: (Marvin) double check + let Some(identifier) = private_identifiers_iter.next() else { + panic!("Missing private account identifier"); + }; + // TODO: (Marvin) identifier used here) // Relevant here as this applies for both cases (authenicated and not authenicated). assert_eq!( - AccountId::private_account_id(npk, None), + AccountId::private_account_id(npk, Some(*identifier)), pre_state.account_id, "AccountId mismatch" ); @@ -398,10 +405,9 @@ fn compute_circuit_output( "Membership proof must be None for unauthorized accounts" ); - // TODO: (Marvin) need to add a Vec as input. // TODO: use here - let account_id = AccountId::private_account_id(npk, None); + let account_id = AccountId::private_account_id(npk, Some(*identifier)); let nullifier = Nullifier::for_account_initialization(&account_id); let new_nonce = Nonce::private_account_nonce_init(npk); @@ -493,6 +499,7 @@ fn main() { visibility_mask, private_account_keys, private_account_nsks, + private_account_identifiers, private_account_membership_proofs, program_id, } = env::read(); @@ -505,6 +512,7 @@ fn main() { &visibility_mask, &private_account_keys, &private_account_nsks, + &private_account_identifiers, &private_account_membership_proofs, ); diff --git a/wallet/src/lib.rs b/wallet/src/lib.rs index deccc8ac..828d6fa8 100644 --- a/wallet/src/lib.rs +++ b/wallet/src/lib.rs @@ -396,6 +396,7 @@ impl WalletCore { .map(|keys| (keys.npk.clone(), keys.ssk)) .collect::>(), acc_manager.private_account_auth(), + vec![], // TODO check (Marvin) acc_manager.private_account_membership_proofs(), &program.to_owned(), )