mirror of
https://github.com/logos-blockchain/lssa-zkvm-testing.git
synced 2026-05-23 17:59:37 +00:00
78 lines
2.2 KiB
Rust
78 lines
2.2 KiB
Rust
use core::{
|
|
account::Account,
|
|
types::{Commitment, Nullifier},
|
|
};
|
|
|
|
use risc0_zkvm::Receipt;
|
|
|
|
use super::MockedSequencer;
|
|
|
|
impl MockedSequencer {
|
|
pub fn process_privacy_execution(&mut self, receipt: Receipt) -> Result<(), ()> {
|
|
let output: (Vec<Account>, Vec<Nullifier>, Vec<Commitment>, [u32; 8]) =
|
|
receipt.journal.decode().unwrap();
|
|
let (public_inputs_outputs, nullifiers, commitments, commitment_tree_root) = output;
|
|
|
|
if commitment_tree_root != self.get_commitment_tree_root() {
|
|
return Err(());
|
|
}
|
|
|
|
if public_inputs_outputs.len() % 2 != 0 {
|
|
return Err(());
|
|
}
|
|
|
|
let num_input_public = public_inputs_outputs.len() >> 1;
|
|
for account in public_inputs_outputs.iter().take(num_input_public) {
|
|
let current_account = self.get_account(&account.address).ok_or(())?;
|
|
if ¤t_account != account {
|
|
return Err(());
|
|
}
|
|
}
|
|
|
|
// Check that nullifiers have not been added before
|
|
if nullifiers
|
|
.iter()
|
|
.any(|nullifier| self.nullifier_set.contains(nullifier))
|
|
{
|
|
return Err(());
|
|
}
|
|
|
|
// Check that commitments are new too
|
|
if commitments
|
|
.iter()
|
|
.any(|commitment| self.commitment_tree.values().contains(commitment))
|
|
{
|
|
return Err(());
|
|
}
|
|
|
|
// Verify consistency between public accounts, nullifiers and commitments
|
|
nssa::verify_privacy_execution(
|
|
receipt,
|
|
&public_inputs_outputs,
|
|
&nullifiers,
|
|
&commitments,
|
|
&commitment_tree_root,
|
|
)?;
|
|
|
|
// Update accounts
|
|
public_inputs_outputs
|
|
.iter()
|
|
.cloned()
|
|
.skip(num_input_public)
|
|
.for_each(|account_post_state| {
|
|
self.accounts
|
|
.insert(account_post_state.address, account_post_state);
|
|
});
|
|
|
|
// Add nullifiers
|
|
self.nullifier_set.extend(nullifiers);
|
|
|
|
// Add commitments
|
|
for commitment in commitments.iter() {
|
|
self.commitment_tree.add_value(*commitment);
|
|
}
|
|
|
|
Ok(())
|
|
}
|
|
}
|