feat(circuit): use dummy_inputs in ppc

This commit is contained in:
Artem Gureev 2026-07-03 14:24:02 +00:00
parent d4c9b5c0a5
commit b8ccf1de58
4 changed files with 36 additions and 3 deletions

View File

@ -9,6 +9,7 @@ fn main() {
program_outputs, program_outputs,
account_identities, account_identities,
program_id, program_id,
dummy_inputs,
} = env::read(); } = env::read();
let execution_state = execution_state::ExecutionState::derive_from_outputs( let execution_state = execution_state::ExecutionState::derive_from_outputs(
@ -17,7 +18,8 @@ fn main() {
program_outputs, 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); env::commit(&output);
} }

View File

@ -1,5 +1,5 @@
use lee_core::{ use lee_core::{
Commitment, CommitmentSetDigest, EncryptedAccountData, EncryptionScheme, EphemeralSecretKey, Commitment, CommitmentSetDigest, DummyInput, EncryptedAccountData, EncryptionScheme, EphemeralSecretKey,
InputAccountIdentity, MembershipProof, Nullifier, NullifierPublicKey, NullifierSecretKey, InputAccountIdentity, MembershipProof, Nullifier, NullifierPublicKey, NullifierSecretKey,
PrivacyPreservingCircuitOutput, PrivateAccountKind, SharedSecretKey, PrivacyPreservingCircuitOutput, PrivateAccountKind, SharedSecretKey,
account::{Account, AccountId, Nonce}, account::{Account, AccountId, Nonce},
@ -12,6 +12,7 @@ use crate::execution_state::ExecutionState;
pub fn compute_circuit_output( pub fn compute_circuit_output(
execution_state: ExecutionState, execution_state: ExecutionState,
account_identities: &[InputAccountIdentity], account_identities: &[InputAccountIdentity],
dummy_inputs: Vec<DummyInput>,
) -> PrivacyPreservingCircuitOutput { ) -> PrivacyPreservingCircuitOutput {
let (block_validity_window, timestamp_validity_window, pda_seed_by_position, states_iter) = let (block_validity_window, timestamp_validity_window, pda_seed_by_position, states_iter) =
execution_state.into_parts(); 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 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( #[expect(
clippy::too_many_arguments, clippy::too_many_arguments,
reason = "Inputs are distinct concerns from the variant arms; bundling would be artificial" reason = "Inputs are distinct concerns from the variant arms; bundling would be artificial"

View File

@ -19,6 +19,7 @@ pub struct PrivacyPreservingCircuitInput {
pub account_identities: Vec<InputAccountIdentity>, pub account_identities: Vec<InputAccountIdentity>,
/// Program ID. /// Program ID.
pub program_id: ProgramId, pub program_id: ProgramId,
pub dummy_inputs: Vec<DummyInput>,
} }
#[derive(Serialize, Deserialize, Clone)] #[derive(Serialize, Deserialize, Clone)]

View File

@ -2,7 +2,7 @@ use std::collections::{HashMap, VecDeque};
use borsh::{BorshDeserialize, BorshSerialize}; use borsh::{BorshDeserialize, BorshSerialize};
use lee_core::{ use lee_core::{
InputAccountIdentity, PrivacyPreservingCircuitInput, PrivacyPreservingCircuitOutput, DummyInput, InputAccountIdentity, PrivacyPreservingCircuitInput, PrivacyPreservingCircuitOutput,
account::AccountWithMetadata, account::AccountWithMetadata,
program::{ChainedCall, InstructionData, ProgramId, ProgramOutput}, program::{ChainedCall, InstructionData, ProgramId, ProgramOutput},
}; };
@ -69,6 +69,22 @@ pub fn execute_and_prove(
instruction_data: InstructionData, instruction_data: InstructionData,
account_identities: Vec<InputAccountIdentity>, account_identities: Vec<InputAccountIdentity>,
program_with_dependencies: &ProgramWithDependencies, 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<AccountWithMetadata>,
instruction_data: InstructionData,
account_identities: Vec<InputAccountIdentity>,
dummy_inputs: Vec<DummyInput>,
program_with_dependencies: &ProgramWithDependencies,
) -> Result<(PrivacyPreservingCircuitOutput, Proof), LeeError> { ) -> Result<(PrivacyPreservingCircuitOutput, Proof), LeeError> {
let ProgramWithDependencies { let ProgramWithDependencies {
program: initial_program, program: initial_program,
@ -127,6 +143,7 @@ pub fn execute_and_prove(
program_outputs, program_outputs,
account_identities, account_identities,
program_id: program_with_dependencies.program.id(), program_id: program_with_dependencies.program.id(),
dummy_inputs,
}; };
env_builder.write(&circuit_input).unwrap(); env_builder.write(&circuit_input).unwrap();