From 23bfa78c2662d697018e7061ab9ad0b864fde0ef Mon Sep 17 00:00:00 2001 From: shamardy Date: Sun, 24 Jun 2018 04:53:50 +0200 Subject: [PATCH] Undo --- ethcore/src/client/client.rs | 13 +++++++++---- ethcore/src/executed.rs | 4 +++- ethcore/src/executive.rs | 2 ++ ethcore/transaction/src/transaction.rs | 5 +++++ ethcore/types/src/call_analytics.rs | 2 ++ rpc/src/v1/impls/traces.rs | 1 + rpc/src/v1/tests/mocked/eth.rs | 5 +++++ rpc/src/v1/tests/mocked/parity.rs | 1 + rpc/src/v1/tests/mocked/traces.rs | 11 ++++++----- rpc/src/v1/types/trace.rs | 7 ++++++- 10 files changed, 40 insertions(+), 11 deletions(-) diff --git a/ethcore/src/client/client.rs b/ethcore/src/client/client.rs index d47d1afa49b..f619a474692 100644 --- a/ethcore/src/client/client.rs +++ b/ethcore/src/client/client.rs @@ -1227,6 +1227,7 @@ impl Client { env_info: &EnvInfo, machine: &::machine::EthereumMachine, state_diff: bool, + hash_trace: bool, transaction: &SignedTransaction, options: TransactOptions, ) -> Result, CallError> where @@ -1240,6 +1241,8 @@ impl Client { let mut ret = Executive::new(state, env_info, machine).transact_virtual(transaction, options)?; + ret.transaction_hash = if hash_trace { Some(transaction.hash()) } else { None }; + if let Some(original) = original_state { ret.state_diff = Some(state.diff_from(original).map_err(ExecutionError::from)?); } @@ -1248,11 +1251,13 @@ impl Client { let state_diff = analytics.state_diffing; + let hash_trace = analytics.hash_tracing; + match (analytics.transaction_tracing, analytics.vm_tracing) { - (true, true) => call(state, env_info, machine, state_diff, t, TransactOptions::with_tracing_and_vm_tracing()), - (true, false) => call(state, env_info, machine, state_diff, t, TransactOptions::with_tracing()), - (false, true) => call(state, env_info, machine, state_diff, t, TransactOptions::with_vm_tracing()), - (false, false) => call(state, env_info, machine, state_diff, t, TransactOptions::with_no_tracing()), + (true, true) => call(state, env_info, machine, state_diff, hash_trace, t, TransactOptions::with_tracing_and_vm_tracing()), + (true, false) => call(state, env_info, machine, state_diff, hash_trace, t, TransactOptions::with_tracing()), + (false, true) => call(state, env_info, machine, state_diff, hash_trace, t, TransactOptions::with_vm_tracing()), + (false, false) => call(state, env_info, machine, state_diff, hash_trace, t, TransactOptions::with_no_tracing()), } } diff --git a/ethcore/src/executed.rs b/ethcore/src/executed.rs index 3d0b9767c4a..408d07c36e6 100644 --- a/ethcore/src/executed.rs +++ b/ethcore/src/executed.rs @@ -16,7 +16,7 @@ //! Transaction execution format module. -use ethereum_types::{U256, U512, Address}; +use ethereum_types::{U256, U512, Address, H256}; use bytes::Bytes; use trie; use vm; @@ -67,6 +67,8 @@ pub struct Executed { pub vm_trace: Option, /// The state diff, if we traced it. pub state_diff: Option, + /// The transaction hash, if we traced it. + pub transaction_hash: Option, } /// Result of executing the transaction. diff --git a/ethcore/src/executive.rs b/ethcore/src/executive.rs index f375f3c2e88..a252c3a1e37 100644 --- a/ethcore/src/executive.rs +++ b/ethcore/src/executive.rs @@ -658,6 +658,7 @@ impl<'a, B: 'a + StateBackend> Executive<'a, B> { trace: trace, vm_trace: vm_trace, state_diff: None, + transaction_hash: None, }) }, Ok(r) => { @@ -673,6 +674,7 @@ impl<'a, B: 'a + StateBackend> Executive<'a, B> { trace: trace, vm_trace: vm_trace, state_diff: None, + transaction_hash: None, }) }, } diff --git a/ethcore/transaction/src/transaction.rs b/ethcore/transaction/src/transaction.rs index 27b8b346cf2..93926e1fb9a 100644 --- a/ethcore/transaction/src/transaction.rs +++ b/ethcore/transaction/src/transaction.rs @@ -492,6 +492,11 @@ impl SignedTransaction { self.transaction.is_unsigned() } + /// Returns Transaction Hash + pub fn hash(&self) -> H256 { + self.transaction.hash() + } + /// Deconstructs this transaction back into `UnverifiedTransaction` pub fn deconstruct(self) -> (UnverifiedTransaction, Address, Option) { (self.transaction, self.sender, self.public) diff --git a/ethcore/types/src/call_analytics.rs b/ethcore/types/src/call_analytics.rs index ae53e6911e1..73fd26a53ba 100644 --- a/ethcore/types/src/call_analytics.rs +++ b/ethcore/types/src/call_analytics.rs @@ -25,4 +25,6 @@ pub struct CallAnalytics { pub vm_tracing: bool, /// Make a diff. pub state_diffing: bool, + /// Make a transaction hash trace. + pub hash_tracing: bool, } diff --git a/rpc/src/v1/impls/traces.rs b/rpc/src/v1/impls/traces.rs index 0e43d8c11af..993cd8fa5c3 100644 --- a/rpc/src/v1/impls/traces.rs +++ b/rpc/src/v1/impls/traces.rs @@ -34,6 +34,7 @@ fn to_call_analytics(flags: TraceOptions) -> CallAnalytics { transaction_tracing: flags.contains(&("trace".to_owned())), vm_tracing: flags.contains(&("vmTrace".to_owned())), state_diffing: flags.contains(&("stateDiff".to_owned())), + hash_tracing: flags.contains(&("transactionHash".to_owned())), } } diff --git a/rpc/src/v1/tests/mocked/eth.rs b/rpc/src/v1/tests/mocked/eth.rs index c0ed3306fee..248f8b88628 100644 --- a/rpc/src/v1/tests/mocked/eth.rs +++ b/rpc/src/v1/tests/mocked/eth.rs @@ -637,6 +637,7 @@ fn rpc_eth_call_latest() { trace: vec![], vm_trace: None, state_diff: None, + transaction_hash: None, })); let request = r#"{ @@ -673,6 +674,7 @@ fn rpc_eth_call() { trace: vec![], vm_trace: None, state_diff: None, + transaction_hash: None, })); let request = r#"{ @@ -709,6 +711,7 @@ fn rpc_eth_call_default_block() { trace: vec![], vm_trace: None, state_diff: None, + transaction_hash: None, })); let request = r#"{ @@ -744,6 +747,7 @@ fn rpc_eth_estimate_gas() { trace: vec![], vm_trace: None, state_diff: None, + transaction_hash: None, })); let request = r#"{ @@ -780,6 +784,7 @@ fn rpc_eth_estimate_gas_default_block() { trace: vec![], vm_trace: None, state_diff: None, + transaction_hash: None, })); let request = r#"{ diff --git a/rpc/src/v1/tests/mocked/parity.rs b/rpc/src/v1/tests/mocked/parity.rs index 4bb653c4d26..b8ba37af00e 100644 --- a/rpc/src/v1/tests/mocked/parity.rs +++ b/rpc/src/v1/tests/mocked/parity.rs @@ -554,6 +554,7 @@ fn rpc_parity_call() { trace: vec![], vm_trace: None, state_diff: None, + transaction_hash: None, })); let io = deps.default_client(); diff --git a/rpc/src/v1/tests/mocked/traces.rs b/rpc/src/v1/tests/mocked/traces.rs index 70a862d332a..a1c1ca53453 100644 --- a/rpc/src/v1/tests/mocked/traces.rs +++ b/rpc/src/v1/tests/mocked/traces.rs @@ -64,6 +64,7 @@ fn io() -> Tester { trace: vec![], vm_trace: None, state_diff: None, + transaction_hash: None, })); let miner = Arc::new(TestMinerService::default()); let traces = TracesClient::new(&client); @@ -165,7 +166,7 @@ fn rpc_trace_call() { let tester = io(); let request = r#"{"jsonrpc":"2.0","method":"trace_call","params":[{}, ["stateDiff", "vmTrace", "trace"]],"id":1}"#; - let response = r#"{"jsonrpc":"2.0","result":{"output":"0x010203","stateDiff":null,"trace":[],"vmTrace":null},"id":1}"#; + let response = r#"{"jsonrpc":"2.0","result":{"output":"0x010203","stateDiff":null,"trace":[],"transactionHash":null,"vmTrace":null},"id":1}"#; assert_eq!(tester.io.handle_request_sync(request), Some(response.to_owned())); } @@ -175,7 +176,7 @@ fn rpc_trace_multi_call() { let tester = io(); let request = r#"{"jsonrpc":"2.0","method":"trace_callMany","params":[[[{}, ["stateDiff", "vmTrace", "trace"]]]],"id":1}"#; - let response = r#"{"jsonrpc":"2.0","result":[{"output":"0x010203","stateDiff":null,"trace":[],"vmTrace":null}],"id":1}"#; + let response = r#"{"jsonrpc":"2.0","result":[{"output":"0x010203","stateDiff":null,"trace":[],"transactionHash":null,"vmTrace":null}],"id":1}"#; assert_eq!(tester.io.handle_request_sync(request), Some(response.to_owned())); } @@ -196,7 +197,7 @@ fn rpc_trace_raw_transaction() { let tester = io(); let request = r#"{"jsonrpc":"2.0","method":"trace_rawTransaction","params":["0xf869018609184e72a0008276c094d46e8dd67c5d32be8058bb8eb970870f07244567849184e72a801ba0617f39c1a107b63302449c476d96a6cb17a5842fc98ff0c5bcf4d5c4d8166b95a009fdb6097c6196b9bbafc3a59f02f38d91baeef23d0c60a8e4f23c7714cea3a9", ["stateDiff", "vmTrace", "trace"]],"id":1}"#; - let response = r#"{"jsonrpc":"2.0","result":{"output":"0x010203","stateDiff":null,"trace":[],"vmTrace":null},"id":1}"#; + let response = r#"{"jsonrpc":"2.0","result":{"output":"0x010203","stateDiff":null,"trace":[],"transactionHash":null,"vmTrace":null},"id":1}"#; assert_eq!(tester.io.handle_request_sync(request), Some(response.to_owned())); } @@ -217,7 +218,7 @@ fn rpc_trace_replay_transaction() { let tester = io(); let request = r#"{"jsonrpc":"2.0","method":"trace_replayTransaction","params":["0x0000000000000000000000000000000000000000000000000000000000000005", ["trace", "stateDiff", "vmTrace"]],"id":1}"#; - let response = r#"{"jsonrpc":"2.0","result":{"output":"0x010203","stateDiff":null,"trace":[],"vmTrace":null},"id":1}"#; + let response = r#"{"jsonrpc":"2.0","result":{"output":"0x010203","stateDiff":null,"trace":[],"transactionHash":null,"vmTrace":null},"id":1}"#; assert_eq!(tester.io.handle_request_sync(request), Some(response.to_owned())); } @@ -238,7 +239,7 @@ fn rpc_trace_replay_block_transactions() { let tester = io(); let request = r#"{"jsonrpc":"2.0","method":"trace_replayBlockTransactions","params":["0x10", ["trace", "stateDiff", "vmTrace"]],"id":1}"#; - let response = r#"{"jsonrpc":"2.0","result":[{"output":"0x010203","stateDiff":null,"trace":[],"vmTrace":null}],"id":1}"#; + let response = r#"{"jsonrpc":"2.0","result":[{"output":"0x010203","stateDiff":null,"trace":[],"transactionHash":null,"vmTrace":null}],"id":1}"#; assert_eq!(tester.io.handle_request_sync(request), Some(response.to_owned())); } diff --git a/rpc/src/v1/types/trace.rs b/rpc/src/v1/types/trace.rs index 08ddfb27670..1d3af24f883 100644 --- a/rpc/src/v1/types/trace.rs +++ b/rpc/src/v1/types/trace.rs @@ -618,6 +618,9 @@ pub struct TraceResults { /// The transaction trace. #[serde(rename="stateDiff")] pub state_diff: Option, + /// The transaction trace. + #[serde(rename="transactionHash")] + pub transaction_hash: Option, } impl From for TraceResults { @@ -627,6 +630,7 @@ impl From for TraceResults { trace: t.trace.into_iter().map(Into::into).collect(), vm_trace: t.vm_trace.map(Into::into), state_diff: t.state_diff.map(Into::into), + transaction_hash: t.transaction_hash.map(Into::into), } } } @@ -646,9 +650,10 @@ mod tests { trace: vec![], vm_trace: None, state_diff: None, + transaction_hash: None, }; let serialized = serde_json::to_string(&r).unwrap(); - assert_eq!(serialized, r#"{"output":"0x60","trace":[],"vmTrace":null,"stateDiff":null}"#); + assert_eq!(serialized, r#"{"output":"0x60","trace":[],"vmTrace":null,"stateDiff":null,"transactionHash":null}"#); } #[test]