identifiers added to privacy circuit

This commit is contained in:
jonesmarvin8 2026-04-02 19:24:01 -04:00
parent e15b078640
commit 7b0eac6a3f
31 changed files with 58 additions and 6 deletions

1
Cargo.lock generated
View File

@ -5294,7 +5294,6 @@ dependencies = [
"serde",
"serde_json",
"serde_with",
"sha2",
"thiserror 2.0.18",
]

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -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(),
)

View File

@ -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

View File

@ -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<NullifierSecretKey>,
/// Identifiers used to generate `AccountId` (TODO: marvin double check logic).
pub private_account_identifiers: Vec<u128>,
/// Membership proofs for private accounts. Can be [`None`] for uninitialized accounts.
pub private_account_membership_proofs: Vec<Option<MembershipProof>>,
/// Program ID.

View File

@ -63,13 +63,14 @@ impl From<Program> 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<AccountWithMetadata>,
instruction_data: InstructionData,
visibility_mask: Vec<u8>,
private_account_keys: Vec<(NullifierPublicKey, SharedSecretKey)>,
private_account_nsks: Vec<NullifierSecretKey>,
private_account_identifiers: Vec<u128>,
private_account_membership_proofs: Vec<Option<MembershipProof>>,
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,
);

View File

@ -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,
);

View File

@ -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<MembershipProof>],
) -> 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<identifier> 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,
);

View File

@ -396,6 +396,7 @@ impl WalletCore {
.map(|keys| (keys.npk.clone(), keys.ssk))
.collect::<Vec<_>>(),
acc_manager.private_account_auth(),
vec![], // TODO check (Marvin)
acc_manager.private_account_membership_proofs(),
&program.to_owned(),
)