chain_state.rs 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. use log::{debug, error};
  2. use super::{memory::MemoryManipulation, vm_runtime::Env};
  3. use crate::{
  4. crypto::{merkle_node::MerkleNode, nullifier::Nullifier},
  5. node::state::ProgramState,
  6. };
  7. /// Try to read a `Nullifier` from the given pointer and check if it's
  8. /// an existing nullifier in the blockchain state machine.
  9. pub fn nullifier_exists(env: &Env, ptr: u32, len: u32) -> i32 {
  10. if let Some(bytes) = env.memory.get_ref().unwrap().read(ptr, len as usize) {
  11. debug!(target: "wasm-runtime", "[wasm::nullifier_exists] Read bytes: {:?}", bytes);
  12. let nullifier = match Nullifier::from_bytes(bytes.try_into().unwrap()) {
  13. Some(nf) => {
  14. debug!(target: "wasm_runtime::nullifier_exists", "Nullifier: {:?}", nf);
  15. nf
  16. }
  17. None => {
  18. error!(target: "wasm_runtime::nullifier_exists", "Could not convert bytes to Nullifier");
  19. return -1
  20. }
  21. };
  22. match env.state_machine.nullifier_exists(&nullifier) {
  23. true => return 1,
  24. false => return 0,
  25. }
  26. }
  27. error!(target: "wasm_runtime::nullifier_exists", "Failed to read bytes from VM memory");
  28. -2
  29. }
  30. /// Try to read a `MerkleNode` from the given pointer and check if it's
  31. /// a valid Merkle root in the chain's Merkle tree.
  32. pub fn is_valid_merkle(env: &Env, ptr: u32, len: u32) -> i32 {
  33. if let Some(bytes) = env.memory.get_ref().unwrap().read(ptr, len as usize) {
  34. debug!(target: "wasm_runtime::nullifier_exists", "Read bytes: {:?}", bytes);
  35. let merkle_node = match MerkleNode::from_bytes(bytes.try_into().unwrap()) {
  36. Some(mn) => {
  37. debug!(target: "wasm_runtime::is_valid_merkle", "MerkleNode: {:?}", mn);
  38. mn
  39. }
  40. None => {
  41. error!(target: "wasm_runtime::is_valid_merkle", "Could not convert bytes to MerkleNode");
  42. return -1
  43. }
  44. };
  45. match env.state_machine.is_valid_merkle(&merkle_node) {
  46. true => return 1,
  47. false => return 0,
  48. }
  49. }
  50. error!(target: "wasm_runtime::is_valid_merkle", "Failed to read bytes from VM memory");
  51. -2
  52. }