unify loading spec && further spec cleanups (#10948)
* bundle_* macros for spec * fixed failing tests * renamed bundle.rs to chain.rs * removed unused derives * updated spec/chain.rs description
This commit is contained in:
parent
c689495826
commit
45978bc2bd
@ -874,7 +874,7 @@ mod tests {
|
|||||||
use cache::Cache;
|
use cache::Cache;
|
||||||
use common_types::header::Header;
|
use common_types::header::Header;
|
||||||
use common_types::ids::BlockId;
|
use common_types::ids::BlockId;
|
||||||
use ethcore::spec::Spec;
|
use ethcore::spec;
|
||||||
use ethereum_types::U256;
|
use ethereum_types::U256;
|
||||||
use kvdb::KeyValueDB;
|
use kvdb::KeyValueDB;
|
||||||
use kvdb_memorydb;
|
use kvdb_memorydb;
|
||||||
@ -888,7 +888,7 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn basic_chain() {
|
fn basic_chain() {
|
||||||
let spec = Spec::new_test();
|
let spec = spec::new_test();
|
||||||
let genesis_header = spec.genesis_header();
|
let genesis_header = spec.genesis_header();
|
||||||
let db = make_db();
|
let db = make_db();
|
||||||
|
|
||||||
@ -922,7 +922,7 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn reorganize() {
|
fn reorganize() {
|
||||||
let spec = Spec::new_test();
|
let spec = spec::new_test();
|
||||||
let genesis_header = spec.genesis_header();
|
let genesis_header = spec.genesis_header();
|
||||||
let db = make_db();
|
let db = make_db();
|
||||||
let cache = Arc::new(Mutex::new(Cache::new(Default::default(), Duration::from_secs(6 * 3600))));
|
let cache = Arc::new(Mutex::new(Cache::new(Default::default(), Duration::from_secs(6 * 3600))));
|
||||||
@ -1005,7 +1005,7 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn earliest_is_latest() {
|
fn earliest_is_latest() {
|
||||||
let spec = Spec::new_test();
|
let spec = spec::new_test();
|
||||||
let db = make_db();
|
let db = make_db();
|
||||||
let cache = Arc::new(Mutex::new(Cache::new(Default::default(), Duration::from_secs(6 * 3600))));
|
let cache = Arc::new(Mutex::new(Cache::new(Default::default(), Duration::from_secs(6 * 3600))));
|
||||||
|
|
||||||
@ -1017,7 +1017,7 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn restore_from_db() {
|
fn restore_from_db() {
|
||||||
let spec = Spec::new_test();
|
let spec = spec::new_test();
|
||||||
let genesis_header = spec.genesis_header();
|
let genesis_header = spec.genesis_header();
|
||||||
let db = make_db();
|
let db = make_db();
|
||||||
let cache = Arc::new(Mutex::new(Cache::new(Default::default(), Duration::from_secs(6 * 3600))));
|
let cache = Arc::new(Mutex::new(Cache::new(Default::default(), Duration::from_secs(6 * 3600))));
|
||||||
@ -1055,7 +1055,7 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn restore_higher_non_canonical() {
|
fn restore_higher_non_canonical() {
|
||||||
let spec = Spec::new_test();
|
let spec = spec::new_test();
|
||||||
let genesis_header = spec.genesis_header();
|
let genesis_header = spec.genesis_header();
|
||||||
let db = make_db();
|
let db = make_db();
|
||||||
let cache = Arc::new(Mutex::new(Cache::new(Default::default(), Duration::from_secs(6 * 3600))));
|
let cache = Arc::new(Mutex::new(Cache::new(Default::default(), Duration::from_secs(6 * 3600))));
|
||||||
@ -1112,7 +1112,7 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn genesis_header_available() {
|
fn genesis_header_available() {
|
||||||
let spec = Spec::new_test();
|
let spec = spec::new_test();
|
||||||
let genesis_header = spec.genesis_header();
|
let genesis_header = spec.genesis_header();
|
||||||
let db = make_db();
|
let db = make_db();
|
||||||
let cache = Arc::new(Mutex::new(Cache::new(Default::default(), Duration::from_secs(6 * 3600))));
|
let cache = Arc::new(Mutex::new(Cache::new(Default::default(), Duration::from_secs(6 * 3600))));
|
||||||
@ -1127,7 +1127,7 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn epoch_transitions_available_after_cht() {
|
fn epoch_transitions_available_after_cht() {
|
||||||
let spec = Spec::new_test();
|
let spec = spec::new_test();
|
||||||
let genesis_header = spec.genesis_header();
|
let genesis_header = spec.genesis_header();
|
||||||
let db = make_db();
|
let db = make_db();
|
||||||
let cache = Arc::new(Mutex::new(Cache::new(Default::default(), Duration::from_secs(6 * 3600))));
|
let cache = Arc::new(Mutex::new(Cache::new(Default::default(), Duration::from_secs(6 * 3600))));
|
||||||
@ -1193,7 +1193,7 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn hardcoded_sync_gen() {
|
fn hardcoded_sync_gen() {
|
||||||
let spec = Spec::new_test();
|
let spec = spec::new_test();
|
||||||
let genesis_header = spec.genesis_header();
|
let genesis_header = spec.genesis_header();
|
||||||
let db = make_db();
|
let db = make_db();
|
||||||
|
|
||||||
|
@ -113,7 +113,7 @@ impl<T: ChainDataFetcher> IoHandler<ClientIoMessage> for ImportBlocks<T> {
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::Service;
|
use super::Service;
|
||||||
use ethcore::spec::Spec;
|
use ethcore::spec;
|
||||||
|
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use cache::Cache;
|
use cache::Cache;
|
||||||
@ -125,7 +125,7 @@ mod tests {
|
|||||||
#[test]
|
#[test]
|
||||||
fn it_works() {
|
fn it_works() {
|
||||||
let db = test_helpers::new_db();
|
let db = test_helpers::new_db();
|
||||||
let spec = Spec::new_test();
|
let spec = spec::new_test();
|
||||||
let cache = Arc::new(Mutex::new(Cache::new(Default::default(), Duration::from_secs(6 * 3600))));
|
let cache = Arc::new(Mutex::new(Cache::new(Default::default(), Duration::from_secs(6 * 3600))));
|
||||||
|
|
||||||
Service::start(Default::default(), &spec, fetch::unavailable(), db, cache).unwrap();
|
Service::start(Default::default(), &spec, fetch::unavailable(), db, cache).unwrap();
|
||||||
|
@ -38,6 +38,7 @@ use ethcore::client::BlockChainClient;
|
|||||||
use ethcore::executive::contract_address;
|
use ethcore::executive::contract_address;
|
||||||
use ethcore::miner::Miner;
|
use ethcore::miner::Miner;
|
||||||
use ethcore::test_helpers::{generate_dummy_client, push_block_with_transactions};
|
use ethcore::test_helpers::{generate_dummy_client, push_block_with_transactions};
|
||||||
|
use ethcore::spec;
|
||||||
use ethkey::{Secret, KeyPair, Signature};
|
use ethkey::{Secret, KeyPair, Signature};
|
||||||
use hash::keccak;
|
use hash::keccak;
|
||||||
|
|
||||||
@ -63,7 +64,7 @@ fn private_contract() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
let io = ethcore_io::IoChannel::disconnected();
|
let io = ethcore_io::IoChannel::disconnected();
|
||||||
let miner = Arc::new(Miner::new_for_tests(&::ethcore::spec::Spec::new_test(), None));
|
let miner = Arc::new(Miner::new_for_tests(&spec::new_test(), None));
|
||||||
let private_keys = Arc::new(StoringKeyProvider::default());
|
let private_keys = Arc::new(StoringKeyProvider::default());
|
||||||
let pm = Arc::new(Provider::new(
|
let pm = Arc::new(Provider::new(
|
||||||
client.clone(),
|
client.clone(),
|
||||||
@ -198,7 +199,7 @@ fn call_other_private_contract() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
let io = ethcore_io::IoChannel::disconnected();
|
let io = ethcore_io::IoChannel::disconnected();
|
||||||
let miner = Arc::new(Miner::new_for_tests(&::ethcore::spec::Spec::new_test(), None));
|
let miner = Arc::new(Miner::new_for_tests(&spec::new_test(), None));
|
||||||
let private_keys = Arc::new(StoringKeyProvider::default());
|
let private_keys = Arc::new(StoringKeyProvider::default());
|
||||||
let pm = Arc::new(Provider::new(
|
let pm = Arc::new(Provider::new(
|
||||||
client.clone(),
|
client.clone(),
|
||||||
|
@ -283,7 +283,7 @@ mod tests {
|
|||||||
use ethcore_db::NUM_COLUMNS;
|
use ethcore_db::NUM_COLUMNS;
|
||||||
use ethcore::client::ClientConfig;
|
use ethcore::client::ClientConfig;
|
||||||
use ethcore::miner::Miner;
|
use ethcore::miner::Miner;
|
||||||
use ethcore::spec::Spec;
|
use ethcore::spec;
|
||||||
use ethcore::test_helpers;
|
use ethcore::test_helpers;
|
||||||
use kvdb_rocksdb::{DatabaseConfig, CompactionProfile};
|
use kvdb_rocksdb::{DatabaseConfig, CompactionProfile};
|
||||||
use super::*;
|
use super::*;
|
||||||
@ -306,7 +306,7 @@ mod tests {
|
|||||||
let client_db = client_db_handler.open(&client_path).unwrap();
|
let client_db = client_db_handler.open(&client_path).unwrap();
|
||||||
let restoration_db_handler = test_helpers::restoration_db_handler(client_db_config);
|
let restoration_db_handler = test_helpers::restoration_db_handler(client_db_config);
|
||||||
|
|
||||||
let spec = Spec::new_test();
|
let spec = spec::new_test();
|
||||||
let service = ClientService::start(
|
let service = ClientService::start(
|
||||||
ClientConfig::default(),
|
ClientConfig::default(),
|
||||||
&spec,
|
&spec,
|
||||||
|
@ -563,6 +563,7 @@ mod tests {
|
|||||||
errors::EthcoreError as Error,
|
errors::EthcoreError as Error,
|
||||||
};
|
};
|
||||||
use hash_db::EMPTY_PREFIX;
|
use hash_db::EMPTY_PREFIX;
|
||||||
|
use crate::spec;
|
||||||
|
|
||||||
/// Enact the block given by `block_bytes` using `engine` on the database `db` with given `parent` block header
|
/// Enact the block given by `block_bytes` using `engine` on the database `db` with given `parent` block header
|
||||||
fn enact_bytes(
|
fn enact_bytes(
|
||||||
@ -633,8 +634,7 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn open_block() {
|
fn open_block() {
|
||||||
use spec::*;
|
let spec = spec::new_test();
|
||||||
let spec = Spec::new_test();
|
|
||||||
let genesis_header = spec.genesis_header();
|
let genesis_header = spec.genesis_header();
|
||||||
let db = spec.ensure_db_good(get_temp_state_db(), &Default::default()).unwrap();
|
let db = spec.ensure_db_good(get_temp_state_db(), &Default::default()).unwrap();
|
||||||
let last_hashes = Arc::new(vec![genesis_header.hash()]);
|
let last_hashes = Arc::new(vec![genesis_header.hash()]);
|
||||||
@ -645,8 +645,7 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn enact_block() {
|
fn enact_block() {
|
||||||
use spec::*;
|
let spec = spec::new_test();
|
||||||
let spec = Spec::new_test();
|
|
||||||
let engine = &*spec.engine;
|
let engine = &*spec.engine;
|
||||||
let genesis_header = spec.genesis_header();
|
let genesis_header = spec.genesis_header();
|
||||||
|
|
||||||
@ -670,8 +669,7 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn enact_block_with_uncle() {
|
fn enact_block_with_uncle() {
|
||||||
use spec::*;
|
let spec = spec::new_test();
|
||||||
let spec = Spec::new_test();
|
|
||||||
let engine = &*spec.engine;
|
let engine = &*spec.engine;
|
||||||
let genesis_header = spec.genesis_header();
|
let genesis_header = spec.genesis_header();
|
||||||
|
|
||||||
|
@ -29,13 +29,13 @@ use types::{
|
|||||||
receipt,
|
receipt,
|
||||||
transaction
|
transaction
|
||||||
};
|
};
|
||||||
|
use ethjson::spec::ForkSpec;
|
||||||
use trie_vm_factories::Factories;
|
use trie_vm_factories::Factories;
|
||||||
use evm::{VMType, FinalizationResult};
|
use evm::{VMType, FinalizationResult};
|
||||||
use vm::{self, ActionParams, CreateContractAddress};
|
use vm::{self, ActionParams, CreateContractAddress};
|
||||||
use ethtrie;
|
use ethtrie;
|
||||||
use account_state::{CleanupMode, State};
|
use account_state::{CleanupMode, State};
|
||||||
use substate::Substate;
|
use substate::Substate;
|
||||||
|
|
||||||
use executive_state::ExecutiveState;
|
use executive_state::ExecutiveState;
|
||||||
|
|
||||||
/// EVM test Error.
|
/// EVM test Error.
|
||||||
@ -70,9 +70,6 @@ impl fmt::Display for EvmTestError {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
use ethereum;
|
|
||||||
use ethjson::spec::ForkSpec;
|
|
||||||
|
|
||||||
/// Simplified, single-block EVM test client.
|
/// Simplified, single-block EVM test client.
|
||||||
pub struct EvmTestClient<'a> {
|
pub struct EvmTestClient<'a> {
|
||||||
state: State<state_db::StateDB>,
|
state: State<state_db::StateDB>,
|
||||||
@ -101,14 +98,14 @@ impl<'a> EvmTestClient<'a> {
|
|||||||
/// Converts a json spec definition into spec.
|
/// Converts a json spec definition into spec.
|
||||||
pub fn fork_spec_from_json(spec: &ForkSpec) -> Option<spec::Spec> {
|
pub fn fork_spec_from_json(spec: &ForkSpec) -> Option<spec::Spec> {
|
||||||
match *spec {
|
match *spec {
|
||||||
ForkSpec::Frontier => Some(ethereum::new_frontier_test()),
|
ForkSpec::Frontier => Some(spec::new_frontier_test()),
|
||||||
ForkSpec::Homestead => Some(ethereum::new_homestead_test()),
|
ForkSpec::Homestead => Some(spec::new_homestead_test()),
|
||||||
ForkSpec::EIP150 => Some(ethereum::new_eip150_test()),
|
ForkSpec::EIP150 => Some(spec::new_eip150_test()),
|
||||||
ForkSpec::EIP158 => Some(ethereum::new_eip161_test()),
|
ForkSpec::EIP158 => Some(spec::new_eip161_test()),
|
||||||
ForkSpec::Byzantium => Some(ethereum::new_byzantium_test()),
|
ForkSpec::Byzantium => Some(spec::new_byzantium_test()),
|
||||||
ForkSpec::Constantinople => Some(ethereum::new_constantinople_test()),
|
ForkSpec::Constantinople => Some(spec::new_constantinople_test()),
|
||||||
ForkSpec::ConstantinopleFix => Some(ethereum::new_constantinople_fix_test()),
|
ForkSpec::ConstantinopleFix => Some(spec::new_constantinople_fix_test()),
|
||||||
ForkSpec::EIP158ToByzantiumAt5 => Some(ethereum::new_transition_test()),
|
ForkSpec::EIP158ToByzantiumAt5 => Some(spec::new_transition_test()),
|
||||||
ForkSpec::FrontierToHomesteadAt5 | ForkSpec::HomesteadToDaoAt5 | ForkSpec::HomesteadToEIP150At5 => None,
|
ForkSpec::FrontierToHomesteadAt5 | ForkSpec::HomesteadToDaoAt5 | ForkSpec::HomesteadToEIP150At5 => None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -66,7 +66,7 @@ use engines::Engine;
|
|||||||
use executive::Executed;
|
use executive::Executed;
|
||||||
use journaldb;
|
use journaldb;
|
||||||
use miner::{self, Miner, MinerService};
|
use miner::{self, Miner, MinerService};
|
||||||
use spec::Spec;
|
use spec::{Spec, self};
|
||||||
use account_state::state::StateInfo;
|
use account_state::state::StateInfo;
|
||||||
use state_db::StateDB;
|
use state_db::StateDB;
|
||||||
use trace::LocalizedTrace;
|
use trace::LocalizedTrace;
|
||||||
@ -152,7 +152,7 @@ impl TestBlockChainClient {
|
|||||||
|
|
||||||
/// Creates new test client with specified extra data for each block
|
/// Creates new test client with specified extra data for each block
|
||||||
pub fn new_with_extra_data(extra_data: Bytes) -> Self {
|
pub fn new_with_extra_data(extra_data: Bytes) -> Self {
|
||||||
let spec = Spec::new_test();
|
let spec = spec::new_test();
|
||||||
TestBlockChainClient::new_with_spec_and_extra(spec, extra_data)
|
TestBlockChainClient::new_with_spec_and_extra(spec, extra_data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1636,7 +1636,7 @@ mod tests {
|
|||||||
generate_dummy_client_with_spec, get_temp_state_db,
|
generate_dummy_client_with_spec, get_temp_state_db,
|
||||||
TestNotify
|
TestNotify
|
||||||
};
|
};
|
||||||
use spec::Spec;
|
use crate::spec::{Spec, self};
|
||||||
use engines::{Seal, Engine};
|
use engines::{Seal, Engine};
|
||||||
use engines::validator_set::{TestSet, SimpleList};
|
use engines::validator_set::{TestSet, SimpleList};
|
||||||
use super::{AuthorityRoundParams, AuthorityRound, EmptyStep, SealedEmptyStep, calculate_score};
|
use super::{AuthorityRoundParams, AuthorityRound, EmptyStep, SealedEmptyStep, calculate_score};
|
||||||
@ -1673,13 +1673,13 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn has_valid_metadata() {
|
fn has_valid_metadata() {
|
||||||
let engine = Spec::new_test_round().engine;
|
let engine = spec::new_test_round().engine;
|
||||||
assert!(!engine.name().is_empty());
|
assert!(!engine.name().is_empty());
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn can_return_schedule() {
|
fn can_return_schedule() {
|
||||||
let engine = Spec::new_test_round().engine;
|
let engine = spec::new_test_round().engine;
|
||||||
let schedule = engine.schedule(10000000);
|
let schedule = engine.schedule(10000000);
|
||||||
|
|
||||||
assert!(schedule.stack_limit > 0);
|
assert!(schedule.stack_limit > 0);
|
||||||
@ -1687,7 +1687,7 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn can_do_signature_verification_fail() {
|
fn can_do_signature_verification_fail() {
|
||||||
let engine = Spec::new_test_round().engine;
|
let engine = spec::new_test_round().engine;
|
||||||
let mut header: Header = Header::default();
|
let mut header: Header = Header::default();
|
||||||
header.set_seal(vec![encode(&H520::default())]);
|
header.set_seal(vec![encode(&H520::default())]);
|
||||||
|
|
||||||
@ -1701,7 +1701,7 @@ mod tests {
|
|||||||
let addr1 = tap.insert_account(keccak("1").into(), &"1".into()).unwrap();
|
let addr1 = tap.insert_account(keccak("1").into(), &"1".into()).unwrap();
|
||||||
let addr2 = tap.insert_account(keccak("2").into(), &"2".into()).unwrap();
|
let addr2 = tap.insert_account(keccak("2").into(), &"2".into()).unwrap();
|
||||||
|
|
||||||
let spec = Spec::new_test_round();
|
let spec = spec::new_test_round();
|
||||||
let engine = &*spec.engine;
|
let engine = &*spec.engine;
|
||||||
let genesis_header = spec.genesis_header();
|
let genesis_header = spec.genesis_header();
|
||||||
let db1 = spec.ensure_db_good(get_temp_state_db(), &Default::default()).unwrap();
|
let db1 = spec.ensure_db_good(get_temp_state_db(), &Default::default()).unwrap();
|
||||||
@ -1733,7 +1733,7 @@ mod tests {
|
|||||||
let addr1 = tap.insert_account(keccak("1").into(), &"1".into()).unwrap();
|
let addr1 = tap.insert_account(keccak("1").into(), &"1".into()).unwrap();
|
||||||
let addr2 = tap.insert_account(keccak("0").into(), &"0".into()).unwrap();
|
let addr2 = tap.insert_account(keccak("0").into(), &"0".into()).unwrap();
|
||||||
|
|
||||||
let spec = Spec::new_test_round();
|
let spec = spec::new_test_round();
|
||||||
let engine = &*spec.engine;
|
let engine = &*spec.engine;
|
||||||
|
|
||||||
let genesis_header = spec.genesis_header();
|
let genesis_header = spec.genesis_header();
|
||||||
@ -1773,7 +1773,7 @@ mod tests {
|
|||||||
header.set_gas_limit("222222".parse::<U256>().unwrap());
|
header.set_gas_limit("222222".parse::<U256>().unwrap());
|
||||||
header.set_author(addr);
|
header.set_author(addr);
|
||||||
|
|
||||||
let engine = Spec::new_test_round().engine;
|
let engine = spec::new_test_round().engine;
|
||||||
|
|
||||||
// Two validators.
|
// Two validators.
|
||||||
// Spec starts with step 2.
|
// Spec starts with step 2.
|
||||||
@ -1802,7 +1802,7 @@ mod tests {
|
|||||||
header.set_gas_limit("222222".parse::<U256>().unwrap());
|
header.set_gas_limit("222222".parse::<U256>().unwrap());
|
||||||
header.set_author(addr);
|
header.set_author(addr);
|
||||||
|
|
||||||
let engine = Spec::new_test_round().engine;
|
let engine = spec::new_test_round().engine;
|
||||||
|
|
||||||
// Two validators.
|
// Two validators.
|
||||||
// Spec starts with step 2.
|
// Spec starts with step 2.
|
||||||
@ -1828,7 +1828,7 @@ mod tests {
|
|||||||
header.set_gas_limit("222222".parse::<U256>().unwrap());
|
header.set_gas_limit("222222".parse::<U256>().unwrap());
|
||||||
header.set_author(addr);
|
header.set_author(addr);
|
||||||
|
|
||||||
let engine = Spec::new_test_round().engine;
|
let engine = spec::new_test_round().engine;
|
||||||
|
|
||||||
let signature = tap.sign(addr, Some("0".into()), header.bare_hash()).unwrap();
|
let signature = tap.sign(addr, Some("0".into()), header.bare_hash()).unwrap();
|
||||||
// Two validators.
|
// Two validators.
|
||||||
@ -1931,7 +1931,7 @@ mod tests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn setup_empty_steps() -> (Spec, Arc<AccountProvider>, Vec<Address>) {
|
fn setup_empty_steps() -> (Spec, Arc<AccountProvider>, Vec<Address>) {
|
||||||
let spec = Spec::new_test_round_empty_steps();
|
let spec = spec::new_test_round_empty_steps();
|
||||||
let tap = Arc::new(AccountProvider::transient_provider());
|
let tap = Arc::new(AccountProvider::transient_provider());
|
||||||
|
|
||||||
let addr1 = tap.insert_account(keccak("1").into(), &"1".into()).unwrap();
|
let addr1 = tap.insert_account(keccak("1").into(), &"1".into()).unwrap();
|
||||||
@ -1984,7 +1984,7 @@ mod tests {
|
|||||||
|
|
||||||
let last_hashes = Arc::new(vec![genesis_header.hash()]);
|
let last_hashes = Arc::new(vec![genesis_header.hash()]);
|
||||||
|
|
||||||
let client = generate_dummy_client_with_spec(Spec::new_test_round_empty_steps);
|
let client = generate_dummy_client_with_spec(spec::new_test_round_empty_steps);
|
||||||
let notify = Arc::new(TestNotify::default());
|
let notify = Arc::new(TestNotify::default());
|
||||||
client.add_notify(notify.clone());
|
client.add_notify(notify.clone());
|
||||||
engine.register_client(Arc::downgrade(&client) as _);
|
engine.register_client(Arc::downgrade(&client) as _);
|
||||||
@ -2023,7 +2023,7 @@ mod tests {
|
|||||||
|
|
||||||
let last_hashes = Arc::new(vec![genesis_header.hash()]);
|
let last_hashes = Arc::new(vec![genesis_header.hash()]);
|
||||||
|
|
||||||
let client = generate_dummy_client_with_spec(Spec::new_test_round_empty_steps);
|
let client = generate_dummy_client_with_spec(spec::new_test_round_empty_steps);
|
||||||
let notify = Arc::new(TestNotify::default());
|
let notify = Arc::new(TestNotify::default());
|
||||||
client.add_notify(notify.clone());
|
client.add_notify(notify.clone());
|
||||||
engine.register_client(Arc::downgrade(&client) as _);
|
engine.register_client(Arc::downgrade(&client) as _);
|
||||||
@ -2076,7 +2076,7 @@ mod tests {
|
|||||||
|
|
||||||
let last_hashes = Arc::new(vec![genesis_header.hash()]);
|
let last_hashes = Arc::new(vec![genesis_header.hash()]);
|
||||||
|
|
||||||
let client = generate_dummy_client_with_spec(Spec::new_test_round_empty_steps);
|
let client = generate_dummy_client_with_spec(spec::new_test_round_empty_steps);
|
||||||
let notify = Arc::new(TestNotify::default());
|
let notify = Arc::new(TestNotify::default());
|
||||||
client.add_notify(notify.clone());
|
client.add_notify(notify.clone());
|
||||||
engine.register_client(Arc::downgrade(&client) as _);
|
engine.register_client(Arc::downgrade(&client) as _);
|
||||||
@ -2128,7 +2128,7 @@ mod tests {
|
|||||||
|
|
||||||
let last_hashes = Arc::new(vec![genesis_header.hash()]);
|
let last_hashes = Arc::new(vec![genesis_header.hash()]);
|
||||||
|
|
||||||
let client = generate_dummy_client_with_spec(Spec::new_test_round_empty_steps);
|
let client = generate_dummy_client_with_spec(spec::new_test_round_empty_steps);
|
||||||
engine.register_client(Arc::downgrade(&client) as _);
|
engine.register_client(Arc::downgrade(&client) as _);
|
||||||
|
|
||||||
// step 2
|
// step 2
|
||||||
@ -2215,7 +2215,7 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn block_reward_contract() {
|
fn block_reward_contract() {
|
||||||
let spec = Spec::new_test_round_block_reward_contract();
|
let spec = spec::new_test_round_block_reward_contract();
|
||||||
let tap = Arc::new(AccountProvider::transient_provider());
|
let tap = Arc::new(AccountProvider::transient_provider());
|
||||||
|
|
||||||
let addr1 = tap.insert_account(keccak("1").into(), &"1".into()).unwrap();
|
let addr1 = tap.insert_account(keccak("1").into(), &"1".into()).unwrap();
|
||||||
@ -2227,7 +2227,7 @@ mod tests {
|
|||||||
|
|
||||||
let last_hashes = Arc::new(vec![genesis_header.hash()]);
|
let last_hashes = Arc::new(vec![genesis_header.hash()]);
|
||||||
|
|
||||||
let client = generate_dummy_client_with_spec(Spec::new_test_round_block_reward_contract);
|
let client = generate_dummy_client_with_spec(spec::new_test_round_block_reward_contract);
|
||||||
engine.register_client(Arc::downgrade(&client) as _);
|
engine.register_client(Arc::downgrade(&client) as _);
|
||||||
|
|
||||||
// step 2
|
// step 2
|
||||||
|
@ -164,7 +164,7 @@ mod test {
|
|||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
use client::PrepareOpenBlock;
|
use client::PrepareOpenBlock;
|
||||||
use ethereum_types::{U256, Address};
|
use ethereum_types::{U256, Address};
|
||||||
use spec::Spec;
|
use crate::spec;
|
||||||
use test_helpers::generate_dummy_client_with_spec;
|
use test_helpers::generate_dummy_client_with_spec;
|
||||||
|
|
||||||
use engines::SystemOrCodeCallKind;
|
use engines::SystemOrCodeCallKind;
|
||||||
@ -172,9 +172,9 @@ mod test {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn block_reward_contract() {
|
fn block_reward_contract() {
|
||||||
let client = generate_dummy_client_with_spec(Spec::new_test_round_block_reward_contract);
|
let client = generate_dummy_client_with_spec(spec::new_test_round_block_reward_contract);
|
||||||
|
|
||||||
let machine = Spec::new_test_machine();
|
let machine = spec::new_test_machine();
|
||||||
|
|
||||||
// the spec has a block reward contract defined at the given address
|
// the spec has a block reward contract defined at the given address
|
||||||
let block_reward_contract = BlockRewardContract::new_from_address(
|
let block_reward_contract = BlockRewardContract::new_from_address(
|
||||||
|
@ -227,7 +227,7 @@ impl Clique {
|
|||||||
/// Note we need to `mock` the miner and it is introduced to test block verification to trigger new blocks
|
/// Note we need to `mock` the miner and it is introduced to test block verification to trigger new blocks
|
||||||
/// to mainly test consensus edge cases
|
/// to mainly test consensus edge cases
|
||||||
pub fn with_test(epoch_length: u64, period: u64) -> Self {
|
pub fn with_test(epoch_length: u64, period: u64) -> Self {
|
||||||
use spec::Spec;
|
use crate::spec;
|
||||||
|
|
||||||
Self {
|
Self {
|
||||||
epoch_length,
|
epoch_length,
|
||||||
@ -236,7 +236,7 @@ impl Clique {
|
|||||||
block_state_by_hash: RwLock::new(LruCache::new(STATE_CACHE_NUM)),
|
block_state_by_hash: RwLock::new(LruCache::new(STATE_CACHE_NUM)),
|
||||||
proposals: Default::default(),
|
proposals: Default::default(),
|
||||||
signer: Default::default(),
|
signer: Default::default(),
|
||||||
machine: Spec::new_test_machine(),
|
machine: spec::new_test_machine(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -501,7 +501,7 @@ mod tests {
|
|||||||
};
|
};
|
||||||
use spec::Spec;
|
use spec::Spec;
|
||||||
use engines::Engine;
|
use engines::Engine;
|
||||||
use ethereum::{new_morden, new_mcip3_test, new_homestead_test_machine};
|
use crate::spec::{new_morden, new_mcip3_test, new_homestead_test_machine};
|
||||||
use super::{Ethash, EthashParams, ecip1017_eras_block_reward};
|
use super::{Ethash, EthashParams, ecip1017_eras_block_reward};
|
||||||
use rlp;
|
use rlp;
|
||||||
use tempdir::TempDir;
|
use tempdir::TempDir;
|
||||||
|
@ -107,14 +107,14 @@ mod tests {
|
|||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use ethereum_types::{H520, Address};
|
use ethereum_types::{H520, Address};
|
||||||
use test_helpers::get_temp_state_db;
|
use test_helpers::get_temp_state_db;
|
||||||
use spec::Spec;
|
use crate::spec;
|
||||||
use types::header::Header;
|
use types::header::Header;
|
||||||
use block::*;
|
use block::*;
|
||||||
use engines::Seal;
|
use engines::Seal;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn instant_can_seal() {
|
fn instant_can_seal() {
|
||||||
let spec = Spec::new_instant();
|
let spec = spec::new_instant();
|
||||||
let engine = &*spec.engine;
|
let engine = &*spec.engine;
|
||||||
let db = spec.ensure_db_good(get_temp_state_db(), &Default::default()).unwrap();
|
let db = spec.ensure_db_good(get_temp_state_db(), &Default::default()).unwrap();
|
||||||
let genesis_header = spec.genesis_header();
|
let genesis_header = spec.genesis_header();
|
||||||
@ -128,7 +128,7 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn instant_cant_verify() {
|
fn instant_cant_verify() {
|
||||||
let engine = Spec::new_instant().engine;
|
let engine = spec::new_instant().engine;
|
||||||
let mut header: Header = Header::default();
|
let mut header: Header = Header::default();
|
||||||
|
|
||||||
assert!(engine.verify_block_basic(&header).is_ok());
|
assert!(engine.verify_block_basic(&header).is_ok());
|
||||||
|
@ -144,7 +144,7 @@ mod tests {
|
|||||||
use ethereum_types::{H520, Address};
|
use ethereum_types::{H520, Address};
|
||||||
use bytes::ToPretty;
|
use bytes::ToPretty;
|
||||||
use rlp::encode;
|
use rlp::encode;
|
||||||
use spec::Spec;
|
use crate::spec;
|
||||||
use types::header::Header;
|
use types::header::Header;
|
||||||
use accounts::AccountProvider;
|
use accounts::AccountProvider;
|
||||||
use miner::{self, MinerService};
|
use miner::{self, MinerService};
|
||||||
@ -158,7 +158,7 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn fetches_validators() {
|
fn fetches_validators() {
|
||||||
let client = generate_dummy_client_with_spec(Spec::new_validator_contract);
|
let client = generate_dummy_client_with_spec(spec::new_validator_contract);
|
||||||
let vc = Arc::new(ValidatorContract::new("0000000000000000000000000000000000000005".parse::<Address>().unwrap()));
|
let vc = Arc::new(ValidatorContract::new("0000000000000000000000000000000000000005".parse::<Address>().unwrap()));
|
||||||
vc.register_client(Arc::downgrade(&client) as _);
|
vc.register_client(Arc::downgrade(&client) as _);
|
||||||
let last_hash = client.best_block_header().hash();
|
let last_hash = client.best_block_header().hash();
|
||||||
@ -171,7 +171,7 @@ mod tests {
|
|||||||
let _ = ::env_logger::try_init();
|
let _ = ::env_logger::try_init();
|
||||||
let tap = Arc::new(AccountProvider::transient_provider());
|
let tap = Arc::new(AccountProvider::transient_provider());
|
||||||
let v1 = tap.insert_account(keccak("1").into(), &"".into()).unwrap();
|
let v1 = tap.insert_account(keccak("1").into(), &"".into()).unwrap();
|
||||||
let client = generate_dummy_client_with_spec(Spec::new_validator_contract);
|
let client = generate_dummy_client_with_spec(spec::new_validator_contract);
|
||||||
client.engine().register_client(Arc::downgrade(&client) as _);
|
client.engine().register_client(Arc::downgrade(&client) as _);
|
||||||
let validator_contract = "0000000000000000000000000000000000000005".parse::<Address>().unwrap();
|
let validator_contract = "0000000000000000000000000000000000000005".parse::<Address>().unwrap();
|
||||||
|
|
||||||
|
@ -162,7 +162,7 @@ mod tests {
|
|||||||
use ethkey::Secret;
|
use ethkey::Secret;
|
||||||
use types::header::Header;
|
use types::header::Header;
|
||||||
use miner::{self, MinerService};
|
use miner::{self, MinerService};
|
||||||
use spec::Spec;
|
use crate::spec;
|
||||||
use test_helpers::{generate_dummy_client_with_spec, generate_dummy_client_with_spec_and_data};
|
use test_helpers::{generate_dummy_client_with_spec, generate_dummy_client_with_spec_and_data};
|
||||||
use types::ids::BlockId;
|
use types::ids::BlockId;
|
||||||
use ethereum_types::Address;
|
use ethereum_types::Address;
|
||||||
@ -176,7 +176,7 @@ mod tests {
|
|||||||
let s0: Secret = keccak("0").into();
|
let s0: Secret = keccak("0").into();
|
||||||
let v0 = tap.insert_account(s0.clone(), &"".into()).unwrap();
|
let v0 = tap.insert_account(s0.clone(), &"".into()).unwrap();
|
||||||
let v1 = tap.insert_account(keccak("1").into(), &"".into()).unwrap();
|
let v1 = tap.insert_account(keccak("1").into(), &"".into()).unwrap();
|
||||||
let client = generate_dummy_client_with_spec(Spec::new_validator_multi);
|
let client = generate_dummy_client_with_spec(spec::new_validator_multi);
|
||||||
client.engine().register_client(Arc::downgrade(&client) as _);
|
client.engine().register_client(Arc::downgrade(&client) as _);
|
||||||
|
|
||||||
// Make sure txs go through.
|
// Make sure txs go through.
|
||||||
@ -207,7 +207,7 @@ mod tests {
|
|||||||
assert_eq!(client.chain_info().best_block_number, 3);
|
assert_eq!(client.chain_info().best_block_number, 3);
|
||||||
|
|
||||||
// Check syncing.
|
// Check syncing.
|
||||||
let sync_client = generate_dummy_client_with_spec_and_data(Spec::new_validator_multi, 0, 0, &[]);
|
let sync_client = generate_dummy_client_with_spec_and_data(spec::new_validator_multi, 0, 0, &[]);
|
||||||
sync_client.engine().register_client(Arc::downgrade(&sync_client) as _);
|
sync_client.engine().register_client(Arc::downgrade(&sync_client) as _);
|
||||||
for i in 1..4 {
|
for i in 1..4 {
|
||||||
sync_client.import_block(Unverified::from_rlp(client.block(BlockId::Number(i)).unwrap().into_inner()).unwrap()).unwrap();
|
sync_client.import_block(Unverified::from_rlp(client.block(BlockId::Number(i)).unwrap().into_inner()).unwrap()).unwrap();
|
||||||
|
@ -454,7 +454,7 @@ mod tests {
|
|||||||
use hash::keccak;
|
use hash::keccak;
|
||||||
use ethereum_types::Address;
|
use ethereum_types::Address;
|
||||||
use types::ids::BlockId;
|
use types::ids::BlockId;
|
||||||
use spec::Spec;
|
use crate::spec;
|
||||||
use accounts::AccountProvider;
|
use accounts::AccountProvider;
|
||||||
use types::transaction::{Transaction, Action};
|
use types::transaction::{Transaction, Action};
|
||||||
use client::{ChainInfo, ImportBlock};
|
use client::{ChainInfo, ImportBlock};
|
||||||
@ -468,7 +468,7 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn fetches_validators() {
|
fn fetches_validators() {
|
||||||
let client = generate_dummy_client_with_spec(Spec::new_validator_safe_contract);
|
let client = generate_dummy_client_with_spec(spec::new_validator_safe_contract);
|
||||||
let vc = Arc::new(ValidatorSafeContract::new("0000000000000000000000000000000000000005".parse::<Address>().unwrap()));
|
let vc = Arc::new(ValidatorSafeContract::new("0000000000000000000000000000000000000005".parse::<Address>().unwrap()));
|
||||||
vc.register_client(Arc::downgrade(&client) as _);
|
vc.register_client(Arc::downgrade(&client) as _);
|
||||||
let last_hash = client.best_block_header().hash();
|
let last_hash = client.best_block_header().hash();
|
||||||
@ -483,8 +483,8 @@ mod tests {
|
|||||||
let s0: Secret = keccak("1").into();
|
let s0: Secret = keccak("1").into();
|
||||||
let v0 = tap.insert_account(s0.clone(), &"".into()).unwrap();
|
let v0 = tap.insert_account(s0.clone(), &"".into()).unwrap();
|
||||||
let v1 = tap.insert_account(keccak("0").into(), &"".into()).unwrap();
|
let v1 = tap.insert_account(keccak("0").into(), &"".into()).unwrap();
|
||||||
let chain_id = Spec::new_validator_safe_contract().chain_id();
|
let chain_id = spec::new_validator_safe_contract().chain_id();
|
||||||
let client = generate_dummy_client_with_spec(Spec::new_validator_safe_contract);
|
let client = generate_dummy_client_with_spec(spec::new_validator_safe_contract);
|
||||||
client.engine().register_client(Arc::downgrade(&client) as _);
|
client.engine().register_client(Arc::downgrade(&client) as _);
|
||||||
let validator_contract = "0000000000000000000000000000000000000005".parse::<Address>().unwrap();
|
let validator_contract = "0000000000000000000000000000000000000005".parse::<Address>().unwrap();
|
||||||
let signer = Box::new((tap.clone(), v1, "".into()));
|
let signer = Box::new((tap.clone(), v1, "".into()));
|
||||||
@ -538,7 +538,7 @@ mod tests {
|
|||||||
assert_eq!(client.chain_info().best_block_number, 3);
|
assert_eq!(client.chain_info().best_block_number, 3);
|
||||||
|
|
||||||
// Check syncing.
|
// Check syncing.
|
||||||
let sync_client = generate_dummy_client_with_spec_and_data(Spec::new_validator_safe_contract, 0, 0, &[]);
|
let sync_client = generate_dummy_client_with_spec_and_data(spec::new_validator_safe_contract, 0, 0, &[]);
|
||||||
sync_client.engine().register_client(Arc::downgrade(&sync_client) as _);
|
sync_client.engine().register_client(Arc::downgrade(&sync_client) as _);
|
||||||
for i in 1..4 {
|
for i in 1..4 {
|
||||||
sync_client.import_block(Unverified::from_rlp(client.block(BlockId::Number(i)).unwrap().into_inner()).unwrap()).unwrap();
|
sync_client.import_block(Unverified::from_rlp(client.block(BlockId::Number(i)).unwrap().into_inner()).unwrap()).unwrap();
|
||||||
@ -556,7 +556,7 @@ mod tests {
|
|||||||
engines::machine::AuxiliaryRequest,
|
engines::machine::AuxiliaryRequest,
|
||||||
};
|
};
|
||||||
|
|
||||||
let client = generate_dummy_client_with_spec(Spec::new_validator_safe_contract);
|
let client = generate_dummy_client_with_spec(spec::new_validator_safe_contract);
|
||||||
let engine = client.engine().clone();
|
let engine = client.engine().clone();
|
||||||
let validator_contract = "0000000000000000000000000000000000000005".parse::<Address>().unwrap();
|
let validator_contract = "0000000000000000000000000000000000000005".parse::<Address>().unwrap();
|
||||||
|
|
||||||
@ -593,7 +593,7 @@ mod tests {
|
|||||||
use types::header::Header;
|
use types::header::Header;
|
||||||
use engines::{EpochChange, Proof};
|
use engines::{EpochChange, Proof};
|
||||||
|
|
||||||
let client = generate_dummy_client_with_spec(Spec::new_validator_safe_contract);
|
let client = generate_dummy_client_with_spec(spec::new_validator_safe_contract);
|
||||||
let engine = client.engine().clone();
|
let engine = client.engine().clone();
|
||||||
|
|
||||||
let mut new_header = Header::default();
|
let mut new_header = Header::default();
|
||||||
|
@ -1,225 +0,0 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
|
||||||
// This file is part of Parity Ethereum.
|
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
|
|
||||||
// Parity Ethereum is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with Parity Ethereum. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
//! Ethereum protocol module.
|
|
||||||
//!
|
|
||||||
//! Contains all Ethereum network specific stuff, such as denominations and
|
|
||||||
//! consensus specifications.
|
|
||||||
|
|
||||||
use machine::Machine;
|
|
||||||
use crate::spec::{Spec, SpecParams};
|
|
||||||
|
|
||||||
/// Load chain spec from `SpecParams` and JSON.
|
|
||||||
pub fn load<'a, T: Into<Option<SpecParams<'a>>>>(params: T, b: &[u8]) -> Spec {
|
|
||||||
match params.into() {
|
|
||||||
Some(params) => Spec::load(params, b),
|
|
||||||
None => Spec::load(&::std::env::temp_dir(), b)
|
|
||||||
}.expect("chain spec is invalid")
|
|
||||||
}
|
|
||||||
|
|
||||||
fn load_machine(b: &[u8]) -> Machine {
|
|
||||||
Spec::load_machine(b).expect("chain spec is invalid")
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Create a new Foundation mainnet chain spec.
|
|
||||||
pub fn new_foundation<'a, T: Into<SpecParams<'a>>>(params: T) -> Spec {
|
|
||||||
load(params.into(), include_bytes!("../res/ethereum/foundation.json"))
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Create a new Classic mainnet chain spec without the DAO hardfork.
|
|
||||||
pub fn new_classic<'a, T: Into<SpecParams<'a>>>(params: T) -> Spec {
|
|
||||||
load(params.into(), include_bytes!("../res/ethereum/classic.json"))
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Create a new POA Network mainnet chain spec.
|
|
||||||
pub fn new_poanet<'a, T: Into<SpecParams<'a>>>(params: T) -> Spec {
|
|
||||||
load(params.into(), include_bytes!("../res/ethereum/poacore.json"))
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Create a new Tobalaba mainnet chain spec.
|
|
||||||
pub fn new_tobalaba<'a, T: Into<SpecParams<'a>>>(params: T) -> Spec {
|
|
||||||
load(params.into(), include_bytes!("../res/ethereum/tobalaba.json"))
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Create a new Expanse mainnet chain spec.
|
|
||||||
pub fn new_expanse<'a, T: Into<SpecParams<'a>>>(params: T) -> Spec {
|
|
||||||
load(params.into(), include_bytes!("../res/ethereum/expanse.json"))
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Create a new Musicoin mainnet chain spec.
|
|
||||||
pub fn new_musicoin<'a, T: Into<SpecParams<'a>>>(params: T) -> Spec {
|
|
||||||
// The musicoin chain spec uses a block reward contract which can be found at
|
|
||||||
// https://gist.github.com/andresilva/6f2afaf9486732a0797f4bdeae018ee9
|
|
||||||
load(params.into(), include_bytes!("../res/ethereum/musicoin.json"))
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Create a new Ellaism mainnet chain spec.
|
|
||||||
pub fn new_ellaism<'a, T: Into<SpecParams<'a>>>(params: T) -> Spec {
|
|
||||||
load(params.into(), include_bytes!("../res/ethereum/ellaism.json"))
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Create a new MIX mainnet chain spec.
|
|
||||||
pub fn new_mix<'a, T: Into<SpecParams<'a>>>(params: T) -> Spec {
|
|
||||||
load(params.into(), include_bytes!("../res/ethereum/mix.json"))
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Create a new Callisto chain spec
|
|
||||||
pub fn new_callisto<'a, T: Into<SpecParams<'a>>>(params: T) -> Spec {
|
|
||||||
load(params.into(), include_bytes!("../res/ethereum/callisto.json"))
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Create a new Morden testnet chain spec.
|
|
||||||
pub fn new_morden<'a, T: Into<SpecParams<'a>>>(params: T) -> Spec {
|
|
||||||
load(params.into(), include_bytes!("../res/ethereum/morden.json"))
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Create a new Ropsten testnet chain spec.
|
|
||||||
pub fn new_ropsten<'a, T: Into<SpecParams<'a>>>(params: T) -> Spec {
|
|
||||||
load(params.into(), include_bytes!("../res/ethereum/ropsten.json"))
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Create a new Kovan testnet chain spec.
|
|
||||||
pub fn new_kovan<'a, T: Into<SpecParams<'a>>>(params: T) -> Spec {
|
|
||||||
load(params.into(), include_bytes!("../res/ethereum/kovan.json"))
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Create a new Rinkeby testnet chain spec.
|
|
||||||
pub fn new_rinkeby<'a, T: Into<SpecParams<'a>>>(params: T) -> Spec {
|
|
||||||
load(params.into(), include_bytes!("../res/ethereum/rinkeby.json"))
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Create a new Görli testnet chain spec.
|
|
||||||
pub fn new_goerli<'a, T: Into<SpecParams<'a>>>(params: T) -> Spec {
|
|
||||||
load(params.into(), include_bytes!("../res/ethereum/goerli.json"))
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Create a new Kotti testnet chain spec.
|
|
||||||
pub fn new_kotti<'a, T: Into<SpecParams<'a>>>(params: T) -> Spec {
|
|
||||||
load(params.into(), include_bytes!("../res/ethereum/kotti.json"))
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Create a new POA Sokol testnet chain spec.
|
|
||||||
pub fn new_sokol<'a, T: Into<SpecParams<'a>>>(params: T) -> Spec {
|
|
||||||
load(params.into(), include_bytes!("../res/ethereum/poasokol.json"))
|
|
||||||
}
|
|
||||||
|
|
||||||
// For tests
|
|
||||||
|
|
||||||
/// Create a new Foundation Frontier-era chain spec as though it never changes to Homestead.
|
|
||||||
pub fn new_frontier_test() -> Spec { load(None, include_bytes!("../res/ethereum/frontier_test.json")) }
|
|
||||||
|
|
||||||
/// Create a new Ropsten chain spec.
|
|
||||||
pub fn new_ropsten_test() -> Spec { load(None, include_bytes!("../res/ethereum/ropsten.json")) }
|
|
||||||
|
|
||||||
/// Create a new Foundation Homestead-era chain spec as though it never changed from Frontier.
|
|
||||||
pub fn new_homestead_test() -> Spec { load(None, include_bytes!("../res/ethereum/homestead_test.json")) }
|
|
||||||
|
|
||||||
/// Create a new Foundation Homestead-EIP150-era chain spec as though it never changed from Homestead/Frontier.
|
|
||||||
pub fn new_eip150_test() -> Spec { load(None, include_bytes!("../res/ethereum/eip150_test.json")) }
|
|
||||||
|
|
||||||
/// Create a new Foundation Homestead-EIP161-era chain spec as though it never changed from Homestead/Frontier.
|
|
||||||
pub fn new_eip161_test() -> Spec { load(None, include_bytes!("../res/ethereum/eip161_test.json")) }
|
|
||||||
|
|
||||||
/// Create a new Foundation Frontier/Homestead/DAO chain spec with transition points at #5 and #8.
|
|
||||||
pub fn new_transition_test() -> Spec { load(None, include_bytes!("../res/ethereum/transition_test.json")) }
|
|
||||||
|
|
||||||
/// Create a new Foundation Mainnet chain spec without genesis accounts.
|
|
||||||
pub fn new_mainnet_like() -> Spec { load(None, include_bytes!("../res/ethereum/frontier_like_test.json")) }
|
|
||||||
|
|
||||||
/// Create a new Foundation Byzantium era spec.
|
|
||||||
pub fn new_byzantium_test() -> Spec { load(None, include_bytes!("../res/ethereum/byzantium_test.json")) }
|
|
||||||
|
|
||||||
/// Create a new Foundation Constantinople era spec.
|
|
||||||
pub fn new_constantinople_test() -> Spec { load(None, include_bytes!("../res/ethereum/constantinople_test.json")) }
|
|
||||||
|
|
||||||
/// Create a new Foundation St. Peter's (Contantinople Fix) era spec.
|
|
||||||
pub fn new_constantinople_fix_test() -> Spec { load(None, include_bytes!("../res/ethereum/st_peters_test.json")) }
|
|
||||||
|
|
||||||
/// Create a new Musicoin-MCIP3-era spec.
|
|
||||||
pub fn new_mcip3_test() -> Spec { load(None, include_bytes!("../res/ethereum/mcip3_test.json")) }
|
|
||||||
|
|
||||||
// For tests
|
|
||||||
|
|
||||||
/// Create a new Foundation Frontier-era chain spec as though it never changes to Homestead.
|
|
||||||
pub fn new_frontier_test_machine() -> Machine { load_machine(include_bytes!("../res/ethereum/frontier_test.json")) }
|
|
||||||
|
|
||||||
/// Create a new Foundation Homestead-era chain spec as though it never changed from Frontier.
|
|
||||||
pub fn new_homestead_test_machine() -> Machine { load_machine(include_bytes!("../res/ethereum/homestead_test.json")) }
|
|
||||||
|
|
||||||
/// Create a new Foundation Homestead-EIP210-era chain spec as though it never changed from Homestead/Frontier.
|
|
||||||
pub fn new_eip210_test_machine() -> Machine { load_machine(include_bytes!("../res/ethereum/eip210_test.json")) }
|
|
||||||
|
|
||||||
/// Create a new Foundation Byzantium era spec.
|
|
||||||
pub fn new_byzantium_test_machine() -> Machine { load_machine(include_bytes!("../res/ethereum/byzantium_test.json")) }
|
|
||||||
|
|
||||||
/// Create a new Foundation Constantinople era spec.
|
|
||||||
pub fn new_constantinople_test_machine() -> Machine { load_machine(include_bytes!("../res/ethereum/constantinople_test.json")) }
|
|
||||||
|
|
||||||
/// Create a new Foundation St. Peter's (Contantinople Fix) era spec.
|
|
||||||
pub fn new_constantinople_fix_test_machine() -> Machine { load_machine(include_bytes!("../res/ethereum/st_peters_test.json")) }
|
|
||||||
|
|
||||||
/// Create a new Musicoin-MCIP3-era spec.
|
|
||||||
pub fn new_mcip3_test_machine() -> Machine { load_machine(include_bytes!("../res/ethereum/mcip3_test.json")) }
|
|
||||||
|
|
||||||
/// Create new Kovan spec with wasm activated at certain block
|
|
||||||
pub fn new_kovan_wasm_test_machine() -> Machine { load_machine(include_bytes!("../res/ethereum/kovan_wasm_test.json")) }
|
|
||||||
|
|
||||||
#[cfg(test)]
|
|
||||||
mod tests {
|
|
||||||
use account_state::State;
|
|
||||||
use ethereum_types::U256;
|
|
||||||
use tempdir::TempDir;
|
|
||||||
use test_helpers::get_temp_state_db;
|
|
||||||
use types::{view, views::BlockView};
|
|
||||||
|
|
||||||
use super::{new_morden, new_foundation};
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn ensure_db_good() {
|
|
||||||
let tempdir = TempDir::new("").unwrap();
|
|
||||||
let spec = new_morden(&tempdir.path());
|
|
||||||
let engine = &spec.engine;
|
|
||||||
let genesis_header = spec.genesis_header();
|
|
||||||
let db = spec.ensure_db_good(get_temp_state_db(), &Default::default()).unwrap();
|
|
||||||
let s = State::from_existing(db, genesis_header.state_root().clone(), engine.account_start_nonce(0), Default::default()).unwrap();
|
|
||||||
assert_eq!(s.balance(&"0000000000000000000000000000000000000001".parse().unwrap()).unwrap(), 1u64.into());
|
|
||||||
assert_eq!(s.balance(&"0000000000000000000000000000000000000002".parse().unwrap()).unwrap(), 1u64.into());
|
|
||||||
assert_eq!(s.balance(&"0000000000000000000000000000000000000003".parse().unwrap()).unwrap(), 1u64.into());
|
|
||||||
assert_eq!(s.balance(&"0000000000000000000000000000000000000004".parse().unwrap()).unwrap(), 1u64.into());
|
|
||||||
assert_eq!(s.balance(&"102e61f5d8f9bc71d0ad4a084df4e65e05ce0e1c".parse().unwrap()).unwrap(), U256::from(1u64) << 200);
|
|
||||||
assert_eq!(s.balance(&"0000000000000000000000000000000000000000".parse().unwrap()).unwrap(), 0u64.into());
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn morden() {
|
|
||||||
let tempdir = TempDir::new("").unwrap();
|
|
||||||
let morden = new_morden(&tempdir.path());
|
|
||||||
|
|
||||||
assert_eq!(morden.state_root(), "f3f4696bbf3b3b07775128eb7a3763279a394e382130f27c21e70233e04946a9".parse().unwrap());
|
|
||||||
let genesis = morden.genesis_block();
|
|
||||||
assert_eq!(view!(BlockView, &genesis).header_view().hash(), "0cd786a2425d16f152c658316c423e6ce1181e15c3295826d7c9904cba9ce303".parse().unwrap());
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn frontier() {
|
|
||||||
let tempdir = TempDir::new("").unwrap();
|
|
||||||
let frontier = new_foundation(&tempdir.path());
|
|
||||||
|
|
||||||
assert_eq!(frontier.state_root(), "d7f8974fb5ac78d9ac099b9ad5018bedc2ce0a72dad1827a1709da30580f0544".parse().unwrap());
|
|
||||||
let genesis = frontier.genesis_block();
|
|
||||||
assert_eq!(view!(BlockView, &genesis).header_view().hash(), "d4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3".parse().unwrap());
|
|
||||||
}
|
|
||||||
}
|
|
@ -1228,15 +1228,16 @@ mod tests {
|
|||||||
errors::ExecutionError,
|
errors::ExecutionError,
|
||||||
transaction::{Action, Transaction},
|
transaction::{Action, Transaction},
|
||||||
};
|
};
|
||||||
|
use crate::spec;
|
||||||
|
|
||||||
fn make_frontier_machine(max_depth: usize) -> Machine {
|
fn make_frontier_machine(max_depth: usize) -> Machine {
|
||||||
let mut machine = ::ethereum::new_frontier_test_machine();
|
let mut machine = spec::new_frontier_test_machine();
|
||||||
machine.set_schedule_creation_rules(Box::new(move |s, _| s.max_depth = max_depth));
|
machine.set_schedule_creation_rules(Box::new(move |s, _| s.max_depth = max_depth));
|
||||||
machine
|
machine
|
||||||
}
|
}
|
||||||
|
|
||||||
fn make_byzantium_machine(max_depth: usize) -> Machine {
|
fn make_byzantium_machine(max_depth: usize) -> Machine {
|
||||||
let mut machine = ::ethereum::new_byzantium_test_machine();
|
let mut machine = spec::new_byzantium_test_machine();
|
||||||
machine.set_schedule_creation_rules(Box::new(move |s, _| s.max_depth = max_depth));
|
machine.set_schedule_creation_rules(Box::new(move |s, _| s.max_depth = max_depth));
|
||||||
machine
|
machine
|
||||||
}
|
}
|
||||||
@ -1590,7 +1591,7 @@ mod tests {
|
|||||||
let mut state = get_temp_state();
|
let mut state = get_temp_state();
|
||||||
state.add_balance(&sender, &U256::from(100), CleanupMode::NoEmpty).unwrap();
|
state.add_balance(&sender, &U256::from(100), CleanupMode::NoEmpty).unwrap();
|
||||||
let info = EnvInfo::default();
|
let info = EnvInfo::default();
|
||||||
let machine = ::ethereum::new_byzantium_test_machine();
|
let machine = spec::new_byzantium_test_machine();
|
||||||
let schedule = machine.schedule(info.number);
|
let schedule = machine.schedule(info.number);
|
||||||
let mut substate = Substate::new();
|
let mut substate = Substate::new();
|
||||||
let mut tracer = ExecutiveTracer::default();
|
let mut tracer = ExecutiveTracer::default();
|
||||||
@ -2122,7 +2123,7 @@ mod tests {
|
|||||||
params.code = Some(Arc::new(code));
|
params.code = Some(Arc::new(code));
|
||||||
params.value = ActionValue::Transfer(U256::zero());
|
params.value = ActionValue::Transfer(U256::zero());
|
||||||
let info = EnvInfo::default();
|
let info = EnvInfo::default();
|
||||||
let machine = ::ethereum::new_byzantium_test_machine();
|
let machine = spec::new_byzantium_test_machine();
|
||||||
let schedule = machine.schedule(info.number);
|
let schedule = machine.schedule(info.number);
|
||||||
let mut substate = Substate::new();
|
let mut substate = Substate::new();
|
||||||
|
|
||||||
@ -2158,7 +2159,7 @@ mod tests {
|
|||||||
state.init_code(&y2, "600060006000600061100162fffffff4".from_hex().unwrap()).unwrap();
|
state.init_code(&y2, "600060006000600061100162fffffff4".from_hex().unwrap()).unwrap();
|
||||||
|
|
||||||
let info = EnvInfo::default();
|
let info = EnvInfo::default();
|
||||||
let machine = ::ethereum::new_constantinople_test_machine();
|
let machine = spec::new_constantinople_test_machine();
|
||||||
let schedule = machine.schedule(info.number);
|
let schedule = machine.schedule(info.number);
|
||||||
|
|
||||||
assert_eq!(state.storage_at(&operating_address, &k).unwrap(), BigEndianHash::from_uint(&U256::from(0)));
|
assert_eq!(state.storage_at(&operating_address, &k).unwrap(), BigEndianHash::from_uint(&U256::from(0)));
|
||||||
@ -2228,7 +2229,7 @@ mod tests {
|
|||||||
info.number = 100;
|
info.number = 100;
|
||||||
|
|
||||||
// Network with wasm activated at block 10
|
// Network with wasm activated at block 10
|
||||||
let machine = ::ethereum::new_kovan_wasm_test_machine();
|
let machine = spec::new_kovan_wasm_test_machine();
|
||||||
|
|
||||||
let mut output = [0u8; 20];
|
let mut output = [0u8; 20];
|
||||||
let FinalizationResult { gas_left: result, return_data, .. } = {
|
let FinalizationResult { gas_left: result, return_data, .. } = {
|
||||||
|
@ -268,7 +268,6 @@ mod tests {
|
|||||||
use test_helpers::{get_temp_state, get_temp_state_db};
|
use test_helpers::{get_temp_state, get_temp_state_db};
|
||||||
use machine::Machine;
|
use machine::Machine;
|
||||||
use vm::EnvInfo;
|
use vm::EnvInfo;
|
||||||
use spec::*;
|
|
||||||
use types::transaction::*;
|
use types::transaction::*;
|
||||||
use trace::{FlatTrace, TraceError, trace};
|
use trace::{FlatTrace, TraceError, trace};
|
||||||
use evm::CallType;
|
use evm::CallType;
|
||||||
@ -276,13 +275,14 @@ mod tests {
|
|||||||
use pod::PodState;
|
use pod::PodState;
|
||||||
use executive_state::ExecutiveState;
|
use executive_state::ExecutiveState;
|
||||||
use account_state::{Account, CleanupMode};
|
use account_state::{Account, CleanupMode};
|
||||||
|
use crate::spec;
|
||||||
|
|
||||||
fn secret() -> Secret {
|
fn secret() -> Secret {
|
||||||
keccak("").into()
|
keccak("").into()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn make_frontier_machine(max_depth: usize) -> Machine {
|
fn make_frontier_machine(max_depth: usize) -> Machine {
|
||||||
let mut machine = ::ethereum::new_frontier_test_machine();
|
let mut machine = spec::new_frontier_test_machine();
|
||||||
machine.set_schedule_creation_rules(Box::new(move |s, _| s.max_depth = max_depth));
|
machine.set_schedule_creation_rules(Box::new(move |s, _| s.max_depth = max_depth));
|
||||||
machine
|
machine
|
||||||
}
|
}
|
||||||
@ -472,7 +472,7 @@ mod tests {
|
|||||||
|
|
||||||
let mut info = EnvInfo::default();
|
let mut info = EnvInfo::default();
|
||||||
info.gas_limit = 1_000_000.into();
|
info.gas_limit = 1_000_000.into();
|
||||||
let machine = Spec::new_test_machine();
|
let machine = spec::new_test_machine();
|
||||||
|
|
||||||
let t = Transaction {
|
let t = Transaction {
|
||||||
nonce: 0.into(),
|
nonce: 0.into(),
|
||||||
@ -513,7 +513,7 @@ mod tests {
|
|||||||
|
|
||||||
let mut info = EnvInfo::default();
|
let mut info = EnvInfo::default();
|
||||||
info.gas_limit = 1_000_000.into();
|
info.gas_limit = 1_000_000.into();
|
||||||
let machine = Spec::new_test_machine();
|
let machine = spec::new_test_machine();
|
||||||
|
|
||||||
let t = Transaction {
|
let t = Transaction {
|
||||||
nonce: 0.into(),
|
nonce: 0.into(),
|
||||||
@ -555,7 +555,7 @@ mod tests {
|
|||||||
|
|
||||||
let mut info = EnvInfo::default();
|
let mut info = EnvInfo::default();
|
||||||
info.gas_limit = 1_000_000.into();
|
info.gas_limit = 1_000_000.into();
|
||||||
let machine = Spec::new_test_machine();
|
let machine = spec::new_test_machine();
|
||||||
|
|
||||||
let t = Transaction {
|
let t = Transaction {
|
||||||
nonce: 0.into(),
|
nonce: 0.into(),
|
||||||
@ -614,7 +614,7 @@ mod tests {
|
|||||||
let mut info = EnvInfo::default();
|
let mut info = EnvInfo::default();
|
||||||
info.gas_limit = 1_000_000.into();
|
info.gas_limit = 1_000_000.into();
|
||||||
info.number = 0x789b0;
|
info.number = 0x789b0;
|
||||||
let machine = Spec::new_test_machine();
|
let machine = spec::new_test_machine();
|
||||||
|
|
||||||
let t = Transaction {
|
let t = Transaction {
|
||||||
nonce: 0.into(),
|
nonce: 0.into(),
|
||||||
|
@ -442,6 +442,7 @@ mod tests {
|
|||||||
use super::*;
|
use super::*;
|
||||||
use trace::{NoopTracer, NoopVMTracer};
|
use trace::{NoopTracer, NoopVMTracer};
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
|
use crate::spec;
|
||||||
|
|
||||||
fn get_test_origin() -> OriginInfo {
|
fn get_test_origin() -> OriginInfo {
|
||||||
OriginInfo {
|
OriginInfo {
|
||||||
@ -480,7 +481,7 @@ mod tests {
|
|||||||
|
|
||||||
impl TestSetup {
|
impl TestSetup {
|
||||||
fn new() -> Self {
|
fn new() -> Self {
|
||||||
let machine = ::spec::Spec::new_test_machine();
|
let machine = spec::new_test_machine();
|
||||||
let env_info = get_test_env_info();
|
let env_info = get_test_env_info();
|
||||||
let schedule = machine.schedule(env_info.number);
|
let schedule = machine.schedule(env_info.number);
|
||||||
TestSetup {
|
TestSetup {
|
||||||
|
@ -61,7 +61,7 @@ macro_rules! difficulty_json_test {
|
|||||||
|
|
||||||
fn do_json_test<H: FnMut(&str, HookType)>(json_data: &[u8], h: &mut H) -> Vec<String> {
|
fn do_json_test<H: FnMut(&str, HookType)>(json_data: &[u8], h: &mut H) -> Vec<String> {
|
||||||
let tempdir = TempDir::new("").unwrap();
|
let tempdir = TempDir::new("").unwrap();
|
||||||
json_difficulty_test(json_data, ::ethereum::$spec(&tempdir.path()), h)
|
json_difficulty_test(json_data, crate::spec::$spec(&tempdir.path()), h)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -74,7 +74,7 @@ macro_rules! difficulty_json_test_nopath {
|
|||||||
use json_tests::HookType;
|
use json_tests::HookType;
|
||||||
|
|
||||||
fn do_json_test<H: FnMut(&str, HookType)>(json_data: &[u8], h: &mut H) -> Vec<String> {
|
fn do_json_test<H: FnMut(&str, HookType)>(json_data: &[u8], h: &mut H) -> Vec<String> {
|
||||||
json_difficulty_test(json_data, ::ethereum::$spec(), h)
|
json_difficulty_test(json_data, crate::spec::$spec(), h)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -37,6 +37,7 @@ use rlp::RlpStream;
|
|||||||
use hash::keccak;
|
use hash::keccak;
|
||||||
use machine::Machine;
|
use machine::Machine;
|
||||||
use ethereum_types::BigEndianHash;
|
use ethereum_types::BigEndianHash;
|
||||||
|
use crate::spec;
|
||||||
|
|
||||||
use super::HookType;
|
use super::HookType;
|
||||||
|
|
||||||
@ -271,7 +272,7 @@ fn do_json_test_for<H: FnMut(&str, HookType)>(vm_type: &VMType, json_data: &[u8]
|
|||||||
state.populate_from(From::from(vm.pre_state.clone()));
|
state.populate_from(From::from(vm.pre_state.clone()));
|
||||||
let info: EnvInfo = From::from(vm.env);
|
let info: EnvInfo = From::from(vm.env);
|
||||||
let machine = {
|
let machine = {
|
||||||
let mut machine = ::ethereum::new_frontier_test_machine();
|
let mut machine = spec::new_frontier_test_machine();
|
||||||
machine.set_schedule_creation_rules(Box::new(move |s, _| s.max_depth = 1));
|
machine.set_schedule_creation_rules(Box::new(move |s, _| s.max_depth = 1));
|
||||||
machine
|
machine
|
||||||
};
|
};
|
||||||
|
@ -152,7 +152,6 @@ extern crate parity_runtime;
|
|||||||
pub mod block;
|
pub mod block;
|
||||||
pub mod client;
|
pub mod client;
|
||||||
pub mod engines;
|
pub mod engines;
|
||||||
pub mod ethereum;
|
|
||||||
pub mod executed;
|
pub mod executed;
|
||||||
pub mod executive;
|
pub mod executive;
|
||||||
pub mod executive_state;
|
pub mod executive_state;
|
||||||
|
@ -402,6 +402,7 @@ fn round_block_gas_limit(gas_limit: U256, lower_limit: U256, upper_limit: U256)
|
|||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
|
use crate::spec;
|
||||||
|
|
||||||
fn get_default_ethash_extensions() -> EthashExtensions {
|
fn get_default_ethash_extensions() -> EthashExtensions {
|
||||||
EthashExtensions {
|
EthashExtensions {
|
||||||
@ -416,7 +417,7 @@ mod tests {
|
|||||||
fn should_disallow_unsigned_transactions() {
|
fn should_disallow_unsigned_transactions() {
|
||||||
let rlp = "ea80843b9aca0083015f90948921ebb5f79e9e3920abe571004d0b1d5119c154865af3107a400080038080";
|
let rlp = "ea80843b9aca0083015f90948921ebb5f79e9e3920abe571004d0b1d5119c154865af3107a400080038080";
|
||||||
let transaction: UnverifiedTransaction = ::rlp::decode(&::rustc_hex::FromHex::from_hex(rlp).unwrap()).unwrap();
|
let transaction: UnverifiedTransaction = ::rlp::decode(&::rustc_hex::FromHex::from_hex(rlp).unwrap()).unwrap();
|
||||||
let spec = ::ethereum::new_ropsten_test();
|
let spec = spec::new_ropsten_test();
|
||||||
let ethparams = get_default_ethash_extensions();
|
let ethparams = get_default_ethash_extensions();
|
||||||
|
|
||||||
let machine = Machine::with_ethash_extensions(
|
let machine = Machine::with_ethash_extensions(
|
||||||
@ -435,7 +436,7 @@ mod tests {
|
|||||||
fn ethash_gas_limit_is_multiple_of_determinant() {
|
fn ethash_gas_limit_is_multiple_of_determinant() {
|
||||||
use ethereum_types::U256;
|
use ethereum_types::U256;
|
||||||
|
|
||||||
let spec = ::ethereum::new_homestead_test();
|
let spec = spec::new_homestead_test();
|
||||||
let ethparams = get_default_ethash_extensions();
|
let ethparams = get_default_ethash_extensions();
|
||||||
|
|
||||||
let machine = Machine::with_ethash_extensions(
|
let machine = Machine::with_ethash_extensions(
|
||||||
|
@ -1488,12 +1488,13 @@ mod tests {
|
|||||||
use miner::{MinerService, PendingOrdering};
|
use miner::{MinerService, PendingOrdering};
|
||||||
use test_helpers::{generate_dummy_client, generate_dummy_client_with_spec};
|
use test_helpers::{generate_dummy_client, generate_dummy_client_with_spec};
|
||||||
use types::transaction::{Transaction};
|
use types::transaction::{Transaction};
|
||||||
|
use crate::spec;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn should_prepare_block_to_seal() {
|
fn should_prepare_block_to_seal() {
|
||||||
// given
|
// given
|
||||||
let client = TestBlockChainClient::default();
|
let client = TestBlockChainClient::default();
|
||||||
let miner = Miner::new_for_tests(&Spec::new_test(), None);
|
let miner = Miner::new_for_tests(&spec::new_test(), None);
|
||||||
|
|
||||||
// when
|
// when
|
||||||
let sealing_work = miner.work_package(&client);
|
let sealing_work = miner.work_package(&client);
|
||||||
@ -1504,7 +1505,7 @@ mod tests {
|
|||||||
fn should_still_work_after_a_couple_of_blocks() {
|
fn should_still_work_after_a_couple_of_blocks() {
|
||||||
// given
|
// given
|
||||||
let client = TestBlockChainClient::default();
|
let client = TestBlockChainClient::default();
|
||||||
let miner = Miner::new_for_tests(&Spec::new_test(), None);
|
let miner = Miner::new_for_tests(&spec::new_test(), None);
|
||||||
|
|
||||||
let res = miner.work_package(&client);
|
let res = miner.work_package(&client);
|
||||||
let hash = res.unwrap().0;
|
let hash = res.unwrap().0;
|
||||||
@ -1548,7 +1549,7 @@ mod tests {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
GasPricer::new_fixed(0u64.into()),
|
GasPricer::new_fixed(0u64.into()),
|
||||||
&Spec::new_test(),
|
&spec::new_test(),
|
||||||
::std::collections::HashSet::new(), // local accounts
|
::std::collections::HashSet::new(), // local accounts
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -1671,7 +1672,7 @@ mod tests {
|
|||||||
..miner().options
|
..miner().options
|
||||||
},
|
},
|
||||||
GasPricer::new_fixed(0u64.into()),
|
GasPricer::new_fixed(0u64.into()),
|
||||||
&Spec::new_test(),
|
&spec::new_test(),
|
||||||
local_accounts,
|
local_accounts,
|
||||||
);
|
);
|
||||||
let transaction = transaction();
|
let transaction = transaction();
|
||||||
@ -1714,7 +1715,7 @@ mod tests {
|
|||||||
..miner().options
|
..miner().options
|
||||||
},
|
},
|
||||||
GasPricer::new_fixed(0u64.into()),
|
GasPricer::new_fixed(0u64.into()),
|
||||||
&Spec::new_test(),
|
&spec::new_test(),
|
||||||
HashSet::from_iter(vec![transaction.sender()].into_iter()),
|
HashSet::from_iter(vec![transaction.sender()].into_iter()),
|
||||||
);
|
);
|
||||||
let best_block = 0;
|
let best_block = 0;
|
||||||
@ -1746,7 +1747,7 @@ mod tests {
|
|||||||
#[test]
|
#[test]
|
||||||
fn internal_seals_without_work() {
|
fn internal_seals_without_work() {
|
||||||
let _ = env_logger::try_init();
|
let _ = env_logger::try_init();
|
||||||
let spec = Spec::new_instant();
|
let spec = spec::new_instant();
|
||||||
let miner = Miner::new_for_tests(&spec, None);
|
let miner = Miner::new_for_tests(&spec, None);
|
||||||
|
|
||||||
let client = generate_dummy_client(2);
|
let client = generate_dummy_client(2);
|
||||||
@ -1775,7 +1776,7 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn should_not_fail_setting_engine_signer_without_account_provider() {
|
fn should_not_fail_setting_engine_signer_without_account_provider() {
|
||||||
let spec = Spec::new_test_round;
|
let spec = spec::new_test_round;
|
||||||
let tap = Arc::new(AccountProvider::transient_provider());
|
let tap = Arc::new(AccountProvider::transient_provider());
|
||||||
let addr = tap.insert_account(keccak("1").into(), &"".into()).unwrap();
|
let addr = tap.insert_account(keccak("1").into(), &"".into()).unwrap();
|
||||||
let client = generate_dummy_client_with_spec(spec);
|
let client = generate_dummy_client_with_spec(spec);
|
||||||
@ -1791,7 +1792,7 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn should_mine_if_internal_sealing_is_enabled() {
|
fn should_mine_if_internal_sealing_is_enabled() {
|
||||||
let spec = Spec::new_instant();
|
let spec = spec::new_instant();
|
||||||
let miner = Miner::new_for_tests(&spec, None);
|
let miner = Miner::new_for_tests(&spec, None);
|
||||||
|
|
||||||
let client = generate_dummy_client(2);
|
let client = generate_dummy_client(2);
|
||||||
@ -1802,7 +1803,7 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn should_not_mine_if_internal_sealing_is_disabled() {
|
fn should_not_mine_if_internal_sealing_is_disabled() {
|
||||||
let spec = Spec::new_test_round();
|
let spec = spec::new_test_round();
|
||||||
let miner = Miner::new_for_tests(&spec, None);
|
let miner = Miner::new_for_tests(&spec, None);
|
||||||
|
|
||||||
let client = generate_dummy_client(2);
|
let client = generate_dummy_client(2);
|
||||||
@ -1813,7 +1814,7 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn should_not_mine_if_no_fetch_work_request() {
|
fn should_not_mine_if_no_fetch_work_request() {
|
||||||
let spec = Spec::new_test();
|
let spec = spec::new_test();
|
||||||
let miner = Miner::new_for_tests(&spec, None);
|
let miner = Miner::new_for_tests(&spec, None);
|
||||||
|
|
||||||
let client = generate_dummy_client(2);
|
let client = generate_dummy_client(2);
|
||||||
@ -1831,7 +1832,7 @@ mod tests {
|
|||||||
fn notify(&self, _pow_hash: H256, _difficulty: U256, _number: u64) { }
|
fn notify(&self, _pow_hash: H256, _difficulty: U256, _number: u64) { }
|
||||||
}
|
}
|
||||||
|
|
||||||
let spec = Spec::new_test();
|
let spec = spec::new_test();
|
||||||
let miner = Miner::new_for_tests(&spec, None);
|
let miner = Miner::new_for_tests(&spec, None);
|
||||||
miner.add_work_listener(Box::new(DummyNotifyWork));
|
miner.add_work_listener(Box::new(DummyNotifyWork));
|
||||||
|
|
||||||
@ -1844,7 +1845,7 @@ mod tests {
|
|||||||
#[test]
|
#[test]
|
||||||
fn should_set_new_minimum_gas_price() {
|
fn should_set_new_minimum_gas_price() {
|
||||||
// Creates a new GasPricer::Fixed behind the scenes
|
// Creates a new GasPricer::Fixed behind the scenes
|
||||||
let miner = Miner::new_for_tests(&Spec::new_test(), None);
|
let miner = Miner::new_for_tests(&spec::new_test(), None);
|
||||||
|
|
||||||
let expected_minimum_gas_price: U256 = 0x1337.into();
|
let expected_minimum_gas_price: U256 = 0x1337.into();
|
||||||
miner.set_minimal_gas_price(expected_minimum_gas_price).unwrap();
|
miner.set_minimal_gas_price(expected_minimum_gas_price).unwrap();
|
||||||
@ -1882,7 +1883,7 @@ mod tests {
|
|||||||
#[cfg(feature = "price-info")]
|
#[cfg(feature = "price-info")]
|
||||||
fn should_fail_to_set_new_minimum_gas_price() {
|
fn should_fail_to_set_new_minimum_gas_price() {
|
||||||
// We get a fixed gas pricer by default, need to change that
|
// We get a fixed gas pricer by default, need to change that
|
||||||
let miner = Miner::new_for_tests(&Spec::new_test(), None);
|
let miner = Miner::new_for_tests(&spec::new_test(), None);
|
||||||
let calibrated_gas_pricer = dynamic_gas_pricer();
|
let calibrated_gas_pricer = dynamic_gas_pricer();
|
||||||
*miner.gas_pricer.lock() = calibrated_gas_pricer;
|
*miner.gas_pricer.lock() = calibrated_gas_pricer;
|
||||||
|
|
||||||
|
@ -899,7 +899,7 @@ impl Drop for Service {
|
|||||||
mod tests {
|
mod tests {
|
||||||
use client::ClientIoMessage;
|
use client::ClientIoMessage;
|
||||||
use io::{IoService};
|
use io::{IoService};
|
||||||
use spec::Spec;
|
use crate::spec;
|
||||||
use journaldb::Algorithm;
|
use journaldb::Algorithm;
|
||||||
use snapshot::{ManifestData, RestorationStatus, SnapshotService};
|
use snapshot::{ManifestData, RestorationStatus, SnapshotService};
|
||||||
use super::*;
|
use super::*;
|
||||||
@ -909,9 +909,9 @@ mod tests {
|
|||||||
#[test]
|
#[test]
|
||||||
fn sends_async_messages() {
|
fn sends_async_messages() {
|
||||||
let gas_prices = vec![1.into(), 2.into(), 3.into(), 999.into()];
|
let gas_prices = vec![1.into(), 2.into(), 3.into(), 999.into()];
|
||||||
let client = generate_dummy_client_with_spec_and_data(Spec::new_null, 400, 5, &gas_prices);
|
let client = generate_dummy_client_with_spec_and_data(spec::new_null, 400, 5, &gas_prices);
|
||||||
let service = IoService::<ClientIoMessage>::start().unwrap();
|
let service = IoService::<ClientIoMessage>::start().unwrap();
|
||||||
let spec = Spec::new_test();
|
let spec = spec::new_test();
|
||||||
|
|
||||||
let tempdir = TempDir::new("").unwrap();
|
let tempdir = TempDir::new("").unwrap();
|
||||||
let dir = tempdir.path().join("snapshot");
|
let dir = tempdir.path().join("snapshot");
|
||||||
@ -952,7 +952,7 @@ mod tests {
|
|||||||
use ethereum_types::H256;
|
use ethereum_types::H256;
|
||||||
use kvdb_rocksdb::DatabaseConfig;
|
use kvdb_rocksdb::DatabaseConfig;
|
||||||
|
|
||||||
let spec = Spec::new_test();
|
let spec = spec::new_test();
|
||||||
let tempdir = TempDir::new("").unwrap();
|
let tempdir = TempDir::new("").unwrap();
|
||||||
|
|
||||||
let state_hashes: Vec<_> = (0..5).map(|_| H256::random()).collect();
|
let state_hashes: Vec<_> = (0..5).map(|_| H256::random()).collect();
|
||||||
|
@ -29,6 +29,7 @@ use parking_lot::Mutex;
|
|||||||
use snappy;
|
use snappy;
|
||||||
use kvdb::DBTransaction;
|
use kvdb::DBTransaction;
|
||||||
use test_helpers;
|
use test_helpers;
|
||||||
|
use crate::spec;
|
||||||
|
|
||||||
const SNAPSHOT_MODE: ::snapshot::PowSnapshot = ::snapshot::PowSnapshot { blocks: 30000, max_restore_blocks: 30000 };
|
const SNAPSHOT_MODE: ::snapshot::PowSnapshot = ::snapshot::PowSnapshot { blocks: 30000, max_restore_blocks: 30000 };
|
||||||
|
|
||||||
@ -38,7 +39,7 @@ fn chunk_and_restore(amount: u64) {
|
|||||||
let generator = BlockGenerator::new(vec![rest]);
|
let generator = BlockGenerator::new(vec![rest]);
|
||||||
let genesis = genesis.last();
|
let genesis = genesis.last();
|
||||||
|
|
||||||
let engine = ::spec::Spec::new_test().engine;
|
let engine = spec::new_test().engine;
|
||||||
let tempdir = TempDir::new("").unwrap();
|
let tempdir = TempDir::new("").unwrap();
|
||||||
let snapshot_path = tempdir.path().join("SNAP");
|
let snapshot_path = tempdir.path().join("SNAP");
|
||||||
|
|
||||||
@ -128,7 +129,7 @@ fn checks_flag() {
|
|||||||
let chunk = stream.out();
|
let chunk = stream.out();
|
||||||
|
|
||||||
let db = test_helpers::new_db();
|
let db = test_helpers::new_db();
|
||||||
let engine = ::spec::Spec::new_test().engine;
|
let engine = spec::new_test().engine;
|
||||||
let chain = BlockChain::new(Default::default(), genesis.last().encoded().raw(), db.clone());
|
let chain = BlockChain::new(Default::default(), genesis.last().encoded().raw(), db.clone());
|
||||||
|
|
||||||
let manifest = ::snapshot::ManifestData {
|
let manifest = ::snapshot::ManifestData {
|
||||||
|
@ -27,7 +27,7 @@ use types::ids::BlockId;
|
|||||||
use snapshot::io::{PackedReader, PackedWriter, SnapshotReader, SnapshotWriter};
|
use snapshot::io::{PackedReader, PackedWriter, SnapshotReader, SnapshotWriter};
|
||||||
use snapshot::service::{Service, ServiceParams};
|
use snapshot::service::{Service, ServiceParams};
|
||||||
use snapshot::{chunk_state, chunk_secondary, ManifestData, Progress, SnapshotService, RestorationStatus};
|
use snapshot::{chunk_state, chunk_secondary, ManifestData, Progress, SnapshotService, RestorationStatus};
|
||||||
use spec::Spec;
|
use crate::spec;
|
||||||
use test_helpers::{new_db, new_temp_db, generate_dummy_client_with_spec_and_data, restoration_db_handler};
|
use test_helpers::{new_db, new_temp_db, generate_dummy_client_with_spec_and_data, restoration_db_handler};
|
||||||
|
|
||||||
use parking_lot::Mutex;
|
use parking_lot::Mutex;
|
||||||
@ -43,7 +43,7 @@ fn restored_is_equivalent() {
|
|||||||
const TX_PER: usize = 5;
|
const TX_PER: usize = 5;
|
||||||
|
|
||||||
let gas_prices = vec![1.into(), 2.into(), 3.into(), 999.into()];
|
let gas_prices = vec![1.into(), 2.into(), 3.into(), 999.into()];
|
||||||
let client = generate_dummy_client_with_spec_and_data(Spec::new_null, NUM_BLOCKS, TX_PER, &gas_prices);
|
let client = generate_dummy_client_with_spec_and_data(spec::new_null, NUM_BLOCKS, TX_PER, &gas_prices);
|
||||||
|
|
||||||
let tempdir = TempDir::new("").unwrap();
|
let tempdir = TempDir::new("").unwrap();
|
||||||
let client_db = tempdir.path().join("client_db");
|
let client_db = tempdir.path().join("client_db");
|
||||||
@ -53,7 +53,7 @@ fn restored_is_equivalent() {
|
|||||||
let restoration = restoration_db_handler(db_config);
|
let restoration = restoration_db_handler(db_config);
|
||||||
let blockchain_db = restoration.open(&client_db).unwrap();
|
let blockchain_db = restoration.open(&client_db).unwrap();
|
||||||
|
|
||||||
let spec = Spec::new_null();
|
let spec = spec::new_null();
|
||||||
let client2 = Client::new(
|
let client2 = Client::new(
|
||||||
Default::default(),
|
Default::default(),
|
||||||
&spec,
|
&spec,
|
||||||
@ -107,9 +107,9 @@ fn restored_is_equivalent() {
|
|||||||
#[test]
|
#[test]
|
||||||
fn guards_delete_folders() {
|
fn guards_delete_folders() {
|
||||||
let gas_prices = vec![1.into(), 2.into(), 3.into(), 999.into()];
|
let gas_prices = vec![1.into(), 2.into(), 3.into(), 999.into()];
|
||||||
let client = generate_dummy_client_with_spec_and_data(Spec::new_null, 400, 5, &gas_prices);
|
let client = generate_dummy_client_with_spec_and_data(spec::new_null, 400, 5, &gas_prices);
|
||||||
|
|
||||||
let spec = Spec::new_null();
|
let spec = spec::new_null();
|
||||||
let tempdir = TempDir::new("").unwrap();
|
let tempdir = TempDir::new("").unwrap();
|
||||||
let service_params = ServiceParams {
|
let service_params = ServiceParams {
|
||||||
engine: spec.engine.clone(),
|
engine: spec.engine.clone(),
|
||||||
@ -165,7 +165,7 @@ fn keep_ancient_blocks() {
|
|||||||
|
|
||||||
// Generate blocks
|
// Generate blocks
|
||||||
let gas_prices = vec![1.into(), 2.into(), 3.into(), 999.into()];
|
let gas_prices = vec![1.into(), 2.into(), 3.into(), 999.into()];
|
||||||
let spec_f = Spec::new_null;
|
let spec_f = spec::new_null;
|
||||||
let spec = spec_f();
|
let spec = spec_f();
|
||||||
let client = generate_dummy_client_with_spec_and_data(spec_f, NUM_BLOCKS as u32, 5, &gas_prices);
|
let client = generate_dummy_client_with_spec_and_data(spec_f, NUM_BLOCKS as u32, 5, &gas_prices);
|
||||||
|
|
||||||
@ -276,9 +276,9 @@ fn recover_aborted_recovery() {
|
|||||||
|
|
||||||
const NUM_BLOCKS: u32 = 400;
|
const NUM_BLOCKS: u32 = 400;
|
||||||
let gas_prices = vec![1.into(), 2.into(), 3.into(), 999.into()];
|
let gas_prices = vec![1.into(), 2.into(), 3.into(), 999.into()];
|
||||||
let client = generate_dummy_client_with_spec_and_data(Spec::new_null, NUM_BLOCKS, 5, &gas_prices);
|
let client = generate_dummy_client_with_spec_and_data(spec::new_null, NUM_BLOCKS, 5, &gas_prices);
|
||||||
|
|
||||||
let spec = Spec::new_null();
|
let spec = spec::new_null();
|
||||||
let tempdir = TempDir::new("").unwrap();
|
let tempdir = TempDir::new("").unwrap();
|
||||||
let db_config = DatabaseConfig::with_columns(::db::NUM_COLUMNS);
|
let db_config = DatabaseConfig::with_columns(::db::NUM_COLUMNS);
|
||||||
let client_db = new_db();
|
let client_db = new_db();
|
||||||
|
165
ethcore/src/spec/chain.rs
Normal file
165
ethcore/src/spec/chain.rs
Normal file
@ -0,0 +1,165 @@
|
|||||||
|
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
||||||
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
|
||||||
|
// Parity Ethereum is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with Parity Ethereum. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
//! Ethereum protocol module.
|
||||||
|
//!
|
||||||
|
//! Loads all protocols supported by parity-ethereum client.
|
||||||
|
|
||||||
|
macro_rules! bundle_release_spec {
|
||||||
|
($($path: expr => $name: ident), *) => {
|
||||||
|
$(
|
||||||
|
/// Bundled release spec
|
||||||
|
pub fn $name<'a, T: Into<crate::spec::SpecParams<'a>>>(params: T) -> crate::spec::Spec {
|
||||||
|
let params = params.into();
|
||||||
|
crate::spec::Spec::load(
|
||||||
|
params,
|
||||||
|
include_bytes!(concat!("../../res/", $path, ".json")) as &[u8]
|
||||||
|
).expect(concat!("Chain spec ", $path, " is invalid."))
|
||||||
|
}
|
||||||
|
)*
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
macro_rules! bundle_test_spec {
|
||||||
|
($($path: expr => $name: ident), *) => {
|
||||||
|
$(
|
||||||
|
/// Bundled test spec
|
||||||
|
pub fn $name() -> crate::spec::Spec {
|
||||||
|
crate::spec::Spec::load(
|
||||||
|
&::std::env::temp_dir(),
|
||||||
|
include_bytes!(concat!("../../res/", $path, ".json")) as &[u8]
|
||||||
|
).expect(concat!("Chain spec ", $path, " is invalid."))
|
||||||
|
}
|
||||||
|
)*
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
macro_rules! bundle_test_machine {
|
||||||
|
($($path: expr => $name: ident), *) => {
|
||||||
|
$(
|
||||||
|
/// Bundled test spec
|
||||||
|
pub fn $name() -> crate::machine::Machine {
|
||||||
|
crate::spec::Spec::load_machine(
|
||||||
|
include_bytes!(concat!("../../res/", $path, ".json")) as &[u8]
|
||||||
|
).expect(concat!("Chain spec ", $path, " is invalid."))
|
||||||
|
}
|
||||||
|
)*
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bundle_release_spec! {
|
||||||
|
"ethereum/callisto" => new_callisto,
|
||||||
|
"ethereum/classic" => new_classic,
|
||||||
|
"ethereum/ellaism" => new_ellaism,
|
||||||
|
"ethereum/expanse" => new_expanse,
|
||||||
|
"ethereum/foundation" => new_foundation,
|
||||||
|
"ethereum/goerli" => new_goerli,
|
||||||
|
"ethereum/kotti" => new_kotti,
|
||||||
|
"ethereum/kovan" => new_kovan,
|
||||||
|
"ethereum/mix" => new_mix,
|
||||||
|
"ethereum/morden" => new_morden,
|
||||||
|
"ethereum/musicoin" => new_musicoin,
|
||||||
|
"ethereum/poacore" => new_poanet,
|
||||||
|
"ethereum/poasokol" => new_sokol,
|
||||||
|
"ethereum/rinkeby" => new_rinkeby,
|
||||||
|
"ethereum/ropsten" => new_ropsten,
|
||||||
|
"ethereum/tobalaba" => new_tobalaba
|
||||||
|
}
|
||||||
|
|
||||||
|
bundle_test_spec! {
|
||||||
|
"authority_round" => new_test_round,
|
||||||
|
"authority_round_block_reward_contract" => new_test_round_block_reward_contract,
|
||||||
|
"authority_round_empty_steps" => new_test_round_empty_steps,
|
||||||
|
"constructor" => new_test_constructor,
|
||||||
|
"ethereum/byzantium_test" => new_byzantium_test,
|
||||||
|
"ethereum/constantinople_test" => new_constantinople_test,
|
||||||
|
"ethereum/eip150_test" => new_eip150_test,
|
||||||
|
"ethereum/eip161_test" => new_eip161_test,
|
||||||
|
"ethereum/eip210_test" => new_eip210_test,
|
||||||
|
"ethereum/frontier_like_test" => new_mainnet_like,
|
||||||
|
"ethereum/frontier_test" => new_frontier_test,
|
||||||
|
"ethereum/homestead_test" => new_homestead_test,
|
||||||
|
"ethereum/kovan_wasm_test" => new_kovan_wasm_test,
|
||||||
|
"ethereum/mcip3_test" => new_mcip3_test,
|
||||||
|
"ethereum/morden" => new_morden_test,
|
||||||
|
"ethereum/ropsten" => new_ropsten_test,
|
||||||
|
"ethereum/st_peters_test" => new_constantinople_fix_test,
|
||||||
|
"ethereum/transition_test" => new_transition_test,
|
||||||
|
"instant_seal" => new_instant,
|
||||||
|
"null" => new_null,
|
||||||
|
"null_morden" => new_test,
|
||||||
|
"null_morden_with_reward" => new_test_with_reward,
|
||||||
|
"validator_contract" => new_validator_contract,
|
||||||
|
"validator_multi" => new_validator_multi,
|
||||||
|
"validator_safe_contract" => new_validator_safe_contract
|
||||||
|
}
|
||||||
|
|
||||||
|
bundle_test_machine! {
|
||||||
|
"ethereum/byzantium_test" => new_byzantium_test_machine,
|
||||||
|
"ethereum/constantinople_test" => new_constantinople_test_machine,
|
||||||
|
"ethereum/eip210_test" => new_eip210_test_machine,
|
||||||
|
"ethereum/frontier_test" => new_frontier_test_machine,
|
||||||
|
"ethereum/homestead_test" => new_homestead_test_machine,
|
||||||
|
"ethereum/kovan_wasm_test" => new_kovan_wasm_test_machine,
|
||||||
|
"null_morden" => new_test_machine
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use account_state::State;
|
||||||
|
use ethereum_types::U256;
|
||||||
|
use tempdir::TempDir;
|
||||||
|
use test_helpers::get_temp_state_db;
|
||||||
|
use types::{view, views::BlockView};
|
||||||
|
|
||||||
|
use super::{new_morden, new_foundation};
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn ensure_db_good() {
|
||||||
|
let tempdir = TempDir::new("").unwrap();
|
||||||
|
let spec = new_morden(&tempdir.path());
|
||||||
|
let engine = &spec.engine;
|
||||||
|
let genesis_header = spec.genesis_header();
|
||||||
|
let db = spec.ensure_db_good(get_temp_state_db(), &Default::default()).unwrap();
|
||||||
|
let s = State::from_existing(db, genesis_header.state_root().clone(), engine.account_start_nonce(0), Default::default()).unwrap();
|
||||||
|
assert_eq!(s.balance(&"0000000000000000000000000000000000000001".parse().unwrap()).unwrap(), 1u64.into());
|
||||||
|
assert_eq!(s.balance(&"0000000000000000000000000000000000000002".parse().unwrap()).unwrap(), 1u64.into());
|
||||||
|
assert_eq!(s.balance(&"0000000000000000000000000000000000000003".parse().unwrap()).unwrap(), 1u64.into());
|
||||||
|
assert_eq!(s.balance(&"0000000000000000000000000000000000000004".parse().unwrap()).unwrap(), 1u64.into());
|
||||||
|
assert_eq!(s.balance(&"102e61f5d8f9bc71d0ad4a084df4e65e05ce0e1c".parse().unwrap()).unwrap(), U256::from(1u64) << 200);
|
||||||
|
assert_eq!(s.balance(&"0000000000000000000000000000000000000000".parse().unwrap()).unwrap(), 0u64.into());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn morden() {
|
||||||
|
let tempdir = TempDir::new("").unwrap();
|
||||||
|
let morden = new_morden(&tempdir.path());
|
||||||
|
|
||||||
|
assert_eq!(morden.state_root(), "f3f4696bbf3b3b07775128eb7a3763279a394e382130f27c21e70233e04946a9".parse().unwrap());
|
||||||
|
let genesis = morden.genesis_block();
|
||||||
|
assert_eq!(view!(BlockView, &genesis).header_view().hash(), "0cd786a2425d16f152c658316c423e6ce1181e15c3295826d7c9904cba9ce303".parse().unwrap());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn frontier() {
|
||||||
|
let tempdir = TempDir::new("").unwrap();
|
||||||
|
let frontier = new_foundation(&tempdir.path());
|
||||||
|
|
||||||
|
assert_eq!(frontier.state_root(), "d7f8974fb5ac78d9ac099b9ad5018bedc2ce0a72dad1827a1709da30580f0544".parse().unwrap());
|
||||||
|
let genesis = frontier.genesis_block();
|
||||||
|
assert_eq!(view!(BlockView, &genesis).header_view().hash(), "d4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3".parse().unwrap());
|
||||||
|
}
|
||||||
|
}
|
@ -16,9 +16,11 @@
|
|||||||
|
|
||||||
//! Blockchain params.
|
//! Blockchain params.
|
||||||
|
|
||||||
|
mod chain;
|
||||||
mod genesis;
|
mod genesis;
|
||||||
mod seal;
|
mod seal;
|
||||||
mod spec;
|
mod spec;
|
||||||
|
|
||||||
|
pub use self::chain::*;
|
||||||
pub use self::genesis::Genesis;
|
pub use self::genesis::Genesis;
|
||||||
pub use self::spec::{Spec, SpecHardcodedSync, SpecParams, OptimizeFor};
|
pub use self::spec::{Spec, SpecHardcodedSync, SpecParams, OptimizeFor};
|
||||||
|
@ -62,7 +62,6 @@ fn fmt_err<F: ::std::fmt::Display>(f: F) -> String {
|
|||||||
|
|
||||||
/// Runtime parameters for the spec that are related to how the software should run the chain,
|
/// Runtime parameters for the spec that are related to how the software should run the chain,
|
||||||
/// rather than integral properties of the chain itself.
|
/// rather than integral properties of the chain itself.
|
||||||
#[derive(Debug, Clone, Copy)]
|
|
||||||
pub struct SpecParams<'a> {
|
pub struct SpecParams<'a> {
|
||||||
/// The path to the folder used to cache nodes. This is typically /tmp/ on Unix-like systems
|
/// The path to the folder used to cache nodes. This is typically /tmp/ on Unix-like systems
|
||||||
pub cache_dir: &'a Path,
|
pub cache_dir: &'a Path,
|
||||||
@ -187,16 +186,14 @@ fn run_constructors<T: Backend>(
|
|||||||
/// Parameters for a block chain; includes both those intrinsic to the design of the
|
/// Parameters for a block chain; includes both those intrinsic to the design of the
|
||||||
/// chain and those to be interpreted by the active chain engine.
|
/// chain and those to be interpreted by the active chain engine.
|
||||||
pub struct Spec {
|
pub struct Spec {
|
||||||
/// User friendly spec name
|
/// User friendly spec name.
|
||||||
pub name: String,
|
pub name: String,
|
||||||
/// What engine are we using for this?
|
/// Engine specified by json file.
|
||||||
pub engine: Arc<dyn Engine>,
|
pub engine: Arc<dyn Engine>,
|
||||||
/// Name of the subdir inside the main data dir to use for chain data and settings.
|
/// Name of the subdir inside the main data dir to use for chain data and settings.
|
||||||
pub data_dir: String,
|
pub data_dir: String,
|
||||||
|
|
||||||
/// Known nodes on the network in enode format.
|
/// Known nodes on the network in enode format.
|
||||||
pub nodes: Vec<String>,
|
pub nodes: Vec<String>,
|
||||||
|
|
||||||
/// The genesis block's parent hash field.
|
/// The genesis block's parent hash field.
|
||||||
pub parent_hash: H256,
|
pub parent_hash: H256,
|
||||||
/// The genesis block's author field.
|
/// The genesis block's author field.
|
||||||
@ -217,48 +214,17 @@ pub struct Spec {
|
|||||||
pub extra_data: Bytes,
|
pub extra_data: Bytes,
|
||||||
/// Each seal field, expressed as RLP, concatenated.
|
/// Each seal field, expressed as RLP, concatenated.
|
||||||
pub seal_rlp: Bytes,
|
pub seal_rlp: Bytes,
|
||||||
|
|
||||||
/// Hardcoded synchronization. Allows the light client to immediately jump to a specific block.
|
/// Hardcoded synchronization. Allows the light client to immediately jump to a specific block.
|
||||||
pub hardcoded_sync: Option<SpecHardcodedSync>,
|
pub hardcoded_sync: Option<SpecHardcodedSync>,
|
||||||
|
|
||||||
/// Contract constructors to be executed on genesis.
|
/// Contract constructors to be executed on genesis.
|
||||||
constructors: Vec<(Address, Bytes)>,
|
pub constructors: Vec<(Address, Bytes)>,
|
||||||
|
|
||||||
/// May be prepopulated if we know this in advance.
|
/// May be prepopulated if we know this in advance.
|
||||||
state_root_memo: H256,
|
pub state_root_memo: H256,
|
||||||
|
|
||||||
/// Genesis state as plain old data.
|
/// Genesis state as plain old data.
|
||||||
genesis_state: PodState,
|
pub genesis_state: PodState,
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(test)]
|
|
||||||
impl Clone for Spec {
|
|
||||||
fn clone(&self) -> Spec {
|
|
||||||
Spec {
|
|
||||||
name: self.name.clone(),
|
|
||||||
engine: self.engine.clone(),
|
|
||||||
data_dir: self.data_dir.clone(),
|
|
||||||
nodes: self.nodes.clone(),
|
|
||||||
parent_hash: self.parent_hash.clone(),
|
|
||||||
transactions_root: self.transactions_root.clone(),
|
|
||||||
receipts_root: self.receipts_root.clone(),
|
|
||||||
author: self.author.clone(),
|
|
||||||
difficulty: self.difficulty.clone(),
|
|
||||||
gas_limit: self.gas_limit.clone(),
|
|
||||||
gas_used: self.gas_used.clone(),
|
|
||||||
timestamp: self.timestamp.clone(),
|
|
||||||
extra_data: self.extra_data.clone(),
|
|
||||||
seal_rlp: self.seal_rlp.clone(),
|
|
||||||
hardcoded_sync: self.hardcoded_sync.clone(),
|
|
||||||
constructors: self.constructors.clone(),
|
|
||||||
state_root_memo: self.state_root_memo,
|
|
||||||
genesis_state: self.genesis_state.clone(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Part of `Spec`. Describes the hardcoded synchronization parameters.
|
/// Part of `Spec`. Describes the hardcoded synchronization parameters.
|
||||||
#[derive(Debug, Clone)]
|
|
||||||
pub struct SpecHardcodedSync {
|
pub struct SpecHardcodedSync {
|
||||||
/// Header of the block to jump to for hardcoded sync, and total difficulty.
|
/// Header of the block to jump to for hardcoded sync, and total difficulty.
|
||||||
pub header: encoded::Header,
|
pub header: encoded::Header,
|
||||||
@ -289,13 +255,6 @@ impl fmt::Display for SpecHardcodedSync {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn load_machine_from(s: ethjson::spec::Spec) -> Machine {
|
|
||||||
let builtins = s.accounts.builtins().into_iter().map(|p| (p.0.into(), From::from(p.1))).collect();
|
|
||||||
let params = CommonParams::from(s.params);
|
|
||||||
|
|
||||||
Spec::machine(&s.engine, params, builtins)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Load from JSON object.
|
/// Load from JSON object.
|
||||||
fn load_from(spec_params: SpecParams, s: ethjson::spec::Spec) -> Result<Spec, Error> {
|
fn load_from(spec_params: SpecParams, s: ethjson::spec::Spec) -> Result<Spec, Error> {
|
||||||
let builtins = s.accounts
|
let builtins = s.accounts
|
||||||
@ -355,24 +314,6 @@ fn load_from(spec_params: SpecParams, s: ethjson::spec::Spec) -> Result<Spec, Er
|
|||||||
Ok(s)
|
Ok(s)
|
||||||
}
|
}
|
||||||
|
|
||||||
macro_rules! load_bundled {
|
|
||||||
($e:expr) => {
|
|
||||||
Spec::load(
|
|
||||||
&::std::env::temp_dir(),
|
|
||||||
include_bytes!(concat!("../../res/", $e, ".json")) as &[u8]
|
|
||||||
).expect(concat!("Chain spec ", $e, " is invalid."))
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(any(test, feature = "test-helpers"))]
|
|
||||||
macro_rules! load_machine_bundled {
|
|
||||||
($e:expr) => {
|
|
||||||
Spec::load_machine(
|
|
||||||
include_bytes!(concat!("../../res/", $e, ".json")) as &[u8]
|
|
||||||
).expect(concat!("Chain spec ", $e, " is invalid."))
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Spec {
|
impl Spec {
|
||||||
// create an instance of an Ethereum state machine, minus consensus logic.
|
// create an instance of an Ethereum state machine, minus consensus logic.
|
||||||
fn machine(
|
fn machine(
|
||||||
@ -420,11 +361,6 @@ impl Spec {
|
|||||||
&self.engine.params()
|
&self.engine.params()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get the known knodes of the network in enode format.
|
|
||||||
pub fn nodes(&self) -> &[String] {
|
|
||||||
&self.nodes
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Get the configured Network ID.
|
/// Get the configured Network ID.
|
||||||
pub fn network_id(&self) -> u64 {
|
pub fn network_id(&self) -> u64 {
|
||||||
self.params().network_id
|
self.params().network_id
|
||||||
@ -513,11 +449,6 @@ impl Spec {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Return genesis state as Plain old data.
|
|
||||||
pub fn genesis_state(&self) -> &PodState {
|
|
||||||
&self.genesis_state
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Ensure that the given state DB has the trie nodes in for the genesis state.
|
/// Ensure that the given state DB has the trie nodes in for the genesis state.
|
||||||
pub fn ensure_db_good<T: Backend>(&self, db: T, factories: &Factories) -> Result<T, Error> {
|
pub fn ensure_db_good<T: Backend>(&self, db: T, factories: &Factories) -> Result<T, Error> {
|
||||||
if db.as_hash_db().contains(&self.state_root(), hash_db::EMPTY_PREFIX) {
|
if db.as_hash_db().contains(&self.state_root(), hash_db::EMPTY_PREFIX) {
|
||||||
@ -545,20 +476,19 @@ impl Spec {
|
|||||||
pub fn load_machine<R: Read>(reader: R) -> Result<Machine, String> {
|
pub fn load_machine<R: Read>(reader: R) -> Result<Machine, String> {
|
||||||
ethjson::spec::Spec::load(reader)
|
ethjson::spec::Spec::load(reader)
|
||||||
.map_err(fmt_err)
|
.map_err(fmt_err)
|
||||||
.map(load_machine_from)
|
.map(|s| {
|
||||||
|
let builtins = s.accounts.builtins().into_iter().map(|p| (p.0.into(), From::from(p.1))).collect();
|
||||||
|
let params = CommonParams::from(s.params);
|
||||||
|
Spec::machine(&s.engine, params, builtins)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Loads spec from json file. Provide factories for executing contracts and ensuring
|
/// Loads spec from json file. Provide factories for executing contracts and ensuring
|
||||||
/// storage goes to the right place.
|
/// storage goes to the right place.
|
||||||
pub fn load<'a, T: Into<SpecParams<'a>>, R>(params: T, reader: R) -> Result<Self, String>
|
pub fn load<'a, T: Into<SpecParams<'a>>, R: Read>(params: T, reader: R) -> Result<Self, String> {
|
||||||
where
|
ethjson::spec::Spec::load(reader)
|
||||||
R: Read,
|
.map_err(fmt_err)
|
||||||
{
|
.and_then(|x| load_from(params.into(), x).map_err(fmt_err))
|
||||||
ethjson::spec::Spec::load(reader).map_err(fmt_err).and_then(
|
|
||||||
|x| {
|
|
||||||
load_from(params.into(), x).map_err(fmt_err)
|
|
||||||
},
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// initialize genesis epoch data, using in-memory database for
|
/// initialize genesis epoch data, using in-memory database for
|
||||||
@ -616,94 +546,6 @@ impl Spec {
|
|||||||
|
|
||||||
self.engine.genesis_epoch_data(&genesis, &call)
|
self.engine.genesis_epoch_data(&genesis, &call)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Create a new Spec with InstantSeal consensus which does internal sealing (not requiring
|
|
||||||
/// work).
|
|
||||||
pub fn new_instant() -> Spec {
|
|
||||||
load_bundled!("instant_seal")
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Create a new Spec which conforms to the Frontier-era Morden chain except that it's a
|
|
||||||
/// NullEngine consensus.
|
|
||||||
#[cfg(any(test, feature = "test-helpers"))]
|
|
||||||
pub fn new_test() -> Spec {
|
|
||||||
load_bundled!("null_morden")
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Create the Machine corresponding to Spec::new_test.
|
|
||||||
#[cfg(any(test, feature = "test-helpers"))]
|
|
||||||
pub fn new_test_machine() -> Machine { load_machine_bundled!("null_morden") }
|
|
||||||
|
|
||||||
/// Create a new Spec which conforms to the Frontier-era Morden chain except that it's a NullEngine consensus with applying reward on block close.
|
|
||||||
#[cfg(any(test, feature = "test-helpers"))]
|
|
||||||
pub fn new_test_with_reward() -> Spec { load_bundled!("null_morden_with_reward") }
|
|
||||||
|
|
||||||
/// Create a new Spec which is a NullEngine consensus with a premine of address whose
|
|
||||||
/// secret is keccak('').
|
|
||||||
#[cfg(any(test, feature = "test-helpers"))]
|
|
||||||
pub fn new_null() -> Spec {
|
|
||||||
load_bundled!("null")
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Create a new Spec which constructs a contract at address 5 with storage at 0 equal to 1.
|
|
||||||
#[cfg(any(test, feature = "test-helpers"))]
|
|
||||||
pub fn new_test_constructor() -> Spec {
|
|
||||||
load_bundled!("constructor")
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Create a new Spec with AuthorityRound consensus which does internal sealing (not
|
|
||||||
/// requiring work).
|
|
||||||
/// Accounts with secrets keccak("0") and keccak("1") are the validators.
|
|
||||||
#[cfg(any(test, feature = "test-helpers"))]
|
|
||||||
pub fn new_test_round() -> Self {
|
|
||||||
load_bundled!("authority_round")
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Create a new Spec with AuthorityRound consensus which does internal sealing (not
|
|
||||||
/// requiring work) with empty step messages enabled.
|
|
||||||
/// Accounts with secrets keccak("0") and keccak("1") are the validators.
|
|
||||||
#[cfg(any(test, feature = "test-helpers"))]
|
|
||||||
pub fn new_test_round_empty_steps() -> Self {
|
|
||||||
load_bundled!("authority_round_empty_steps")
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Create a new Spec with AuthorityRound consensus (with empty steps) using a block reward
|
|
||||||
/// contract. The contract source code can be found at:
|
|
||||||
/// https://github.com/parity-contracts/block-reward/blob/daf7d44383b6cdb11cb6b953b018648e2b027cfb/contracts/ExampleBlockReward.sol
|
|
||||||
#[cfg(any(test, feature = "test-helpers"))]
|
|
||||||
pub fn new_test_round_block_reward_contract() -> Self {
|
|
||||||
load_bundled!("authority_round_block_reward_contract")
|
|
||||||
}
|
|
||||||
|
|
||||||
/// TestList.sol used in both specs: https://github.com/paritytech/contracts/pull/30/files
|
|
||||||
/// Accounts with secrets keccak("0") and keccak("1") are initially the validators.
|
|
||||||
/// Create a new Spec with BasicAuthority which uses a contract at address 5 to determine
|
|
||||||
/// the current validators using `getValidators`.
|
|
||||||
/// Second validator can be removed with
|
|
||||||
/// "0xbfc708a000000000000000000000000082a978b3f5962a5b0957d9ee9eef472ee55b42f1" and added
|
|
||||||
/// back in using
|
|
||||||
/// "0x4d238c8e00000000000000000000000082a978b3f5962a5b0957d9ee9eef472ee55b42f1".
|
|
||||||
#[cfg(any(test, feature = "test-helpers"))]
|
|
||||||
pub fn new_validator_safe_contract() -> Self {
|
|
||||||
load_bundled!("validator_safe_contract")
|
|
||||||
}
|
|
||||||
|
|
||||||
/// The same as the `safeContract`, but allows reporting and uses AuthorityRound.
|
|
||||||
/// Account is marked with `reportBenign` it can be checked as disliked with "0xd8f2e0bf".
|
|
||||||
/// Validator can be removed with `reportMalicious`.
|
|
||||||
#[cfg(any(test, feature = "test-helpers"))]
|
|
||||||
pub fn new_validator_contract() -> Self {
|
|
||||||
load_bundled!("validator_contract")
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Create a new Spec with BasicAuthority which uses multiple validator sets changing with
|
|
||||||
/// height.
|
|
||||||
/// Account with secrets keccak("0") is the validator for block 1 and with keccak("1")
|
|
||||||
/// onwards.
|
|
||||||
#[cfg(any(test, feature = "test-helpers"))]
|
|
||||||
pub fn new_validator_multi() -> Self {
|
|
||||||
load_bundled!("validator_multi")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
@ -715,6 +557,7 @@ mod tests {
|
|||||||
use types::view;
|
use types::view;
|
||||||
use types::views::BlockView;
|
use types::views::BlockView;
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
|
use crate::spec;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_load_empty() {
|
fn test_load_empty() {
|
||||||
@ -724,7 +567,7 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_chain() {
|
fn test_chain() {
|
||||||
let test_spec = Spec::new_test();
|
let test_spec = spec::new_test();
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
test_spec.state_root(),
|
test_spec.state_root(),
|
||||||
@ -740,7 +583,7 @@ mod tests {
|
|||||||
#[test]
|
#[test]
|
||||||
fn genesis_constructor() {
|
fn genesis_constructor() {
|
||||||
let _ = ::env_logger::try_init();
|
let _ = ::env_logger::try_init();
|
||||||
let spec = Spec::new_test_constructor();
|
let spec = spec::new_test_constructor();
|
||||||
let db = spec.ensure_db_good(get_temp_state_db(), &Default::default())
|
let db = spec.ensure_db_good(get_temp_state_db(), &Default::default())
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let state = State::from_existing(
|
let state = State::from_existing(
|
||||||
|
@ -43,7 +43,7 @@ use block::{OpenBlock, Drain};
|
|||||||
use client::{Client, ClientConfig, ChainInfo, ImportBlock, ChainNotify, ChainMessageType, PrepareOpenBlock};
|
use client::{Client, ClientConfig, ChainInfo, ImportBlock, ChainNotify, ChainMessageType, PrepareOpenBlock};
|
||||||
use trie_vm_factories::Factories;
|
use trie_vm_factories::Factories;
|
||||||
use miner::Miner;
|
use miner::Miner;
|
||||||
use spec::Spec;
|
use spec::{Spec, self};
|
||||||
use account_state::*;
|
use account_state::*;
|
||||||
use state_db::StateDB;
|
use state_db::StateDB;
|
||||||
use verification::queue::kind::blocks::Unverified;
|
use verification::queue::kind::blocks::Unverified;
|
||||||
@ -100,16 +100,16 @@ pub fn create_test_block_with_data(header: &Header, transactions: &[SignedTransa
|
|||||||
|
|
||||||
/// Generates dummy client (not test client) with corresponding amount of blocks
|
/// Generates dummy client (not test client) with corresponding amount of blocks
|
||||||
pub fn generate_dummy_client(block_number: u32) -> Arc<Client> {
|
pub fn generate_dummy_client(block_number: u32) -> Arc<Client> {
|
||||||
generate_dummy_client_with_spec_and_data(Spec::new_test, block_number, 0, &[])
|
generate_dummy_client_with_spec_and_data(spec::new_test, block_number, 0, &[])
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Generates dummy client (not test client) with corresponding amount of blocks and txs per every block
|
/// Generates dummy client (not test client) with corresponding amount of blocks and txs per every block
|
||||||
pub fn generate_dummy_client_with_data(block_number: u32, txs_per_block: usize, tx_gas_prices: &[U256]) -> Arc<Client> {
|
pub fn generate_dummy_client_with_data(block_number: u32, txs_per_block: usize, tx_gas_prices: &[U256]) -> Arc<Client> {
|
||||||
generate_dummy_client_with_spec_and_data(Spec::new_null, block_number, txs_per_block, tx_gas_prices)
|
generate_dummy_client_with_spec_and_data(spec::new_null, block_number, txs_per_block, tx_gas_prices)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Generates dummy client (not test client) with corresponding spec and accounts
|
/// Generates dummy client (not test client) with corresponding spec and accounts
|
||||||
pub fn generate_dummy_client_with_spec<F>(test_spec: F) -> Arc<Client> where F: Fn()->Spec {
|
pub fn generate_dummy_client_with_spec<F>(test_spec: F) -> Arc<Client> where F: Fn() -> Spec {
|
||||||
generate_dummy_client_with_spec_and_data(test_spec, 0, 0, &[])
|
generate_dummy_client_with_spec_and_data(test_spec, 0, 0, &[])
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -188,7 +188,7 @@ pub fn generate_dummy_client_with_spec_and_data<F>(test_spec: F, block_number: u
|
|||||||
|
|
||||||
/// Adds blocks to the client
|
/// Adds blocks to the client
|
||||||
pub fn push_blocks_to_client(client: &Arc<Client>, timestamp_salt: u64, starting_number: usize, block_number: usize) {
|
pub fn push_blocks_to_client(client: &Arc<Client>, timestamp_salt: u64, starting_number: usize, block_number: usize) {
|
||||||
let test_spec = Spec::new_test();
|
let test_spec = spec::new_test();
|
||||||
let state_root = test_spec.genesis_header().state_root().clone();
|
let state_root = test_spec.genesis_header().state_root().clone();
|
||||||
let genesis_gas = test_spec.genesis_header().gas_limit().clone();
|
let genesis_gas = test_spec.genesis_header().gas_limit().clone();
|
||||||
|
|
||||||
@ -218,7 +218,7 @@ pub fn push_blocks_to_client(client: &Arc<Client>, timestamp_salt: u64, starting
|
|||||||
|
|
||||||
/// Adds one block with transactions
|
/// Adds one block with transactions
|
||||||
pub fn push_block_with_transactions(client: &Arc<Client>, transactions: &[SignedTransaction]) {
|
pub fn push_block_with_transactions(client: &Arc<Client>, transactions: &[SignedTransaction]) {
|
||||||
let test_spec = Spec::new_test();
|
let test_spec = spec::new_test();
|
||||||
let test_engine = &*test_spec.engine;
|
let test_engine = &*test_spec.engine;
|
||||||
let block_number = client.chain_info().best_block_number as u64 + 1;
|
let block_number = client.chain_info().best_block_number as u64 + 1;
|
||||||
|
|
||||||
@ -240,7 +240,7 @@ pub fn push_block_with_transactions(client: &Arc<Client>, transactions: &[Signed
|
|||||||
|
|
||||||
/// Creates dummy client (not test client) with corresponding blocks
|
/// Creates dummy client (not test client) with corresponding blocks
|
||||||
pub fn get_test_client_with_blocks(blocks: Vec<Bytes>) -> Arc<Client> {
|
pub fn get_test_client_with_blocks(blocks: Vec<Bytes>) -> Arc<Client> {
|
||||||
let test_spec = Spec::new_test();
|
let test_spec = spec::new_test();
|
||||||
let client_db = new_db();
|
let client_db = new_db();
|
||||||
|
|
||||||
let client = Client::new(
|
let client = Client::new(
|
||||||
@ -432,13 +432,13 @@ pub fn get_temp_state_db() -> StateDB {
|
|||||||
|
|
||||||
/// Returns sequence of hashes of the dummy blocks
|
/// Returns sequence of hashes of the dummy blocks
|
||||||
pub fn get_good_dummy_block_seq(count: usize) -> Vec<Bytes> {
|
pub fn get_good_dummy_block_seq(count: usize) -> Vec<Bytes> {
|
||||||
let test_spec = Spec::new_test();
|
let test_spec = spec::new_test();
|
||||||
get_good_dummy_block_fork_seq(1, count, &test_spec.genesis_header().hash())
|
get_good_dummy_block_fork_seq(1, count, &test_spec.genesis_header().hash())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns sequence of hashes of the dummy blocks beginning from corresponding parent
|
/// Returns sequence of hashes of the dummy blocks beginning from corresponding parent
|
||||||
pub fn get_good_dummy_block_fork_seq(start_number: usize, count: usize, parent_hash: &H256) -> Vec<Bytes> {
|
pub fn get_good_dummy_block_fork_seq(start_number: usize, count: usize, parent_hash: &H256) -> Vec<Bytes> {
|
||||||
let test_spec = Spec::new_test();
|
let test_spec = spec::new_test();
|
||||||
let genesis_gas = test_spec.genesis_header().gas_limit().clone();
|
let genesis_gas = test_spec.genesis_header().gas_limit().clone();
|
||||||
let mut rolling_timestamp = start_number as u64 * 10;
|
let mut rolling_timestamp = start_number as u64 * 10;
|
||||||
let mut parent = *parent_hash;
|
let mut parent = *parent_hash;
|
||||||
@ -463,7 +463,7 @@ pub fn get_good_dummy_block_fork_seq(start_number: usize, count: usize, parent_h
|
|||||||
/// Returns hash and header of the correct dummy block
|
/// Returns hash and header of the correct dummy block
|
||||||
pub fn get_good_dummy_block_hash() -> (H256, Bytes) {
|
pub fn get_good_dummy_block_hash() -> (H256, Bytes) {
|
||||||
let mut block_header = Header::new();
|
let mut block_header = Header::new();
|
||||||
let test_spec = Spec::new_test();
|
let test_spec = spec::new_test();
|
||||||
let genesis_gas = test_spec.genesis_header().gas_limit().clone();
|
let genesis_gas = test_spec.genesis_header().gas_limit().clone();
|
||||||
block_header.set_gas_limit(genesis_gas);
|
block_header.set_gas_limit(genesis_gas);
|
||||||
block_header.set_difficulty(U256::from(0x20000));
|
block_header.set_difficulty(U256::from(0x20000));
|
||||||
@ -484,7 +484,7 @@ pub fn get_good_dummy_block() -> Bytes {
|
|||||||
/// Returns hash of the dummy block with incorrect state root
|
/// Returns hash of the dummy block with incorrect state root
|
||||||
pub fn get_bad_state_dummy_block() -> Bytes {
|
pub fn get_bad_state_dummy_block() -> Bytes {
|
||||||
let mut block_header = Header::new();
|
let mut block_header = Header::new();
|
||||||
let test_spec = Spec::new_test();
|
let test_spec = spec::new_test();
|
||||||
let genesis_gas = test_spec.genesis_header().gas_limit().clone();
|
let genesis_gas = test_spec.genesis_header().gas_limit().clone();
|
||||||
|
|
||||||
block_header.set_gas_limit(genesis_gas);
|
block_header.set_gas_limit(genesis_gas);
|
||||||
|
@ -29,10 +29,9 @@ use types::views::BlockView;
|
|||||||
|
|
||||||
use client::{BlockChainClient, BlockChainReset, Client, ClientConfig, BlockId, ChainInfo, PrepareOpenBlock, ImportSealedBlock, ImportBlock};
|
use client::{BlockChainClient, BlockChainReset, Client, ClientConfig, BlockId, ChainInfo, PrepareOpenBlock, ImportSealedBlock, ImportBlock};
|
||||||
use client::BlockInfo;
|
use client::BlockInfo;
|
||||||
use ethereum;
|
use crate::spec;
|
||||||
use executive::{Executive, TransactOptions};
|
use executive::{Executive, TransactOptions};
|
||||||
use miner::{Miner, PendingOrdering, MinerService};
|
use miner::{Miner, PendingOrdering, MinerService};
|
||||||
use spec::Spec;
|
|
||||||
use account_state::{State, CleanupMode, backend};
|
use account_state::{State, CleanupMode, backend};
|
||||||
use test_helpers::{
|
use test_helpers::{
|
||||||
self,
|
self,
|
||||||
@ -44,7 +43,7 @@ use verification::queue::kind::blocks::Unverified;
|
|||||||
#[test]
|
#[test]
|
||||||
fn imports_from_empty() {
|
fn imports_from_empty() {
|
||||||
let db = test_helpers::new_db();
|
let db = test_helpers::new_db();
|
||||||
let spec = Spec::new_test();
|
let spec = spec::new_test();
|
||||||
|
|
||||||
let client = Client::new(
|
let client = Client::new(
|
||||||
ClientConfig::default(),
|
ClientConfig::default(),
|
||||||
@ -61,7 +60,7 @@ fn imports_from_empty() {
|
|||||||
fn should_return_registrar() {
|
fn should_return_registrar() {
|
||||||
let db = test_helpers::new_db();
|
let db = test_helpers::new_db();
|
||||||
let tempdir = TempDir::new("").unwrap();
|
let tempdir = TempDir::new("").unwrap();
|
||||||
let spec = ethereum::new_morden(&tempdir.path().to_owned());
|
let spec = spec::new_morden(&tempdir.path().to_owned());
|
||||||
|
|
||||||
let client = Client::new(
|
let client = Client::new(
|
||||||
ClientConfig::default(),
|
ClientConfig::default(),
|
||||||
@ -77,7 +76,7 @@ fn should_return_registrar() {
|
|||||||
#[test]
|
#[test]
|
||||||
fn returns_state_root_basic() {
|
fn returns_state_root_basic() {
|
||||||
let client = generate_dummy_client(6);
|
let client = generate_dummy_client(6);
|
||||||
let test_spec = Spec::new_test();
|
let test_spec = spec::new_test();
|
||||||
let genesis_header = test_spec.genesis_header();
|
let genesis_header = test_spec.genesis_header();
|
||||||
|
|
||||||
assert!(client.state_data(genesis_header.state_root()).is_some());
|
assert!(client.state_data(genesis_header.state_root()).is_some());
|
||||||
@ -86,7 +85,7 @@ fn returns_state_root_basic() {
|
|||||||
#[test]
|
#[test]
|
||||||
fn imports_good_block() {
|
fn imports_good_block() {
|
||||||
let db = test_helpers::new_db();
|
let db = test_helpers::new_db();
|
||||||
let spec = Spec::new_test();
|
let spec = spec::new_test();
|
||||||
|
|
||||||
let client = Client::new(
|
let client = Client::new(
|
||||||
ClientConfig::default(),
|
ClientConfig::default(),
|
||||||
@ -109,7 +108,7 @@ fn imports_good_block() {
|
|||||||
#[test]
|
#[test]
|
||||||
fn query_none_block() {
|
fn query_none_block() {
|
||||||
let db = test_helpers::new_db();
|
let db = test_helpers::new_db();
|
||||||
let spec = Spec::new_test();
|
let spec = spec::new_test();
|
||||||
|
|
||||||
let client = Client::new(
|
let client = Client::new(
|
||||||
ClientConfig::default(),
|
ClientConfig::default(),
|
||||||
@ -257,7 +256,7 @@ fn can_mine() {
|
|||||||
#[test]
|
#[test]
|
||||||
fn change_history_size() {
|
fn change_history_size() {
|
||||||
let db = test_helpers::new_db();
|
let db = test_helpers::new_db();
|
||||||
let test_spec = Spec::new_null();
|
let test_spec = spec::new_null();
|
||||||
let mut config = ClientConfig::default();
|
let mut config = ClientConfig::default();
|
||||||
|
|
||||||
config.history = 2;
|
config.history = 2;
|
||||||
@ -329,7 +328,7 @@ fn transaction_proof() {
|
|||||||
|
|
||||||
let client = generate_dummy_client(0);
|
let client = generate_dummy_client(0);
|
||||||
let address = Address::random();
|
let address = Address::random();
|
||||||
let test_spec = Spec::new_test();
|
let test_spec = spec::new_test();
|
||||||
for _ in 0..20 {
|
for _ in 0..20 {
|
||||||
let mut b = client.prepare_open_block(Address::zero(), (3141562.into(), 31415620.into()), vec![]).unwrap();
|
let mut b = client.prepare_open_block(Address::zero(), (3141562.into(), 31415620.into()), vec![]).unwrap();
|
||||||
b.block_mut().state_mut().add_balance(&address, &5.into(), CleanupMode::NoEmpty).unwrap();
|
b.block_mut().state_mut().add_balance(&address, &5.into(), CleanupMode::NoEmpty).unwrap();
|
||||||
|
@ -29,6 +29,7 @@ use types::transaction::SYSTEM_ADDRESS;
|
|||||||
use rustc_hex::FromHex;
|
use rustc_hex::FromHex;
|
||||||
|
|
||||||
use ethereum_types::{H256, Address};
|
use ethereum_types::{H256, Address};
|
||||||
|
use crate::spec;
|
||||||
|
|
||||||
evm_test!{test_blockhash_eip210: test_blockhash_eip210_int}
|
evm_test!{test_blockhash_eip210: test_blockhash_eip210_int}
|
||||||
fn test_blockhash_eip210(factory: Factory) {
|
fn test_blockhash_eip210(factory: Factory) {
|
||||||
@ -38,7 +39,7 @@ fn test_blockhash_eip210(factory: Factory) {
|
|||||||
let test_blockhash_contract = "73fffffffffffffffffffffffffffffffffffffffe33141561007a57600143036020526000356101006020510755600061010060205107141561005057600035610100610100602051050761010001555b6000620100006020510714156100755760003561010062010000602051050761020001555b61014a565b4360003512151561009057600060405260206040f35b610100600035430312156100b357610100600035075460605260206060f3610149565b62010000600035430312156100d157600061010060003507146100d4565b60005b156100f6576101006101006000350507610100015460805260206080f3610148565b630100000060003543031215610116576000620100006000350714610119565b60005b1561013c57610100620100006000350507610200015460a052602060a0f3610147565b600060c052602060c0f35b5b5b5b5b";
|
let test_blockhash_contract = "73fffffffffffffffffffffffffffffffffffffffe33141561007a57600143036020526000356101006020510755600061010060205107141561005057600035610100610100602051050761010001555b6000620100006020510714156100755760003561010062010000602051050761020001555b61014a565b4360003512151561009057600060405260206040f35b610100600035430312156100b357610100600035075460605260206060f3610149565b62010000600035430312156100d157600061010060003507146100d4565b60005b156100f6576101006101006000350507610100015460805260206080f3610148565b630100000060003543031215610116576000620100006000350714610119565b60005b1561013c57610100620100006000350507610200015460a052602060a0f3610147565b600060c052602060c0f35b5b5b5b5b";
|
||||||
let blockhash_contract_code = Arc::new(test_blockhash_contract.from_hex().unwrap());
|
let blockhash_contract_code = Arc::new(test_blockhash_contract.from_hex().unwrap());
|
||||||
let blockhash_contract_code_hash = keccak(blockhash_contract_code.as_ref());
|
let blockhash_contract_code_hash = keccak(blockhash_contract_code.as_ref());
|
||||||
let machine = ::ethereum::new_eip210_test_machine();
|
let machine = spec::new_eip210_test_machine();
|
||||||
let mut env_info = EnvInfo::default();
|
let mut env_info = EnvInfo::default();
|
||||||
|
|
||||||
// populate state with 256 last hashes
|
// populate state with 256 last hashes
|
||||||
|
@ -21,7 +21,7 @@ use hash::keccak;
|
|||||||
use block::*;
|
use block::*;
|
||||||
use ethereum_types::{U256, Address};
|
use ethereum_types::{U256, Address};
|
||||||
use io::*;
|
use io::*;
|
||||||
use spec::*;
|
use crate::spec;
|
||||||
use client::*;
|
use client::*;
|
||||||
use test_helpers::get_temp_state_db;
|
use test_helpers::get_temp_state_db;
|
||||||
use client::{BlockChainClient, Client, ClientConfig};
|
use client::{BlockChainClient, Client, ClientConfig};
|
||||||
@ -40,7 +40,7 @@ use types::views::BlockView;
|
|||||||
#[test]
|
#[test]
|
||||||
fn can_trace_block_and_uncle_reward() {
|
fn can_trace_block_and_uncle_reward() {
|
||||||
let db = test_helpers::new_db();
|
let db = test_helpers::new_db();
|
||||||
let spec = Spec::new_test_with_reward();
|
let spec = spec::new_test_with_reward();
|
||||||
let engine = &*spec.engine;
|
let engine = &*spec.engine;
|
||||||
|
|
||||||
// Create client
|
// Create client
|
||||||
|
@ -734,7 +734,6 @@ impl<K: Kind> Drop for VerificationQueue<K> {
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use io::*;
|
use io::*;
|
||||||
use spec::Spec;
|
|
||||||
use super::{BlockQueue, Config, State};
|
use super::{BlockQueue, Config, State};
|
||||||
use super::kind::blocks::Unverified;
|
use super::kind::blocks::Unverified;
|
||||||
use test_helpers::{get_good_dummy_block_seq, get_good_dummy_block};
|
use test_helpers::{get_good_dummy_block_seq, get_good_dummy_block};
|
||||||
@ -744,11 +743,12 @@ mod tests {
|
|||||||
views::BlockView,
|
views::BlockView,
|
||||||
errors::{EthcoreError, ImportError},
|
errors::{EthcoreError, ImportError},
|
||||||
};
|
};
|
||||||
|
use crate::spec;
|
||||||
|
|
||||||
// create a test block queue.
|
// create a test block queue.
|
||||||
// auto_scaling enables verifier adjustment.
|
// auto_scaling enables verifier adjustment.
|
||||||
fn get_test_queue(auto_scale: bool) -> BlockQueue {
|
fn get_test_queue(auto_scale: bool) -> BlockQueue {
|
||||||
let spec = Spec::new_test();
|
let spec = spec::new_test();
|
||||||
let engine = spec.engine;
|
let engine = spec.engine;
|
||||||
|
|
||||||
let mut config = Config::default();
|
let mut config = Config::default();
|
||||||
@ -770,7 +770,7 @@ mod tests {
|
|||||||
#[test]
|
#[test]
|
||||||
fn can_be_created() {
|
fn can_be_created() {
|
||||||
// TODO better test
|
// TODO better test
|
||||||
let spec = Spec::new_test();
|
let spec = spec::new_test();
|
||||||
let engine = spec.engine;
|
let engine = spec.engine;
|
||||||
let _ = BlockQueue::new(Config::default(), engine, IoChannel::disconnected(), true);
|
let _ = BlockQueue::new(Config::default(), engine, IoChannel::disconnected(), true);
|
||||||
}
|
}
|
||||||
@ -848,7 +848,7 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_mem_limit() {
|
fn test_mem_limit() {
|
||||||
let spec = Spec::new_test();
|
let spec = spec::new_test();
|
||||||
let engine = spec.engine;
|
let engine = spec.engine;
|
||||||
let mut config = Config::default();
|
let mut config = Config::default();
|
||||||
config.max_mem_use = super::MIN_MEM_LIMIT; // empty queue uses about 15000
|
config.max_mem_use = super::MIN_MEM_LIMIT; // empty queue uses about 15000
|
||||||
@ -899,7 +899,7 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn worker_threads_honor_specified_number_without_scaling() {
|
fn worker_threads_honor_specified_number_without_scaling() {
|
||||||
let spec = Spec::new_test();
|
let spec = spec::new_test();
|
||||||
let engine = spec.engine;
|
let engine = spec.engine;
|
||||||
let config = get_test_config(1, false);
|
let config = get_test_config(1, false);
|
||||||
let queue = BlockQueue::new(config, engine, IoChannel::disconnected(), true);
|
let queue = BlockQueue::new(config, engine, IoChannel::disconnected(), true);
|
||||||
@ -909,7 +909,7 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn worker_threads_specified_to_zero_should_set_to_one() {
|
fn worker_threads_specified_to_zero_should_set_to_one() {
|
||||||
let spec = Spec::new_test();
|
let spec = spec::new_test();
|
||||||
let engine = spec.engine;
|
let engine = spec.engine;
|
||||||
let config = get_test_config(0, false);
|
let config = get_test_config(0, false);
|
||||||
let queue = BlockQueue::new(config, engine, IoChannel::disconnected(), true);
|
let queue = BlockQueue::new(config, engine, IoChannel::disconnected(), true);
|
||||||
@ -919,7 +919,7 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn worker_threads_should_only_accept_max_number_cpus() {
|
fn worker_threads_should_only_accept_max_number_cpus() {
|
||||||
let spec = Spec::new_test();
|
let spec = spec::new_test();
|
||||||
let engine = spec.engine;
|
let engine = spec.engine;
|
||||||
let config = get_test_config(10_000, false);
|
let config = get_test_config(10_000, false);
|
||||||
let queue = BlockQueue::new(config, engine, IoChannel::disconnected(), true);
|
let queue = BlockQueue::new(config, engine, IoChannel::disconnected(), true);
|
||||||
@ -933,7 +933,7 @@ mod tests {
|
|||||||
let num_cpus = ::num_cpus::get();
|
let num_cpus = ::num_cpus::get();
|
||||||
// only run the test with at least 2 CPUs
|
// only run the test with at least 2 CPUs
|
||||||
if num_cpus > 1 {
|
if num_cpus > 1 {
|
||||||
let spec = Spec::new_test();
|
let spec = spec::new_test();
|
||||||
let engine = spec.engine;
|
let engine = spec.engine;
|
||||||
let config = get_test_config(num_cpus - 1, true);
|
let config = get_test_config(num_cpus - 1, true);
|
||||||
let queue = BlockQueue::new(config, engine, IoChannel::disconnected(), true);
|
let queue = BlockQueue::new(config, engine, IoChannel::disconnected(), true);
|
||||||
|
@ -372,7 +372,7 @@ mod tests {
|
|||||||
use hash::keccak;
|
use hash::keccak;
|
||||||
use engines::Engine;
|
use engines::Engine;
|
||||||
use ethkey::{Random, Generator};
|
use ethkey::{Random, Generator};
|
||||||
use spec::Spec;
|
use crate::spec;
|
||||||
use test_helpers::{create_test_block_with_data, create_test_block};
|
use test_helpers::{create_test_block_with_data, create_test_block};
|
||||||
use types::{
|
use types::{
|
||||||
encoded,
|
encoded,
|
||||||
@ -546,7 +546,7 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_verify_block_basic_with_invalid_transactions() {
|
fn test_verify_block_basic_with_invalid_transactions() {
|
||||||
let spec = Spec::new_test();
|
let spec = spec::new_test();
|
||||||
let engine = &*spec.engine;
|
let engine = &*spec.engine;
|
||||||
|
|
||||||
let block = {
|
let block = {
|
||||||
@ -571,7 +571,7 @@ mod tests {
|
|||||||
|
|
||||||
// Test against morden
|
// Test against morden
|
||||||
let mut good = Header::new();
|
let mut good = Header::new();
|
||||||
let spec = Spec::new_test();
|
let spec = spec::new_test();
|
||||||
let engine = &*spec.engine;
|
let engine = &*spec.engine;
|
||||||
|
|
||||||
let min_gas_limit = engine.params().min_gas_limit;
|
let min_gas_limit = engine.params().min_gas_limit;
|
||||||
|
@ -636,7 +636,7 @@ fn all_expected<A, B, F>(values: &[A], expected_values: &[B], is_expected: F) ->
|
|||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use ethcore::client::TestBlockChainClient;
|
use ethcore::client::TestBlockChainClient;
|
||||||
use ethcore::spec::Spec;
|
use ethcore::spec;
|
||||||
use ethkey::{Generator,Random};
|
use ethkey::{Generator,Random};
|
||||||
use hash::keccak;
|
use hash::keccak;
|
||||||
use parking_lot::RwLock;
|
use parking_lot::RwLock;
|
||||||
@ -681,7 +681,7 @@ mod tests {
|
|||||||
fn import_headers_in_chain_head_state() {
|
fn import_headers_in_chain_head_state() {
|
||||||
::env_logger::try_init().ok();
|
::env_logger::try_init().ok();
|
||||||
|
|
||||||
let spec = Spec::new_test();
|
let spec = spec::new_test();
|
||||||
let genesis_hash = spec.genesis_header().hash();
|
let genesis_hash = spec.genesis_header().hash();
|
||||||
|
|
||||||
let mut downloader = BlockDownloader::new(BlockSet::NewBlocks, &genesis_hash, 0);
|
let mut downloader = BlockDownloader::new(BlockSet::NewBlocks, &genesis_hash, 0);
|
||||||
@ -930,7 +930,7 @@ mod tests {
|
|||||||
fn reset_after_multiple_sets_of_useless_headers() {
|
fn reset_after_multiple_sets_of_useless_headers() {
|
||||||
::env_logger::try_init().ok();
|
::env_logger::try_init().ok();
|
||||||
|
|
||||||
let spec = Spec::new_test();
|
let spec = spec::new_test();
|
||||||
let genesis_hash = spec.genesis_header().hash();
|
let genesis_hash = spec.genesis_header().hash();
|
||||||
|
|
||||||
let mut downloader = BlockDownloader::new(BlockSet::NewBlocks, &genesis_hash, 0);
|
let mut downloader = BlockDownloader::new(BlockSet::NewBlocks, &genesis_hash, 0);
|
||||||
@ -970,7 +970,7 @@ mod tests {
|
|||||||
fn dont_reset_after_multiple_sets_of_useless_headers_for_chain_head() {
|
fn dont_reset_after_multiple_sets_of_useless_headers_for_chain_head() {
|
||||||
::env_logger::try_init().ok();
|
::env_logger::try_init().ok();
|
||||||
|
|
||||||
let spec = Spec::new_test();
|
let spec = spec::new_test();
|
||||||
let genesis_hash = spec.genesis_header().hash();
|
let genesis_hash = spec.genesis_header().hash();
|
||||||
|
|
||||||
let mut downloader = BlockDownloader::new(BlockSet::NewBlocks, &genesis_hash, 0);
|
let mut downloader = BlockDownloader::new(BlockSet::NewBlocks, &genesis_hash, 0);
|
||||||
|
@ -23,7 +23,7 @@ use light_sync::*;
|
|||||||
use tests::helpers::{TestNet, Peer as PeerLike, TestPacket};
|
use tests::helpers::{TestNet, Peer as PeerLike, TestPacket};
|
||||||
|
|
||||||
use ethcore::client::TestBlockChainClient;
|
use ethcore::client::TestBlockChainClient;
|
||||||
use ethcore::spec::Spec;
|
use ethcore::spec;
|
||||||
use io::IoChannel;
|
use io::IoChannel;
|
||||||
use kvdb_memorydb;
|
use kvdb_memorydb;
|
||||||
use light::client::fetch::{self, Unavailable};
|
use light::client::fetch::{self, Unavailable};
|
||||||
@ -229,7 +229,7 @@ impl TestNet<Peer> {
|
|||||||
config,
|
config,
|
||||||
Arc::new(db),
|
Arc::new(db),
|
||||||
None,
|
None,
|
||||||
&Spec::new_test(),
|
&spec::new_test(),
|
||||||
fetch::unavailable(), // TODO: allow fetch from full nodes.
|
fetch::unavailable(), // TODO: allow fetch from full nodes.
|
||||||
IoChannel::disconnected(),
|
IoChannel::disconnected(),
|
||||||
cache
|
cache
|
||||||
|
@ -19,6 +19,7 @@ use ethcore::client::{TestBlockChainClient, BlockChainClient, BlockId, EachBlock
|
|||||||
use chain::{SyncState};
|
use chain::{SyncState};
|
||||||
use super::helpers::*;
|
use super::helpers::*;
|
||||||
use {SyncConfig, WarpSync};
|
use {SyncConfig, WarpSync};
|
||||||
|
use ethcore::spec;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn two_peers() {
|
fn two_peers() {
|
||||||
@ -101,7 +102,7 @@ fn forked_with_misbehaving_peer() {
|
|||||||
::env_logger::try_init().ok();
|
::env_logger::try_init().ok();
|
||||||
let mut net = TestNet::new(3);
|
let mut net = TestNet::new(3);
|
||||||
|
|
||||||
let mut alt_spec = ::ethcore::spec::Spec::new_test();
|
let mut alt_spec = spec::new_test();
|
||||||
alt_spec.extra_data = b"fork".to_vec();
|
alt_spec.extra_data = b"fork".to_vec();
|
||||||
// peer 0 is on a totally different chain with higher total difficulty
|
// peer 0 is on a totally different chain with higher total difficulty
|
||||||
net.peer_mut(0).chain = Arc::new(TestBlockChainClient::new_with_spec(alt_spec));
|
net.peer_mut(0).chain = Arc::new(TestBlockChainClient::new_with_spec(alt_spec));
|
||||||
|
@ -20,7 +20,7 @@ use ethereum_types::{U256, Address};
|
|||||||
use io::{IoHandler, IoChannel};
|
use io::{IoHandler, IoChannel};
|
||||||
use ethcore::client::{ChainInfo, ClientIoMessage};
|
use ethcore::client::{ChainInfo, ClientIoMessage};
|
||||||
use ethcore::engines;
|
use ethcore::engines;
|
||||||
use ethcore::spec::Spec;
|
use ethcore::spec;
|
||||||
use ethcore::miner::{self, MinerService};
|
use ethcore::miner::{self, MinerService};
|
||||||
use ethkey::{KeyPair, Secret};
|
use ethkey::{KeyPair, Secret};
|
||||||
use types::transaction::{Action, PendingTransaction, Transaction};
|
use types::transaction::{Action, PendingTransaction, Transaction};
|
||||||
@ -44,8 +44,8 @@ fn authority_round() {
|
|||||||
let s0 = KeyPair::from_secret_slice(keccak("1").as_bytes()).unwrap();
|
let s0 = KeyPair::from_secret_slice(keccak("1").as_bytes()).unwrap();
|
||||||
let s1 = KeyPair::from_secret_slice(keccak("0").as_bytes()).unwrap();
|
let s1 = KeyPair::from_secret_slice(keccak("0").as_bytes()).unwrap();
|
||||||
|
|
||||||
let chain_id = Spec::new_test_round().chain_id();
|
let chain_id = spec::new_test_round().chain_id();
|
||||||
let mut net = TestNet::with_spec(2, SyncConfig::default(), Spec::new_test_round);
|
let mut net = TestNet::with_spec(2, SyncConfig::default(), spec::new_test_round);
|
||||||
let io_handler0: Arc<dyn IoHandler<ClientIoMessage>> = Arc::new(TestIoHandler::new(net.peer(0).chain.clone()));
|
let io_handler0: Arc<dyn IoHandler<ClientIoMessage>> = Arc::new(TestIoHandler::new(net.peer(0).chain.clone()));
|
||||||
let io_handler1: Arc<dyn IoHandler<ClientIoMessage>> = Arc::new(TestIoHandler::new(net.peer(1).chain.clone()));
|
let io_handler1: Arc<dyn IoHandler<ClientIoMessage>> = Arc::new(TestIoHandler::new(net.peer(1).chain.clone()));
|
||||||
// Push transaction to both clients. Only one of them gets lucky to produce a block.
|
// Push transaction to both clients. Only one of them gets lucky to produce a block.
|
||||||
|
@ -25,7 +25,7 @@ use tests::snapshot::*;
|
|||||||
use ethcore::client::{TestBlockChainClient, BlockChainClient, Client as EthcoreClient,
|
use ethcore::client::{TestBlockChainClient, BlockChainClient, Client as EthcoreClient,
|
||||||
ClientConfig, ChainNotify, NewBlocks, ChainMessageType, ClientIoMessage};
|
ClientConfig, ChainNotify, NewBlocks, ChainMessageType, ClientIoMessage};
|
||||||
use ethcore::snapshot::SnapshotService;
|
use ethcore::snapshot::SnapshotService;
|
||||||
use ethcore::spec::Spec;
|
use ethcore::spec::{self, Spec};
|
||||||
use ethcore::miner::Miner;
|
use ethcore::miner::Miner;
|
||||||
use ethcore::test_helpers;
|
use ethcore::test_helpers;
|
||||||
use sync_io::SyncIo;
|
use sync_io::SyncIo;
|
||||||
@ -351,7 +351,7 @@ impl TestNet<EthPeer<TestBlockChainClient>> {
|
|||||||
sync: RwLock::new(sync),
|
sync: RwLock::new(sync),
|
||||||
snapshot_service: ss,
|
snapshot_service: ss,
|
||||||
chain: Arc::new(chain),
|
chain: Arc::new(chain),
|
||||||
miner: Arc::new(Miner::new_for_tests(&Spec::new_test(), None)),
|
miner: Arc::new(Miner::new_for_tests(&spec::new_test(), None)),
|
||||||
queue: RwLock::new(VecDeque::new()),
|
queue: RwLock::new(VecDeque::new()),
|
||||||
private_tx_handler,
|
private_tx_handler,
|
||||||
io_queue: RwLock::new(VecDeque::new()),
|
io_queue: RwLock::new(VecDeque::new()),
|
||||||
|
@ -88,12 +88,12 @@ pub fn run_action<T: Informant>(
|
|||||||
|
|
||||||
// if the code is not overwritten from CLI, use code from spec file.
|
// if the code is not overwritten from CLI, use code from spec file.
|
||||||
if params.code.is_none() {
|
if params.code.is_none() {
|
||||||
if let Some(acc) = spec.genesis_state().get().get(¶ms.code_address) {
|
if let Some(acc) = spec.genesis_state.get().get(¶ms.code_address) {
|
||||||
params.code = acc.code.clone().map(::std::sync::Arc::new);
|
params.code = acc.code.clone().map(::std::sync::Arc::new);
|
||||||
params.code_hash = None;
|
params.code_hash = None;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
run(spec, trie_spec, params.gas, spec.genesis_state(), |mut client| {
|
run(spec, trie_spec, params.gas, &spec.genesis_state, |mut client| {
|
||||||
let result = match client.call(params, &mut trace::NoopTracer, &mut informant) {
|
let result = match client.call(params, &mut trace::NoopTracer, &mut informant) {
|
||||||
Ok(r) => (Ok(r.return_data.to_vec()), Some(r.gas_left)),
|
Ok(r) => (Ok(r.return_data.to_vec()), Some(r.gas_left)),
|
||||||
Err(err) => (Err(err), None),
|
Err(err) => (Err(err), None),
|
||||||
@ -240,6 +240,7 @@ pub mod tests {
|
|||||||
use super::*;
|
use super::*;
|
||||||
use tempdir::TempDir;
|
use tempdir::TempDir;
|
||||||
use ethereum_types::Address;
|
use ethereum_types::Address;
|
||||||
|
use ethcore::spec::{self, Spec};
|
||||||
|
|
||||||
pub fn run_test<T, I, F>(
|
pub fn run_test<T, I, F>(
|
||||||
informant: I,
|
informant: I,
|
||||||
@ -257,7 +258,7 @@ pub mod tests {
|
|||||||
params.gas = gas.into();
|
params.gas = gas.into();
|
||||||
|
|
||||||
let tempdir = TempDir::new("").unwrap();
|
let tempdir = TempDir::new("").unwrap();
|
||||||
let spec = ::ethcore::ethereum::new_foundation(&tempdir.path());
|
let spec = spec::new_foundation(&tempdir.path());
|
||||||
let result = run_action(&spec, params, informant, TrieSpec::Secure);
|
let result = run_action(&spec, params, informant, TrieSpec::Secure);
|
||||||
match result {
|
match result {
|
||||||
Ok(Success { traces, .. }) => {
|
Ok(Success { traces, .. }) => {
|
||||||
@ -278,7 +279,8 @@ pub mod tests {
|
|||||||
params.code_address = Address::from_low_u64_be(0x20);
|
params.code_address = Address::from_low_u64_be(0x20);
|
||||||
params.gas = 0xffff.into();
|
params.gas = 0xffff.into();
|
||||||
|
|
||||||
let spec = ::ethcore::ethereum::load(None, include_bytes!("../res/testchain.json"));
|
let tempdir = TempDir::new("").unwrap();
|
||||||
|
let spec = Spec::load(&tempdir.path(), include_bytes!("../res/testchain.json") as &[u8]).unwrap();
|
||||||
let _result = run_action(&spec, params, inf, TrieSpec::Secure);
|
let _result = run_action(&spec, params, inf, TrieSpec::Secure);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
|
@ -443,7 +443,7 @@ impl Args {
|
|||||||
spec::Spec::load(&::std::env::temp_dir(), file)?
|
spec::Spec::load(&::std::env::temp_dir(), file)?
|
||||||
},
|
},
|
||||||
None => {
|
None => {
|
||||||
ethcore::ethereum::new_foundation(&::std::env::temp_dir())
|
spec::new_foundation(&::std::env::temp_dir())
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -19,8 +19,7 @@ use std::time::Duration;
|
|||||||
use std::{str, fs, fmt};
|
use std::{str, fs, fmt};
|
||||||
|
|
||||||
use ethcore::client::Mode;
|
use ethcore::client::Mode;
|
||||||
use ethcore::ethereum;
|
use ethcore::spec::{Spec, SpecParams, self};
|
||||||
use ethcore::spec::{Spec, SpecParams};
|
|
||||||
use ethereum_types::{U256, Address};
|
use ethereum_types::{U256, Address};
|
||||||
use parity_runtime::Executor;
|
use parity_runtime::Executor;
|
||||||
use hash_fetch::fetch::Client as FetchClient;
|
use hash_fetch::fetch::Client as FetchClient;
|
||||||
@ -115,23 +114,23 @@ impl SpecType {
|
|||||||
pub fn spec<'a, T: Into<SpecParams<'a>>>(&self, params: T) -> Result<Spec, String> {
|
pub fn spec<'a, T: Into<SpecParams<'a>>>(&self, params: T) -> Result<Spec, String> {
|
||||||
let params = params.into();
|
let params = params.into();
|
||||||
match *self {
|
match *self {
|
||||||
SpecType::Foundation => Ok(ethereum::new_foundation(params)),
|
SpecType::Foundation => Ok(spec::new_foundation(params)),
|
||||||
SpecType::Classic => Ok(ethereum::new_classic(params)),
|
SpecType::Classic => Ok(spec::new_classic(params)),
|
||||||
SpecType::Poanet => Ok(ethereum::new_poanet(params)),
|
SpecType::Poanet => Ok(spec::new_poanet(params)),
|
||||||
SpecType::Tobalaba => Ok(ethereum::new_tobalaba(params)),
|
SpecType::Tobalaba => Ok(spec::new_tobalaba(params)),
|
||||||
SpecType::Expanse => Ok(ethereum::new_expanse(params)),
|
SpecType::Expanse => Ok(spec::new_expanse(params)),
|
||||||
SpecType::Musicoin => Ok(ethereum::new_musicoin(params)),
|
SpecType::Musicoin => Ok(spec::new_musicoin(params)),
|
||||||
SpecType::Ellaism => Ok(ethereum::new_ellaism(params)),
|
SpecType::Ellaism => Ok(spec::new_ellaism(params)),
|
||||||
SpecType::Mix => Ok(ethereum::new_mix(params)),
|
SpecType::Mix => Ok(spec::new_mix(params)),
|
||||||
SpecType::Callisto => Ok(ethereum::new_callisto(params)),
|
SpecType::Callisto => Ok(spec::new_callisto(params)),
|
||||||
SpecType::Morden => Ok(ethereum::new_morden(params)),
|
SpecType::Morden => Ok(spec::new_morden(params)),
|
||||||
SpecType::Ropsten => Ok(ethereum::new_ropsten(params)),
|
SpecType::Ropsten => Ok(spec::new_ropsten(params)),
|
||||||
SpecType::Kovan => Ok(ethereum::new_kovan(params)),
|
SpecType::Kovan => Ok(spec::new_kovan(params)),
|
||||||
SpecType::Rinkeby => Ok(ethereum::new_rinkeby(params)),
|
SpecType::Rinkeby => Ok(spec::new_rinkeby(params)),
|
||||||
SpecType::Goerli => Ok(ethereum::new_goerli(params)),
|
SpecType::Goerli => Ok(spec::new_goerli(params)),
|
||||||
SpecType::Kotti => Ok(ethereum::new_kotti(params)),
|
SpecType::Kotti => Ok(spec::new_kotti(params)),
|
||||||
SpecType::Sokol => Ok(ethereum::new_sokol(params)),
|
SpecType::Sokol => Ok(spec::new_sokol(params)),
|
||||||
SpecType::Dev => Ok(Spec::new_instant()),
|
SpecType::Dev => Ok(spec::new_instant()),
|
||||||
SpecType::Custom(ref filename) => {
|
SpecType::Custom(ref filename) => {
|
||||||
let file = fs::File::open(filename).map_err(|e| format!("Could not load specification file at {}: {}", filename, e))?;
|
let file = fs::File::open(filename).map_err(|e| format!("Could not load specification file at {}: {}", filename, e))?;
|
||||||
Spec::load(params, file)
|
Spec::load(params, file)
|
||||||
|
@ -20,9 +20,8 @@ use std::sync::Arc;
|
|||||||
|
|
||||||
use accounts::AccountProvider;
|
use accounts::AccountProvider;
|
||||||
use ethcore::client::{BlockChainClient, Client, ClientConfig, ChainInfo, ImportBlock};
|
use ethcore::client::{BlockChainClient, Client, ClientConfig, ChainInfo, ImportBlock};
|
||||||
use ethcore::ethereum;
|
|
||||||
use ethcore::miner::Miner;
|
use ethcore::miner::Miner;
|
||||||
use ethcore::spec::{Genesis, Spec};
|
use ethcore::spec::{Genesis, Spec, self};
|
||||||
use ethcore::test_helpers;
|
use ethcore::test_helpers;
|
||||||
use ethcore::verification::VerifierType;
|
use ethcore::verification::VerifierType;
|
||||||
use ethcore::verification::queue::kind::blocks::Unverified;
|
use ethcore::verification::queue::kind::blocks::Unverified;
|
||||||
@ -64,7 +63,7 @@ fn snapshot_service() -> Arc<TestSnapshotService> {
|
|||||||
|
|
||||||
fn make_spec(chain: &BlockChain) -> Spec {
|
fn make_spec(chain: &BlockChain) -> Spec {
|
||||||
let genesis = Genesis::from(chain.genesis());
|
let genesis = Genesis::from(chain.genesis());
|
||||||
let mut spec = ethereum::new_frontier_test();
|
let mut spec = spec::new_frontier_test();
|
||||||
let state = chain.pre_state.clone().into();
|
let state = chain.pre_state.clone().into();
|
||||||
spec.set_genesis_state(state).expect("unable to set genesis state");
|
spec.set_genesis_state(state).expect("unable to set genesis state");
|
||||||
spec.overwrite_genesis_params(genesis);
|
spec.overwrite_genesis_params(genesis);
|
||||||
|
Loading…
Reference in New Issue
Block a user