From d30520c98189e1840a42c11f8eb5315fb3567b93 Mon Sep 17 00:00:00 2001 From: Svyatoslav Nikolsky Date: Mon, 7 Nov 2016 12:15:15 +0300 Subject: [PATCH] added support for regnet && testnet genesis blocks --- message/src/common/magic.rs | 9 +++++++++ pbtc/commands/import.rs | 4 ++-- pbtc/commands/start.rs | 6 +++--- pbtc/util.rs | 20 +++++++++++--------- 4 files changed, 25 insertions(+), 14 deletions(-) diff --git a/message/src/common/magic.rs b/message/src/common/magic.rs index 28d60563..fdf7228d 100644 --- a/message/src/common/magic.rs +++ b/message/src/common/magic.rs @@ -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 { diff --git a/pbtc/commands/import.rs b/pbtc/commands/import.rs index 97344bbc..5653ef99 100644 --- a/pbtc/commands/import.rs +++ b/pbtc/commands/import.rs @@ -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); diff --git a/pbtc/commands/start.rs b/pbtc/commands/start.rs index f7fb7f06..1bf3ef44 100644 --- a/pbtc/commands/start.rs +++ b/pbtc/commands/start.rs @@ -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); diff --git a/pbtc/util.rs b/pbtc/util.rs index f61d788d..112d6723 100644 --- a/pbtc/util.rs +++ b/pbtc/util.rs @@ -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 { - match use_disk_database { +pub fn open_db(cfg: &Config) -> Arc { + 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) { +pub fn init_db(cfg: &Config, db: &Arc) { // 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"), } }