Move the substate module into ethcore/executive (#10867)

* substate is not a part of account-state

* fn cleanup_mode is a part of executive.rs

* test_cleanup_mode
This commit is contained in:
Marek Kotewicz 2019-07-10 10:55:37 +02:00 committed by Andronik Ordian
parent f53c3e582c
commit 34cdeac2a6
17 changed files with 67 additions and 43 deletions

3
Cargo.lock generated
View File

@ -20,7 +20,6 @@ dependencies = [
"common-types 0.1.0", "common-types 0.1.0",
"derive_more 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "derive_more 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)",
"ethereum-types 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", "ethereum-types 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
"evm 0.1.0",
"hash-db 0.12.4 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.12.4 (registry+https://github.com/rust-lang/crates.io-index)",
"journaldb 0.2.0", "journaldb 0.2.0",
"keccak-hash 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "keccak-hash 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
@ -40,7 +39,6 @@ dependencies = [
"trace 0.1.0", "trace 0.1.0",
"trie-db 0.12.4 (registry+https://github.com/rust-lang/crates.io-index)", "trie-db 0.12.4 (registry+https://github.com/rust-lang/crates.io-index)",
"trie-vm-factories 0.1.0", "trie-vm-factories 0.1.0",
"vm 0.1.0",
] ]
[[package]] [[package]]
@ -2882,7 +2880,6 @@ dependencies = [
"parity-updater 1.12.0", "parity-updater 1.12.0",
"parity-version 2.7.0", "parity-version 2.7.0",
"parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
"patricia-trie-ethereum 0.1.0",
"pretty_assertions 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "pretty_assertions 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
"rand 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)",
"rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",

View File

@ -10,7 +10,6 @@ common-types = { path = "../types"}
derive_more = "0.15.0" derive_more = "0.15.0"
ethereum-types = "0.6.0" ethereum-types = "0.6.0"
ethtrie = { package = "patricia-trie-ethereum", path = "../../util/patricia-trie-ethereum" } ethtrie = { package = "patricia-trie-ethereum", path = "../../util/patricia-trie-ethereum" }
evm = { path = "../evm" }
trie-vm-factories = { path = "../trie-vm-factories" } trie-vm-factories = { path = "../trie-vm-factories" }
hash-db = "0.12.4" hash-db = "0.12.4"
journaldb = { path = "../../util/journaldb" } journaldb = { path = "../../util/journaldb" }
@ -28,7 +27,6 @@ rlp = "0.4.0"
serde = { version = "1.0", features = ["derive"] } serde = { version = "1.0", features = ["derive"] }
trace = { path = "../trace" } trace = { path = "../trace" }
trie-db = "0.12.4" trie-db = "0.12.4"
vm = { path = "../vm" }
[dev-dependencies] [dev-dependencies]
account-db = { path = "../account-db" } account-db = { path = "../account-db" }

View File

@ -24,7 +24,6 @@
pub mod account; pub mod account;
pub mod backend; pub mod backend;
pub mod substate;
pub mod state; pub mod state;
pub mod error; pub mod error;
@ -32,6 +31,5 @@ pub use {
account::Account, account::Account,
backend::Backend, backend::Backend,
error::Error, error::Error,
substate::Substate,
state::{State, CleanupMode}, state::{State, CleanupMode},
}; };

View File

