From 3204df13f1f0db4c2a21beb9edc69fbafabdd60e Mon Sep 17 00:00:00 2001 From: Rostyslav Tyshko Date: Mon, 2 Dec 2024 01:19:42 +0100 Subject: [PATCH] add se kernel impl and verify_commitment to de module --- node_core/src/executions/se.rs | 50 ++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/node_core/src/executions/se.rs b/node_core/src/executions/se.rs index 0eaaab7..8428fbc 100644 --- a/node_core/src/executions/se.rs +++ b/node_core/src/executions/se.rs @@ -113,3 +113,53 @@ pub fn validate_nullifiers_proof( nsmt.get_non_membership_proof(nullifier).unwrap().1.is_none() } + +// Check balances + +// takes the public_info and output_utxos[], +// returns the True if the token amount in public_info matches the sum of all output_utxos[], otherwise return False. +pub fn check_balances(public_info: u128, output_utxos: &[UTXO]) -> bool { + let total_output: u128 = output_utxos.iter().map(|utxo| utxo.amount).sum(); + public_info == total_output +} + +// Verify Pedersen commitment + +// takes the public_info, secret_r and pedersen_commitment and +// checks that commitment(public_info,secret_r) is equal pedersen_commitment where the commitment is pedersen commitment. +pub fn verify_commitment(public_info: u64, secret_r: &[u8], pedersen_commitment: &PedersenCommitment) -> bool { + let commitment_secrets = CommitmentSecrets { + value: public_info, + value_blinding_factor: Tweak::from_slice(secret_r).unwrap(), + generator_blinding_factor: Tweak::new(&mut thread_rng()), + }; + + let tag = tag_random(); + let commitment = commit(&commitment_secrets, tag); + + commitment == *pedersen_commitment +} + +fn se_kernel( + root_commitment: &[u8], + root_nullifier: [u8; 32], + public_info: u64, + pedersen_commitment: PedersenCommitment, + secret_r: &[u8], + output_utxos: &[UTXO], + in_commitments_proof: &[Vec], + nullifiers_proof: &[[u8; 32]], + nullifier_secret_key: Scalar, +) -> (Vec, Vec>, Vec) { + check_balances(public_info as u128, output_utxos); + + let out_commitments = generate_commitments(output_utxos); + + let nullifier = generate_nullifiers(&pedersen_commitment, &nullifier_secret_key.to_bytes()); + + validate_in_commitments_proof(&pedersen_commitment, root_commitment.to_vec(), in_commitments_proof); + + verify_commitment(public_info, secret_r, &pedersen_commitment); + + (vec![], out_commitments, nullifier) +}