Merge branch 'master' into move_hash
This commit is contained in:
commit
efca92b766
@ -99,11 +99,11 @@ impl<'a> Executive<'a> {
|
|||||||
let check = options.check_nonce;
|
let check = options.check_nonce;
|
||||||
match options.tracing {
|
match options.tracing {
|
||||||
true => match options.vm_tracing {
|
true => match options.vm_tracing {
|
||||||
true => self.transact_with_tracer(t, check, ExecutiveTracer::default(), ExecutiveVMTracer::default()),
|
true => self.transact_with_tracer(t, check, ExecutiveTracer::default(), ExecutiveVMTracer::toplevel()),
|
||||||
false => self.transact_with_tracer(t, check, ExecutiveTracer::default(), NoopVMTracer),
|
false => self.transact_with_tracer(t, check, ExecutiveTracer::default(), NoopVMTracer),
|
||||||
},
|
},
|
||||||
false => match options.vm_tracing {
|
false => match options.vm_tracing {
|
||||||
true => self.transact_with_tracer(t, check, NoopTracer, ExecutiveVMTracer::default()),
|
true => self.transact_with_tracer(t, check, NoopTracer, ExecutiveVMTracer::toplevel()),
|
||||||
false => self.transact_with_tracer(t, check, NoopTracer, NoopVMTracer),
|
false => self.transact_with_tracer(t, check, NoopTracer, NoopVMTracer),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@ -634,7 +634,7 @@ mod tests {
|
|||||||
let engine = TestEngine::new(5);
|
let engine = TestEngine::new(5);
|
||||||
let mut substate = Substate::new();
|
let mut substate = Substate::new();
|
||||||
let mut tracer = ExecutiveTracer::default();
|
let mut tracer = ExecutiveTracer::default();
|
||||||
let mut vm_tracer = ExecutiveVMTracer::default();
|
let mut vm_tracer = ExecutiveVMTracer::toplevel();
|
||||||
|
|
||||||
let gas_left = {
|
let gas_left = {
|
||||||
let mut ex = Executive::new(&mut state, &info, &engine, &factory);
|
let mut ex = Executive::new(&mut state, &info, &engine, &factory);
|
||||||
@ -693,7 +693,7 @@ mod tests {
|
|||||||
],
|
],
|
||||||
subs: vec![
|
subs: vec![
|
||||||
VMTrace {
|
VMTrace {
|
||||||
parent_step: 7,
|
parent_step: 6,
|
||||||
code: vec![96, 16, 128, 96, 12, 96, 0, 57, 96, 0, 243, 0, 96, 0, 53, 84, 21, 96, 9, 87, 0, 91, 96, 32, 53, 96, 0, 53, 85],
|
code: vec![96, 16, 128, 96, 12, 96, 0, 57, 96, 0, 243, 0, 96, 0, 53, 84, 21, 96, 9, 87, 0, 91, 96, 32, 53, 96, 0, 53, 85],
|
||||||
operations: vec![
|
operations: vec![
|
||||||
VMOperation { pc: 0, instruction: 96, gas_cost: 3.into(), executed: Some(VMExecutedOperation { gas_used: 67976.into(), stack_push: vec_into![16], mem_diff: None, store_diff: None }) },
|
VMOperation { pc: 0, instruction: 96, gas_cost: 3.into(), executed: Some(VMExecutedOperation { gas_used: 67976.into(), stack_push: vec_into![16], mem_diff: None, store_diff: None }) },
|
||||||
@ -743,7 +743,7 @@ mod tests {
|
|||||||
let engine = TestEngine::new(5);
|
let engine = TestEngine::new(5);
|
||||||
let mut substate = Substate::new();
|
let mut substate = Substate::new();
|
||||||
let mut tracer = ExecutiveTracer::default();
|
let mut tracer = ExecutiveTracer::default();
|
||||||
let mut vm_tracer = ExecutiveVMTracer::default();
|
let mut vm_tracer = ExecutiveVMTracer::toplevel();
|
||||||
|
|
||||||
let gas_left = {
|
let gas_left = {
|
||||||
let mut ex = Executive::new(&mut state, &info, &engine, &factory);
|
let mut ex = Executive::new(&mut state, &info, &engine, &factory);
|
||||||
|
@ -294,10 +294,11 @@ impl<T> TraceDatabase for TraceDB<T> where T: DatabaseExtras {
|
|||||||
.map(|p| (From::from(p.0), From::from(p.1)))
|
.map(|p| (From::from(p.0), From::from(p.1)))
|
||||||
.collect::<HashMap<TraceGroupPosition, blooms::BloomGroup>>();
|
.collect::<HashMap<TraceGroupPosition, blooms::BloomGroup>>();
|
||||||
|
|
||||||
let mut blooms = self.blooms.write();
|
// note_used must be called before locking blooms to avoid cache/traces deadlock on garbage collection
|
||||||
for key in blooms_to_insert.keys() {
|
for key in blooms_to_insert.keys() {
|
||||||
self.note_used(CacheID::Bloom(key.clone()));
|
self.note_used(CacheID::Bloom(key.clone()));
|
||||||
}
|
}
|
||||||
|
let mut blooms = self.blooms.write();
|
||||||
batch.extend_with_cache(DB_COL_TRACE, blooms.deref_mut(), blooms_to_insert, CacheUpdatePolicy::Remove);
|
batch.extend_with_cache(DB_COL_TRACE, blooms.deref_mut(), blooms_to_insert, CacheUpdatePolicy::Remove);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -160,11 +160,24 @@ impl Tracer for ExecutiveTracer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Simple VM tracer. Traces all operations.
|
/// Simple VM tracer. Traces all operations.
|
||||||
#[derive(Default)]
|
|
||||||
pub struct ExecutiveVMTracer {
|
pub struct ExecutiveVMTracer {
|
||||||
data: VMTrace,
|
data: VMTrace,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl ExecutiveVMTracer {
|
||||||
|
/// Create a new top-level instance.
|
||||||
|
pub fn toplevel() -> Self {
|
||||||
|
ExecutiveVMTracer {
|
||||||
|
data: VMTrace {
|
||||||
|
parent_step: 0,
|
||||||
|
code: vec![],
|
||||||
|
operations: vec![Default::default()], // prefill with a single entry so that prepare_subtrace can get the parent_step
|
||||||
|
subs: vec![],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl VMTracer for ExecutiveVMTracer {
|
impl VMTracer for ExecutiveVMTracer {
|
||||||
fn trace_prepare_execute(&mut self, pc: usize, instruction: u8, gas_cost: &U256) -> bool {
|
fn trace_prepare_execute(&mut self, pc: usize, instruction: u8, gas_cost: &U256) -> bool {
|
||||||
self.data.operations.push(VMOperation {
|
self.data.operations.push(VMOperation {
|
||||||
@ -188,7 +201,7 @@ impl VMTracer for ExecutiveVMTracer {
|
|||||||
|
|
||||||
fn prepare_subtrace(&self, code: &[u8]) -> Self {
|
fn prepare_subtrace(&self, code: &[u8]) -> Self {
|
||||||
ExecutiveVMTracer { data: VMTrace {
|
ExecutiveVMTracer { data: VMTrace {
|
||||||
parent_step: self.data.operations.len(),
|
parent_step: self.data.operations.len() - 1, // won't overflow since we must already have pushed an operation in trace_prepare_execute.
|
||||||
code: code.to_vec(),
|
code: code.to_vec(),
|
||||||
operations: vec![],
|
operations: vec![],
|
||||||
subs: vec![],
|
subs: vec![],
|
||||||
|
@ -473,7 +473,7 @@ impl Decodable for VMExecutedOperation {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, PartialEq, Binary)]
|
#[derive(Debug, Clone, PartialEq, Binary, Default)]
|
||||||
/// A record of the execution of a single VM operation.
|
/// A record of the execution of a single VM operation.
|
||||||
pub struct VMOperation {
|
pub struct VMOperation {
|
||||||
/// The program counter.
|
/// The program counter.
|
||||||
|
@ -37,7 +37,7 @@ use dir::Directories;
|
|||||||
use dapps::Configuration as DappsConfiguration;
|
use dapps::Configuration as DappsConfiguration;
|
||||||
use signer::Configuration as SignerConfiguration;
|
use signer::Configuration as SignerConfiguration;
|
||||||
use run::RunCmd;
|
use run::RunCmd;
|
||||||
use blockchain::{BlockchainCmd, ImportBlockchain, ExportBlockchain};
|
use blockchain::{BlockchainCmd, ImportBlockchain, ExportBlockchain, DataFormat};
|
||||||
use presale::ImportWallet;
|
use presale::ImportWallet;
|
||||||
use account::{AccountCmd, NewAccount, ImportAccounts};
|
use account::{AccountCmd, NewAccount, ImportAccounts};
|
||||||
|
|
||||||
@ -88,6 +88,7 @@ impl Configuration {
|
|||||||
let signer_port = self.signer_port();
|
let signer_port = self.signer_port();
|
||||||
let dapps_conf = self.dapps_config();
|
let dapps_conf = self.dapps_config();
|
||||||
let signer_conf = self.signer_config();
|
let signer_conf = self.signer_config();
|
||||||
|
let format = try!(self.format());
|
||||||
|
|
||||||
let cmd = if self.args.flag_version {
|
let cmd = if self.args.flag_version {
|
||||||
Cmd::Version
|
Cmd::Version
|
||||||
@ -128,7 +129,7 @@ impl Configuration {
|
|||||||
cache_config: cache_config,
|
cache_config: cache_config,
|
||||||
dirs: dirs,
|
dirs: dirs,
|
||||||
file_path: self.args.arg_file.clone(),
|
file_path: self.args.arg_file.clone(),
|
||||||
format: None,
|
format: format,
|
||||||
pruning: pruning,
|
pruning: pruning,
|
||||||
compaction: compaction,
|
compaction: compaction,
|
||||||
wal: wal,
|
wal: wal,
|
||||||
@ -144,7 +145,7 @@ impl Configuration {
|
|||||||
cache_config: cache_config,
|
cache_config: cache_config,
|
||||||
dirs: dirs,
|
dirs: dirs,
|
||||||
file_path: self.args.arg_file.clone(),
|
file_path: self.args.arg_file.clone(),
|
||||||
format: None,
|
format: format,
|
||||||
pruning: pruning,
|
pruning: pruning,
|
||||||
compaction: compaction,
|
compaction: compaction,
|
||||||
wal: wal,
|
wal: wal,
|
||||||
@ -228,6 +229,13 @@ impl Configuration {
|
|||||||
to_address(self.args.flag_etherbase.clone().or(self.args.flag_author.clone()))
|
to_address(self.args.flag_etherbase.clone().or(self.args.flag_author.clone()))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn format(&self) -> Result<Option<DataFormat>, String> {
|
||||||
|
match self.args.flag_format {
|
||||||
|
Some(ref f) => Ok(Some(try!(f.parse()))),
|
||||||
|
None => Ok(None),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn cache_config(&self) -> CacheConfig {
|
fn cache_config(&self) -> CacheConfig {
|
||||||
match self.args.flag_cache_size.or(self.args.flag_cache) {
|
match self.args.flag_cache_size.or(self.args.flag_cache) {
|
||||||
Some(size) => CacheConfig::new_with_total_cache_size(size),
|
Some(size) => CacheConfig::new_with_total_cache_size(size),
|
||||||
@ -548,7 +556,7 @@ mod tests {
|
|||||||
use ethcore::client::{VMType, BlockID};
|
use ethcore::client::{VMType, BlockID};
|
||||||
use helpers::{replace_home, default_network_config};
|
use helpers::{replace_home, default_network_config};
|
||||||
use run::RunCmd;
|
use run::RunCmd;
|
||||||
use blockchain::{BlockchainCmd, ImportBlockchain, ExportBlockchain};
|
use blockchain::{BlockchainCmd, ImportBlockchain, ExportBlockchain, DataFormat};
|
||||||
use presale::ImportWallet;
|
use presale::ImportWallet;
|
||||||
use account::{AccountCmd, NewAccount, ImportAccounts};
|
use account::{AccountCmd, NewAccount, ImportAccounts};
|
||||||
use devtools::{RandomTempPath};
|
use devtools::{RandomTempPath};
|
||||||
@ -623,7 +631,7 @@ mod tests {
|
|||||||
cache_config: Default::default(),
|
cache_config: Default::default(),
|
||||||
dirs: Default::default(),
|
dirs: Default::default(),
|
||||||
file_path: Some("blockchain.json".into()),
|
file_path: Some("blockchain.json".into()),
|
||||||
format: None,
|
format: Default::default(),
|
||||||
pruning: Default::default(),
|
pruning: Default::default(),
|
||||||
compaction: Default::default(),
|
compaction: Default::default(),
|
||||||
wal: true,
|
wal: true,
|
||||||
@ -654,6 +662,27 @@ mod tests {
|
|||||||
})));
|
})));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_command_blockchain_export_with_custom_format() {
|
||||||
|
let args = vec!["parity", "export", "--format", "hex", "blockchain.json"];
|
||||||
|
let conf = Configuration::parse(args).unwrap();
|
||||||
|
assert_eq!(conf.into_command().unwrap(), Cmd::Blockchain(BlockchainCmd::Export(ExportBlockchain {
|
||||||
|
spec: Default::default(),
|
||||||
|
logger_config: Default::default(),
|
||||||
|
cache_config: Default::default(),
|
||||||
|
dirs: Default::default(),
|
||||||
|
file_path: Some("blockchain.json".into()),
|
||||||
|
pruning: Default::default(),
|
||||||
|
format: Some(DataFormat::Hex),
|
||||||
|
compaction: Default::default(),
|
||||||
|
wal: true,
|
||||||
|
mode: Default::default(),
|
||||||
|
tracing: Default::default(),
|
||||||
|
from_block: BlockID::Number(1),
|
||||||
|
to_block: BlockID::Latest,
|
||||||
|
})));
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_command_signer_new_token() {
|
fn test_command_signer_new_token() {
|
||||||
let args = vec!["parity", "signer", "new-token"];
|
let args = vec!["parity", "signer", "new-token"];
|
||||||
|
Loading…
Reference in New Issue
Block a user