Transaction ids made optional in order to reflect not transactional traces

This commit is contained in:
Anton Gavrilov 2017-07-28 13:41:51 +02:00
parent b1935340c8
commit 1f3f91136c
5 changed files with 78 additions and 45 deletions

View File

@ -40,7 +40,7 @@ fn can_trace_block_and_uncle_reward() {
let spec = Spec::new_test_with_reward(); let spec = Spec::new_test_with_reward();
let engine = &*spec.engine; let engine = &*spec.engine;
/// Create client // Create client
let db_config = DatabaseConfig::with_columns(::db::NUM_COLUMNS); let db_config = DatabaseConfig::with_columns(::db::NUM_COLUMNS);
let mut client_config = ClientConfig::default(); let mut client_config = ClientConfig::default();
client_config.tracing.enabled = true; client_config.tracing.enabled = true;
@ -53,7 +53,15 @@ fn can_trace_block_and_uncle_reward() {
IoChannel::disconnected(), IoChannel::disconnected(),
).unwrap(); ).unwrap();
/// Create test data // Create test data:
// genesis
// |
// root_block
// |
// parent_block
// |
// block with transaction and uncle
let genesis_header = spec.genesis_header(); let genesis_header = spec.genesis_header();
let mut db = spec.ensure_db_good(get_temp_state_db(), &Default::default()).unwrap(); let mut db = spec.ensure_db_good(get_temp_state_db(), &Default::default()).unwrap();
let mut rolling_timestamp = 40; let mut rolling_timestamp = 40;
@ -64,7 +72,7 @@ fn can_trace_block_and_uncle_reward() {
let kp = KeyPair::from_secret_slice(&"".sha3()).unwrap(); let kp = KeyPair::from_secret_slice(&"".sha3()).unwrap();
let author = kp.address(); let author = kp.address();
/// Add root block first // Add root block first
let mut root_block = OpenBlock::new( let mut root_block = OpenBlock::new(
engine, engine,
Default::default(), Default::default(),
@ -93,7 +101,7 @@ fn can_trace_block_and_uncle_reward() {
last_hashes.push(last_header.hash()); last_hashes.push(last_header.hash());
/// Add parent block // Add parent block
let mut parent_block = OpenBlock::new( let mut parent_block = OpenBlock::new(
engine, engine,
Default::default(), Default::default(),
@ -121,7 +129,7 @@ fn can_trace_block_and_uncle_reward() {
last_hashes.push(last_header.hash()); last_hashes.push(last_header.hash());
/// Add testing block with transactions and uncles // Add testing block with transaction and uncle
let mut block = OpenBlock::new( let mut block = OpenBlock::new(
engine, engine,
Default::default(), Default::default(),
@ -172,7 +180,7 @@ fn can_trace_block_and_uncle_reward() {
client.flush_queue(); client.flush_queue();
client.import_verified_blocks(); client.import_verified_blocks();
/// Filter the resuliting data // Test0. Check overall filter
let filter = TraceFilter { let filter = TraceFilter {
range: (BlockId::Number(1)..BlockId::Number(3)), range: (BlockId::Number(1)..BlockId::Number(3)),
from_address: vec![], from_address: vec![],
@ -180,7 +188,7 @@ fn can_trace_block_and_uncle_reward() {
}; };
let traces = client.filter_traces(filter); let traces = client.filter_traces(filter);
assert!(traces.is_some(), "Traces should be present"); assert!(traces.is_some(), "Filtered traces should be present");
let traces_vec = traces.unwrap(); let traces_vec = traces.unwrap();
let block_reward_traces: Vec<LocalizedTrace> = traces_vec.clone().into_iter().filter(|trace| match (trace).action { let block_reward_traces: Vec<LocalizedTrace> = traces_vec.clone().into_iter().filter(|trace| match (trace).action {
Reward(ref a) => a.reward_type == RewardType::Block, Reward(ref a) => a.reward_type == RewardType::Block,
@ -192,4 +200,8 @@ fn can_trace_block_and_uncle_reward() {
_ => false, _ => false,
}).collect(); }).collect();
assert_eq!(uncle_reward_traces.len(), 1); assert_eq!(uncle_reward_traces.len(), 1);
// Test1. Check block filter
let traces = client.block_traces(BlockId::Number(3));
assert_eq!(traces.unwrap().len(), 3);
} }

View File

@ -215,7 +215,20 @@ impl<T> TraceDB<T> where T: DatabaseExtras {
block_number: BlockNumber, block_number: BlockNumber,
tx_number: usize tx_number: usize
) -> Vec<LocalizedTrace> { ) -> Vec<LocalizedTrace> {
let tx_hash = self.extras.transaction_hash(block_number, tx_number); let trace_tx_number;
let trace_tx_hash;
match self.extras.transaction_hash(block_number, tx_number) {
Some(hash) => {
trace_tx_hash = Some(hash.clone());
trace_tx_number = Some(tx_number);
},
None => {
//None means trace without transaction (reward)
trace_tx_hash = None;
trace_tx_number = None;
}
}
let flat_traces: Vec<FlatTrace> = traces.into(); let flat_traces: Vec<FlatTrace> = traces.into();
flat_traces.into_iter() flat_traces.into_iter()
@ -226,12 +239,8 @@ impl<T> TraceDB<T> where T: DatabaseExtras {
result: trace.result, result: trace.result,
subtraces: trace.subtraces, subtraces: trace.subtraces,
trace_address: trace.trace_address.into_iter().collect(), trace_address: trace.trace_address.into_iter().collect(),
transaction_number: tx_number, transaction_number: trace_tx_number,
transaction_hash: match tx_hash { transaction_hash: trace_tx_hash,
Some(hash) => hash.clone(),
/// None tx hash means non transaction's trace
None => 0.into(),
},
block_number: block_number, block_number: block_number,
block_hash: block_hash block_hash: block_hash
}), }),
@ -324,8 +333,8 @@ impl<T> TraceDatabase for TraceDB<T> where T: DatabaseExtras {
result: trace.result, result: trace.result,
subtraces: trace.subtraces, subtraces: trace.subtraces,
trace_address: trace.trace_address.into_iter().collect(), trace_address: trace.trace_address.into_iter().collect(),
transaction_number: tx_position, transaction_number: Some(tx_position),
transaction_hash: tx_hash, transaction_hash: Some(tx_hash),
block_number: block_number, block_number: block_number,
block_hash: block_hash, block_hash: block_hash,
} }
@ -348,8 +357,8 @@ impl<T> TraceDatabase for TraceDB<T> where T: DatabaseExtras {
result: trace.result, result: trace.result,
subtraces: trace.subtraces, subtraces: trace.subtraces,
trace_address: trace.trace_address.into_iter().collect(), trace_address: trace.trace_address.into_iter().collect(),
transaction_number: tx_position, transaction_number: Some(tx_position),
transaction_hash: tx_hash.clone(), transaction_hash: Some(tx_hash.clone()),
block_number: block_number, block_number: block_number,
block_hash: block_hash block_hash: block_hash
}) })
@ -366,8 +375,20 @@ impl<T> TraceDatabase for TraceDB<T> where T: DatabaseExtras {
.map(Into::<Vec<FlatTrace>>::into) .map(Into::<Vec<FlatTrace>>::into)
.enumerate() .enumerate()
.flat_map(|(tx_position, traces)| { .flat_map(|(tx_position, traces)| {
let tx_hash = self.extras.transaction_hash(block_number, tx_position) let trace_tx_number;
.expect("Expected to find transaction hash. Database is probably corrupted"); let trace_tx_hash;
match self.extras.transaction_hash(block_number, tx_position) {
Some(hash) => {
trace_tx_hash = Some(hash.clone());
trace_tx_number = Some(tx_position);
},
None => {
//None means trace without transaction (reward)
trace_tx_hash = None;
trace_tx_number = None;
}
}
traces.into_iter() traces.into_iter()
.map(|trace| LocalizedTrace { .map(|trace| LocalizedTrace {
@ -375,8 +396,8 @@ impl<T> TraceDatabase for TraceDB<T> where T: DatabaseExtras {
result: trace.result, result: trace.result,
subtraces: trace.subtraces, subtraces: trace.subtraces,
trace_address: trace.trace_address.into_iter().collect(), trace_address: trace.trace_address.into_iter().collect(),
transaction_number: tx_position, transaction_number: trace_tx_number,
transaction_hash: tx_hash.clone(), transaction_hash: trace_tx_hash,
block_number: block_number, block_number: block_number,
block_hash: block_hash, block_hash: block_hash,
}) })
@ -546,8 +567,8 @@ mod tests {
result: Res::FailedCall(TraceError::OutOfGas), result: Res::FailedCall(TraceError::OutOfGas),
trace_address: vec![], trace_address: vec![],
subtraces: 0, subtraces: 0,
transaction_number: 0, transaction_number: Some(0),
transaction_hash: tx_hash, transaction_hash: Some(tx_hash),
block_number: block_number, block_number: block_number,
block_hash: block_hash, block_hash: block_hash,
} }

View File

@ -34,9 +34,9 @@ pub struct LocalizedTrace {
/// [index in root, index in first CALL, index in second CALL, ...] /// [index in root, index in first CALL, index in second CALL, ...]
pub trace_address: Vec<usize>, pub trace_address: Vec<usize>,
/// Transaction number within the block. /// Transaction number within the block.
pub transaction_number: usize, pub transaction_number: Option<usize>,
/// Signed transaction hash. /// Signed transaction hash.
pub transaction_hash: H256, pub transaction_hash: Option<H256>,
/// Block number. /// Block number.
pub block_number: BlockNumber, pub block_number: BlockNumber,
/// Block hash. /// Block hash.

View File

@ -47,8 +47,8 @@ fn io() -> Tester {
result: Res::None, result: Res::None,
subtraces: 0, subtraces: 0,
trace_address: vec![0], trace_address: vec![0],
transaction_number: 0, transaction_number: Some(0),
transaction_hash: 5.into(), transaction_hash: Some(5.into()),
block_number: 10, block_number: 10,
block_hash: 10.into(), block_hash: 10.into(),
}]); }]);

View File

@ -472,9 +472,9 @@ pub struct LocalizedTrace {
/// Subtraces /// Subtraces
subtraces: usize, subtraces: usize,
/// Transaction position /// Transaction position
transaction_position: usize, transaction_position: Option<usize>,
/// Transaction hash /// Transaction hash
transaction_hash: H256, transaction_hash: Option<H256>,
/// Block Number /// Block Number
block_number: u64, block_number: u64,
/// Block Hash /// Block Hash
@ -531,8 +531,8 @@ impl From<EthLocalizedTrace> for LocalizedTrace {
result: t.result.into(), result: t.result.into(),
trace_address: t.trace_address.into_iter().map(Into::into).collect(), trace_address: t.trace_address.into_iter().map(Into::into).collect(),
subtraces: t.subtraces.into(), subtraces: t.subtraces.into(),
transaction_position: t.transaction_number.into(), transaction_position: t.transaction_number.map(Into::into),
transaction_hash: t.transaction_hash.into(), transaction_hash: t.transaction_hash.map(Into::into),
block_number: t.block_number.into(), block_number: t.block_number.into(),
block_hash: t.block_hash.into(), block_hash: t.block_hash.into(),
} }
@ -665,8 +665,8 @@ mod tests {
}), }),
trace_address: vec![10], trace_address: vec![10],
subtraces: 1, subtraces: 1,
transaction_position: 11, transaction_position: Some(11),
transaction_hash: 12.into(), transaction_hash: Some(12.into()),
block_number: 13, block_number: 13,
block_hash: 14.into(), block_hash: 14.into(),
}; };
@ -688,8 +688,8 @@ mod tests {
result: Res::FailedCall(TraceError::OutOfGas), result: Res::FailedCall(TraceError::OutOfGas),
trace_address: vec![10], trace_address: vec![10],
subtraces: 1, subtraces: 1,
transaction_position: 11, transaction_position: Some(11),
transaction_hash: 12.into(), transaction_hash: Some(12.into()),
block_number: 13, block_number: 13,
block_hash: 14.into(), block_hash: 14.into(),
}; };
@ -713,8 +713,8 @@ mod tests {
}), }),
trace_address: vec![10], trace_address: vec![10],
subtraces: 1, subtraces: 1,
transaction_position: 11, transaction_position: Some(11),
transaction_hash: 12.into(), transaction_hash: Some(12.into()),
block_number: 13, block_number: 13,
block_hash: 14.into(), block_hash: 14.into(),
}; };
@ -734,8 +734,8 @@ mod tests {
result: Res::FailedCreate(TraceError::OutOfGas), result: Res::FailedCreate(TraceError::OutOfGas),
trace_address: vec![10], trace_address: vec![10],
subtraces: 1, subtraces: 1,
transaction_position: 11, transaction_position: Some(11),
transaction_hash: 12.into(), transaction_hash: Some(12.into()),
block_number: 13, block_number: 13,
block_hash: 14.into(), block_hash: 14.into(),
}; };
@ -754,8 +754,8 @@ mod tests {
result: Res::None, result: Res::None,
trace_address: vec![10], trace_address: vec![10],
subtraces: 1, subtraces: 1,
transaction_position: 11, transaction_position: Some(11),
transaction_hash: 12.into(), transaction_hash: Some(12.into()),
block_number: 13, block_number: 13,
block_hash: 14.into(), block_hash: 14.into(),
}; };
@ -774,13 +774,13 @@ mod tests {
result: Res::None, result: Res::None,
trace_address: vec![10], trace_address: vec![10],
subtraces: 1, subtraces: 1,
transaction_position: 11, transaction_position: None,
transaction_hash: 12.into(), transaction_hash: None,
block_number: 13, block_number: 13,
block_hash: 14.into(), block_hash: 14.into(),
}; };
let serialized = serde_json::to_string(&t).unwrap(); let serialized = serde_json::to_string(&t).unwrap();
assert_eq!(serialized, r#"{"type":"reward","action":{"miner":"0x0000000000000000000000000000000000000004","value":"0x6","rewardType":"block"},"result":null,"traceAddress":[10],"subtraces":1,"transactionPosition":11,"transactionHash":"0x000000000000000000000000000000000000000000000000000000000000000c","blockNumber":13,"blockHash":"0x000000000000000000000000000000000000000000000000000000000000000e"}"#); assert_eq!(serialized, r#"{"type":"reward","action":{"miner":"0x0000000000000000000000000000000000000004","value":"0x6","rewardType":"block"},"result":null,"traceAddress":[10],"subtraces":1,"transactionPosition":null,"transactionHash":null,"blockNumber":13,"blockHash":"0x000000000000000000000000000000000000000000000000000000000000000e"}"#);
} }
#[test] #[test]