2016-02-05 13:40:41 +01:00
|
|
|
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
|
|
|
// This file is part of Parity.
|
|
|
|
|
|
|
|
// Parity 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 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. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
2016-01-09 17:15:55 +01:00
|
|
|
//! Ethereum protocol module.
|
|
|
|
//!
|
|
|
|
//! Contains all Ethereum network specific stuff, such as denominations and
|
|
|
|
//! consensus specifications.
|
|
|
|
|
2016-02-03 13:20:32 +01:00
|
|
|
/// Export the ethash module.
|
2016-01-09 17:15:55 +01:00
|
|
|
pub mod ethash;
|
2016-02-03 13:20:32 +01:00
|
|
|
/// Export the denominations module.
|
2016-01-09 17:15:55 +01:00
|
|
|
pub mod denominations;
|
|
|
|
|
2016-02-13 13:15:46 +01:00
|
|
|
pub use self::ethash::{Ethash};
|
2016-01-09 17:15:55 +01:00
|
|
|
pub use self::denominations::*;
|
|
|
|
|
2016-01-09 18:20:31 +01:00
|
|
|
use super::spec::*;
|
|
|
|
|
|
|
|
/// Create a new Olympic chain spec.
|
2016-01-12 12:22:18 +01:00
|
|
|
pub fn new_olympic() -> Spec { Spec::from_json_utf8(include_bytes!("../../res/ethereum/olympic.json")) }
|
2016-01-09 18:20:31 +01:00
|
|
|
|
|
|
|
/// Create a new Frontier mainnet chain spec.
|
2016-01-12 12:22:18 +01:00
|
|
|
pub fn new_frontier() -> Spec { Spec::from_json_utf8(include_bytes!("../../res/ethereum/frontier.json")) }
|
2016-01-09 18:20:31 +01:00
|
|
|
|
|
|
|
/// Create a new Frontier chain spec as though it never changes to Homestead.
|
2016-01-12 12:22:18 +01:00
|
|
|
pub fn new_frontier_test() -> Spec { Spec::from_json_utf8(include_bytes!("../../res/ethereum/frontier_test.json")) }
|
2016-01-09 18:20:31 +01:00
|
|
|
|
|
|
|
/// Create a new Homestead chain spec as though it never changed from Frontier.
|
2016-01-12 12:22:18 +01:00
|
|
|
pub fn new_homestead_test() -> Spec { Spec::from_json_utf8(include_bytes!("../../res/ethereum/homestead_test.json")) }
|
2016-01-16 21:08:04 +01:00
|
|
|
|
|
|
|
/// Create a new Frontier main net chain spec without genesis accounts.
|
2016-01-29 17:49:58 +01:00
|
|
|
pub fn new_mainnet_like() -> Spec { Spec::from_json_utf8(include_bytes!("../../res/ethereum/frontier_like_test.json")) }
|
2016-01-09 18:20:31 +01:00
|
|
|
|
|
|
|
/// Create a new Morden chain spec.
|
2016-01-12 12:22:18 +01:00
|
|
|
pub fn new_morden() -> Spec { Spec::from_json_utf8(include_bytes!("../../res/ethereum/morden.json")) }
|
2016-01-09 18:20:31 +01:00
|
|
|
|
|
|
|
#[cfg(test)]
|
|
|
|
mod tests {
|
|
|
|
use common::*;
|
|
|
|
use state::*;
|
|
|
|
use engine::*;
|
|
|
|
use super::*;
|
2016-01-31 10:52:07 +01:00
|
|
|
use tests::helpers::*;
|
2016-01-09 18:20:31 +01:00
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn ensure_db_good() {
|
|
|
|
let engine = new_morden().to_engine().unwrap();
|
|
|
|
let genesis_header = engine.spec().genesis_header();
|
2016-01-31 10:52:07 +01:00
|
|
|
let mut db_result = get_temp_journal_db();
|
2016-02-03 19:34:51 +01:00
|
|
|
let mut db = db_result.take();
|
2016-03-11 15:01:15 +01:00
|
|
|
engine.spec().ensure_db_good(db.as_hashdb_mut());
|
2016-02-03 19:34:51 +01:00
|
|
|
let s = State::from_existing(db, genesis_header.state_root.clone(), engine.account_start_nonce());
|
2016-01-09 18:20:31 +01:00
|
|
|
assert_eq!(s.balance(&address_from_hex("0000000000000000000000000000000000000001")), U256::from(1u64));
|
|
|
|
assert_eq!(s.balance(&address_from_hex("0000000000000000000000000000000000000002")), U256::from(1u64));
|
|
|
|
assert_eq!(s.balance(&address_from_hex("0000000000000000000000000000000000000003")), U256::from(1u64));
|
|
|
|
assert_eq!(s.balance(&address_from_hex("0000000000000000000000000000000000000004")), U256::from(1u64));
|
|
|
|
assert_eq!(s.balance(&address_from_hex("102e61f5d8f9bc71d0ad4a084df4e65e05ce0e1c")), U256::from(1u64) << 200);
|
|
|
|
assert_eq!(s.balance(&address_from_hex("0000000000000000000000000000000000000000")), U256::from(0u64));
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn morden() {
|
|
|
|
let morden = new_morden();
|
|
|
|
|
2016-01-11 11:51:31 +01:00
|
|
|
assert_eq!(morden.state_root(), H256::from_str("f3f4696bbf3b3b07775128eb7a3763279a394e382130f27c21e70233e04946a9").unwrap());
|
2016-01-09 18:20:31 +01:00
|
|
|
let genesis = morden.genesis_block();
|
|
|
|
assert_eq!(BlockView::new(&genesis).header_view().sha3(), H256::from_str("0cd786a2425d16f152c658316c423e6ce1181e15c3295826d7c9904cba9ce303").unwrap());
|
|
|
|
|
2016-01-09 18:26:35 +01:00
|
|
|
let _ = morden.to_engine();
|
2016-01-09 18:20:31 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn frontier() {
|
|
|
|
let frontier = new_frontier();
|
|
|
|
|
2016-01-11 11:51:31 +01:00
|
|
|
assert_eq!(frontier.state_root(), H256::from_str("d7f8974fb5ac78d9ac099b9ad5018bedc2ce0a72dad1827a1709da30580f0544").unwrap());
|
2016-01-09 18:20:31 +01:00
|
|
|
let genesis = frontier.genesis_block();
|
|
|
|
assert_eq!(BlockView::new(&genesis).header_view().sha3(), H256::from_str("d4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3").unwrap());
|
|
|
|
|
2016-01-09 18:26:35 +01:00
|
|
|
let _ = frontier.to_engine();
|
2016-01-09 18:20:31 +01:00
|
|
|
}
|
2016-01-11 11:51:31 +01:00
|
|
|
}
|