Compare commits

...

2 Commits

Author SHA1 Message Date
activecoder10 8287146003 Improve tracing part 2025-06-10 09:50:45 +03:00
activecoder10 b8cd5d6031 Extended execute_input method 2025-06-09 19:10:23 +03:00
2 changed files with 49 additions and 9 deletions
+47 -7
View File
@@ -2,7 +2,7 @@
use alloy::{ use alloy::{
primitives::{Address, map::HashMap}, primitives::{Address, map::HashMap},
rpc::types::trace::geth::GethTrace, rpc::types::trace::geth::{AccountState, DiffMode, GethTrace},
}; };
use revive_dt_compiler::{Compiler, CompilerInput, SolidityCompiler}; use revive_dt_compiler::{Compiler, CompilerInput, SolidityCompiler};
use revive_dt_config::Arguments; use revive_dt_config::Arguments;
@@ -94,15 +94,20 @@ where
&mut self, &mut self,
input: &Input, input: &Input,
node: &T::Blockchain, node: &T::Blockchain,
) -> anyhow::Result<GethTrace> { ) -> anyhow::Result<(GethTrace, DiffMode)> {
let receipt = node.execute_transaction(input.legacy_transaction( let receipt = node.execute_transaction(input.legacy_transaction(
self.config.network_id, self.config.network_id,
0, 0,
&self.deployed_contracts, &self.deployed_contracts,
)?)?; )?)?;
dbg!(&receipt);
//node.trace_transaction(receipt) log::trace!("Transaction receipt: {:?}", receipt);
todo!() let trace = node.trace_transaction(receipt.clone())?;
log::trace!("Trace result: {:?}", trace);
let diff = node.state_diff(receipt)?;
Ok((trace, diff))
} }
} }
@@ -132,6 +137,32 @@ where
} }
} }
pub fn trace_diff_mode(label: &str, diff: &DiffMode) {
log::trace!("{} - PRE STATE:", label);
for (addr, state) in &diff.pre {
Self::trace_account_state(" [pre]", addr, state);
}
log::trace!("{} - POST STATE:", label);
for (addr, state) in &diff.post {
Self::trace_account_state(" [post]", addr, state);
}
}
fn trace_account_state(prefix: &str, addr: &Address, state: &AccountState) {
log::trace!("{} 0x{:x}", prefix, addr);
if let Some(balance) = &state.balance {
log::trace!("{} balance: {}", prefix, balance);
}
if let Some(nonce) = &state.nonce {
log::trace!("{} nonce: {}", prefix, nonce);
}
if let Some(code) = &state.code {
log::trace!("{} code: {}", prefix, code);
}
}
pub fn execute(&mut self, span: Span) -> anyhow::Result<()> { pub fn execute(&mut self, span: Span) -> anyhow::Result<()> {
for mode in self.metadata.solc_modes() { for mode in self.metadata.solc_modes() {
let mut leader_state = State::<L>::new(self.config, span); let mut leader_state = State::<L>::new(self.config, span);
@@ -142,8 +173,17 @@ where
for case in &self.metadata.cases { for case in &self.metadata.cases {
for input in &case.inputs { for input in &case.inputs {
let _ = leader_state.execute_input(input, self.leader_node)?; let (_, leader_diff) = leader_state.execute_input(input, self.leader_node)?;
let _ = follower_state.execute_input(input, self.follower_node)?; let (_, follower_diff) =
follower_state.execute_input(input, self.follower_node)?;
if leader_diff == follower_diff {
log::debug!("State diffs match between leader and follower.");
} else {
log::debug!("State diffs mismatch between leader and follower.");
Self::trace_diff_mode("Leader", &leader_diff);
Self::trace_diff_mode("Follower", &follower_diff);
}
} }
} }
} }
+2 -2
View File
@@ -5,7 +5,7 @@
use revive_dt_compiler::{SolidityCompiler, revive_resolc, solc}; use revive_dt_compiler::{SolidityCompiler, revive_resolc, solc};
use revive_dt_config::TestingPlatform; use revive_dt_config::TestingPlatform;
use revive_dt_node::geth; use revive_dt_node::{geth, kitchensink::KitchensinkNode};
use revive_dt_node_interaction::EthereumNode; use revive_dt_node_interaction::EthereumNode;
pub mod driver; pub mod driver;
@@ -37,7 +37,7 @@ impl Platform for Geth {
pub struct Kitchensink; pub struct Kitchensink;
impl Platform for Kitchensink { impl Platform for Kitchensink {
type Blockchain = geth::Instance; type Blockchain = KitchensinkNode;
type Compiler = revive_resolc::Resolc; type Compiler = revive_resolc::Resolc;
fn config_id() -> TestingPlatform { fn config_id() -> TestingPlatform {