Merge pull request #94 from ethcore/reg_genesis

Added support for regnet && testnet genesis blocks
This commit is contained in:
Marek Kotewicz 2016-11-07 11:07:38 +01:00 committed by GitHub
commit 8d2a7e6aa5
4 changed files with 25 additions and 14 deletions

View File

@ -2,6 +2,7 @@
//! https://www.anintegratedworld.com/unravelling-the-mysterious-block-chain-magic-number/
use ser::{Stream, Serializable};
use chain::Block;
use Error;
const MAGIC_MAINNET: u32 = 0xD9B4BEF9;
@ -53,6 +54,14 @@ impl Magic {
Magic::Regtest => 18443,
}
}
pub fn genesis_block(&self) -> Block {
match *self {
Magic::Mainnet => "0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a29ab5f49ffff001d1dac2b7c0101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff4d04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73ffffffff0100f2052a01000000434104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac00000000".into(),
Magic::Testnet => "0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4adae5494dffff001d1aa4ae180101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff4d04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73ffffffff0100f2052a01000000434104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac00000000".into(),
Magic::Regtest => "0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4adae5494dffff7f20020000000101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff4d04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73ffffffff0100f2052a01000000434104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac00000000".into(),
}
}
}
impl Serializable for Magic {

View File

@ -4,9 +4,9 @@ use config::Config;
use util::{open_db, init_db};
pub fn import(cfg: Config, matches: &ArgMatches) -> Result<(), String> {
let db = open_db(cfg.use_disk_database);
let db = open_db(&cfg);
// TODO: this might be unnecessary here!
init_db(&db);
init_db(&cfg, &db);
let mut writer = create_sync_blocks_writer(db);

View File

@ -7,6 +7,9 @@ use {config, p2p};
pub fn start(cfg: config::Config) -> Result<(), String> {
let mut el = p2p::event_loop();
let db = open_db(&cfg);
init_db(&cfg, &db);
let p2p_cfg = p2p::Config {
threads: 4,
protocol_minimum: 70001,
@ -26,9 +29,6 @@ pub fn start(cfg: config::Config) -> Result<(), String> {
node_table_path: node_table_path(),
};
let db = open_db(cfg.use_disk_database);
init_db(&db);
let sync_handle = el.handle();
let sync_connection_factory = create_sync_connection_factory(&sync_handle, db);

View File

@ -1,11 +1,12 @@
use std::sync::Arc;
use std::path::PathBuf;
use app_dirs::{app_dir, AppDataType};
use chain::Block;
use chain::RepresentH256;
use {db, APP_INFO};
use config::Config;
pub fn open_db(use_disk_database: bool) -> Arc<db::Store> {
match use_disk_database {
pub fn open_db(cfg: &Config) -> Arc<db::Store> {
match cfg.use_disk_database {
true => {
let db_path = app_dir(AppDataType::UserData, &APP_INFO, "db").expect("Failed to get app dir");
Arc::new(db::Storage::new(db_path).expect("Failed to open database"))
@ -22,12 +23,13 @@ pub fn node_table_path() -> PathBuf {
node_table
}
pub fn init_db(db: &Arc<db::Store>) {
pub fn init_db(cfg: &Config, db: &Arc<db::Store>) {
// insert genesis block if db is empty
if db.best_block().is_none() {
// TODO: move to config
let genesis_block: Block = "0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a29ab5f49ffff001d1dac2b7c0101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff4d04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73ffffffff0100f2052a01000000434104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac00000000".into();
db.insert_block(&genesis_block)
.expect("Failed to insert genesis block to the database");
let genesis_block = cfg.magic.genesis_block();
match db.block_hash(0) {
Some(ref db_genesis_block_hash) if db_genesis_block_hash != &genesis_block.hash() => panic!("Trying to open database with incompatible genesis block"),
Some(_) => (),
None => db.insert_block(&genesis_block)
.expect("Failed to insert genesis block to the database"),
}
}