Jelajahi Sumber

runtime: Add query for merkle root store.

Luther Blissett 3 tahun lalu
induk
melakukan
c370e2779d
3 mengubah file dengan 52 tambahan dan 7 penghapusan
  1. 34 4
      src/runtime/chain_state.rs
  2. 7 2
      src/runtime/mod.rs
  3. 11 1
      src/runtime/vm_runtime.rs

+ 34 - 4
src/runtime/chain_state.rs

@@ -1,7 +1,10 @@
 use log::{debug, error};
 
 use super::{memory::MemoryManipulation, vm_runtime::Env};
-use crate::{crypto::nullifier::Nullifier, node::state::ProgramState};
+use crate::{
+    crypto::{merkle_node::MerkleNode, nullifier::Nullifier},
+    node::state::ProgramState,
+};
 
 /// Try to read a `Nullifier` from the given pointer and check if it's
 /// an existing nullifier in the blockchain state machine.
@@ -11,11 +14,11 @@ pub fn nullifier_exists(env: &Env, ptr: u32, len: u32) -> i32 {
 
         let nullifier = match Nullifier::from_bytes(bytes.try_into().unwrap()) {
             Some(nf) => {
-                debug!(target: "wasm-runtime", "[wasm::nullifier_exists] Nullifier: {:?}", nf);
+                debug!(target: "wasm_runtime::nullifier_exists", "Nullifier: {:?}", nf);
                 nf
             }
             None => {
-                error!(target: "wasm-runtime", "[wasm_nullifier_exists] Could not convert bytes to Nullifier");
+                error!(target: "wasm_runtime::nullifier_exists", "Could not convert bytes to Nullifier");
                 return -1
             }
         };
@@ -26,6 +29,33 @@ pub fn nullifier_exists(env: &Env, ptr: u32, len: u32) -> i32 {
         }
     }
 
-    error!(target: "wasm-runtime", "[wasm::nullifier_exists] Failed to read any bytes from VM memory");
+    error!(target: "wasm_runtime::nullifier_exists", "Failed to read bytes from VM memory");
+    -2
+}
+
+/// Try to read a `MerkleNode` from the given pointer and check if it's
+/// a valid Merkle root in the chain's Merkle tree.
+pub fn is_valid_merkle(env: &Env, ptr: u32, len: u32) -> i32 {
+    if let Some(bytes) = env.memory.get_ref().unwrap().read(ptr, len as usize) {
+        debug!(target: "wasm_runtime::nullifier_exists", "Read bytes: {:?}", bytes);
+
+        let merkle_node = match MerkleNode::from_bytes(bytes.try_into().unwrap()) {
+            Some(mn) => {
+                debug!(target: "wasm_runtime::is_valid_merkle", "MerkleNode: {:?}", mn);
+                mn
+            }
+            None => {
+                error!(target: "wasm_runtime::is_valid_merkle", "Could not convert bytes to MerkleNode");
+                return -1
+            }
+        };
+
+        match env.state_machine.is_valid_merkle(&merkle_node) {
+            true => return 1,
+            false => return 0,
+        }
+    }
+
+    error!(target: "wasm_runtime::is_valid_merkle", "Failed to read bytes from VM memory");
     -2
 }

+ 7 - 2
src/runtime/mod.rs

@@ -1,6 +1,11 @@
-pub mod memory;
-pub mod util;
+/// Main wasm vm runtime implementation
 pub mod vm_runtime;
 
+/// VM memory access (read/write)
+pub(crate) mod memory;
+
+/// Utility functions
+pub mod util;
+
 /// Host functions for querying blockchain state through `MemoryState`
 pub(crate) mod chain_state;

+ 11 - 1
src/runtime/vm_runtime.rs

@@ -12,7 +12,11 @@ use wasmer_middlewares::{
     Metering,
 };
 
-use super::{chain_state::nullifier_exists, memory::MemoryManipulation, util::drk_log};
+use super::{
+    chain_state::{is_valid_merkle, nullifier_exists},
+    memory::MemoryManipulation,
+    util::drk_log,
+};
 use crate::{
     node::{state::StateUpdate, MemoryState},
     Result,
@@ -114,6 +118,12 @@ impl Runtime {
                     env.clone(),
                     nullifier_exists,
                 ),
+
+                "is_valid_merkle_" => Function::new_native_with_env(
+                    &store,
+                    env.clone(),
+                    is_valid_merkle,
+                ),
             }
         };