Fixing importing traces for non-canon blockS (#2683)
This commit is contained in:
parent
ed804341bd
commit
4d48054cee
@ -275,16 +275,6 @@ impl<T> TraceDatabase for TraceDB<T> where T: DatabaseExtras {
|
|||||||
.map(Into::into)
|
.map(Into::into)
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
// insert new block traces into the cache and the database
|
|
||||||
{
|
|
||||||
let mut traces = self.traces.write();
|
|
||||||
// it's important to use overwrite here,
|
|
||||||
// cause this value might be queried by hash later
|
|
||||||
batch.write_with_cache(db::COL_TRACE, &mut *traces, request.block_hash, request.traces, CacheUpdatePolicy::Overwrite);
|
|
||||||
// note_used must be called after locking traces to avoid cache/traces deadlock on garbage collection
|
|
||||||
self.note_used(CacheID::Trace(request.block_hash.clone()));
|
|
||||||
}
|
|
||||||
|
|
||||||
let chain = BloomGroupChain::new(self.bloom_config, self);
|
let chain = BloomGroupChain::new(self.bloom_config, self);
|
||||||
let trace_blooms = chain.replace(&replaced_range, enacted_blooms);
|
let trace_blooms = chain.replace(&replaced_range, enacted_blooms);
|
||||||
let blooms_to_insert = trace_blooms.into_iter()
|
let blooms_to_insert = trace_blooms.into_iter()
|
||||||
@ -299,6 +289,16 @@ impl<T> TraceDatabase for TraceDB<T> where T: DatabaseExtras {
|
|||||||
self.note_used(CacheID::Bloom(key));
|
self.note_used(CacheID::Bloom(key));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// insert new block traces into the cache and the database
|
||||||
|
{
|
||||||
|
let mut traces = self.traces.write();
|
||||||
|
// it's important to use overwrite here,
|
||||||
|
// cause this value might be queried by hash later
|
||||||
|
batch.write_with_cache(db::COL_TRACE, &mut *traces, request.block_hash, request.traces, CacheUpdatePolicy::Overwrite);
|
||||||
|
// note_used must be called after locking traces to avoid cache/traces deadlock on garbage collection
|
||||||
|
self.note_used(CacheID::Trace(request.block_hash.clone()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn trace(&self, block_number: BlockNumber, tx_position: usize, trace_position: Vec<usize>) -> Option<LocalizedTrace> {
|
fn trace(&self, block_number: BlockNumber, tx_position: usize, trace_position: Vec<usize>) -> Option<LocalizedTrace> {
|
||||||
@ -504,6 +504,28 @@ mod tests {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn create_noncanon_import_request(block_number: BlockNumber, block_hash: H256) -> ImportRequest {
|
||||||
|
ImportRequest {
|
||||||
|
traces: FlatBlockTraces::from(vec![FlatTransactionTraces::from(vec![FlatTrace {
|
||||||
|
trace_address: Default::default(),
|
||||||
|
subtraces: 0,
|
||||||
|
action: Action::Call(Call {
|
||||||
|
from: 1.into(),
|
||||||
|
to: 2.into(),
|
||||||
|
value: 3.into(),
|
||||||
|
gas: 4.into(),
|
||||||
|
input: vec![],
|
||||||
|
call_type: CallType::Call,
|
||||||
|
}),
|
||||||
|
result: Res::FailedCall(TraceError::OutOfGas),
|
||||||
|
}])]),
|
||||||
|
block_hash: block_hash.clone(),
|
||||||
|
block_number: block_number,
|
||||||
|
enacted: vec![],
|
||||||
|
retracted: 0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn create_simple_localized_trace(block_number: BlockNumber, block_hash: H256, tx_hash: H256) -> LocalizedTrace {
|
fn create_simple_localized_trace(block_number: BlockNumber, block_hash: H256, tx_hash: H256) -> LocalizedTrace {
|
||||||
LocalizedTrace {
|
LocalizedTrace {
|
||||||
action: Action::Call(Call {
|
action: Action::Call(Call {
|
||||||
@ -524,6 +546,34 @@ mod tests {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_import_non_canon_traces() {
|
||||||
|
let temp = RandomTempPath::new();
|
||||||
|
let db = Arc::new(Database::open(&DatabaseConfig::with_columns(::db::NUM_COLUMNS), temp.as_str()).unwrap());
|
||||||
|
let mut config = Config::default();
|
||||||
|
config.enabled = true;
|
||||||
|
let block_0 = H256::from(0xa1);
|
||||||
|
let block_1 = H256::from(0xa2);
|
||||||
|
let tx_0 = H256::from(0xff);
|
||||||
|
let tx_1 = H256::from(0xaf);
|
||||||
|
|
||||||
|
let mut extras = Extras::default();
|
||||||
|
extras.block_hashes.insert(0, block_0.clone());
|
||||||
|
extras.block_hashes.insert(1, block_1.clone());
|
||||||
|
extras.transaction_hashes.insert(0, vec![tx_0.clone()]);
|
||||||
|
extras.transaction_hashes.insert(1, vec![tx_1.clone()]);
|
||||||
|
|
||||||
|
let tracedb = TraceDB::new(config, db.clone(), Arc::new(extras));
|
||||||
|
|
||||||
|
// import block 0
|
||||||
|
let request = create_noncanon_import_request(0, block_0.clone());
|
||||||
|
let mut batch = DBTransaction::new(&db);
|
||||||
|
tracedb.import(&mut batch, request);
|
||||||
|
db.write(batch).unwrap();
|
||||||
|
|
||||||
|
assert!(tracedb.traces(&block_0).is_some(), "Traces should be available even if block is non-canon.");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_import() {
|
fn test_import() {
|
||||||
|
Loading…
Reference in New Issue
Block a user