Fixed the contract deployment logic. Added new tracing logging for differential for leader and follower receipt structure (#26)

This commit is contained in:
activecoder10
2025-06-20 16:02:54 +03:00
committed by GitHub
parent ee97b62e70
commit 4ab79ed97e
+55 -19
View File
@@ -1,10 +1,11 @@
//! The test driver handles the compilation and execution of the test cases.
use alloy::primitives::Bytes;
use alloy::rpc::types::TransactionInput;
use alloy::{
network::TransactionBuilder,
primitives::{Address, bytes::Bytes, map::HashMap},
primitives::{Address, TxKind, map::HashMap},
rpc::types::{
TransactionRequest,
TransactionReceipt, TransactionRequest,
trace::geth::{AccountState, DiffMode, GethTrace},
},
};
@@ -116,7 +117,7 @@ where
&mut self,
input: &Input,
node: &T::Blockchain,
) -> anyhow::Result<(GethTrace, DiffMode)> {
) -> anyhow::Result<(TransactionReceipt, GethTrace, DiffMode)> {
log::trace!("Calling execute_input for input: {:?}", input);
let nonce = node.fetch_add_nonce(input.caller)?;
@@ -144,19 +145,31 @@ where
let receipt = match node.execute_transaction(tx) {
Ok(receipt) => receipt,
Err(err) => {
log::error!("Failed to execute transaction: {:?}", err);
log::error!(
"Failed to execute transaction when executing the contract: {}, {:?}",
&input.instance,
err
);
return Err(err);
}
};
log::trace!("Transaction receipt: {:?}", receipt);
log::trace!(
"Transaction receipt for executed contract: {} - {:?}",
&input.instance,
receipt,
);
let trace = node.trace_transaction(receipt.clone())?;
log::trace!("Trace result: {:?}", trace);
log::trace!(
"Trace result for contract: {} - {:?}",
&input.instance,
trace
);
let diff = node.state_diff(receipt)?;
let diff = node.state_diff(receipt.clone())?;
Ok((trace, diff))
Ok((receipt, trace, diff))
}
pub fn deploy_contracts(&mut self, input: &Input, node: &T::Blockchain) -> anyhow::Result<()> {
@@ -207,14 +220,16 @@ where
std::any::type_name::<T>()
);
let tx = TransactionRequest::default()
.with_from(input.caller)
.with_to(Address::ZERO)
.with_input(Bytes::from(code.clone()))
.with_gas_price(5_000_000)
.with_gas_limit(5_000_000)
.with_chain_id(self.config.network_id)
.with_nonce(nonce);
let tx = TransactionRequest {
from: Some(input.caller),
to: Some(TxKind::Create),
gas_price: Some(5_000_000),
gas: Some(5_000_000),
chain_id: Some(self.config.network_id),
nonce: Some(nonce),
input: TransactionInput::new(Bytes::from(code.into_bytes())),
..Default::default()
};
let receipt = match node.execute_transaction(tx) {
Ok(receipt) => receipt,
@@ -228,6 +243,12 @@ where
}
};
log::trace!(
"Deployed transaction receipt for contract: {} - {:?}",
&contract_name,
receipt
);
let Some(address) = receipt.contract_address else {
log::error!(
"contract {} deployment did not return an address",
@@ -316,8 +337,9 @@ where
follower_state.deploy_contracts(input, self.follower_node)?;
log::debug!("Starting executing contract {}", &input.instance);
let (_, leader_diff) = leader_state.execute_input(input, self.leader_node)?;
let (_, follower_diff) =
let (leader_receipt, _, leader_diff) =
leader_state.execute_input(input, self.leader_node)?;
let (follower_receipt, _, follower_diff) =
follower_state.execute_input(input, self.follower_node)?;
if leader_diff == follower_diff {
@@ -327,6 +349,20 @@ where
Self::trace_diff_mode("Leader", &leader_diff);
Self::trace_diff_mode("Follower", &follower_diff);
}
if leader_receipt.logs() != follower_receipt.logs() {
log::debug!("Log/event mismatch between leader and follower.");
log::trace!("Leader logs: {:?}", leader_receipt.logs());
log::trace!("Follower logs: {:?}", follower_receipt.logs());
}
if leader_receipt.status() != follower_receipt.status() {
log::debug!(
"Mismatch in status: leader = {}, follower = {}",
leader_receipt.status(),
follower_receipt.status()
);
}
}
}
}