@ -218,7 +218,7 @@ enum RequireCache {
} }
/// Mode of dealing with null accounts. /// Mode of dealing with null accounts.
#[derive(PartialEq)] #[derive(Debug, PartialEq)]
pub enum CleanupMode<'a> { pub enum CleanupMode<'a> {
/// Create accounts which would be null. /// Create accounts which would be null.
ForceCreate, ForceCreate,

View File

@ -28,7 +28,8 @@ use trie_vm_factories::Factories;
use evm::{VMType, FinalizationResult}; use evm::{VMType, FinalizationResult};
use vm::{self, ActionParams}; use vm::{self, ActionParams};
use ethtrie; use ethtrie;
use account_state::{CleanupMode, Substate, State}; use account_state::{CleanupMode, State};
use substate::Substate;
use executive_state::ExecutiveState; use executive_state::ExecutiveState;

View File

@ -21,7 +21,8 @@ use std::sync::Arc;
use hash::keccak; use hash::keccak;
use ethereum_types::{H256, U256, U512, Address}; use ethereum_types::{H256, U256, U512, Address};
use bytes::{Bytes, BytesRef}; use bytes::{Bytes, BytesRef};
use account_state::{Backend as StateBackend, State, Substate, CleanupMode}; use account_state::{Backend as StateBackend, State, CleanupMode};
use substate::Substate;
use executed::ExecutionError; use executed::ExecutionError;
use machine::Machine; use machine::Machine;
use evm::{CallType, Finalize, FinalizationResult}; use evm::{CallType, Finalize, FinalizationResult};
@ -106,6 +107,15 @@ pub fn into_contract_create_result(result: vm::Result<FinalizationResult>, addre
} }
} }
/// Get the cleanup mode object from this.
pub fn cleanup_mode<'a>(substate: &'a mut Substate, schedule: &Schedule) -> CleanupMode<'a> {
match (schedule.kill_dust != CleanDustMode::Off, schedule.no_empty, schedule.kill_empty) {
(false, false, _) => CleanupMode::ForceCreate,
(false, true, false) => CleanupMode::NoEmpty,
(false, true, true) | (true, _, _,) => CleanupMode::TrackTouched(&mut substate.touched),
}
}
/// Transaction execution options. /// Transaction execution options.
#[derive(Copy, Clone, PartialEq)] #[derive(Copy, Clone, PartialEq)]
pub struct TransactOptions<T, V> { pub struct TransactOptions<T, V> {
@ -302,7 +312,7 @@ impl<'a> CallCreateExecutive<'a> {
fn transfer_exec_balance<B: 'a + StateBackend>(params: &ActionParams, schedule: &Schedule, state: &mut State<B>, substate: &mut Substate) -> vm::Result<()> { fn transfer_exec_balance<B: 'a + StateBackend>(params: &ActionParams, schedule: &Schedule, state: &mut State<B>, substate: &mut Substate) -> vm::Result<()> {
if let ActionValue::Transfer(val) = params.value { if let ActionValue::Transfer(val) = params.value {
state.transfer_balance(&params.sender, &params.address, &val, substate.to_cleanup_mode(&schedule))?; state.transfer_balance(&params.sender, &params.address, &val, cleanup_mode(substate, &schedule))?;
} }
Ok(()) Ok(())
@ -312,7 +322,7 @@ impl<'a> CallCreateExecutive<'a> {
let nonce_offset = if schedule.no_empty { 1 } else { 0 }.into(); let nonce_offset = if schedule.no_empty { 1 } else { 0 }.into();
let prev_bal = state.balance(&params.address)?; let prev_bal = state.balance(&params.address)?;
if let ActionValue::Transfer(val) = params.value { if let ActionValue::Transfer(val) = params.value {
state.sub_balance(&params.sender, &val, &mut substate.to_cleanup_mode(&schedule))?; state.sub_balance(&params.sender, &val, &mut cleanup_mode(substate, &schedule))?;
state.new_contract(&params.address, val.saturating_add(prev_bal), nonce_offset, params.code_version)?; state.new_contract(&params.address, val.saturating_add(prev_bal), nonce_offset, params.code_version)?;
} else { } else {
state.new_contract(&params.address, prev_bal, nonce_offset, params.code_version)?; state.new_contract(&params.address, prev_bal, nonce_offset, params.code_version)?;
@ -865,7 +875,11 @@ impl<'a, B: 'a + StateBackend> Executive<'a, B> {
if !schedule.keep_unsigned_nonce || !t.is_unsigned() { if !schedule.keep_unsigned_nonce || !t.is_unsigned() {
self.state.inc_nonce(&sender)?; self.state.inc_nonce(&sender)?;
} }
self.state.sub_balance(&sender, &U256::try_from(gas_cost).expect("Total cost (value + gas_cost) is lower than max allowed balance (U256); gas_cost has to fit U256; qed"), &mut substate.to_cleanup_mode(&schedule))?; self.state.sub_balance(
&sender,
&U256::try_from(gas_cost).expect("Total cost (value + gas_cost) is lower than max allowed balance (U256); gas_cost has to fit U256; qed"),
&mut cleanup_mode(&mut substate, &schedule)
)?;
let (result, output) = match t.action { let (result, output) = match t.action {
Action::Create => { Action::Create => {
@ -1142,7 +1156,7 @@ impl<'a, B: 'a + StateBackend> Executive<'a, B> {
// Below: NoEmpty is safe since the sender must already be non-null to have sent this transaction // Below: NoEmpty is safe since the sender must already be non-null to have sent this transaction
self.state.add_balance(&sender, &refund_value, CleanupMode::NoEmpty)?; self.state.add_balance(&sender, &refund_value, CleanupMode::NoEmpty)?;
trace!("exec::finalize: Compensating author: fees_value={}, author={}\n", fees_value, &self.info.author); trace!("exec::finalize: Compensating author: fees_value={}, author={}\n", fees_value, &self.info.author);
self.state.add_balance(&self.info.author, &fees_value, substate.to_cleanup_mode(&schedule))?; self.state.add_balance(&self.info.author, &fees_value, cleanup_mode(&mut substate, &schedule))?;
// perform suicides // perform suicides
for address in &substate.suicides { for address in &substate.suicides {
@ -1194,6 +1208,7 @@ impl<'a, B: 'a + StateBackend> Executive<'a, B> {
mod tests { mod tests {
use std::sync::Arc; use std::sync::Arc;
use std::str::FromStr; use std::str::FromStr;
use std::collections::HashSet;
use rustc_hex::FromHex; use rustc_hex::FromHex;
use ethkey::{Generator, Random}; use ethkey::{Generator, Random};
use super::*; use super::*;
@ -1202,7 +1217,8 @@ mod tests {
use evm::{Factory, VMType}; use evm::{Factory, VMType};
use error::ExecutionError; use error::ExecutionError;
use machine::Machine; use machine::Machine;
use account_state::{Substate, CleanupMode}; use account_state::CleanupMode;
use substate::Substate;
use test_helpers::{get_temp_state_with_factory, get_temp_state}; use test_helpers::{get_temp_state_with_factory, get_temp_state};
use trace::trace; use trace::trace;
use trace::{FlatTrace, Tracer, NoopTracer, ExecutiveTracer}; use trace::{FlatTrace, Tracer, NoopTracer, ExecutiveTracer};
@ -1221,6 +1237,33 @@ mod tests {
machine machine
} }
#[test]
fn test_cleanup_mode() {
let address = Address::from_str("0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6").unwrap();
let mut touched = HashSet::new();
touched.insert(address);
let mut substate = Substate::default();
substate.touched = touched.clone();
assert_eq!(CleanupMode::ForceCreate, cleanup_mode(&mut substate, &Schedule::new_frontier()));
assert_eq!(CleanupMode::ForceCreate, cleanup_mode(&mut substate, &Schedule::new_homestead()));
assert_eq!(CleanupMode::TrackTouched(&mut touched), cleanup_mode(&mut substate, &Schedule::new_byzantium()));
assert_eq!(CleanupMode::TrackTouched(&mut touched), cleanup_mode(&mut substate, &Schedule::new_constantinople()));
assert_eq!(CleanupMode::TrackTouched(&mut touched), cleanup_mode(&mut substate, &{
let mut schedule = Schedule::new_homestead();
schedule.kill_dust = CleanDustMode::BasicOnly;
schedule
}));
assert_eq!(CleanupMode::NoEmpty, cleanup_mode(&mut substate, &{
let mut schedule = Schedule::new_homestead();
schedule.no_empty = true;
schedule
}));
}
#[test] #[test]
fn test_contract_address() { fn test_contract_address() {
let address = Address::from_str("0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6").unwrap(); let address = Address::from_str("0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6").unwrap();

View File

@ -19,7 +19,8 @@ use std::cmp;
use std::sync::Arc; use std::sync::Arc;
use ethereum_types::{H256, U256, Address, BigEndianHash}; use ethereum_types::{H256, U256, Address, BigEndianHash};
use bytes::Bytes; use bytes::Bytes;
use account_state::{Backend as StateBackend, State, Substate, CleanupMode}; use account_state::{Backend as StateBackend, State, CleanupMode};
use substate::Substate;
use machine::Machine; use machine::Machine;
use executive::*; use executive::*;
use vm::{ use vm::{
@ -388,7 +389,7 @@ impl<'a, T: 'a, V: 'a, B: 'a> Ext for Externalities<'a, T, V, B>
&address, &address,
refund_address, refund_address,
&balance, &balance,
self.substate.to_cleanup_mode(&self.schedule) cleanup_mode(&mut self.substate, &self.schedule)
)?; )?;
} }
@ -435,7 +436,8 @@ impl<'a, T: 'a, V: 'a, B: 'a> Ext for Externalities<'a, T, V, B>
mod tests { mod tests {
use ethereum_types::{U256, Address}; use ethereum_types::{U256, Address};
use evm::{EnvInfo, Ext, CallType}; use evm::{EnvInfo, Ext, CallType};
use account_state::{State, Substate}; use account_state::State;
use substate::Substate;
use test_helpers::get_temp_state; use test_helpers::get_temp_state;
use super::*; use super::*;
use trace::{NoopTracer, NoopVMTracer}; use trace::{NoopTracer, NoopVMTracer};

View File

@ -17,7 +17,8 @@
use std::path::Path; use std::path::Path;
use std::sync::Arc; use std::sync::Arc;
use super::test_common::*; use super::test_common::*;
use account_state::{Backend as StateBackend, State, Substate}; use account_state::{Backend as StateBackend, State};
use substate::Substate;
use executive::*; use executive::*;
use evm::{VMType, Finalize}; use evm::{VMType, Finalize};
use vm::{ use vm::{

View File

@ -164,6 +164,7 @@ pub mod spec;
pub mod verification; pub mod verification;
mod externalities; mod externalities;
mod substate;
mod transaction_ext; mod transaction_ext;
mod tx_filter; mod tx_filter;

View File

@ -35,7 +35,8 @@ use client::BlockInfo;
use error::Error; use error::Error;
use executive::Executive; use executive::Executive;
use spec::CommonParams; use spec::CommonParams;
use account_state::{CleanupMode, Substate}; use account_state::CleanupMode;
use substate::Substate;
use trace::{NoopTracer, NoopVMTracer}; use trace::{NoopTracer, NoopVMTracer};
use tx_filter::TransactionFilter; use tx_filter::TransactionFilter;

View File

@ -45,7 +45,8 @@ use machine::Machine;
use pod::PodState; use pod::PodState;
use spec::Genesis; use spec::Genesis;
use spec::seal::Generic as GenericSeal; use spec::seal::Generic as GenericSeal;
use account_state::{Backend, State, Substate, backend::Basic as BasicBackend}; use account_state::{Backend, State, backend::Basic as BasicBackend};
use substate::Substate;
use trace::{NoopTracer, NoopVMTracer}; use trace::{NoopTracer, NoopVMTracer};
pub use ethash::OptimizeFor; pub use ethash::OptimizeFor;

View File

@ -16,12 +16,8 @@
//! Execution environment substate. //! Execution environment substate.
use std::collections::HashSet; use std::collections::HashSet;
use common_types::log_entry::LogEntry;
use ethereum_types::Address; use ethereum_types::Address;
use evm::{CleanDustMode, Schedule}; use types::log_entry::LogEntry;
use crate::state::CleanupMode;
/// State changes which should be applied in finalize, /// State changes which should be applied in finalize,
/// after transaction is fully executed. /// after transaction is fully executed.
@ -57,21 +53,12 @@ impl Substate {
self.sstore_clears_refund += s.sstore_clears_refund; self.sstore_clears_refund += s.sstore_clears_refund;
self.contracts_created.extend(s.contracts_created); self.contracts_created.extend(s.contracts_created);
} }
/// Get the cleanup mode object from this.
pub fn to_cleanup_mode(&mut self, schedule: &Schedule) -> CleanupMode {
match (schedule.kill_dust != CleanDustMode::Off, schedule.no_empty, schedule.kill_empty) {
(false, false, _) => CleanupMode::ForceCreate,
(false, true, false) => CleanupMode::NoEmpty,
(false, true, true) | (true, _, _,) => CleanupMode::TrackTouched(&mut self.touched),
}
}
} }
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use common_types::log_entry::LogEntry;
use ethereum_types::Address; use ethereum_types::Address;
use types::log_entry::LogEntry;
use super::Substate; use super::Substate;
#[test] #[test]

View File

@ -21,7 +21,7 @@ use hash::keccak;
use vm::{EnvInfo, ActionParams, ActionValue, CallType, ParamsType}; use vm::{EnvInfo, ActionParams, ActionValue, CallType, ParamsType};
use evm::{Factory, VMType}; use evm::{Factory, VMType};
use executive::Executive; use executive::Executive;
use account_state::Substate; use substate::Substate;
use test_helpers::get_temp_state_with_factory; use test_helpers::get_temp_state_with_factory;
use trace::{NoopVMTracer, NoopTracer}; use trace::{NoopVMTracer, NoopTracer};
use types::transaction::SYSTEM_ADDRESS; use types::transaction::SYSTEM_ADDRESS;

View File

@ -25,7 +25,6 @@ use ethjson;
use pod::PodState; use pod::PodState;
use types::transaction; use types::transaction;
use vm::ActionParams; use vm::ActionParams;
use account_state::State;
/// VM execution informant /// VM execution informant
pub trait Informant: trace::VMTracer { pub trait Informant: trace::VMTracer {

View File

@ -70,7 +70,6 @@ ethcore = { path = "../ethcore", features = ["test-helpers"] }
ethcore-accounts = { path = "../accounts" } ethcore-accounts = { path = "../accounts" }
ethcore-io = { path = "../util/io" } ethcore-io = { path = "../util/io" }
ethcore-network = { path = "../util/network" } ethcore-network = { path = "../util/network" }
patricia-trie-ethereum = { path = "../util/patricia-trie-ethereum" }
fake-fetch = { path = "../util/fake-fetch" } fake-fetch = { path = "../util/fake-fetch" }
macros = { path = "../util/macros" } macros = { path = "../util/macros" }
pretty_assertions = "0.1" pretty_assertions = "0.1"

View File

@ -105,8 +105,6 @@ extern crate rand_xorshift;
#[cfg(test)] #[cfg(test)]
extern crate ethjson; extern crate ethjson;
#[cfg(test)] #[cfg(test)]
extern crate patricia_trie_ethereum as ethtrie;
#[cfg(test)]
extern crate transaction_pool as txpool; extern crate transaction_pool as txpool;
#[cfg(test)] #[cfg(test)]

View File

@ -26,11 +26,9 @@ use ethcore::engines::{Engine, signer::EngineSigner};
use ethcore::error::Error; use ethcore::error::Error;
use ethcore::miner::{self, MinerService, AuthoringParams, FilterOptions}; use ethcore::miner::{self, MinerService, AuthoringParams, FilterOptions};
use ethereum_types::{H256, U256, Address}; use ethereum_types::{H256, U256, Address};
use ethtrie;
use miner::pool::local_transactions::Status as LocalTransactionStatus; use miner::pool::local_transactions::Status as LocalTransactionStatus;
use miner::pool::{verifier, VerifiedTransaction, QueueStatus}; use miner::pool::{verifier, VerifiedTransaction, QueueStatus};
use parking_lot::{RwLock, Mutex}; use parking_lot::{RwLock, Mutex};
use account_state::state::StateInfo;
use types::transaction::{self, UnverifiedTransaction, SignedTransaction, PendingTransaction}; use types::transaction::{self, UnverifiedTransaction, SignedTransaction, PendingTransaction};
use txpool; use txpool;
use types::BlockNumber; use types::BlockNumber;