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