From 2165d032ca3007a3a668e99196923ca04a3e84d6 Mon Sep 17 00:00:00 2001 From: parazyd Date: Tue, 26 Apr 2022 16:20:09 +0200 Subject: [PATCH] node: Implement MemoryState as an extension for state transition validation. --- src/node/memorystate.rs | 62 +++++++++++++++++++++++++++++++++++++++++ src/node/mod.rs | 3 ++ 2 files changed, 65 insertions(+) create mode 100644 src/node/memorystate.rs diff --git a/src/node/memorystate.rs b/src/node/memorystate.rs new file mode 100644 index 000000000..52220c844 --- /dev/null +++ b/src/node/memorystate.rs @@ -0,0 +1,62 @@ +use incrementalmerkletree::{bridgetree::BridgeTree, Frontier}; +use log::debug; + +use super::state::{ProgramState, State, StateUpdate}; +use crate::crypto::{ + keypair::PublicKey, merkle_node::MerkleNode, nullifier::Nullifier, proof::VerifyingKey, +}; + +/// In-memory state extension for state transition validations +pub struct MemoryState { + /// Canonical state + pub canon: State, + /// The entire Merkle tree state (copied from `canon`) + pub tree: BridgeTree, + /// List of all previous and the current merkle roots. + pub merkle_roots: Vec, + /// Nullifiers prevent double-spending + pub nullifiers: Vec, +} + +impl ProgramState for MemoryState { + fn is_valid_cashier_public_key(&self, public: &PublicKey) -> bool { + self.canon.is_valid_cashier_public_key(public) + } + + fn is_valid_faucet_public_key(&self, public: &PublicKey) -> bool { + self.canon.is_valid_faucet_public_key(public) + } + + fn is_valid_merkle(&self, merkle_root: &MerkleNode) -> bool { + self.canon.is_valid_merkle(merkle_root) || self.merkle_roots.contains(merkle_root) + } + + fn nullifier_exists(&self, nullifier: &Nullifier) -> bool { + self.canon.nullifier_exists(nullifier) || self.nullifiers.contains(nullifier) + } + + fn mint_vk(&self) -> &VerifyingKey { + self.canon.mint_vk() + } + + fn burn_vk(&self) -> &VerifyingKey { + self.canon.burn_vk() + } +} + +impl MemoryState { + pub async fn apply(&mut self, update: StateUpdate) { + debug!(target: "state_apply", "(in-memory) Extend nullifier set"); + let mut nfs = update.nullifiers.clone(); + self.nullifiers.append(&mut nfs); + + debug!(target: "state_apply", "(in-memory) Update Merkle tree and witnesses"); + for coin in update.coins { + let node = MerkleNode(coin.0); + self.tree.append(&node); + self.merkle_roots.push(self.tree.root()); + } + + debug!(target: "state_apply", "(in-memory) Finished apply() successfully."); + } +} diff --git a/src/node/mod.rs b/src/node/mod.rs index 913f985f5..d7333925a 100644 --- a/src/node/mod.rs +++ b/src/node/mod.rs @@ -3,3 +3,6 @@ pub use client::Client; pub mod state; pub use state::State; + +pub mod memorystate; +pub use memorystate::MemoryState;