diff --git a/lee/privacy_preserving_circuit/src/main.rs b/lee/privacy_preserving_circuit/src/main.rs index a342665d..d0054dba 100644 --- a/lee/privacy_preserving_circuit/src/main.rs +++ b/lee/privacy_preserving_circuit/src/main.rs @@ -9,6 +9,7 @@ fn main() { program_outputs, account_identities, program_id, + dummy_inputs, } = env::read(); let execution_state = execution_state::ExecutionState::derive_from_outputs( @@ -17,7 +18,8 @@ fn main() { program_outputs, ); - let output = output::compute_circuit_output(execution_state, &account_identities); + let output = + output::compute_circuit_output(execution_state, &account_identities, dummy_inputs); env::commit(&output); } diff --git a/lee/privacy_preserving_circuit/src/output.rs b/lee/privacy_preserving_circuit/src/output.rs index c5d962d6..12c556a6 100644 --- a/lee/privacy_preserving_circuit/src/output.rs +++ b/lee/privacy_preserving_circuit/src/output.rs @@ -1,5 +1,5 @@ use lee_core::{ - Commitment, CommitmentSetDigest, EncryptedAccountData, EncryptionScheme, EphemeralSecretKey, + Commitment, CommitmentSetDigest, DummyInput, EncryptedAccountData, EncryptionScheme, EphemeralSecretKey, InputAccountIdentity, MembershipProof, Nullifier, NullifierPublicKey, NullifierSecretKey, PrivacyPreservingCircuitOutput, PrivateAccountKind, SharedSecretKey, account::{Account, AccountId, Nonce}, @@ -12,6 +12,7 @@ use crate::execution_state::ExecutionState; pub fn compute_circuit_output( execution_state: ExecutionState, account_identities: &[InputAccountIdentity], + dummy_inputs: Vec, ) -> PrivacyPreservingCircuitOutput { let (block_validity_window, timestamp_validity_window, pda_seed_by_position, states_iter) = execution_state.into_parts(); @@ -262,9 +263,21 @@ pub fn compute_circuit_output( } } + for dummy in dummy_inputs { + emit_dummy_output(&mut output, dummy); + } + output } +fn emit_dummy_output(output: &mut PrivacyPreservingCircuitOutput, dummy: DummyInput) { + let nullifier = Nullifier::for_dummy(&dummy.nullifier_seed); + let commitment = Commitment::for_dummy(&nullifier, &dummy.commitment_seed); + output.new_nullifiers.push((nullifier, dummy.commitment_root)); + output.new_commitments.push(commitment); + output.encrypted_private_post_states.push(dummy.note); +} + #[expect( clippy::too_many_arguments, reason = "Inputs are distinct concerns from the variant arms; bundling would be artificial" diff --git a/lee/state_machine/core/src/circuit_io.rs b/lee/state_machine/core/src/circuit_io.rs index 1c74b227..9b283eae 100644 --- a/lee/state_machine/core/src/circuit_io.rs +++ b/lee/state_machine/core/src/circuit_io.rs @@ -19,6 +19,7 @@ pub struct PrivacyPreservingCircuitInput { pub account_identities: Vec, /// Program ID. pub program_id: ProgramId, + pub dummy_inputs: Vec, } #[derive(Serialize, Deserialize, Clone)] diff --git a/lee/state_machine/src/privacy_preserving_transaction/circuit/mod.rs b/lee/state_machine/src/privacy_preserving_transaction/circuit/mod.rs index da8b2be4..088b772c 100644 --- a/lee/state_machine/src/privacy_preserving_transaction/circuit/mod.rs +++ b/lee/state_machine/src/privacy_preserving_transaction/circuit/mod.rs @@ -2,7 +2,7 @@ use std::collections::{HashMap, VecDeque}; use borsh::{BorshDeserialize, BorshSerialize}; use lee_core::{ - InputAccountIdentity, PrivacyPreservingCircuitInput, PrivacyPreservingCircuitOutput, + DummyInput, InputAccountIdentity, PrivacyPreservingCircuitInput, PrivacyPreservingCircuitOutput, account::AccountWithMetadata, program::{ChainedCall, InstructionData, ProgramId, ProgramOutput}, }; @@ -69,6 +69,22 @@ pub fn execute_and_prove( instruction_data: InstructionData, account_identities: Vec, program_with_dependencies: &ProgramWithDependencies, +) -> Result<(PrivacyPreservingCircuitOutput, Proof), LeeError> { + execute_and_prove_with_dummy_inputs( + pre_states, + instruction_data, + account_identities, + vec![], + program_with_dependencies, + ) +} + +pub fn execute_and_prove_with_dummy_inputs( + pre_states: Vec, + instruction_data: InstructionData, + account_identities: Vec, + dummy_inputs: Vec, + program_with_dependencies: &ProgramWithDependencies, ) -> Result<(PrivacyPreservingCircuitOutput, Proof), LeeError> { let ProgramWithDependencies { program: initial_program, @@ -127,6 +143,7 @@ pub fn execute_and_prove( program_outputs, account_identities, program_id: program_with_dependencies.program.id(), + dummy_inputs, }; env_builder.write(&circuit_input).unwrap();