From 09677446357a2a800ae332cceae355cdf3f9f1ad Mon Sep 17 00:00:00 2001 From: zero Date: Mon, 1 Apr 2024 11:40:01 +0200 Subject: [PATCH] runtime: add tx_hash to runtime params --- src/contract/test-harness/src/lib.rs | 10 ++++++++-- src/runtime/vm_runtime.rs | 7 ++++++- src/validator/utils.rs | 8 +++++++- src/validator/verification.rs | 18 ++++++++++++++---- 4 files changed, 35 insertions(+), 8 deletions(-) diff --git a/src/contract/test-harness/src/lib.rs b/src/contract/test-harness/src/lib.rs index 0432897d8..4d2fd6d46 100644 --- a/src/contract/test-harness/src/lib.rs +++ b/src/contract/test-harness/src/lib.rs @@ -289,8 +289,14 @@ fn benchmark_wasm_calls( for (idx, call) in tx.calls.iter().enumerate() { let overlay = BlockchainOverlay::new(&validator.blockchain).expect("blockchain overlay"); let wasm = overlay.lock().unwrap().wasm_bincode.get(call.data.contract_id).unwrap(); - let mut runtime = Runtime::new(&wasm, overlay.clone(), call.data.contract_id, block_height) - .expect("runtime"); + let mut runtime = Runtime::new( + &wasm, + overlay.clone(), + call.data.contract_id, + block_height, + tx.hash().clone(), + ) + .expect("runtime"); let mut payload = vec![]; payload.write_u32(idx as u32).unwrap(); // Call index tx.calls.encode(&mut payload).unwrap(); // Actual call data diff --git a/src/runtime/vm_runtime.rs b/src/runtime/vm_runtime.rs index fb9692018..e7861972d 100644 --- a/src/runtime/vm_runtime.rs +++ b/src/runtime/vm_runtime.rs @@ -94,8 +94,11 @@ pub struct Env { pub memory: Option, /// Object store for transferring memory from the host to VM pub objects: RefCell>>, - /// Block height number runtime verifys against + /// Block height number runtime verifies against. + /// For unconfirmed txs, this will be the current max height in the chain. pub verifying_block_height: u64, + /// The hash for this transaction the runtime is being run against. + pub tx_hash: TransactionHash, /// Parent `Instance` pub instance: Option>, } @@ -151,6 +154,7 @@ impl Runtime { blockchain: BlockchainOverlayPtr, contract_id: ContractId, verifying_block_height: u64, + tx_hash: TransactionHash, ) -> Result { info!(target: "runtime::vm_runtime", "[WASM] Instantiating a new runtime"); // This function will be called for each `Operator` encountered during @@ -192,6 +196,7 @@ impl Runtime { memory: None, objects: RefCell::new(vec![]), verifying_block_height, + tx_hash, instance: None, }, ); diff --git a/src/validator/utils.rs b/src/validator/utils.rs index 1854a465e..7d9542ff8 100644 --- a/src/validator/utils.rs +++ b/src/validator/utils.rs @@ -84,7 +84,13 @@ pub async fn deploy_native_contracts(overlay: &BlockchainOverlayPtr) -> Result<( for nc in native_contracts { info!(target: "validator::utils::deploy_native_contracts", "Deploying {} with ContractID {}", nc.0, nc.1); - let mut runtime = Runtime::new(&nc.2[..], overlay.clone(), nc.1, verifying_block_height)?; + let mut runtime = Runtime::new( + &nc.2[..], + overlay.clone(), + nc.1, + verifying_block_height, + TransactionHash::none(), + )?; runtime.deploy(&nc.3)?; diff --git a/src/validator/verification.rs b/src/validator/verification.rs index 2d4d95154..7f4757335 100644 --- a/src/validator/verification.rs +++ b/src/validator/verification.rs @@ -282,8 +282,13 @@ pub async fn verify_producer_transaction( debug!(target: "validator::verification::verify_producer_transaction", "Instantiating WASM runtime"); let wasm = overlay.lock().unwrap().wasm_bincode.get(call.data.contract_id)?; - let mut runtime = - Runtime::new(&wasm, overlay.clone(), call.data.contract_id, verifying_block_height)?; + let mut runtime = Runtime::new( + &wasm, + overlay.clone(), + call.data.contract_id, + verifying_block_height, + tx_hash.clone(), + )?; debug!(target: "validator::verification::verify_producer_transaction", "Executing \"metadata\" call"); let metadata = runtime.metadata(&payload)?; @@ -444,8 +449,13 @@ pub async fn verify_transaction( debug!(target: "validator::verification::verify_transaction", "Instantiating WASM runtime"); let wasm = overlay.lock().unwrap().wasm_bincode.get(call.data.contract_id)?; - let mut runtime = - Runtime::new(&wasm, overlay.clone(), call.data.contract_id, verifying_block_height)?; + let mut runtime = Runtime::new( + &wasm, + overlay.clone(), + call.data.contract_id, + verifying_block_height, + tx_hash.clone(), + )?; debug!(target: "validator::verification::verify_transaction", "Executing \"metadata\" call"); let metadata = runtime.metadata(&payload)?;