From 5d4993b0f856bf9e0e2c78849b72e581f0cde686 Mon Sep 17 00:00:00 2001 From: David Date: Thu, 30 Jan 2020 15:21:29 +0100 Subject: [PATCH 01/11] Revert "[Trace] Distinguish between `create` and `create2` (#11311)" (#11427) This reverts commit 87e108058125098ec404951393a054f08aebef7a. --- ethcore/engine/src/engine.rs | 4 +- ethcore/evm/src/interpreter/mod.rs | 29 ++--- ethcore/evm/src/lib.rs | 2 +- ethcore/executive-state/src/lib.rs | 49 ++++---- ethcore/machine/src/executive.rs | 33 +++--- ethcore/machine/src/externalities.rs | 20 ++-- ethcore/machine/src/machine.rs | 6 +- ethcore/spec/src/spec.rs | 4 +- ethcore/src/json_tests/executive.rs | 4 +- ethcore/src/tests/evm.rs | 6 +- ethcore/trace/src/db.rs | 9 +- ethcore/trace/src/types/filter.rs | 7 +- ethcore/trace/src/types/flat.rs | 7 +- ethcore/trace/src/types/trace.rs | 110 +----------------- ethcore/vm/src/action_params.rs | 10 +- .../vm/src/{action_type.rs => call_type.rs} | 50 ++++---- ethcore/vm/src/ext.rs | 4 +- ethcore/vm/src/lib.rs | 4 +- ethcore/vm/src/tests.rs | 4 +- ethcore/wasm/src/runtime.rs | 14 +-- evmbin/src/main.rs | 4 +- rpc/src/v1/tests/mocked/traces.rs | 4 +- rpc/src/v1/types/trace.rs | 54 +++------ 23 files changed, 148 insertions(+), 290 deletions(-) rename ethcore/vm/src/{action_type.rs => call_type.rs} (66%) diff --git a/ethcore/engine/src/engine.rs b/ethcore/engine/src/engine.rs index 3fa13a07472..5159c122239 100644 --- a/ethcore/engine/src/engine.rs +++ b/ethcore/engine/src/engine.rs @@ -42,7 +42,7 @@ use machine::{ Machine, executed_block::ExecutedBlock, }; -use vm::{EnvInfo, Schedule, ActionType, ActionValue}; +use vm::{EnvInfo, Schedule, CallType, ActionValue}; use crate::signer::EngineSigner; @@ -82,7 +82,7 @@ pub fn default_system_or_code_call<'a>(machine: &'a Machine, block: &'a mut Exec Some(ActionValue::Apparent(U256::zero())), U256::max_value(), Some(data), - Some(ActionType::StaticCall), + Some(CallType::StaticCall), ) }, }; diff --git a/ethcore/evm/src/interpreter/mod.rs b/ethcore/evm/src/interpreter/mod.rs index 799566eebd9..fded2ac7f1d 100644 --- a/ethcore/evm/src/interpreter/mod.rs +++ b/ethcore/evm/src/interpreter/mod.rs @@ -33,7 +33,7 @@ use ethereum_types::{U256, U512, H256, Address, BigEndianHash}; use vm::{ - self, ActionParams, ParamsType, ActionValue, ActionType, MessageCallResult, + self, ActionParams, ParamsType, ActionValue, CallType, MessageCallResult, ContractCreateResult, CreateContractAddress, ReturnData, GasLeft, Schedule, TrapKind, TrapError }; @@ -133,8 +133,8 @@ struct InterpreterParams { pub value: ActionValue, /// Input data. pub data: Option, - /// Type of action - pub action_type: ActionType, + /// Type of call + pub call_type: CallType, /// Param types encoding pub params_type: ParamsType, } @@ -152,7 +152,7 @@ impl From for InterpreterParams { gas_price: params.gas_price, value: params.value, data: params.data, - action_type: params.action_type, + call_type: params.call_type, params_type: params.params_type, } } @@ -532,9 +532,7 @@ impl Interpreter { let init_size = self.stack.pop_back(); let address_scheme = match instruction { instructions::CREATE => CreateContractAddress::FromSenderAndNonce, - instructions::CREATE2 => CreateContractAddress::FromSenderSaltAndCodeHash( - BigEndianHash::from_uint(&self.stack.pop_back()) - ), + instructions::CREATE2 => CreateContractAddress::FromSenderSaltAndCodeHash(BigEndianHash::from_uint(&self.stack.pop_back())), _ => unreachable!("instruction can only be CREATE/CREATE2 checked above; qed"), }; @@ -555,14 +553,7 @@ impl Interpreter { let contract_code = self.mem.read_slice(init_off, init_size); - let create_result = ext.create( - &create_gas.as_u256(), - &endowment, - contract_code, - &self.params.code_version, - address_scheme, - true, - ); + let create_result = ext.create(&create_gas.as_u256(), &endowment, contract_code, &self.params.code_version, address_scheme, true); return match create_result { Ok(ContractCreateResult::Created(address, gas_left)) => { self.stack.push(address_to_u256(address)); @@ -616,14 +607,14 @@ impl Interpreter { return Err(vm::Error::MutableCallInStaticContext); } let has_balance = ext.balance(&self.params.address)? >= value.expect("value set for all but delegate call; qed"); - (&self.params.address, &code_address, has_balance, ActionType::Call) + (&self.params.address, &code_address, has_balance, CallType::Call) }, instructions::CALLCODE => { let has_balance = ext.balance(&self.params.address)? >= value.expect("value set for all but delegate call; qed"); - (&self.params.address, &self.params.address, has_balance, ActionType::CallCode) + (&self.params.address, &self.params.address, has_balance, CallType::CallCode) }, - instructions::DELEGATECALL => (&self.params.sender, &self.params.address, true, ActionType::DelegateCall), - instructions::STATICCALL => (&self.params.address, &code_address, true, ActionType::StaticCall), + instructions::DELEGATECALL => (&self.params.sender, &self.params.address, true, CallType::DelegateCall), + instructions::STATICCALL => (&self.params.address, &code_address, true, CallType::StaticCall), _ => panic!(format!("Unexpected instruction {:?} in CALL branch.", instruction)) }; diff --git a/ethcore/evm/src/lib.rs b/ethcore/evm/src/lib.rs index 2a1fd39494c..1dff2165c43 100644 --- a/ethcore/evm/src/lib.rs +++ b/ethcore/evm/src/lib.rs @@ -47,7 +47,7 @@ mod instructions; mod tests; pub use vm::{ - Schedule, CleanDustMode, EnvInfo, ActionType, ActionParams, Ext, + Schedule, CleanDustMode, EnvInfo, CallType, ActionParams, Ext, ContractCreateResult, MessageCallResult, CreateContractAddress, GasLeft, ReturnData }; diff --git a/ethcore/executive-state/src/lib.rs b/ethcore/executive-state/src/lib.rs index b42fbe073b0..52a9fae2cfe 100644 --- a/ethcore/executive-state/src/lib.rs +++ b/ethcore/executive-state/src/lib.rs @@ -276,6 +276,7 @@ mod tests { test_helpers::{get_temp_state, get_temp_state_db} }; use ethtrie; + use evm::CallType; use machine::Machine; use pod::{self, PodAccount, PodState}; use rustc_hex::FromHex; @@ -323,7 +324,6 @@ mod tests { value: 100.into(), gas: 77412.into(), init: 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], - creation_method: Some(trace::CreationMethod::Create), }), result: trace::Res::Create(trace::CreateResult { gas_used: U256::from(3224), @@ -381,7 +381,6 @@ mod tests { value: 100.into(), gas: 78792.into(), init: vec![91, 96, 0, 86], - creation_method: Some(trace::CreationMethod::Create), }), result: trace::Res::FailedCreate(TraceError::OutOfGas), subtraces: 0 @@ -420,7 +419,7 @@ mod tests { value: 100.into(), gas: 79000.into(), input: vec![], - call_type: Some(trace::CallType::Call), + call_type: CallType::Call, }), result: trace::Res::Call(trace::CallResult { gas_used: U256::from(3), @@ -461,7 +460,7 @@ mod tests { value: 100.into(), gas: 79000.into(), input: vec![], - call_type: Some(trace::CallType::Call), + call_type: CallType::Call, }), result: trace::Res::Call(trace::CallResult { gas_used: U256::from(0), @@ -502,7 +501,7 @@ mod tests { value: 0.into(), gas: 79_000.into(), input: vec![], - call_type: Some(trace::CallType::Call), + call_type: CallType::Call, }), result: trace::Res::Call(trace::CallResult { gas_used: U256::from(3000), @@ -544,7 +543,7 @@ mod tests { value: 0.into(), gas: 79000.into(), input: vec![], - call_type: Some(trace::CallType::Call), + call_type: CallType::Call, }), result: trace::Res::Call(trace::CallResult { gas_used: U256::from(3_721), // in post-eip150 @@ -588,7 +587,7 @@ mod tests { value: 0.into(), gas: 79000.into(), input: vec![], - call_type: Some(trace::CallType::Call), + call_type: CallType::Call, }), result: trace::Res::Call(trace::CallResult { gas_used: 724.into(), // in post-eip150 @@ -603,7 +602,7 @@ mod tests { value: 0.into(), gas: 4096.into(), input: vec![], - call_type: Some(trace::CallType::CallCode), + call_type: CallType::CallCode, }), result: trace::Res::Call(trace::CallResult { gas_used: 3.into(), @@ -647,7 +646,7 @@ mod tests { value: 0.into(), gas: 79000.into(), input: vec![], - call_type: Some(trace::CallType::Call), + call_type: CallType::Call, }), result: trace::Res::Call(trace::CallResult { gas_used: U256::from(736), // in post-eip150 @@ -662,7 +661,7 @@ mod tests { value: 0.into(), gas: 32768.into(), input: vec![], - call_type: Some(trace::CallType::DelegateCall), + call_type: CallType::DelegateCall, }), result: trace::Res::Call(trace::CallResult { gas_used: 18.into(), @@ -703,7 +702,7 @@ mod tests { value: 100.into(), gas: 79000.into(), input: vec![], - call_type: Some(trace::CallType::Call), + call_type: CallType::Call, }), result: trace::Res::FailedCall(TraceError::OutOfGas), subtraces: 0, @@ -745,7 +744,7 @@ mod tests { value: 100.into(), gas: 79000.into(), input: vec![], - call_type: Some(trace::CallType::Call), + call_type: CallType::Call, }), result: trace::Res::Call(trace::CallResult { gas_used: U256::from(69), @@ -760,7 +759,7 @@ mod tests { value: 0.into(), gas: 78934.into(), input: vec![], - call_type: Some(trace::CallType::Call), + call_type: CallType::Call, }), result: trace::Res::Call(trace::CallResult { gas_used: U256::from(3), @@ -802,7 +801,7 @@ mod tests { value: 100.into(), gas: 79000.into(), input: vec![], - call_type: Some(trace::CallType::Call), + call_type: CallType::Call, }), result: trace::Res::Call(trace::CallResult { gas_used: U256::from(31761), @@ -817,7 +816,7 @@ mod tests { value: 69.into(), gas: 2300.into(), input: vec![], - call_type: Some(trace::CallType::Call), + call_type: CallType::Call, }), result: trace::Res::Call(trace::CallResult::default()), }]; @@ -856,7 +855,7 @@ mod tests { value: 100.into(), gas: 79000.into(), input: vec![], - call_type: Some(trace::CallType::Call), + call_type: CallType::Call, }), result: trace::Res::Call(trace::CallResult { gas_used: U256::from(31761), @@ -899,7 +898,7 @@ mod tests { value: 100.into(), gas: 79000.into(), input: vec![], - call_type: Some(trace::CallType::Call), + call_type: CallType::Call, }), result: trace::Res::Call(trace::CallResult { gas_used: U256::from(79_000), @@ -914,7 +913,7 @@ mod tests { value: 0.into(), gas: 78934.into(), input: vec![], - call_type: Some(trace::CallType::Call), + call_type: CallType::Call, }), result: trace::Res::FailedCall(TraceError::OutOfGas), }]; @@ -955,7 +954,7 @@ mod tests { value: 100.into(), gas: 79000.into(), input: vec![], - call_type: Some(trace::CallType::Call), + call_type: CallType::Call, }), result: trace::Res::Call(trace::CallResult { gas_used: U256::from(135), @@ -970,7 +969,7 @@ mod tests { value: 0.into(), gas: 78934.into(), input: vec![], - call_type: Some(trace::CallType::Call), + call_type: CallType::Call, }), result: trace::Res::Call(trace::CallResult { gas_used: U256::from(69), @@ -985,7 +984,7 @@ mod tests { value: 0.into(), gas: 78868.into(), input: vec![], - call_type: Some(trace::CallType::Call), + call_type: CallType::Call, }), result: trace::Res::Call(trace::CallResult { gas_used: U256::from(3), @@ -1030,7 +1029,7 @@ mod tests { value: 100.into(), gas: 79000.into(), input: vec![], - call_type: Some(trace::CallType::Call), + call_type: CallType::Call, }), result: trace::Res::Call(trace::CallResult { gas_used: U256::from(79_000), @@ -1045,7 +1044,7 @@ mod tests { value: 0.into(), gas: 78934.into(), input: vec![], - call_type: Some(trace::CallType::Call), + call_type: CallType::Call, }), result: trace::Res::FailedCall(TraceError::OutOfGas), }, FlatTrace { @@ -1056,7 +1055,7 @@ mod tests { to: Address::from_low_u64_be(0xc), value: 0.into(), gas: 78868.into(), - call_type: Some(trace::CallType::Call), + call_type: CallType::Call, input: vec![], }), result: trace::Res::Call(trace::CallResult { @@ -1100,7 +1099,7 @@ mod tests { value: 100.into(), gas: 79000.into(), input: vec![], - call_type: Some(trace::CallType::Call), + call_type: CallType::Call, }), result: trace::Res::Call(trace::CallResult { gas_used: 3.into(), diff --git a/ethcore/machine/src/executive.rs b/ethcore/machine/src/executive.rs index 6382ffabb63..f93231c0c0a 100644 --- a/ethcore/machine/src/executive.rs +++ b/ethcore/machine/src/executive.rs @@ -26,7 +26,7 @@ use rlp::RlpStream; use log::trace; use account_state::{Backend as StateBackend, State, CleanupMode}; -use evm::{ActionType, Finalize, FinalizationResult}; +use evm::{CallType, Finalize, FinalizationResult}; use vm::{ self, EnvInfo, CreateContractAddress, ReturnData, CleanDustMode, ActionParams, ActionValue, Schedule, TrapError, ResumeCall, ResumeCreate @@ -241,7 +241,7 @@ impl<'a> CallCreateExecutive<'a> { trace!("Executive::call(params={:?}) self.env_info={:?}, parent_static={}", params, info, parent_static_flag); let gas = params.gas; - let static_flag = parent_static_flag || params.action_type == ActionType::StaticCall; + let static_flag = parent_static_flag || params.call_type == CallType::StaticCall; // if destination is builtin, try to execute it let kind = if let Some(builtin) = machine.builtin(¶ms.code_address, info.number) { @@ -298,7 +298,7 @@ impl<'a> CallCreateExecutive<'a> { } } else { if (static_flag && - (params.action_type == ActionType::StaticCall || params.action_type == ActionType::Call)) && + (params.call_type == CallType::StaticCall || params.call_type == CallType::Call)) && params.value.value() > U256::zero() { return Err(vm::Error::MutableCallInStaticContext); @@ -909,7 +909,7 @@ impl<'a, B: 'a + StateBackend> Executive<'a, B> { code: Some(Arc::new(t.data.clone())), code_version: schedule.latest_version, data: None, - action_type: ActionType::Create, + call_type: CallType::None, params_type: vm::ParamsType::Embedded, }; let res = self.create(params, &mut substate, &mut tracer, &mut vm_tracer); @@ -932,7 +932,7 @@ impl<'a, B: 'a + StateBackend> Executive<'a, B> { code_hash: self.state.code_hash(address)?, code_version: self.state.code_version(address)?, data: Some(t.data.clone()), - action_type: ActionType::Call, + call_type: CallType::Call, params_type: vm::ParamsType::Separate, }; let res = self.call(params, &mut substate, &mut tracer, &mut vm_tracer); @@ -1236,7 +1236,7 @@ mod tests { use parity_crypto::publickey::{Generator, Random}; use evm::{Factory, evm_test, evm_test_ignore}; use macros::vec_into; - use vm::{ActionParams, ActionValue, EnvInfo, CreateContractAddress}; + use vm::{ActionParams, ActionValue, CallType, EnvInfo, CreateContractAddress}; use ::trace::{ trace, FlatTrace, Tracer, NoopTracer, ExecutiveTracer, @@ -1414,7 +1414,7 @@ mod tests { params.gas = U256::from(100_000); params.code = Some(Arc::new(code)); params.value = ActionValue::Transfer(U256::from(100)); - params.action_type = ActionType::Call; + params.call_type = CallType::Call; let mut state = get_temp_state(); state.add_balance(&sender, &U256::from(100), CleanupMode::NoEmpty).unwrap(); let info = EnvInfo::default(); @@ -1434,7 +1434,7 @@ mod tests { value: 100.into(), gas: 100_000.into(), input: vec![], - call_type: Some(trace::CallType::Call) + call_type: CallType::Call }), result: trace::Res::Call(trace::CallResult { gas_used: 33021.into(), @@ -1449,7 +1449,7 @@ mod tests { value: 1.into(), gas: 66560.into(), input: vec![], - call_type: Some(trace::CallType::Call) + call_type: CallType::Call }), result: trace::Res::Call(trace::CallResult { gas_used: 600.into(), output: vec![0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 156, 17, 133, 165, 197, 233, 252, 84, 97, 40, 8, 151, 126, 232, 245, 72, 178, 37, 141, 49] @@ -1498,7 +1498,7 @@ mod tests { params.gas = U256::from(100_000); params.code = Some(Arc::new(code)); params.value = ActionValue::Transfer(U256::from(100)); - params.action_type = ActionType::Call; + params.call_type = CallType::Call; let mut state = get_temp_state(); state.add_balance(&sender, &U256::from(100), CleanupMode::NoEmpty).unwrap(); let info = EnvInfo::default(); @@ -1524,7 +1524,7 @@ mod tests { value: 100.into(), gas: 100000.into(), input: vec![], - call_type: Some(trace::CallType::Call), + call_type: CallType::Call, }), result: trace::Res::Call(trace::CallResult { gas_used: U256::from(55_248), @@ -1537,8 +1537,7 @@ mod tests { from: Address::from_str("b010143a42d5980c7e5ef0e4a4416dc098a4fed3").unwrap(), value: 23.into(), gas: 67979.into(), - init: 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], - creation_method: Some(trace::CreationMethod::Create), + init: 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] }), result: trace::Res::Create(trace::CreateResult { gas_used: U256::from(3224), @@ -1615,7 +1614,7 @@ mod tests { params.gas = U256::from(100_000); params.code = Some(Arc::new(code)); params.value = ActionValue::Transfer(U256::from(100)); - params.action_type = ActionType::Call; + params.call_type = CallType::Call; let mut state = get_temp_state(); state.add_balance(&sender, &U256::from(100), CleanupMode::NoEmpty).unwrap(); let info = EnvInfo::default(); @@ -1641,7 +1640,7 @@ mod tests { value: 100.into(), gas: 100_000.into(), input: vec![], - call_type: Some(trace::CallType::Call), + call_type: CallType::Call, }), result: trace::Res::Call(trace::CallResult { gas_used: U256::from(37_033), @@ -1654,8 +1653,7 @@ mod tests { from: Address::from_str("b010143a42d5980c7e5ef0e4a4416dc098a4fed3").unwrap(), value: 23.into(), gas: 66_917.into(), - init: vec![0x60, 0x01, 0x60, 0x00, 0xfd], - creation_method: Some(trace::CreationMethod::Create), + init: vec![0x60, 0x01, 0x60, 0x00, 0xfd] }), result: trace::Res::FailedCreate(vm::Error::Reverted.into()), }]; @@ -1713,7 +1711,6 @@ mod tests { value: 100.into(), gas: params.gas, init: 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], - creation_method: Some(trace::CreationMethod::Create), }), result: trace::Res::Create(trace::CreateResult { gas_used: U256::from(3224), diff --git a/ethcore/machine/src/externalities.rs b/ethcore/machine/src/externalities.rs index 0808ebed2dd..1b8d3ca0d97 100644 --- a/ethcore/machine/src/externalities.rs +++ b/ethcore/machine/src/externalities.rs @@ -29,7 +29,7 @@ use common_types::{ }; use trace::{Tracer, VMTracer}; use vm::{ - self, ActionParams, ActionValue, EnvInfo, ActionType, Schedule, + self, ActionParams, ActionValue, EnvInfo, CallType, Schedule, Ext, ContractCreateResult, MessageCallResult, CreateContractAddress, ReturnData, TrapKind }; @@ -193,7 +193,7 @@ impl<'a, T: 'a, V: 'a, B: 'a> Ext for Externalities<'a, T, V, B> code_hash, code_version, data: Some(data.as_bytes().to_vec()), - action_type: ActionType::Call, + call_type: CallType::Call, params_type: vm::ParamsType::Separate, }; @@ -241,12 +241,6 @@ impl<'a, T: 'a, V: 'a, B: 'a> Ext for Externalities<'a, T, V, B> } }; - let create_type = match address_scheme { - CreateContractAddress::FromSenderAndNonce => ActionType::Create, - CreateContractAddress::FromSenderSaltAndCodeHash(_) => ActionType::Create2, - CreateContractAddress::FromSenderAndCodeHash => ActionType::Create2, - }; - // prepare the params let params = ActionParams { code_address: address.clone(), @@ -260,7 +254,7 @@ impl<'a, T: 'a, V: 'a, B: 'a> Ext for Externalities<'a, T, V, B> code_hash, code_version: *parent_version, data: None, - action_type: create_type, + call_type: CallType::None, params_type: vm::ParamsType::Embedded, }; @@ -291,7 +285,7 @@ impl<'a, T: 'a, V: 'a, B: 'a> Ext for Externalities<'a, T, V, B> value: Option, data: &[u8], code_address: &Address, - call_type: ActionType, + call_type: CallType, trap: bool, ) -> ::std::result::Result { trace!(target: "externalities", "call"); @@ -317,7 +311,7 @@ impl<'a, T: 'a, V: 'a, B: 'a> Ext for Externalities<'a, T, V, B> code_hash, code_version, data: Some(data.to_vec()), - action_type: call_type, + call_type, params_type: vm::ParamsType::Separate, }; @@ -463,7 +457,7 @@ impl<'a, T: 'a, V: 'a, B: 'a> Ext for Externalities<'a, T, V, B> mod tests { use std::str::FromStr; use ethereum_types::{U256, Address}; - use evm::{EnvInfo, Ext, ActionType}; + use evm::{EnvInfo, Ext, CallType}; use account_state::State; use ethcore::test_helpers::get_temp_state; use trace::{NoopTracer, NoopVMTracer}; @@ -597,7 +591,7 @@ mod tests { Some("0000000000000000000000000000000000000000000000000000000000150000".parse::().unwrap()), &[], &Address::zero(), - ActionType::Call, + CallType::Call, false, ).ok().unwrap(); } diff --git a/ethcore/machine/src/machine.rs b/ethcore/machine/src/machine.rs index 43151d0a023..0c9a8a45ac8 100644 --- a/ethcore/machine/src/machine.rs +++ b/ethcore/machine/src/machine.rs @@ -34,7 +34,7 @@ use common_types::{ errors::{EngineError, EthcoreError as Error}, transaction::{self, SYSTEM_ADDRESS, UNSIGNED_SENDER, UnverifiedTransaction, SignedTransaction}, }; -use vm::{ActionType, ActionParams, ActionValue, ParamsType}; +use vm::{CallType, ActionParams, ActionValue, ParamsType}; use vm::{EnvInfo, Schedule}; use account_state::CleanupMode; @@ -141,7 +141,7 @@ impl Machine { value: Option, gas: U256, data: Option>, - action_type: Option, + call_type: Option, ) -> Result, Error> { let env_info = { let mut env_info = block.env_info(); @@ -163,7 +163,7 @@ impl Machine { code_hash, code_version: 0.into(), data, - action_type: action_type.unwrap_or(ActionType::Call), + call_type: call_type.unwrap_or(CallType::Call), params_type: ParamsType::Separate, }; let schedule = self.schedule(env_info.number); diff --git a/ethcore/spec/src/spec.rs b/ethcore/spec/src/spec.rs index 1116fc626a5..e6337e0cf2d 100644 --- a/ethcore/spec/src/spec.rs +++ b/ethcore/spec/src/spec.rs @@ -52,7 +52,7 @@ use pod::PodState; use rlp::{Rlp, RlpStream}; use trace::{NoopTracer, NoopVMTracer}; use trie_vm_factories::Factories; -use vm::{EnvInfo, ActionType, ActionValue, ActionParams, ParamsType}; +use vm::{EnvInfo, CallType, ActionValue, ActionParams, ParamsType}; use crate::{ Genesis, @@ -163,7 +163,7 @@ fn run_constructors( value: ActionValue::Transfer(Default::default()), code: Some(Arc::new(constructor.clone())), data: None, - action_type: ActionType::Create, + call_type: CallType::None, params_type: ParamsType::Embedded, }; diff --git a/ethcore/src/json_tests/executive.rs b/ethcore/src/json_tests/executive.rs index 212197e9027..0a79be7cf1c 100644 --- a/ethcore/src/json_tests/executive.rs +++ b/ethcore/src/json_tests/executive.rs @@ -20,7 +20,7 @@ use super::test_common::*; use account_state::{Backend as StateBackend, State}; use evm::Finalize; use vm::{ - self, ActionParams, ActionType, Schedule, Ext, + self, ActionParams, CallType, Schedule, Ext, ContractCreateResult, EnvInfo, MessageCallResult, CreateContractAddress, ReturnData, }; @@ -172,7 +172,7 @@ impl<'a, T: 'a, V: 'a, B: 'a> Ext for TestExt<'a, T, V, B> value: Option, data: &[u8], _code_address: &Address, - _call_type: ActionType, + _call_type: CallType, _trap: bool ) -> Result { self.callcreates.push(CallCreate { diff --git a/ethcore/src/tests/evm.rs b/ethcore/src/tests/evm.rs index f435502f808..4b463cb48ed 100644 --- a/ethcore/src/tests/evm.rs +++ b/ethcore/src/tests/evm.rs @@ -18,7 +18,7 @@ use std::sync::Arc; use hash::keccak; -use vm::{EnvInfo, ActionParams, ActionValue, ActionType, ParamsType}; +use vm::{EnvInfo, ActionParams, ActionValue, CallType, ParamsType}; use evm::Factory; use machine::{ executive::Executive, @@ -62,7 +62,7 @@ fn test_blockhash_eip210(factory: Factory) { code_hash: Some(blockhash_contract_code_hash), code_version: 0.into(), data: Some(H256::from_low_u64_be(i - 1).as_bytes().to_vec()), - action_type: ActionType::Call, + call_type: CallType::Call, params_type: ParamsType::Separate, }; let schedule = machine.schedule(env_info.number); @@ -86,7 +86,7 @@ fn test_blockhash_eip210(factory: Factory) { code_hash: Some(get_prev_hash_code_hash), code_version: 0.into(), data: None, - action_type: ActionType::Call, + call_type: CallType::Call, params_type: ParamsType::Separate, }; let schedule = machine.schedule(env_info.number); diff --git a/ethcore/trace/src/db.rs b/ethcore/trace/src/db.rs index 57c33c15a49..6fe27a5b263 100644 --- a/ethcore/trace/src/db.rs +++ b/ethcore/trace/src/db.rs @@ -374,12 +374,13 @@ mod tests { use ethcore::test_helpers::new_db; use ethereum_types::{H256, U256, Address}; + use evm::CallType; use kvdb::DBTransaction; use crate::{ BlockNumber, Config, TraceDB, Database as TraceDatabase, ImportRequest, DatabaseExtras, Filter, LocalizedTrace, AddressesFilter, TraceError, - trace::{Call, CallType, Action, Res}, + trace::{Call, Action, Res}, flat::{FlatTrace, FlatBlockTraces, FlatTransactionTraces} }; @@ -464,7 +465,7 @@ mod tests { value: 3.into(), gas: 4.into(), input: vec![], - call_type: Some(CallType::Call), + call_type: CallType::Call, }), result: Res::FailedCall(TraceError::OutOfGas), }])]), @@ -486,7 +487,7 @@ mod tests { value: 3.into(), gas: 4.into(), input: vec![], - call_type: Some(CallType::Call), + call_type: CallType::Call, }), result: Res::FailedCall(TraceError::OutOfGas), }])]), @@ -505,7 +506,7 @@ mod tests { value: U256::from(3), gas: U256::from(4), input: vec![], - call_type: Some(CallType::Call), + call_type: CallType::Call, }), result: Res::FailedCall(TraceError::OutOfGas), trace_address: vec![], diff --git a/ethcore/trace/src/types/filter.rs b/ethcore/trace/src/types/filter.rs index 98b9673bd46..cb4b312692d 100644 --- a/ethcore/trace/src/types/filter.rs +++ b/ethcore/trace/src/types/filter.rs @@ -125,9 +125,10 @@ impl Filter { #[cfg(test)] mod tests { use ethereum_types::{Address, Bloom, BloomInput}; + use evm::CallType; use crate::{ Filter, AddressesFilter, TraceError, RewardType, - trace::{Action, Call, CallType, Res, Create, CreationMethod, CreateResult, Suicide, Reward}, + trace::{Action, Call, Res, Create, CreateResult, Suicide, Reward}, flat::FlatTrace, }; @@ -272,7 +273,7 @@ mod tests { value: 3.into(), gas: 4.into(), input: vec![0x5], - call_type: Some(CallType::Call), + call_type: CallType::Call, }), result: Res::FailedCall(TraceError::OutOfGas), trace_address: vec![0].into_iter().collect(), @@ -293,7 +294,6 @@ mod tests { value: 3.into(), gas: 4.into(), init: vec![0x5], - creation_method: Some(CreationMethod::Create), }), result: Res::Create(CreateResult { gas_used: 10.into(), @@ -413,7 +413,6 @@ mod tests { gas: 4.into(), init: vec![0x5], value: 3.into(), - creation_method: Some(CreationMethod::Create), }), result: Res::FailedCall(TraceError::BadInstruction), trace_address: vec![].into_iter().collect(), diff --git a/ethcore/trace/src/types/flat.rs b/ethcore/trace/src/types/flat.rs index cf75f7ce9f4..1f0d87ddfab 100644 --- a/ethcore/trace/src/types/flat.rs +++ b/ethcore/trace/src/types/flat.rs @@ -123,8 +123,9 @@ mod tests { use rlp::*; use crate::{ FlatBlockTraces, FlatTransactionTraces, FlatTrace, - trace::{Action, Res, CallResult, Call, CallType, Suicide, Reward, RewardType} + trace::{Action, Res, CallResult, Call, Suicide, Reward, RewardType} }; + use evm::CallType; #[test] fn encode_flat_transaction_traces() { @@ -161,7 +162,7 @@ mod tests { value: "3627e8f712373c0000".parse().unwrap(), gas: 0x03e8.into(), input: vec![], - call_type: Some(CallType::Call), + call_type: CallType::Call, }), result: Res::Call(CallResult { gas_used: 0.into(), @@ -178,7 +179,7 @@ mod tests { value: 0.into(), gas: 0x010c78.into(), input: vec![0x41, 0xc0, 0xe1, 0xb5], - call_type: Some(CallType::Call), + call_type: CallType::Call, }), result: Res::Call(CallResult { gas_used: 0x0127.into(), diff --git a/ethcore/trace/src/types/trace.rs b/ethcore/trace/src/types/trace.rs index 387a262aedf..a3fb92dec7f 100644 --- a/ethcore/trace/src/types/trace.rs +++ b/ethcore/trace/src/types/trace.rs @@ -16,13 +16,12 @@ //! Tracing data types. -use std::convert::TryFrom; use ethereum_types::{U256, Address, Bloom, BloomInput}; use parity_bytes::Bytes; use rlp::{Rlp, RlpStream, Encodable, DecoderError, Decodable}; use rlp_derive::{RlpEncodable, RlpDecodable}; use vm::ActionParams; -use evm::ActionType; +use evm::CallType; use super::error::Error; /// `Call` result. @@ -34,57 +33,6 @@ pub struct CallResult { pub output: Bytes, } -/// `Call` type. Distinguish between different types of contract interactions. -#[derive(Debug, Clone, PartialEq)] -pub enum CallType { - /// Call - Call, - /// Call code - CallCode, - /// Delegate call - DelegateCall, - /// Static call - StaticCall, -} - -impl TryFrom for CallType { - type Error = &'static str; - fn try_from(action_type: ActionType) -> Result { - match action_type { - ActionType::Call => Ok(CallType::Call), - ActionType::CallCode => Ok(CallType::CallCode), - ActionType::DelegateCall => Ok(CallType::DelegateCall), - ActionType::StaticCall => Ok(CallType::StaticCall), - ActionType::Create => Err("Create cannot be converted to CallType"), - ActionType::Create2 => Err("Create2 cannot be converted to CallType"), - } - } -} - -impl Encodable for CallType { - fn rlp_append(&self, s: &mut RlpStream) { - let v = match *self { - CallType::Call => 0u32, - CallType::CallCode => 1, - CallType::DelegateCall => 2, - CallType::StaticCall => 3, - }; - Encodable::rlp_append(&v, s); - } -} - -impl Decodable for CallType { - fn decode(rlp: &Rlp) -> Result { - rlp.as_val().and_then(|v| Ok(match v { - 0u32 => CallType::Call, - 1 => CallType::CallCode, - 2 => CallType::DelegateCall, - 3 => CallType::StaticCall, - _ => return Err(DecoderError::Custom("Invalid value of RewardType item")), - })) - } -} - /// `Create` result. #[derive(Debug, Clone, PartialEq, RlpEncodable, RlpDecodable)] pub struct CreateResult { @@ -103,49 +51,6 @@ impl CreateResult { } } -/// `Create` method. Distinguish between use of `CREATE` and `CREATE2` opcodes in an action. -#[derive(Debug, Clone, PartialEq)] -pub enum CreationMethod { - /// Create - Create, - /// Create2 - Create2, -} - -impl TryFrom for CreationMethod { - type Error = &'static str; - fn try_from(action_type: ActionType) -> Result { - match action_type { - ActionType::Call => Err("Call cannot be converted to CreationMethod"), - ActionType::CallCode => Err("CallCode cannot be converted to CreationMethod"), - ActionType::DelegateCall => Err("DelegateCall cannot be converted to CreationMethod"), - ActionType::StaticCall => Err("StaticCall cannot be converted to CreationMethod"), - ActionType::Create => Ok(CreationMethod::Create), - ActionType::Create2 => Ok(CreationMethod::Create2), - } - } -} - -impl Encodable for CreationMethod { - fn rlp_append(&self, s: &mut RlpStream) { - let v = match *self { - CreationMethod::Create => 0u32, - CreationMethod::Create2 => 1, - }; - Encodable::rlp_append(&v, s); - } -} - -impl Decodable for CreationMethod { - fn decode(rlp: &Rlp) -> Result { - rlp.as_val().and_then(|v| Ok(match v { - 0u32 => CreationMethod::Create, - 1 => CreationMethod::Create2, - _ => return Err(DecoderError::Custom("Invalid value of RewardType item")), - })) - } -} - /// Description of a _call_ action, either a `CALL` operation or a message transaction. #[derive(Debug, Clone, PartialEq, RlpEncodable, RlpDecodable)] pub struct Call { @@ -160,19 +65,19 @@ pub struct Call { /// The input data provided to the call. pub input: Bytes, /// The type of the call. - pub call_type: Option, + pub call_type: CallType, } impl From for Call { fn from(p: ActionParams) -> Self { - match p.action_type { - ActionType::DelegateCall | ActionType::CallCode => Call { + match p.call_type { + CallType::DelegateCall | CallType::CallCode => Call { from: p.address, to: p.code_address, value: p.value.value(), gas: p.gas, input: p.data.unwrap_or_else(Vec::new), - call_type: CallType::try_from(p.action_type).ok(), + call_type: p.call_type, }, _ => Call { from: p.sender, @@ -180,7 +85,7 @@ impl From for Call { value: p.value.value(), gas: p.gas, input: p.data.unwrap_or_else(Vec::new), - call_type: CallType::try_from(p.action_type).ok(), + call_type: p.call_type, }, } } @@ -208,8 +113,6 @@ pub struct Create { pub gas: U256, /// The init code. pub init: Bytes, - /// Creation method (CREATE vs CREATE2). - pub creation_method: Option, } impl From for Create { @@ -219,7 +122,6 @@ impl From for Create { value: p.value.value(), gas: p.gas, init: p.code.map_or_else(Vec::new, |c| (*c).clone()), - creation_method: CreationMethod::try_from(p.action_type).ok(), } } } diff --git a/ethcore/vm/src/action_params.rs b/ethcore/vm/src/action_params.rs index da06fb3f3ff..e98e214cde9 100644 --- a/ethcore/vm/src/action_params.rs +++ b/ethcore/vm/src/action_params.rs @@ -20,7 +20,7 @@ use bytes::Bytes; use hash::{keccak, KECCAK_EMPTY}; use ethjson; -use action_type::ActionType; +use call_type::CallType; use std::sync::Arc; @@ -88,8 +88,8 @@ pub struct ActionParams { pub code_version: U256, /// Input data. pub data: Option, - /// Type of action (e.g. CALL, DELEGATECALL, CREATE, etc.) - pub action_type: ActionType, + /// Type of call + pub call_type: CallType, /// Param types encoding pub params_type: ParamsType, } @@ -109,7 +109,7 @@ impl Default for ActionParams { code: None, code_version: U256::zero(), data: None, - action_type: ActionType::Create, + call_type: CallType::None, params_type: ParamsType::Separate, } } @@ -130,7 +130,7 @@ impl From for ActionParams { gas: t.gas.into(), gas_price: t.gas_price.into(), value: ActionValue::Transfer(t.value.into()), - action_type: ActionType::Call, + call_type: match address.is_zero() { true => CallType::None, false => CallType::Call }, // TODO @debris is this correct? params_type: ParamsType::Separate, } } diff --git a/ethcore/vm/src/action_type.rs b/ethcore/vm/src/call_type.rs similarity index 66% rename from ethcore/vm/src/action_type.rs rename to ethcore/vm/src/call_type.rs index 2696ba598af..1bb06d86cc7 100644 --- a/ethcore/vm/src/action_type.rs +++ b/ethcore/vm/src/call_type.rs @@ -14,51 +14,47 @@ // You should have received a copy of the GNU General Public License // along with Parity Ethereum. If not, see . -//! EVM action types. +//! EVM call types. use rlp::{Encodable, Decodable, DecoderError, RlpStream, Rlp}; -/// The type of the instruction. +/// The type of the call-like instruction. #[derive(Debug, PartialEq, Clone)] -pub enum ActionType { - /// CREATE. - Create, +pub enum CallType { + /// Not a CALL. + None, /// CALL. Call, /// CALLCODE. CallCode, /// DELEGATECALL. DelegateCall, - /// STATICCALL. + /// STATICCALL StaticCall, - /// CREATE2. - Create2 } -impl Encodable for ActionType { +impl Encodable for CallType { fn rlp_append(&self, s: &mut RlpStream) { let v = match *self { - ActionType::Create => 0u32, - ActionType::Call => 1, - ActionType::CallCode => 2, - ActionType::DelegateCall => 3, - ActionType::StaticCall => 4, - ActionType::Create2 => 5, + CallType::None => 0u32, + CallType::Call => 1, + CallType::CallCode => 2, + CallType::DelegateCall => 3, + CallType::StaticCall => 4, }; Encodable::rlp_append(&v, s); } } -impl Decodable for ActionType { +impl Decodable for CallType { fn decode(rlp: &Rlp) -> Result { rlp.as_val().and_then(|v| Ok(match v { - 0u32 => ActionType::Create, - 1 => ActionType::Call, - 2 => ActionType::CallCode, - 3 => ActionType::DelegateCall, - 4 => ActionType::StaticCall, - 5 => ActionType::Create2, - _ => return Err(DecoderError::Custom("Invalid value of ActionType item")), + 0u32 => CallType::None, + 1 => CallType::Call, + 2 => CallType::CallCode, + 3 => CallType::DelegateCall, + 4 => CallType::StaticCall, + _ => return Err(DecoderError::Custom("Invalid value of CallType item")), })) } } @@ -66,11 +62,11 @@ impl Decodable for ActionType { #[cfg(test)] mod tests { use rlp::*; - use super::ActionType; + use super::CallType; #[test] fn encode_call_type() { - let ct = ActionType::Call; + let ct = CallType::Call; let mut s = RlpStream::new_list(2); s.append(&ct); @@ -82,9 +78,9 @@ mod tests { #[test] fn should_encode_and_decode_call_type() { - let original = ActionType::Call; + let original = CallType::Call; let encoded = encode(&original); - let decoded = decode(&encoded).expect("failure decoding ActionType"); + let decoded = decode(&encoded).expect("failure decoding CallType"); assert_eq!(original, decoded); } } diff --git a/ethcore/vm/src/ext.rs b/ethcore/vm/src/ext.rs index 656831cdcf9..0349e3dfa62 100644 --- a/ethcore/vm/src/ext.rs +++ b/ethcore/vm/src/ext.rs @@ -19,7 +19,7 @@ use std::sync::Arc; use ethereum_types::{U256, H256, Address}; use bytes::Bytes; -use action_type::ActionType; +use call_type::CallType; use env_info::EnvInfo; use schedule::Schedule; use return_data::ReturnData; @@ -115,7 +115,7 @@ pub trait Ext { value: Option, data: &[u8], code_address: &Address, - call_type: ActionType, + call_type: CallType, trap: bool ) -> ::std::result::Result; diff --git a/ethcore/vm/src/lib.rs b/ethcore/vm/src/lib.rs index 6c5ed98fd59..1576dda04a2 100644 --- a/ethcore/vm/src/lib.rs +++ b/ethcore/vm/src/lib.rs @@ -24,7 +24,7 @@ extern crate keccak_hash as hash; extern crate patricia_trie_ethereum as ethtrie; mod action_params; -mod action_type; +mod call_type; mod env_info; mod schedule; mod ext; @@ -34,7 +34,7 @@ mod error; pub mod tests; pub use action_params::{ActionParams, ActionValue, ParamsType}; -pub use action_type::ActionType; +pub use call_type::CallType; pub use env_info::{EnvInfo, LastHashes}; pub use schedule::{Schedule, VersionedSchedule, CleanDustMode, WasmCosts}; pub use ext::{Ext, MessageCallResult, ContractCreateResult, CreateContractAddress}; diff --git a/ethcore/vm/src/tests.rs b/ethcore/vm/src/tests.rs index bdca9bbf3ad..d0335040920 100644 --- a/ethcore/vm/src/tests.rs +++ b/ethcore/vm/src/tests.rs @@ -20,7 +20,7 @@ use std::collections::{HashMap, HashSet}; use ethereum_types::{U256, H256, Address}; use bytes::Bytes; use { - ActionType, Schedule, EnvInfo, + CallType, Schedule, EnvInfo, ReturnData, Ext, ContractCreateResult, MessageCallResult, CreateContractAddress, Result, GasLeft, }; @@ -185,7 +185,7 @@ impl Ext for FakeExt { value: Option, data: &[u8], code_address: &Address, - _call_type: ActionType, + _call_type: CallType, _trap: bool, ) -> ::std::result::Result { self.calls.insert(FakeCall { diff --git a/ethcore/wasm/src/runtime.rs b/ethcore/wasm/src/runtime.rs index 3350e15bd8a..972870bfdfa 100644 --- a/ethcore/wasm/src/runtime.rs +++ b/ethcore/wasm/src/runtime.rs @@ -16,7 +16,7 @@ use std::cmp; use ethereum_types::{BigEndianHash, U256, H256, Address}; -use vm::{self, ActionType}; +use vm::{self, CallType}; use wasmi::{self, MemoryRef, RuntimeArgs, RuntimeValue, Error as InterpreterError, Trap, TrapKind}; use super::panic_payload; @@ -384,7 +384,7 @@ impl<'a> Runtime<'a> { fn do_call( &mut self, use_val: bool, - call_type: ActionType, + call_type: CallType, args: RuntimeArgs, ) -> Result @@ -445,8 +445,8 @@ impl<'a> Runtime<'a> { let call_result = self.ext.call( &gas.into(), - match call_type { ActionType::DelegateCall => &self.context.sender, _ => &self.context.address }, - match call_type { ActionType::Call | ActionType::StaticCall => &address, _ => &self.context.address }, + match call_type { CallType::DelegateCall => &self.context.sender, _ => &self.context.address }, + match call_type { CallType::Call | CallType::StaticCall => &address, _ => &self.context.address }, val, &payload, &address, @@ -487,17 +487,17 @@ impl<'a> Runtime<'a> { /// Message call fn ccall(&mut self, args: RuntimeArgs) -> Result { - self.do_call(true, ActionType::Call, args) + self.do_call(true, CallType::Call, args) } /// Delegate call fn dcall(&mut self, args: RuntimeArgs) -> Result { - self.do_call(false, ActionType::DelegateCall, args) + self.do_call(false, CallType::DelegateCall, args) } /// Static call fn scall(&mut self, args: RuntimeArgs) -> Result { - self.do_call(false, ActionType::StaticCall, args) + self.do_call(false, CallType::StaticCall, args) } fn return_address_ptr(&mut self, ptr: u32, val: Address) -> Result<()> diff --git a/evmbin/src/main.rs b/evmbin/src/main.rs index 4e6f637d4ee..4edee5f0fdb 100644 --- a/evmbin/src/main.rs +++ b/evmbin/src/main.rs @@ -45,7 +45,7 @@ use ethereum_types::{U256, Address}; use ethcore::{json_tests, test_helpers::TrieSpec}; use spec; use serde::Deserialize; -use vm::{ActionParams, ActionType}; +use vm::{ActionParams, CallType}; mod info; mod display; @@ -314,7 +314,7 @@ fn run_call(args: Args, informant: T) { } let mut params = ActionParams::default(); - params.action_type = if code.is_none() { ActionType::Call } else { ActionType::Create }; + params.call_type = if code.is_none() { CallType::Call } else { CallType::None }; params.code = code.map(Arc::new); params.code_address = to; params.address = to; diff --git a/rpc/src/v1/tests/mocked/traces.rs b/rpc/src/v1/tests/mocked/traces.rs index 4b6d7f11b94..aee34a49f08 100644 --- a/rpc/src/v1/tests/mocked/traces.rs +++ b/rpc/src/v1/tests/mocked/traces.rs @@ -23,7 +23,7 @@ use ethcore::test_helpers::TestBlockChainClient; use ethereum_types::{Address, H256}; use types::transaction::CallError; -use trace::trace::CallType; +use vm::CallType; use jsonrpc_core::IoHandler; use v1::tests::helpers::{TestMinerService}; @@ -44,7 +44,7 @@ fn io() -> Tester { value: 0x1.into(), gas: 0x100.into(), input: vec![1, 2, 3], - call_type: Some(CallType::Call), + call_type: CallType::Call, }), result: Res::None, subtraces: 0, diff --git a/rpc/src/v1/types/trace.rs b/rpc/src/v1/types/trace.rs index f29c329d024..e858d7b177c 100644 --- a/rpc/src/v1/types/trace.rs +++ b/rpc/src/v1/types/trace.rs @@ -24,6 +24,7 @@ use serde::ser::SerializeStruct; use serde::{Serialize, Serializer}; use types::account_diff; use types::state_diff; +use vm; use v1::types::Bytes; @@ -213,7 +214,6 @@ impl From for StateDiff { /// Create response #[derive(Debug, Serialize)] -#[serde(rename_all = "camelCase")] pub struct Create { /// Sender from: H160, @@ -223,9 +223,6 @@ pub struct Create { gas: U256, /// Initialization code init: Bytes, - // Create Type - #[serde(skip_serializing_if="Option::is_none")] - creation_method: Option, } impl From for Create { @@ -235,7 +232,6 @@ impl From for Create { value: c.value, gas: c.gas, init: Bytes::new(c.init), - creation_method: c.creation_method.map(|c| c.into()), } } } @@ -244,6 +240,8 @@ impl From for Create { #[derive(Debug, Serialize)] #[serde(rename_all = "lowercase")] pub enum CallType { + /// None + None, /// Call Call, /// Call code @@ -254,32 +252,14 @@ pub enum CallType { StaticCall, } -impl From for CallType { - fn from(c: trace::CallType) -> Self { - match c { - trace::CallType::Call => CallType::Call, - trace::CallType::CallCode => CallType::CallCode, - trace::CallType::DelegateCall => CallType::DelegateCall, - trace::CallType::StaticCall => CallType::StaticCall, - } - } -} - -/// Create type. -#[derive(Debug, Serialize)] -#[serde(rename_all = "lowercase")] -pub enum CreationMethod { - /// Create - Create, - /// Create2 - Create2, -} - -impl From for CreationMethod { - fn from(c: trace::CreationMethod) -> Self { +impl From for CallType { + fn from(c: vm::CallType) -> Self { match c { - trace::CreationMethod::Create => CreationMethod::Create, - trace::CreationMethod::Create2 => CreationMethod::Create2, + vm::CallType::None => CallType::None, + vm::CallType::Call => CallType::Call, + vm::CallType::CallCode => CallType::CallCode, + vm::CallType::DelegateCall => CallType::DelegateCall, + vm::CallType::StaticCall => CallType::StaticCall, } } } @@ -299,7 +279,7 @@ pub struct Call { /// Input data input: Bytes, /// The type of the call. - call_type: Option, + call_type: CallType, } impl From for Call { @@ -310,7 +290,7 @@ impl From for Call { value: c.value, gas: c.gas, input: c.input.into(), - call_type: c.call_type.map(|c| c.into()), + call_type: c.call_type.into(), } } } @@ -701,7 +681,7 @@ mod tests { value: 6.into(), gas: 7.into(), input: Bytes::new(vec![0x12, 0x34]), - call_type: Some(CallType::Call), + call_type: CallType::Call, }), result: Res::Call(CallResult { gas_used: 8.into(), @@ -727,7 +707,7 @@ mod tests { value: 6.into(), gas: 7.into(), input: Bytes::new(vec![0x12, 0x34]), - call_type: Some(CallType::Call), + call_type: CallType::Call, }), result: Res::FailedCall(TraceError::OutOfGas), trace_address: vec![10], @@ -749,7 +729,6 @@ mod tests { value: 6.into(), gas: 7.into(), init: Bytes::new(vec![0x12, 0x34]), - creation_method: Some(CreationMethod::Create), }), result: Res::Create(CreateResult { gas_used: 8.into(), @@ -764,7 +743,7 @@ mod tests { block_hash: H256::from_low_u64_be(14), }; let serialized = serde_json::to_string(&t).unwrap(); - assert_eq!(serialized, r#"{"type":"create","action":{"from":"0x0000000000000000000000000000000000000004","value":"0x6","gas":"0x7","init":"0x1234","creationMethod":"create"},"result":{"gasUsed":"0x8","code":"0x5678","address":"0x00000000000000000000000000000000000000ff"},"traceAddress":[10],"subtraces":1,"transactionPosition":11,"transactionHash":"0x000000000000000000000000000000000000000000000000000000000000000c","blockNumber":13,"blockHash":"0x000000000000000000000000000000000000000000000000000000000000000e"}"#); + assert_eq!(serialized, r#"{"type":"create","action":{"from":"0x0000000000000000000000000000000000000004","value":"0x6","gas":"0x7","init":"0x1234"},"result":{"gasUsed":"0x8","code":"0x5678","address":"0x00000000000000000000000000000000000000ff"},"traceAddress":[10],"subtraces":1,"transactionPosition":11,"transactionHash":"0x000000000000000000000000000000000000000000000000000000000000000c","blockNumber":13,"blockHash":"0x000000000000000000000000000000000000000000000000000000000000000e"}"#); } #[test] @@ -775,7 +754,6 @@ mod tests { value: 6.into(), gas: 7.into(), init: Bytes::new(vec![0x12, 0x34]), - creation_method: Some(CreationMethod::Create), }), result: Res::FailedCreate(TraceError::OutOfGas), trace_address: vec![10], @@ -786,7 +764,7 @@ mod tests { block_hash: H256::from_low_u64_be(14), }; let serialized = serde_json::to_string(&t).unwrap(); - assert_eq!(serialized, r#"{"type":"create","action":{"from":"0x0000000000000000000000000000000000000004","value":"0x6","gas":"0x7","init":"0x1234","creationMethod":"create"},"error":"Out of gas","traceAddress":[10],"subtraces":1,"transactionPosition":11,"transactionHash":"0x000000000000000000000000000000000000000000000000000000000000000c","blockNumber":13,"blockHash":"0x000000000000000000000000000000000000000000000000000000000000000e"}"#); + assert_eq!(serialized, r#"{"type":"create","action":{"from":"0x0000000000000000000000000000000000000004","value":"0x6","gas":"0x7","init":"0x1234"},"error":"Out of gas","traceAddress":[10],"subtraces":1,"transactionPosition":11,"transactionHash":"0x000000000000000000000000000000000000000000000000000000000000000c","blockNumber":13,"blockHash":"0x000000000000000000000000000000000000000000000000000000000000000e"}"#); } #[test] From 9faa823f53e1f3166146b8440ef4b6dc04f2cb06 Mon Sep 17 00:00:00 2001 From: s3krit Date: Thu, 30 Jan 2020 16:18:36 +0100 Subject: [PATCH 02/11] Update publish-docker.sh (#11428) Add :latest tag to building stable releases --- scripts/docker/hub/publish-docker.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/docker/hub/publish-docker.sh b/scripts/docker/hub/publish-docker.sh index a232cdde83b..a341ccc128a 100755 --- a/scripts/docker/hub/publish-docker.sh +++ b/scripts/docker/hub/publish-docker.sh @@ -29,6 +29,7 @@ case "${SCHEDULE_TAG:-${CI_COMMIT_REF_NAME}}" in --build-arg VCS_REF="${CI_COMMIT_SHA}" \ --build-arg BUILD_DATE="$(date -u '+%Y-%m-%dT%H:%M:%SZ')" \ --tag "parity/parity:${VERSION}-${CI_COMMIT_REF_NAME}" \ + --tag "parity/parity:latest" \ --tag "parity/parity:stable" \ --file tools/Dockerfile .; docker push "parity/parity:${VERSION}-${CI_COMMIT_REF_NAME}"; From 9c94dcb8ab8748a5c9a593f564f79222318a6762 Mon Sep 17 00:00:00 2001 From: Martin Holst Swende Date: Fri, 31 Jan 2020 15:53:02 +0100 Subject: [PATCH 03/11] goerli: replace foundation bootnode (#11433) --- ethcore/res/ethereum/goerli.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ethcore/res/ethereum/goerli.json b/ethcore/res/ethereum/goerli.json index 4c00cc43ec0..28cd3ef309d 100644 --- a/ethcore/res/ethereum/goerli.json +++ b/ethcore/res/ethereum/goerli.json @@ -55,7 +55,7 @@ "nodes": [ "enode://06333009fc9ef3c9e174768e495722a7f98fe7afd4660542e983005f85e556028410fd03278944f44cfe5437b1750b5e6bd1738f700fe7da3626d52010d2954c@51.141.15.254:30303", "enode://176b9417f511d05b6b2cf3e34b756cf0a7096b3094572a8f6ef4cdcb9d1f9d00683bf0f83347eebdf3b81c3521c2332086d9592802230bf528eaf606a1d9677b@13.93.54.137:30303", - "enode://573b6607cd59f241e30e4c4943fd50e99e2b6f42f9bd5ca111659d309c06741247f4f1e93843ad3e8c8c18b6e2d94c161b7ef67479b3938780a97134b618b5ce@52.56.136.200:30303", + "enode://a61215641fb8714a373c80edbfa0ea8878243193f57c96eeb44d0bc019ef295abd4e044fd619bfc4c59731a73fb79afe84e9ab6da0c743ceb479cbb6d263fa91@3.11.147.67:30303", "enode://67913271d14f445689e8310270c304d42f268428f2de7a4ac0275bea97690e021df6f549f462503ff4c7a81d9dd27288867bbfa2271477d0911378b8944fae55@157.230.239.163:30303", "enode://a87685902a0622e9cf18c68e73a0ea45156ec53e857ef049b185a9db2296ca04d776417bf1901c0b4eacb5b26271d8694e88e3f17c20d49eb77e1a41ab26b5b3@51.141.78.53:30303", "enode://ae8658da8d255d1992c3ec6e62e11d6e1c5899aa1566504bc1ff96a0c9c8bd44838372be643342553817f5cc7d78f1c83a8093dee13d77b3b0a583c050c81940@18.232.185.151:30303", From 7d9ff1d810e74b494c375fd9f064d8a0627bd300 Mon Sep 17 00:00:00 2001 From: David Date: Mon, 3 Feb 2020 14:34:03 +0100 Subject: [PATCH 04/11] Remove dead bootnodes, add new geth bootnodes (#11441) --- ethcore/res/ethereum/foundation.json | 34 +++++++--------------------- 1 file changed, 8 insertions(+), 26 deletions(-) diff --git a/ethcore/res/ethereum/foundation.json b/ethcore/res/ethereum/foundation.json index ec864d6ed27..ba988e5bf40 100644 --- a/ethcore/res/ethereum/foundation.json +++ b/ethcore/res/ethereum/foundation.json @@ -4770,32 +4770,14 @@ "enode://4afb3a9137a88267c02651052cf6fb217931b8c78ee058bb86643542a4e2e0a8d24d47d871654e1b78a276c363f3c1bc89254a973b00adc359c9e9a48f140686@144.217.139.5:30303", "enode://c16d390b32e6eb1c312849fe12601412313165df1a705757d671296f1ac8783c5cff09eab0118ac1f981d7148c85072f0f26407e5c68598f3ad49209fade404d@139.99.51.203:30303", "enode://4faf867a2e5e740f9b874e7c7355afee58a2d1ace79f7b692f1d553a1134eddbeb5f9210dd14dc1b774a46fd5f063a8bc1fa90579e13d9d18d1f59bac4a4b16b@139.99.160.213:30303", - "enode://6a868ced2dec399c53f730261173638a93a40214cf299ccf4d42a76e3fa54701db410669e8006347a4b3a74fa090bb35af0320e4bc8d04cf5b7f582b1db285f5@163.172.131.191:30303", - "enode://66a483383882a518fcc59db6c017f9cd13c71261f13c8d7e67ed43adbbc82a932d88d2291f59be577e9425181fc08828dc916fdd053af935a9491edf9d6006ba@212.47.247.103:30303", - "enode://cd6611461840543d5b9c56fbf088736154c699c43973b3a1a32390cf27106f87e58a818a606ccb05f3866de95a4fe860786fea71bf891ea95f234480d3022aa3@163.172.157.114:30303", - "enode://1d1f7bcb159d308eb2f3d5e32dc5f8786d714ec696bb2f7e3d982f9bcd04c938c139432f13aadcaf5128304a8005e8606aebf5eebd9ec192a1471c13b5e31d49@138.201.223.35:30303", - "enode://a979fb575495b8d6db44f750317d0f4622bf4c2aa3365d6af7c284339968eef29b69ad0dce72a4d8db5ebb4968de0e3bec910127f134779fbcb0cb6d3331163c@52.16.188.185:30303", - "enode://3f1d12044546b76342d59d4a05532c14b85aa669704bfe1f864fe079415aa2c02d743e03218e57a33fb94523adb54032871a6c51b2cc5514cb7c7e35b3ed0a99@13.93.211.84:30303", - "enode://78de8a0916848093c73790ead81d1928bec737d565119932b98c6b100d944b7a95e94f847f689fc723399d2e31129d182f7ef3863f2b4c820abbf3ab2722344d@191.235.84.50:30303", - "enode://158f8aab45f6d19c6cbf4a089c2670541a8da11978a2f90dbf6a502a4a3bab80d288afdbeb7ec0ef6d92de563767f3b1ea9e8e334ca711e9f8e2df5a0385e8e6@13.75.154.138:30303", - "enode://1118980bf48b0a3640bdba04e0fe78b1add18e1cd99bf22d53daac1fd9972ad650df52176e7c7d89d1114cfef2bc23a2959aa54998a46afcf7d91809f0855082@52.74.57.123:30303", - "enode://979b7fa28feeb35a4741660a16076f1943202cb72b6af70d327f053e248bab9ba81760f39d0701ef1d8f89cc1fbd2cacba0710a12cd5314d5e0c9021aa3637f9@5.1.83.226:30303", - "enode://0cc5f5ffb5d9098c8b8c62325f3797f56509bff942704687b6530992ac706e2cb946b90a34f1f19548cd3c7baccbcaea354531e5983c7d1bc0dee16ce4b6440b@40.118.3.223:30305", - "enode://1c7a64d76c0334b0418c004af2f67c50e36a3be60b5e4790bdac0439d21603469a85fad36f2473c9a80eb043ae60936df905fa28f1ff614c3e5dc34f15dcd2dc@40.118.3.223:30308", - "enode://85c85d7143ae8bb96924f2b54f1b3e70d8c4d367af305325d30a61385a432f247d2c75c45c6b4a60335060d072d7f5b35dd1d4c45f76941f62a4f83b6e75daaf@40.118.3.223:30309", - "enode://de471bccee3d042261d52e9bff31458daecc406142b401d4cd848f677479f73104b9fdeb090af9583d3391b7f10cb2ba9e26865dd5fca4fcdc0fb1e3b723c786@54.94.239.50:30303", - "enode://4cd540b2c3292e17cff39922e864094bf8b0741fcc8c5dcea14957e389d7944c70278d872902e3d0345927f621547efa659013c400865485ab4bfa0c6596936f@138.201.144.135:30303", - "enode://01f76fa0561eca2b9a7e224378dd854278735f1449793c46ad0c4e79e8775d080c21dcc455be391e90a98153c3b05dcc8935c8440de7b56fe6d67251e33f4e3c@51.15.42.252:30303", - "enode://2c9059f05c352b29d559192fe6bca272d965c9f2290632a2cfda7f83da7d2634f3ec45ae3a72c54dd4204926fb8082dcf9686e0d7504257541c86fc8569bcf4b@163.172.171.38:30303", - "enode://efe4f2493f4aff2d641b1db8366b96ddacfe13e7a6e9c8f8f8cf49f9cdba0fdf3258d8c8f8d0c5db529f8123c8f1d95f36d54d590ca1bb366a5818b9a4ba521c@163.172.187.252:30303", - "enode://bcc7240543fe2cf86f5e9093d05753dd83343f8fda7bf0e833f65985c73afccf8f981301e13ef49c4804491eab043647374df1c4adf85766af88a624ecc3330e@136.243.154.244:30303", - "enode://ed4227681ca8c70beb2277b9e870353a9693f12e7c548c35df6bca6a956934d6f659999c2decb31f75ce217822eefca149ace914f1cbe461ed5a2ebaf9501455@88.212.206.70:30303", - "enode://cadc6e573b6bc2a9128f2f635ac0db3353e360b56deef239e9be7e7fce039502e0ec670b595f6288c0d2116812516ad6b6ff8d5728ff45eba176989e40dead1e@37.128.191.230:30303", - "enode://595a9a06f8b9bc9835c8723b6a82105aea5d55c66b029b6d44f229d6d135ac3ecdd3e9309360a961ea39d7bee7bac5d03564077a4e08823acc723370aace65ec@46.20.235.22:30303", - "enode://029178d6d6f9f8026fc0bc17d5d1401aac76ec9d86633bba2320b5eed7b312980c0a210b74b20c4f9a8b0b2bf884b111fa9ea5c5f916bb9bbc0e0c8640a0f56c@216.158.85.185:30303", - "enode://fdd1b9bb613cfbc200bba17ce199a9490edc752a833f88d4134bf52bb0d858aa5524cb3ec9366c7a4ef4637754b8b15b5dc913e4ed9fdb6022f7512d7b63f181@212.47.247.103:30303", - "enode://cc26c9671dffd3ee8388a7c8c5b601ae9fe75fc0a85cedb72d2dd733d5916fad1d4f0dcbebad5f9518b39cc1f96ba214ab36a7fa5103aaf17294af92a89f227b@52.79.241.155:30303", - "enode://140872ce4eee37177fbb7a3c3aa4aaebe3f30bdbf814dd112f6c364fc2e325ba2b6a942f7296677adcdf753c33170cb4999d2573b5ff7197b4c1868f25727e45@52.78.149.82:30303" + "enode://d860a01f9722d78051619d1e2351aba3f43f943f6f00718d1b9baa4101932a1f5011f16bb2b1bb35db20d6fe28fa0bf09636d26a87d31de9ec6203eeedb1f666@18.138.108.67:30303", + "enode://22a8232c3abc76a16ae9d6c3b164f98775fe226f0917b0ca871128a74a8e9630b458460865bab457221f1d448dd9791d24c4e5d88786180ac185df813a68d4de@3.209.45.79:30303", + "enode://ca6de62fce278f96aea6ec5a2daadb877e51651247cb96ee310a318def462913b653963c155a0ef6c7d50048bba6e6cea881130857413d9f50a621546b590758@34.255.23.113:30303", + "enode://279944d8dcd428dffaa7436f25ca0ca43ae19e7bcf94a8fb7d1641651f92d121e972ac2e8f381414b80cc8e5555811c2ec6e1a99bb009b3f53c4c69923e11bd8@35.158.244.151:30303", + "enode://8499da03c47d637b20eee24eec3c356c9a2e6148d6fe25ca195c7949ab8ec2c03e3556126b0d7ed644675e78c4318b08691b7b57de10e5f0d40d05b09238fa0a@52.187.207.27:30303", + "enode://103858bdb88756c71f15e9b5e09b56dc1be52f0a5021d46301dbbfb7e130029cc9d0d6f73f693bc29b665770fff7da4d34f3c6379fe12721b5d7a0bcb5ca1fc1@191.234.162.198:30303", + "enode://715171f50508aba88aecd1250af392a45a330af91d7b90701c436b618c86aaa1589c9184561907bebbb56439b8f8787bc01f49a7c77276c58c1b09822d75e8e8@52.231.165.108:30303", + "enode://5d6d7cd20d6da4bb83a1d28cadb5d409b64edf314c0335df658c1a54e32c7c4a7ab7823d57c39b6a757556e68ff1df17c748b698544a55cb488b52479a92b60f@104.42.217.25:30303" ], "accounts": { "0x0000000000000000000000000000000000000001": { From 3c3c19d37c139de1aaaa1418492b702843b2c391 Mon Sep 17 00:00:00 2001 From: Artem Vorotnikov Date: Mon, 3 Feb 2020 18:24:20 +0300 Subject: [PATCH 05/11] ethjson: impl Copy for hash type wrapper (#11423) --- json/src/hash.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/json/src/hash.rs b/json/src/hash.rs index bf8bcbb4fcb..51391724260 100644 --- a/json/src/hash.rs +++ b/json/src/hash.rs @@ -25,7 +25,7 @@ use ethereum_types::{H64 as Hash64, H160 as Hash160, H256 as Hash256, H520 as Ha macro_rules! impl_hash { ($name: ident, $inner: ident) => { /// Lenient hash json deserialization for test json files. - #[derive(Default, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, Clone)] + #[derive(Default, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, Clone, Copy)] pub struct $name(pub $inner); impl From<$name> for $inner { From 296fac0fe7ab804ad2d8ab3a20390341c7934f73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= Date: Mon, 3 Feb 2020 16:29:27 +0100 Subject: [PATCH 06/11] Rough architecutre diagram. (#11396) --- docs/architecture-draft.png | Bin 0 -> 90423 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/architecture-draft.png diff --git a/docs/architecture-draft.png b/docs/architecture-draft.png new file mode 100644 index 0000000000000000000000000000000000000000..7a79e7eb3a4daa4c9a8a48f19aa28e6fd169fa29 GIT binary patch literal 90423 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 Al>h($ literal 0 HcmV?d00001 From ccaa514eec699631fce7aea987a08e8a17022820 Mon Sep 17 00:00:00 2001 From: Andronik Ordian Date: Mon, 3 Feb 2020 19:00:23 +0100 Subject: [PATCH 07/11] update kvdb-rocksdb to 0.4 (#11442) --- Cargo.lock | 175 +++++++++++++-------- Cargo.toml | 4 +- ethcore/Cargo.toml | 10 +- ethcore/account-db/Cargo.toml | 2 +- ethcore/account-state/Cargo.toml | 2 +- ethcore/blockchain/Cargo.toml | 4 +- ethcore/client-traits/Cargo.toml | 2 +- ethcore/db/Cargo.toml | 2 +- ethcore/engines/validator-set/Cargo.toml | 2 +- ethcore/executive-state/Cargo.toml | 2 +- ethcore/light/Cargo.toml | 4 +- ethcore/node-filter/Cargo.toml | 2 +- ethcore/pod/Cargo.toml | 2 +- ethcore/private-tx/Cargo.toml | 2 +- ethcore/service/Cargo.toml | 4 +- ethcore/snapshot/Cargo.toml | 4 +- ethcore/snapshot/snapshot-tests/Cargo.toml | 4 +- ethcore/spec/Cargo.toml | 2 +- ethcore/state-db/Cargo.toml | 2 +- ethcore/sync/Cargo.toml | 2 +- ethcore/trace/Cargo.toml | 2 +- miner/local-store/Cargo.toml | 4 +- secret-store/Cargo.toml | 6 +- util/journaldb/Cargo.toml | 4 +- util/migration-rocksdb/Cargo.toml | 4 +- 25 files changed, 146 insertions(+), 107 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3fa5d664d30..beadfb1f248 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8,7 +8,7 @@ dependencies = [ "hash-db 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", "keccak-hash 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "keccak-hasher 0.1.1", - "kvdb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "rlp 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -24,7 +24,7 @@ dependencies = [ "journaldb 0.2.0", "keccak-hash 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "keccak-hasher 0.1.1", - "kvdb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "lru-cache 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "memory-db 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -591,7 +591,7 @@ dependencies = [ "ethcore-db 0.1.0", "ethcore-miner 1.12.0", "ethereum-types 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-bytes 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "registrar 0.0.1", "stats 0.1.0", @@ -852,9 +852,9 @@ name = "derive_more" version = "0.99.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1119,9 +1119,9 @@ dependencies = [ "itertools 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)", "journaldb 0.2.0", "keccak-hash 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb-memorydb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb-rocksdb 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb-memorydb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb-rocksdb 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "machine 0.1.0", @@ -1188,8 +1188,8 @@ dependencies = [ "ethereum-types 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "itertools 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)", "keccak-hash 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb-memorydb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb-memorydb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-bytes 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-crypto 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1246,7 +1246,7 @@ version = "0.1.0" dependencies = [ "common-types 0.1.0", "ethereum-types 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-util-mem 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "rlp 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1294,8 +1294,8 @@ dependencies = [ "journaldb 0.2.0", "keccak-hash 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "keccak-hasher 0.1.1", - "kvdb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb-memorydb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb-memorydb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "machine 0.1.0", "memory-cache 0.1.0", @@ -1447,7 +1447,7 @@ dependencies = [ "journaldb 0.2.0", "keccak-hash 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "keccak-hasher 0.1.1", - "kvdb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "machine 0.1.0", "parity-bytes 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1488,8 +1488,8 @@ dependencies = [ "hyper 0.12.19 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-server-utils 14.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "keccak-hash 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb-rocksdb 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb-rocksdb 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-bytes 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1523,8 +1523,8 @@ dependencies = [ "ethcore-private-tx 1.0.0", "ethcore-sync 1.12.0", "ethereum-types 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb-rocksdb 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb-rocksdb 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "snapshot 0.1.0", "spec 0.1.0", @@ -1567,7 +1567,7 @@ dependencies = [ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "indexmap 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "keccak-hash 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb-memorydb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb-memorydb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "machine 0.1.0", "macros 0.1.0", @@ -1740,7 +1740,7 @@ dependencies = [ "hash-db 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", "keccak-hash 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "keccak-hasher 0.1.1", - "kvdb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "machine 0.1.0", "parity-bytes 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2174,6 +2174,16 @@ dependencies = [ "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "impl-trait-for-tuples" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "indexmap" version = "1.3.0" @@ -2291,8 +2301,8 @@ dependencies = [ "hash-db 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", "keccak-hash 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "keccak-hasher 0.1.1", - "kvdb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb-memorydb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb-memorydb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "memory-db 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-bytes 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2327,9 +2337,9 @@ version = "14.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2450,33 +2460,36 @@ dependencies = [ [[package]] name = "kvdb" -version = "0.2.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "parity-bytes 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-util-mem 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "kvdb-memorydb" -version = "0.2.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "kvdb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-util-mem 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "kvdb-rocksdb" -version = "0.3.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fs-swap 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "interleaved-ordered 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)", "owning_ref 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-util-mem 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "rocksdb 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2637,8 +2650,8 @@ name = "malloc_size_of_derive" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", "synstructure 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2700,8 +2713,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" name = "migration-rocksdb" version = "0.1.0" dependencies = [ - "kvdb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb-rocksdb 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb-rocksdb 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "macros 0.1.0", "tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2850,7 +2863,7 @@ dependencies = [ "ethcore-network 1.12.0", "ethcore-network-devp2p 1.12.0", "ethereum-types 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb-memorydb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb-memorydb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "lru-cache 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3085,8 +3098,8 @@ dependencies = [ "journaldb 0.2.0", "jsonrpc-core 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "keccak-hash 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb-rocksdb 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb-rocksdb 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "migration-rocksdb 0.1.0", "node-filter 1.12.0", @@ -3176,8 +3189,8 @@ dependencies = [ "common-types 0.1.0", "ethcore-io 1.12.0", "ethkey 0.4.0", - "kvdb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb-memorydb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb-memorydb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-crypto 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "rlp 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3386,6 +3399,29 @@ dependencies = [ "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "parity-util-mem" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "impl-trait-for-tuples 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-util-mem-derive 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "parity-util-mem-derive" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "synstructure 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "parity-version" version = "2.8.0" @@ -3572,7 +3608,7 @@ dependencies = [ "itertools 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "keccak-hash 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "keccak-hasher 0.1.1", - "kvdb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "macros 0.1.0", "parity-bytes 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3676,9 +3712,9 @@ name = "proc-macro-hack" version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3691,7 +3727,7 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.1" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3741,7 +3777,7 @@ name = "quote" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4229,9 +4265,9 @@ name = "serde_derive" version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4359,8 +4395,8 @@ dependencies = [ "journaldb 0.2.0", "keccak-hash 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "keccak-hasher 0.1.1", - "kvdb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb-rocksdb 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb-rocksdb 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4405,8 +4441,8 @@ dependencies = [ "journaldb 0.2.0", "keccak-hash 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "keccak-hasher 0.1.1", - "kvdb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb-rocksdb 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb-rocksdb 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-bytes 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4464,7 +4500,7 @@ dependencies = [ "instant-seal 0.1.0", "journaldb 0.2.0", "keccak-hash 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb-memorydb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb-memorydb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "machine 0.1.0", "null-engine 0.1.0", @@ -4502,7 +4538,7 @@ dependencies = [ "journaldb 0.2.0", "keccak-hash 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "keccak-hasher 0.1.1", - "kvdb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "lru-cache 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "memory-cache 0.1.0", @@ -4574,10 +4610,10 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.5" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4598,9 +4634,9 @@ name = "synstructure" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4970,7 +5006,7 @@ dependencies = [ "ethcore-db 0.1.0", "ethereum-types 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "evm 0.1.0", - "kvdb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-bytes 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-util-mem 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5195,7 +5231,7 @@ dependencies = [ "ethjson 0.1.0", "executive-state 0.1.0", "keccak-hash 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "machine 0.1.0", @@ -5347,9 +5383,9 @@ dependencies = [ "bumpalo 3.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-bindgen-shared 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -5367,9 +5403,9 @@ name = "wasm-bindgen-macro-support" version = "0.2.58" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-bindgen-backend 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-bindgen-shared 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -5387,9 +5423,9 @@ dependencies = [ "anyhow 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", "heck 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-bindgen-backend 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "weedle 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -5689,6 +5725,7 @@ dependencies = [ "checksum impl-codec 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1be51a921b067b0eaca2fad532d9400041561aa922221cc65f95a85641c6bf53" "checksum impl-rlp 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8f7a72f11830b52333f36e3b09a288333888bf54380fd0ac0790a3c31ab0f3c5" "checksum impl-serde 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "58e3cae7e99c7ff5a995da2cf78dd0a5383740eda71d98cf7b1910c301ac69b8" +"checksum impl-trait-for-tuples 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7ef5550a42e3740a0e71f909d4c861056a284060af885ae7aa6242820f920d9d" "checksum indexmap 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712d7b3ea5827fcb9d4fda14bf4da5f136f0db2ae9c8f4bd4e2d1c6fde4e6db2" "checksum integer-encoding 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "26746cbc2e680af687e88d717f20ff90079bd10fc984ad57d277cd0e37309fa5" "checksum interleaved-ordered 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "141340095b15ed7491bd3d4ced9d20cebfb826174b6bb03386381f62b01e3d77" @@ -5713,9 +5750,9 @@ dependencies = [ "checksum keccak-hash 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e563fa6fe52b2686094846118bf2cb2e6f75e6b8cec6c3aba09be8e835c7f998" "checksum keccak-hasher 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3bf18164fd7ce989041f8fc4a1ae72a8bd1bec3575f2aeaf1d4968fc053aabef" "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" -"checksum kvdb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cecee8d85a74f6b8284710d52a7d1196f09e31f8217e1f184a475b509d360554" -"checksum kvdb-memorydb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0a5d70712b1fe0f02ce7ee36a962fcb0b15d0fe11262ba21a4aa839ef22cf60d" -"checksum kvdb-rocksdb 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "54cc6b52f7e511de9f07fd77cda70247adfc6b8192e4b5a1b6dbca416dc425b5" +"checksum kvdb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8396be0e5561ccd1bf7ff0b2007487cdd7a87a056873fe6ea906b35d4dbf7ed8" +"checksum kvdb-memorydb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4d25ef14155e418515c4839e9144c839de3506e68946f255a32b7f166095493d" +"checksum kvdb-rocksdb 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "af488cc16c3801705c8d681c3a32c8faa8fafc7fb5309dee0f573f3c6a19d395" "checksum lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" "checksum lazycell 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ddba4c30a78328befecec92fc94970e53b3ae385827d28620f0f5bb2493081e0" "checksum libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)" = "1a31a0627fdf1f6a39ec0dd577e101440b7db22672c0901fe00a9a6fbb5c24e8" @@ -5776,6 +5813,8 @@ dependencies = [ "checksum parity-snappy-sys 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1a413d51e5e1927320c9de992998e4a279dffb8c8a7363570198bd8383e66f1b" "checksum parity-tokio-ipc 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1e57fea504fea33f9fbb5f49f378359030e7e026a6ab849bb9e8f0787376f1bf" "checksum parity-util-mem 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8174d85e62c4d615fddd1ef67966bdc5757528891d0742f15b131ad04667b3f9" +"checksum parity-util-mem 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "900dd84654b048e5bad420bb341658fc2c4d7fea628c22bcf4621733e54859b4" +"checksum parity-util-mem-derive 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f557c32c6d268a07c921471619c0295f5efad3a0e76d4f97a05c091a51d110b2" "checksum parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)" = "511379a8194230c2395d2f5fa627a5a7e108a9f976656ce723ae68fca4097bfc" "checksum parity-wordlist 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "573d08f0d3bc8a6ffcdac1de2725b5daeed8db26345a9c12d91648e2d6457f3e" "checksum parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f0802bff09003b291ba756dc7e79313e51cc31667e94afbe847def490424cde5" @@ -5803,7 +5842,7 @@ dependencies = [ "checksum proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "e10d4b51f154c8a7fb96fd6dad097cb74b863943ec010ac94b9fd1be8861fe1e" "checksum proc-macro-hack 0.5.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e688f31d92ffd7c1ddc57a1b4e6d773c0f2a14ee437a4b0a4f5a69c80eb221c8" "checksum proc-macro2 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)" = "3d7b7eaaa90b4a90a932a9ea6666c95a389e424eff347f0f793979289429feee" -"checksum proc-macro2 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4c5c2380ae88876faae57698be9e9775e3544decad214599c3a6266cca6ac802" +"checksum proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3acb317c6ff86a4e579dfa00fc5e6cca91ecbb4e7eb2df0468805b674eb88548" "checksum pwasm-utils 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e9135bed7b452e20dbb395a2d519abaf0c46d60e7ecc02daeeab447d29bada1" "checksum quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9274b940887ce9addde99c4eee6b5c44cc494b182b97e73dc8ffdcb3397fd3f0" "checksum quote 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)" = "dd636425967c33af890042c483632d33fa7a18f19ad1d7ea72e8998c6ef8dea5" @@ -5889,7 +5928,7 @@ dependencies = [ "checksum subtle 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" "checksum subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "01dca13cf6c3b179864ab3292bd794e757618d35a7766b7c46050c614ba00829" "checksum syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)" = "f92e629aa1d9c827b2bb8297046c1ccffc57c99b947a680d3ccff1f136a3bee9" -"checksum syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "66850e97125af79138385e9b88339cbcd037e3f28ceab8c5ad98e64f0f1f80bf" +"checksum syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)" = "af6f3550d8dff9ef7dc34d384ac6f107e5d31c8f57d9f28e0081503f547ac8f5" "checksum synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "73687139bf99285483c96ac0add482c3776528beac1d97d444f6e91f203a2015" "checksum synstructure 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "67656ea1dc1b41b1451851562ea232ec2e5a80242139f7e679ceccfb5d61f545" "checksum target_info 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c63f48baada5c52e65a29eef93ab4f8982681b67f9e8d29c7b05abcfec2b9ffe" diff --git a/Cargo.toml b/Cargo.toml index 42d23e70e4b..9897a201274 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -41,8 +41,8 @@ futures = "0.1" journaldb = { path = "util/journaldb" } jsonrpc-core = "14.0.3" keccak-hash = "0.4.0" -kvdb = "0.2" -kvdb-rocksdb = "0.3.0" +kvdb = "0.3.1" +kvdb-rocksdb = "0.4.1" log = "0.4" migration-rocksdb = { path = "util/migration-rocksdb" } node-filter = { path = "ethcore/node-filter" } diff --git a/ethcore/Cargo.toml b/ethcore/Cargo.toml index 9d9f574c134..c4cc43f3777 100644 --- a/ethcore/Cargo.toml +++ b/ethcore/Cargo.toml @@ -31,9 +31,9 @@ hash-db = "0.15.0" itertools = "0.5" journaldb = { path = "../util/journaldb" } keccak-hash = "0.4.0" -kvdb = "0.2" -kvdb-memorydb = { version = "0.2.0", optional = true } -kvdb-rocksdb = { version = "0.3.0", optional = true } +kvdb = "0.3.1" +kvdb-memorydb = { version = "0.3.1", optional = true } +kvdb-rocksdb = { version = "0.4.1", optional = true } lazy_static = { version = "1.3", optional = true } log = "0.4" macros = { path = "../util/macros", optional = true } @@ -78,8 +78,8 @@ ethcore-builtin = { path = "./builtin" } ethjson = { path = "../json", features = ["test-helpers"] } parity-crypto = { version = "0.4.2", features = ["publickey"] } fetch = { path = "../util/fetch" } -kvdb-memorydb = "0.2.0" -kvdb-rocksdb = "0.3.0" +kvdb-memorydb = "0.3.1" +kvdb-rocksdb = "0.4.1" lazy_static = "1.3" machine = { path = "./machine", features = ["test-helpers"] } macros = { path = "../util/macros" } diff --git a/ethcore/account-db/Cargo.toml b/ethcore/account-db/Cargo.toml index a0a12136da8..a32d50e329e 100644 --- a/ethcore/account-db/Cargo.toml +++ b/ethcore/account-db/Cargo.toml @@ -11,5 +11,5 @@ ethereum-types = "0.8.0" hash-db = "0.15.0" keccak-hash = "0.4.0" keccak-hasher = { path = "../../util/keccak-hasher" } -kvdb = "0.2" +kvdb = "0.3.1" rlp = "0.4" diff --git a/ethcore/account-state/Cargo.toml b/ethcore/account-state/Cargo.toml index 1b7d663566e..4aa43f60418 100644 --- a/ethcore/account-state/Cargo.toml +++ b/ethcore/account-state/Cargo.toml @@ -16,7 +16,7 @@ hash-db = "0.15.0" journaldb = { path = "../../util/journaldb" } keccak-hash = "0.4.0" keccak-hasher = { path = "../../util/keccak-hasher" } -kvdb = "0.2" +kvdb = "0.3.1" log = "0.4" lru-cache = "0.1.2" memory-db = "0.18.0" diff --git a/ethcore/blockchain/Cargo.toml b/ethcore/blockchain/Cargo.toml index 6e9b2275541..ad4dd274184 100644 --- a/ethcore/blockchain/Cargo.toml +++ b/ethcore/blockchain/Cargo.toml @@ -16,7 +16,7 @@ ethereum-types = "0.8.0" keccak-hash = "0.4.0" parity-util-mem = "0.3.0" itertools = "0.5" -kvdb = "0.2" +kvdb = "0.3.1" log = "0.4" parity-bytes = "0.1" rand = "0.7" @@ -32,4 +32,4 @@ env_logger = "0.5" parity-crypto = { version = "0.4.2", features = ["publickey"] } rustc-hex = "1.0" tempdir = "0.3" -kvdb-memorydb = "0.2.0" +kvdb-memorydb = "0.3.1" diff --git a/ethcore/client-traits/Cargo.toml b/ethcore/client-traits/Cargo.toml index ceeb331e7ea..e8915393974 100644 --- a/ethcore/client-traits/Cargo.toml +++ b/ethcore/client-traits/Cargo.toml @@ -15,7 +15,7 @@ common-types = { path = "../types" } ethcore-db = { path = "../db" } ethcore-miner = { path = "../../miner" } ethereum-types = "0.8.0" -kvdb = "0.2" +kvdb = "0.3.1" registrar = { path = "../../util/registrar" } stats = { path = "../../util/stats" } trace = { path = "../trace" } diff --git a/ethcore/db/Cargo.toml b/ethcore/db/Cargo.toml index 201422e3fe1..af1eb9e9b97 100644 --- a/ethcore/db/Cargo.toml +++ b/ethcore/db/Cargo.toml @@ -10,7 +10,7 @@ edition = "2018" [dependencies] common-types = { path = "../types" } ethereum-types = "0.8.0" -kvdb = "0.2" +kvdb = "0.3.1" parity-util-mem = "0.3.0" parking_lot = "0.9" rlp = "0.4.0" diff --git a/ethcore/engines/validator-set/Cargo.toml b/ethcore/engines/validator-set/Cargo.toml index 8840e61a016..bd63c380d35 100644 --- a/ethcore/engines/validator-set/Cargo.toml +++ b/ethcore/engines/validator-set/Cargo.toml @@ -17,7 +17,7 @@ ethereum-types = "0.8.0" ethjson = { path = "../../../json" } executive-state = { path = "../../executive-state" } keccak-hash = "0.4.0" -kvdb = "0.2" +kvdb = "0.3.1" lazy_static = "1.3.0" log = "0.4.8" machine = { path = "../../machine" } diff --git a/ethcore/executive-state/Cargo.toml b/ethcore/executive-state/Cargo.toml index 83e90564ef6..0236c0a4206 100644 --- a/ethcore/executive-state/Cargo.toml +++ b/ethcore/executive-state/Cargo.toml @@ -14,7 +14,7 @@ common-types = { path = "../types" } ethereum-types = "0.8.0" hash-db = "0.15.0" keccak-hasher = { path = "../../util/keccak-hasher" } -kvdb = "0.2" +kvdb = "0.3.1" log = "0.4.8" machine = { path = "../machine" } trace = { path = "../trace" } diff --git a/ethcore/light/Cargo.toml b/ethcore/light/Cargo.toml index 41d517e03b0..9aa8f5d06d5 100644 --- a/ethcore/light/Cargo.toml +++ b/ethcore/light/Cargo.toml @@ -43,14 +43,14 @@ stats = { path = "../../util/stats" } keccak-hash = "0.4.0" keccak-hasher = { path = "../../util/keccak-hasher" } triehash-ethereum = { version = "0.2", path = "../../util/triehash-ethereum" } -kvdb = "0.2" +kvdb = "0.3.1" memory-cache = { path = "../../util/memory-cache" } journaldb = { path = "../../util/journaldb" } verification = { path = "../verification" } [dev-dependencies] ethcore = { path = "..", features = ["test-helpers"] } -kvdb-memorydb = "0.2.0" +kvdb-memorydb = "0.3.1" tempdir = "0.3" [features] diff --git a/ethcore/node-filter/Cargo.toml b/ethcore/node-filter/Cargo.toml index a619deb91f0..cc8430c435a 100644 --- a/ethcore/node-filter/Cargo.toml +++ b/ethcore/node-filter/Cargo.toml @@ -22,7 +22,7 @@ lru-cache = "0.1" [dev-dependencies] ethcore = { path = "..", features = ["test-helpers"] } -kvdb-memorydb = "0.2.0" +kvdb-memorydb = "0.3.1" ethcore-io = { path = "../../util/io" } spec = { path = "../spec" } tempdir = "0.3" diff --git a/ethcore/pod/Cargo.toml b/ethcore/pod/Cargo.toml index 2602dbcd41c..d3a25d17d27 100644 --- a/ethcore/pod/Cargo.toml +++ b/ethcore/pod/Cargo.toml @@ -15,7 +15,7 @@ hash-db = "0.15.0" itertools = "0.8" keccak-hash = "0.4.0" keccak-hasher = { path = "../../util/keccak-hasher" } -kvdb = "0.2" +kvdb = "0.3.1" log = "0.4" parity-bytes = "0.1.0" rlp = "0.4" diff --git a/ethcore/private-tx/Cargo.toml b/ethcore/private-tx/Cargo.toml index 9139c35425a..9ffdd835a63 100644 --- a/ethcore/private-tx/Cargo.toml +++ b/ethcore/private-tx/Cargo.toml @@ -26,7 +26,7 @@ parity-util-mem = "0.3.0" hash-db = "0.15.0" keccak-hash = "0.4.0" keccak-hasher = { path = "../../util/keccak-hasher" } -kvdb = "0.2" +kvdb = "0.3.1" log = "0.4" machine = { path = "../machine" } journaldb = { path = "../../util/journaldb" } diff --git a/ethcore/service/Cargo.toml b/ethcore/service/Cargo.toml index 6a45b6c59f7..13f2c6c0c9c 100644 --- a/ethcore/service/Cargo.toml +++ b/ethcore/service/Cargo.toml @@ -14,7 +14,7 @@ ethcore-io = { path = "../../util/io" } ethcore-private-tx = { path = "../private-tx" } ethcore-sync = { path = "../sync" } ethereum-types = "0.8.0" -kvdb = "0.2" +kvdb = "0.3.1" log = "0.4" snapshot = { path = "../snapshot" } spec = { path = "../spec" } @@ -23,5 +23,5 @@ trace-time = "0.1" [dev-dependencies] ethcore = { path = "..", features = ["test-helpers"] } ethcore-db = { path = "../db" } -kvdb-rocksdb = "0.3.0" +kvdb-rocksdb = "0.4.1" tempdir = "0.3" diff --git a/ethcore/snapshot/Cargo.toml b/ethcore/snapshot/Cargo.toml index 0619a93c661..5d03048e9eb 100644 --- a/ethcore/snapshot/Cargo.toml +++ b/ethcore/snapshot/Cargo.toml @@ -29,7 +29,7 @@ itertools = "0.5" journaldb = { path = "../../util/journaldb" } keccak-hash = "0.4.0" keccak-hasher = { path = "../../util/keccak-hasher" } -kvdb = "0.2" +kvdb = "0.3.1" log = "0.4.8" num_cpus = "1.10.1" rand = "0.7" @@ -53,7 +53,7 @@ ethabi-contract = "9.0.0" ethabi-derive = "9.0.1" ethcore = { path = "..", features = ["test-helpers"] } ethkey = { path = "../../accounts/ethkey" } -kvdb-rocksdb = "0.3.0" +kvdb-rocksdb = "0.4.1" lazy_static = { version = "1.3" } spec = { path = "../spec" } tempdir = "0.3" diff --git a/ethcore/snapshot/snapshot-tests/Cargo.toml b/ethcore/snapshot/snapshot-tests/Cargo.toml index 585447f22df..1e3f2fb5be7 100644 --- a/ethcore/snapshot/snapshot-tests/Cargo.toml +++ b/ethcore/snapshot/snapshot-tests/Cargo.toml @@ -23,8 +23,8 @@ hash-db = "0.15.0" journaldb = { path = "../../../util/journaldb" } keccak-hash = "0.4.0" keccak-hasher = { path = "../../../util/keccak-hasher" } -kvdb = "0.2" -kvdb-rocksdb = "0.3.0" +kvdb = "0.3.1" +kvdb-rocksdb = "0.4.1" log = "0.4.8" parking_lot = "0.9" parity-crypto = { version = "0.4.2", features = ["publickey"] } diff --git a/ethcore/spec/Cargo.toml b/ethcore/spec/Cargo.toml index ea8f08fe342..570a2df71f4 100644 --- a/ethcore/spec/Cargo.toml +++ b/ethcore/spec/Cargo.toml @@ -25,7 +25,7 @@ hash-db = "0.15.0" instant-seal = { path = "../engines/instant-seal" } journaldb = { path = "../../util/journaldb" } keccak-hash = "0.4.0" -kvdb-memorydb = "0.2.0" +kvdb-memorydb = "0.3.1" log = "0.4.8" machine = { path = "../machine" } null-engine = { path = "../engines/null-engine" } diff --git a/ethcore/state-db/Cargo.toml b/ethcore/state-db/Cargo.toml index d23eafcec47..1cd738e13c1 100644 --- a/ethcore/state-db/Cargo.toml +++ b/ethcore/state-db/Cargo.toml @@ -16,7 +16,7 @@ hash-db = "0.15.0" keccak-hash = "0.4.0" keccak-hasher = { path = "../../util/keccak-hasher" } journaldb = { path = "../../util/journaldb" } -kvdb = "0.2" +kvdb = "0.3.1" log = "0.4.6" lru-cache = "0.1.2" memory-cache = { path = "../../util/memory-cache" } diff --git a/ethcore/sync/Cargo.toml b/ethcore/sync/Cargo.toml index 3e458ced835..14e1d758bf7 100644 --- a/ethcore/sync/Cargo.toml +++ b/ethcore/sync/Cargo.toml @@ -40,7 +40,7 @@ env_logger = "0.5" engine = { path = "../engine" } ethcore = { path = "..", features = ["test-helpers"] } ethcore-io = { path = "../../util/io", features = ["mio"] } -kvdb-memorydb = "0.2.0" +kvdb-memorydb = "0.3.1" machine = { path = "../machine" } rand_xorshift = "0.2" rustc-hex = "1.0" diff --git a/ethcore/trace/Cargo.toml b/ethcore/trace/Cargo.toml index 656070c99d4..ddfd2080116 100644 --- a/ethcore/trace/Cargo.toml +++ b/ethcore/trace/Cargo.toml @@ -11,7 +11,7 @@ ethcore-blockchain = { path = "../blockchain" } ethcore-db = { path = "../db" } ethereum-types = "0.8.0" evm = { path = "../evm" } -kvdb = "0.2" +kvdb = "0.3.1" log = "0.4" parity-bytes = "0.1.0" parity-util-mem = "0.3.0" diff --git a/miner/local-store/Cargo.toml b/miner/local-store/Cargo.toml index 806926ef0ef..10ce145175b 100644 --- a/miner/local-store/Cargo.toml +++ b/miner/local-store/Cargo.toml @@ -8,7 +8,7 @@ edition = "2018" [dependencies] common-types = { path = "../../ethcore/types" } ethcore-io = { path = "../../util/io" } -kvdb = "0.2" +kvdb = "0.3.1" log = "0.4" rlp = "0.4.0" serde = "1.0" @@ -18,4 +18,4 @@ serde_json = "1.0" [dev-dependencies] ethkey = { path = "../../accounts/ethkey" } parity-crypto = { version = "0.4.2", features = ["publickey"] } -kvdb-memorydb = "0.2.0" +kvdb-memorydb = "0.3.1" diff --git a/secret-store/Cargo.toml b/secret-store/Cargo.toml index 609e5ff62c3..2c19907a582 100644 --- a/secret-store/Cargo.toml +++ b/secret-store/Cargo.toml @@ -15,8 +15,8 @@ ethkey = { path = "../accounts/ethkey", optional = true } futures = "0.1" hyper = { version = "0.12", default-features = false } keccak-hash = "0.4.0" -kvdb = "0.2" -kvdb-rocksdb = "0.3.0" +kvdb = "0.3.1" +kvdb-rocksdb = "0.4.1" lazy_static = "1.0" log = "0.4" parity-bytes = "0.1" @@ -38,4 +38,4 @@ jsonrpc-server-utils = "14.0.3" [dev-dependencies] env_logger = "0.5" tempdir = "0.3" -kvdb-rocksdb = "0.3.0" +kvdb-rocksdb = "0.4.1" diff --git a/util/journaldb/Cargo.toml b/util/journaldb/Cargo.toml index 59d2d13973d..a6b74952ba8 100644 --- a/util/journaldb/Cargo.toml +++ b/util/journaldb/Cargo.toml @@ -12,7 +12,7 @@ ethereum-types = "0.8.0" hash-db = "0.15.0" malloc_size_of = { version = "0.3.0", package = "parity-util-mem" } keccak-hasher = { path = "../keccak-hasher" } -kvdb = "0.2" +kvdb = "0.3.1" log = "0.4" memory-db = "0.18.0" parking_lot = "0.9" @@ -22,4 +22,4 @@ rlp = "0.4.0" [dev-dependencies] env_logger = "0.5" keccak-hash = "0.4.0" -kvdb-memorydb = "0.2.0" +kvdb-memorydb = "0.3.1" diff --git a/util/migration-rocksdb/Cargo.toml b/util/migration-rocksdb/Cargo.toml index a6d3c3c620b..3854f424430 100644 --- a/util/migration-rocksdb/Cargo.toml +++ b/util/migration-rocksdb/Cargo.toml @@ -6,8 +6,8 @@ authors = ["Parity Technologies "] [dependencies] log = "0.4" macros = { path = "../macros" } -kvdb = "0.2" -kvdb-rocksdb = "0.3.0" +kvdb = "0.3.1" +kvdb-rocksdb = "0.4.1" [dev-dependencies] tempdir = "0.3" From 1b96f9829689dd69c60d61bdfac02a581bc73e78 Mon Sep 17 00:00:00 2001 From: Niklas Adolfsson Date: Mon, 3 Feb 2020 23:26:43 +0100 Subject: [PATCH 08/11] chore: remove unused dependencies (#11432) * fix: compiler warnings * chore: remove unused dependencies --- Cargo.lock | 1 - ethcore/account-state/Cargo.toml | 1 - ethcore/builtin/Cargo.toml | 2 +- ethcore/engines/validator-set/src/contract.rs | 2 +- ethcore/sync/src/light_sync/sync_round.rs | 2 +- ipfs/Cargo.toml | 1 - util/EIP-152/Cargo.toml | 2 +- 7 files changed, 4 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index beadfb1f248..37fc15d7e6b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -36,7 +36,6 @@ dependencies = [ "rlp 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "rlp_compress 0.1.0", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", - "trace 0.1.0", "trie-db 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)", "trie-vm-factories 0.1.0", ] diff --git a/ethcore/account-state/Cargo.toml b/ethcore/account-state/Cargo.toml index 4aa43f60418..264864e2951 100644 --- a/ethcore/account-state/Cargo.toml +++ b/ethcore/account-state/Cargo.toml @@ -26,7 +26,6 @@ parking_lot = "0.9" pod = { path = "../pod" } rlp = "0.4.0" serde = { version = "1.0", features = ["derive"] } -trace = { path = "../trace" } trie-db = "0.18.0" [dev-dependencies] diff --git a/ethcore/builtin/Cargo.toml b/ethcore/builtin/Cargo.toml index d36a3e7620d..0ce7f315e99 100644 --- a/ethcore/builtin/Cargo.toml +++ b/ethcore/builtin/Cargo.toml @@ -14,10 +14,10 @@ ethereum-types = "0.8.0" ethjson = { path = "../../json" } keccak-hash = "0.4.0" log = "0.4" -macros = { path = "../../util/macros" } num = { version = "0.1", default-features = false, features = ["bigint"] } parity-bytes = "0.1" parity-crypto = { version = "0.4.2", features = ["publickey"] } [dev-dependencies] hex-literal = "0.2.1" +macros = { path = "../../util/macros" } diff --git a/ethcore/engines/validator-set/src/contract.rs b/ethcore/engines/validator-set/src/contract.rs index 6821889f648..bcc2fd176cb 100644 --- a/ethcore/engines/validator-set/src/contract.rs +++ b/ethcore/engines/validator-set/src/contract.rs @@ -22,7 +22,7 @@ use std::sync::Weak; use parity_bytes::Bytes; use ethabi_contract::use_contract; use ethereum_types::{H256, U256, Address}; -use log::{info, warn, trace}; +use log::{warn, trace}; use machine::Machine; use parking_lot::RwLock; use common_types::{ diff --git a/ethcore/sync/src/light_sync/sync_round.rs b/ethcore/sync/src/light_sync/sync_round.rs index d6bcea21422..2ec2973337e 100644 --- a/ethcore/sync/src/light_sync/sync_round.rs +++ b/ethcore/sync/src/light_sync/sync_round.rs @@ -234,7 +234,7 @@ impl Fetcher { } // state transition not triggered until drain is finished. - (SyncRound::Fetch(self)) + SyncRound::Fetch(self) } } } diff --git a/ipfs/Cargo.toml b/ipfs/Cargo.toml index adb42f9e5a0..4d35547aa17 100644 --- a/ipfs/Cargo.toml +++ b/ipfs/Cargo.toml @@ -9,7 +9,6 @@ edition = "2018" [dependencies] client-traits = { path = "../ethcore/client-traits" } common-types = { path = "../ethcore/types" } -ethcore = { path = "../ethcore" } bytes = { package = "parity-bytes", version = "0.1"} ethereum-types = "0.8.0" jsonrpc-core = "14.0.3" diff --git a/util/EIP-152/Cargo.toml b/util/EIP-152/Cargo.toml index fb474919fd0..1f7131fe452 100644 --- a/util/EIP-152/Cargo.toml +++ b/util/EIP-152/Cargo.toml @@ -11,11 +11,11 @@ license = "GPL-3.0" edition = "2018" [dependencies] -rustc-hex = "2.0.1" arrayref = "0.3.5" [dev-dependencies] criterion = "0.3" +rustc-hex = "2.0.1" [[bench]] name = "bench" From e4a4a3cb55a052a41da856d7c7112abb51a4dd07 Mon Sep 17 00:00:00 2001 From: Andronik Ordian Date: Tue, 4 Feb 2020 17:35:48 +0100 Subject: [PATCH 09/11] rlp_derive: cleanup (#11446) * rlp_derive: update syn & co * rlp_derive: remove dummy_const * rlp_derive: remove unused attirubutes * rlp-derive: change authors --- Cargo.lock | 6 ++--- util/rlp-derive/Cargo.toml | 9 ++++--- util/rlp-derive/src/de.rs | 28 +++++++++++++-------- util/rlp-derive/src/en.rs | 49 +++++++++++++++++++++++------------- util/rlp-derive/src/lib.rs | 10 +++----- util/rlp-derive/tests/rlp.rs | 15 +++-------- 6 files changed, 64 insertions(+), 53 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 37fc15d7e6b..593723e0df6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4078,10 +4078,10 @@ dependencies = [ name = "rlp_derive" version = "0.1.0" dependencies = [ - "proc-macro2 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "rlp 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] diff --git a/util/rlp-derive/Cargo.toml b/util/rlp-derive/Cargo.toml index ba5fb984f30..878b8016740 100644 --- a/util/rlp-derive/Cargo.toml +++ b/util/rlp-derive/Cargo.toml @@ -1,16 +1,17 @@ [package] name = "rlp_derive" version = "0.1.0" -authors = ["debris "] +authors = ["Parity Technologies "] +edition = "2018" [lib] name = "rlp_derive" proc-macro = true [dependencies] -syn = "0.15" -quote = "0.6" -proc-macro2 = "0.4" +syn = "1.0.14" +quote = "1.0.2" +proc-macro2 = "1.0.8" [dev-dependencies] rlp = "0.4.0" diff --git a/util/rlp-derive/src/de.rs b/util/rlp-derive/src/de.rs index b59d310e373..b35ece3f97e 100644 --- a/util/rlp-derive/src/de.rs +++ b/util/rlp-derive/src/de.rs @@ -14,8 +14,8 @@ // You should have received a copy of the GNU General Public License // along with Parity Ethereum. If not, see . -use syn; -use proc_macro2::{TokenStream, Span}; +use proc_macro2::TokenStream; +use quote::quote; struct ParseQuotes { single: TokenStream, @@ -45,10 +45,14 @@ pub fn impl_decodable(ast: &syn::DeriveInput) -> TokenStream { _ => panic!("#[derive(RlpDecodable)] is only defined for structs."), }; - let stmts: Vec<_> = body.fields.iter().enumerate().map(decodable_field_map).collect(); + let stmts: Vec<_> = body + .fields + .iter() + .enumerate() + .map(decodable_field_map) + .collect(); let name = &ast.ident; - let dummy_const = syn::Ident::new(&format!("_IMPL_RLP_DECODABLE_FOR_{}", name), Span::call_site()); let impl_block = quote! { impl rlp::Decodable for #name { fn decode(rlp: &rlp::Rlp) -> Result { @@ -62,8 +66,7 @@ pub fn impl_decodable(ast: &syn::DeriveInput) -> TokenStream { }; quote! { - #[allow(non_upper_case_globals, unused_attributes, unused_qualifications)] - const #dummy_const: () = { + const _: () = { extern crate rlp; #impl_block }; @@ -88,7 +91,6 @@ pub fn impl_decodable_wrapper(ast: &syn::DeriveInput) -> TokenStream { let name = &ast.ident; - let dummy_const = syn::Ident::new(&format!("_IMPL_RLP_DECODABLE_FOR_{}", name), Span::call_site()); let impl_block = quote! { impl rlp::Decodable for #name { fn decode(rlp: &rlp::Rlp) -> Result { @@ -102,8 +104,7 @@ pub fn impl_decodable_wrapper(ast: &syn::DeriveInput) -> TokenStream { }; quote! { - #[allow(non_upper_case_globals, unused_attributes, unused_qualifications)] - const #dummy_const: () = { + const _: () = { extern crate rlp; #impl_block }; @@ -130,7 +131,12 @@ fn decodable_field(index: usize, field: &syn::Field, quotes: ParseQuotes) -> Tok match field.ty { syn::Type::Path(ref path) => { - let ident = &path.path.segments.first().expect("there must be at least 1 segment").value().ident; + let ident = &path + .path + .segments + .first() + .expect("there must be at least 1 segment") + .ident; if &ident.to_string() == "Vec" { if quotes.takes_index { quote! { #id: #list(#index)?, } @@ -144,7 +150,7 @@ fn decodable_field(index: usize, field: &syn::Field, quotes: ParseQuotes) -> Tok quote! { #id: #single()?, } } } - }, + } _ => panic!("rlp_derive not supported"), } } diff --git a/util/rlp-derive/src/en.rs b/util/rlp-derive/src/en.rs index 828ad6b0fa6..6bb22f8dcf0 100644 --- a/util/rlp-derive/src/en.rs +++ b/util/rlp-derive/src/en.rs @@ -14,8 +14,8 @@ // You should have received a copy of the GNU General Public License // along with Parity Ethereum. If not, see . -use syn; -use proc_macro2::{TokenStream, Span}; +use proc_macro2::TokenStream; +use quote::quote; pub fn impl_encodable(ast: &syn::DeriveInput) -> TokenStream { let body = match ast.data { @@ -23,12 +23,16 @@ pub fn impl_encodable(ast: &syn::DeriveInput) -> TokenStream { _ => panic!("#[derive(RlpEncodable)] is only defined for structs."), }; - let stmts: Vec<_> = body.fields.iter().enumerate().map(encodable_field_map).collect(); + let stmts: Vec<_> = body + .fields + .iter() + .enumerate() + .map(encodable_field_map) + .collect(); let name = &ast.ident; let stmts_len = stmts.len(); let stmts_len = quote! { #stmts_len }; - let dummy_const = syn::Ident::new(&format!("_IMPL_RLP_ENCODABLE_FOR_{}", name), Span::call_site()); let impl_block = quote! { impl rlp::Encodable for #name { fn rlp_append(&self, stream: &mut rlp::RlpStream) { @@ -39,8 +43,7 @@ pub fn impl_encodable(ast: &syn::DeriveInput) -> TokenStream { }; quote! { - #[allow(non_upper_case_globals, unused_attributes, unused_qualifications)] - const #dummy_const: () = { + const _: () = { extern crate rlp; #impl_block }; @@ -65,7 +68,6 @@ pub fn impl_encodable_wrapper(ast: &syn::DeriveInput) -> TokenStream { let name = &ast.ident; - let dummy_const = syn::Ident::new(&format!("_IMPL_RLP_ENCODABLE_FOR_{}", name), Span::call_site()); let impl_block = quote! { impl rlp::Encodable for #name { fn rlp_append(&self, stream: &mut rlp::RlpStream) { @@ -75,8 +77,7 @@ pub fn impl_encodable_wrapper(ast: &syn::DeriveInput) -> TokenStream { }; quote! { - #[allow(non_upper_case_globals, unused_attributes, unused_qualifications)] - const #dummy_const: () = { + const _: () = { extern crate rlp; #impl_block }; @@ -100,24 +101,38 @@ fn encodable_field(index: usize, field: &syn::Field) -> TokenStream { match field.ty { syn::Type::Path(ref path) => { - let top_segment = path.path.segments.first().expect("there must be at least 1 segment"); - let ident = &top_segment.value().ident; + let top_segment = path + .path + .segments + .first() + .expect("there must be at least 1 segment"); + let ident = &top_segment.ident; if &ident.to_string() == "Vec" { - let inner_ident = match top_segment.value().arguments { + let inner_ident = match top_segment.arguments { syn::PathArguments::AngleBracketed(ref angle) => { - let ty = angle.args.first().expect("Vec has only one angle bracketed type; qed"); - match **ty.value() { - syn::GenericArgument::Type(syn::Type::Path(ref path)) => &path.path.segments.first().expect("there must be at least 1 segment").value().ident, + let ty = angle + .args + .first() + .expect("Vec has only one angle bracketed type; qed"); + match *ty { + syn::GenericArgument::Type(syn::Type::Path(ref path)) => { + &path + .path + .segments + .first() + .expect("there must be at least 1 segment") + .ident + } _ => panic!("rlp_derive not supported"), } - }, + } _ => unreachable!("Vec has only one angle bracketed type; qed"), }; quote! { stream.append_list::<#inner_ident, _>(&#id); } } else { quote! { stream.append(&#id); } } - }, + } _ => panic!("rlp_derive not supported"), } } diff --git a/util/rlp-derive/src/lib.rs b/util/rlp-derive/src/lib.rs index 15757ffd6a2..09d29d25050 100644 --- a/util/rlp-derive/src/lib.rs +++ b/util/rlp-derive/src/lib.rs @@ -15,17 +15,13 @@ // along with Parity Ethereum. If not, see . extern crate proc_macro; -extern crate proc_macro2; -extern crate syn; -#[macro_use] -extern crate quote; -mod en; mod de; +mod en; -use proc_macro::TokenStream; -use en::{impl_encodable, impl_encodable_wrapper}; use de::{impl_decodable, impl_decodable_wrapper}; +use en::{impl_encodable, impl_encodable_wrapper}; +use proc_macro::TokenStream; #[proc_macro_derive(RlpEncodable)] pub fn encodable(input: TokenStream) -> TokenStream { diff --git a/util/rlp-derive/tests/rlp.rs b/util/rlp-derive/tests/rlp.rs index 0e78c169e38..f3889ed18fe 100644 --- a/util/rlp-derive/tests/rlp.rs +++ b/util/rlp-derive/tests/rlp.rs @@ -14,11 +14,8 @@ // You should have received a copy of the GNU General Public License // along with Parity Ethereum. If not, see . -extern crate rlp; -#[macro_use] -extern crate rlp_derive; - -use rlp::{encode, decode}; +use rlp::{decode, encode}; +use rlp_derive::{RlpDecodable, RlpDecodableWrapper, RlpEncodable, RlpEncodableWrapper}; #[derive(Debug, PartialEq, RlpEncodable, RlpDecodable)] struct Foo { @@ -32,9 +29,7 @@ struct FooWrapper { #[test] fn test_encode_foo() { - let foo = Foo { - a: "cat".into(), - }; + let foo = Foo { a: "cat".into() }; let expected = vec![0xc4, 0x83, b'c', b'a', b't']; let out = encode(&foo); @@ -46,9 +41,7 @@ fn test_encode_foo() { #[test] fn test_encode_foo_wrapper() { - let foo = FooWrapper { - a: "cat".into(), - }; + let foo = FooWrapper { a: "cat".into() }; let expected = vec![0x83, b'c', b'a', b't']; let out = encode(&foo); From edf59a139422d79d9428adaa0688fe1052d06a10 Mon Sep 17 00:00:00 2001 From: Andronik Ordian Date: Tue, 4 Feb 2020 20:54:29 +0100 Subject: [PATCH 10/11] Cargo.lock: cargo update -p kvdb-rocksdb (#11447) --- Cargo.lock | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 593723e0df6..4e709a20283 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1120,7 +1120,7 @@ dependencies = [ "keccak-hash 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb-memorydb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb-rocksdb 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb-rocksdb 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "machine 0.1.0", @@ -1488,7 +1488,7 @@ dependencies = [ "jsonrpc-server-utils 14.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "keccak-hash 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb-rocksdb 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb-rocksdb 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-bytes 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1523,7 +1523,7 @@ dependencies = [ "ethcore-sync 1.12.0", "ethereum-types 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb-rocksdb 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb-rocksdb 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "snapshot 0.1.0", "spec 0.1.0", @@ -2479,7 +2479,7 @@ dependencies = [ [[package]] name = "kvdb-rocksdb" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fs-swap 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2713,7 +2713,7 @@ name = "migration-rocksdb" version = "0.1.0" dependencies = [ "kvdb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb-rocksdb 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb-rocksdb 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "macros 0.1.0", "tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3098,7 +3098,7 @@ dependencies = [ "jsonrpc-core 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "keccak-hash 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb-rocksdb 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb-rocksdb 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "migration-rocksdb 0.1.0", "node-filter 1.12.0", @@ -4395,7 +4395,7 @@ dependencies = [ "keccak-hash 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "keccak-hasher 0.1.1", "kvdb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb-rocksdb 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb-rocksdb 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4441,7 +4441,7 @@ dependencies = [ "keccak-hash 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "keccak-hasher 0.1.1", "kvdb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb-rocksdb 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb-rocksdb 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-bytes 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5751,7 +5751,7 @@ dependencies = [ "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" "checksum kvdb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8396be0e5561ccd1bf7ff0b2007487cdd7a87a056873fe6ea906b35d4dbf7ed8" "checksum kvdb-memorydb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4d25ef14155e418515c4839e9144c839de3506e68946f255a32b7f166095493d" -"checksum kvdb-rocksdb 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "af488cc16c3801705c8d681c3a32c8faa8fafc7fb5309dee0f573f3c6a19d395" +"checksum kvdb-rocksdb 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5a1053e90a54421a842b6bf5d0e4a5cb5364c0bf570f713c58e44a9906f501d9" "checksum lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" "checksum lazycell 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ddba4c30a78328befecec92fc94970e53b3ae385827d28620f0f5bb2493081e0" "checksum libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)" = "1a31a0627fdf1f6a39ec0dd577e101440b7db22672c0901fe00a9a6fbb5c24e8" From cf6fa63f55e0cddb77b5f7da41620e8723bc6bb9 Mon Sep 17 00:00:00 2001 From: David Date: Tue, 4 Feb 2020 20:59:16 +0100 Subject: [PATCH 11/11] Avoid long state queries when serving GetNodeData requests (#11444) * Remove dead bootnodes, add new geth bootnodes * More granular locking when fetching state Finish GetDataNode requests early if queries take too long * typo * Use latest kvdb-rocksdb * Cleanup * Update ethcore/sync/src/chain/supplier.rs Co-Authored-By: Andronik Ordian * Address review grumbles * Fix compilation * Address review grumbles Co-authored-by: Andronik Ordian --- ethcore/sync/src/chain/mod.rs | 5 +++++ ethcore/sync/src/chain/supplier.rs | 28 ++++++++++++++++++++------- util/journaldb/src/overlayrecentdb.rs | 20 +++++++++++++++---- util/network-devp2p/src/connection.rs | 12 ++++++------ 4 files changed, 48 insertions(+), 17 deletions(-) diff --git a/ethcore/sync/src/chain/mod.rs b/ethcore/sync/src/chain/mod.rs index 8f9e296c036..2b506c04f2e 100644 --- a/ethcore/sync/src/chain/mod.rs +++ b/ethcore/sync/src/chain/mod.rs @@ -162,7 +162,12 @@ pub const PAR_PROTOCOL_VERSION_4: (u8, u8) = (4, 0x20); pub const MAX_BODIES_TO_SEND: usize = 256; pub const MAX_HEADERS_TO_SEND: usize = 512; +/// Maximum number of "entries" to include in a GetDataNode request. pub const MAX_NODE_DATA_TO_SEND: usize = 1024; +/// Maximum allowed duration for serving a batch GetNodeData request. +const MAX_NODE_DATA_TOTAL_DURATION: Duration = Duration::from_secs(2); +/// Maximum allowed duration for serving a single GetNodeData request. +const MAX_NODE_DATA_SINGLE_DURATION: Duration = Duration::from_millis(100); pub const MAX_RECEIPTS_HEADERS_TO_SEND: usize = 256; const MIN_PEERS_PROPAGATION: usize = 4; const MAX_PEERS_PROPAGATION: usize = 128; diff --git a/ethcore/sync/src/chain/supplier.rs b/ethcore/sync/src/chain/supplier.rs index 43e1148fc1e..6596506ed71 100644 --- a/ethcore/sync/src/chain/supplier.rs +++ b/ethcore/sync/src/chain/supplier.rs @@ -15,13 +15,14 @@ // along with Parity Ethereum. If not, see . use std::cmp; +use std::time::{Duration, Instant}; use crate::sync_io::SyncIo; use bytes::Bytes; use enum_primitive::FromPrimitive; use ethereum_types::H256; -use log::{debug, trace}; +use log::{debug, trace, warn}; use network::{self, PeerId}; use parking_lot::RwLock; use rlp::{Rlp, RlpStream}; @@ -56,6 +57,8 @@ use super::{ MAX_BODIES_TO_SEND, MAX_HEADERS_TO_SEND, MAX_NODE_DATA_TO_SEND, + MAX_NODE_DATA_TOTAL_DURATION, + MAX_NODE_DATA_SINGLE_DURATION, MAX_RECEIPTS_HEADERS_TO_SEND, }; @@ -258,9 +261,9 @@ impl SyncSupplier { /// Respond to GetNodeData request fn return_node_data(io: &dyn SyncIo, r: &Rlp, peer_id: PeerId) -> RlpResponseResult { - let payload_soft_limit = io.payload_soft_limit(); + let payload_soft_limit = io.payload_soft_limit(); // 4Mb let mut count = r.item_count().unwrap_or(0); - trace!(target: "sync", "{} -> GetNodeData: {} entries", peer_id, count); + trace!(target: "sync", "{} -> GetNodeData: {} entries requested", peer_id, count); if count == 0 { debug!(target: "sync", "Empty GetNodeData request, ignoring."); return Ok(None); @@ -269,10 +272,20 @@ impl SyncSupplier { let mut added = 0usize; let mut data = Vec::new(); let mut total_bytes = 0; + let mut total_elpsd = Duration::from_secs(0); for i in 0..count { - if let Some(node) = io.chain().state_data(&r.val_at::(i)?) { + let hash = &r.val_at(i)?; + let elpsd = Instant::now(); + let state = io.chain().state_data(hash); + + total_elpsd += elpsd.elapsed(); + if elpsd.elapsed() > MAX_NODE_DATA_SINGLE_DURATION || total_elpsd > MAX_NODE_DATA_TOTAL_DURATION { + warn!(target: "sync", "{} -> GetNodeData: item {}/{} – slow state fetch for hash {:?}; took {:?}", + peer_id, i, count, hash, elpsd); + break; + } + if let Some(node) = state { total_bytes += node.len(); - // Check that the packet won't be oversized if total_bytes > payload_soft_limit { break; } @@ -280,7 +293,8 @@ impl SyncSupplier { added += 1; } } - trace!(target: "sync", "{} -> GetNodeData: return {} entries", peer_id, added); + trace!(target: "sync", "{} -> GetNodeData: returning {}/{} entries ({} bytes total in {:?})", + peer_id, added, count, total_bytes, total_elpsd); let mut rlp = RlpStream::new_list(added); for d in data { rlp.append(&d); @@ -540,7 +554,7 @@ mod test { let rlp_result = result.unwrap(); assert!(rlp_result.is_some()); - // the length of one rlp-encoded hashe + // the length of one rlp-encoded hash let rlp = rlp_result.unwrap().1.out(); let rlp = Rlp::new(&rlp); assert_eq!(Ok(1), rlp.item_count()); diff --git a/util/journaldb/src/overlayrecentdb.rs b/util/journaldb/src/overlayrecentdb.rs index ed4c5bb25bc..8f17637708b 100644 --- a/util/journaldb/src/overlayrecentdb.rs +++ b/util/journaldb/src/overlayrecentdb.rs @@ -20,6 +20,7 @@ use std::{ collections::{HashMap, hash_map::Entry}, io, sync::Arc, + time::Duration, }; use ethereum_types::H256; @@ -279,11 +280,22 @@ impl JournalDB for OverlayRecentDB { fn earliest_era(&self) -> Option { self.journal_overlay.read().earliest_era } fn state(&self, key: &H256) -> Option { - let journal_overlay = self.journal_overlay.read(); let key = to_short_key(key); - journal_overlay.backing_overlay.get(&key, EMPTY_PREFIX) - .or_else(|| journal_overlay.pending_overlay.get(&key).map(|d| d.clone())) - .or_else(|| self.backing.get_by_prefix(self.column, &key[0..DB_PREFIX_LEN]).map(|b| b.to_vec())) + // Hold the read lock for shortest possible amount of time. + let maybe_state_data = { + let journal_overlay = self.journal_overlay.read(); + journal_overlay + .backing_overlay + .get(&key, EMPTY_PREFIX) + .or_else(|| journal_overlay.pending_overlay.get(&key).map(|d| d.clone())) + }; + + maybe_state_data.or_else(|| { + let pkey = &key[..DB_PREFIX_LEN]; + self.backing + .get_by_prefix(self.column, &pkey) + .map(|b| b.to_vec()) + }) } fn journal_under(&mut self, batch: &mut DBTransaction, now: u64, id: &H256) -> io::Result { diff --git a/util/network-devp2p/src/connection.rs b/util/network-devp2p/src/connection.rs index 0ddeb3737dd..2f88efb2d09 100644 --- a/util/network-devp2p/src/connection.rs +++ b/util/network-devp2p/src/connection.rs @@ -40,11 +40,11 @@ use crate::handshake::Handshake; const ENCRYPTED_HEADER_LEN: usize = 32; const RECEIVE_PAYLOAD: Duration = Duration::from_secs(30); -pub const MAX_PAYLOAD_SIZE: usize = (1 << 24) - 1; +pub const MAX_PAYLOAD_SIZE: usize = (1 << 24) - 1; // 16Mb /// Network responses should try not to go over this limit. /// This should be lower than MAX_PAYLOAD_SIZE -pub const PAYLOAD_SOFT_LIMIT: usize = (1 << 22) - 1; +pub const PAYLOAD_SOFT_LIMIT: usize = (1 << 22) - 1; // 4Mb pub trait GenericSocket : Read + Write { } @@ -97,7 +97,7 @@ impl GenericConnection { else if self.rec_buf.len() > self.rec_size { warn!(target:"network", "Read past buffer {} bytes", self.rec_buf.len() - self.rec_size); return Ok(Some(::std::mem::replace(&mut self.rec_buf, Bytes::new()))) - } + } }, Ok(_) => return Ok(None), Err(e) => { @@ -105,7 +105,7 @@ impl GenericConnection { return Err(e) } } - } + } } /// Add a packet to send queue. @@ -222,7 +222,7 @@ impl Connection { pub fn register_socket(&self, reg: Token, event_loop: &mut EventLoop) -> io::Result<()> { if self.registered.compare_and_swap(false, true, AtomicOrdering::SeqCst) { return Ok(()); - } + } trace!(target: "network", "connection register; token={:?}", reg); if let Err(e) = event_loop.register(&self.socket, reg, self.interest, PollOpt::edge() /* | PollOpt::oneshot() */) { // TODO: oneshot is broken on windows trace!(target: "network", "Failed to register {:?}, {:?}", reg, e); @@ -235,7 +235,7 @@ impl Connection { trace!(target: "network", "connection reregister; token={:?}", reg); if !self.registered.load(AtomicOrdering::SeqCst) { self.register_socket(reg, event_loop) - } else { + } else { event_loop.reregister(&self.socket, reg, self.interest, PollOpt::edge() /* | PollOpt::oneshot() */ ).unwrap_or_else(|e| { // TODO: oneshot is broken on windows trace!(target: "network", "Failed to reregister {:?}, {:?}", reg, e); });