diff --git a/ethcore/src/blockchain/blockchain.rs b/ethcore/src/blockchain/blockchain.rs index 5910d03099c..68fb4048384 100644 --- a/ethcore/src/blockchain/blockchain.rs +++ b/ethcore/src/blockchain/blockchain.rs @@ -140,7 +140,7 @@ pub trait BlockProvider { fn blocks_with_bloom(&self, bloom: &H2048, from_block: BlockNumber, to_block: BlockNumber) -> Vec; /// Returns logs matching given filter. - fn logs(&self, mut blocks: Vec, matches: F, limit: Option) -> Vec + fn logs(&self, blocks: Vec, matches: F, limit: Option) -> Vec where F: Fn(&LogEntry) -> bool, Self: Sized; } diff --git a/parity/cli/mod.rs b/parity/cli/mod.rs index 3ad6259b806..cfe4c4d29bb 100644 --- a/parity/cli/mod.rs +++ b/parity/cli/mod.rs @@ -132,6 +132,7 @@ usage! { or |c: &Config| otry!(c.network).reserved_peers.clone().map(Some), flag_reserved_only: bool = false, or |c: &Config| otry!(c.network).reserved_only.clone(), + flag_no_ancient_blocks: bool = false, or |_| None, // -- API and Console Options // RPC @@ -533,6 +534,7 @@ mod tests { flag_node_key: None, flag_reserved_peers: Some("./path_to_file".into()), flag_reserved_only: false, + flag_no_ancient_blocks: false, // -- API and Console Options // RPC diff --git a/parity/cli/usage.txt b/parity/cli/usage.txt index 3e3e79247be..97cda74ba8d 100644 --- a/parity/cli/usage.txt +++ b/parity/cli/usage.txt @@ -95,6 +95,8 @@ Networking Options: all - connect to any IP address. (default: {flag_allow_ips}) --max-pending-peers NUM Allow up to NUM pending connections. (default: {flag_max_pending_peers}) + --no-ancient-blocks Disable downloading old blocks after snapshot restoration + or warp sync. (default: {flag_no_ancient_blocks}) API and Console Options: --no-jsonrpc Disable the JSON-RPC API server. (default: {flag_no_jsonrpc}) diff --git a/parity/configuration.rs b/parity/configuration.rs index 5188b44f1bd..ecf47ddadf0 100644 --- a/parity/configuration.rs +++ b/parity/configuration.rs @@ -250,6 +250,7 @@ impl Configuration { custom_bootnodes: self.args.flag_bootnodes.is_some(), no_periodic_snapshot: self.args.flag_no_periodic_snapshot, check_seal: !self.args.flag_no_seal_check, + download_old_blocks: !self.args.flag_no_ancient_blocks, }; Cmd::Run(run_cmd) }; @@ -871,6 +872,7 @@ mod tests { fat_db: Default::default(), no_periodic_snapshot: false, check_seal: true, + download_old_blocks: true, })); } diff --git a/parity/run.rs b/parity/run.rs index 2cc791f8c2c..f56ba5b9268 100644 --- a/parity/run.rs +++ b/parity/run.rs @@ -91,6 +91,7 @@ pub struct RunCmd { pub custom_bootnodes: bool, pub no_periodic_snapshot: bool, pub check_seal: bool, + pub download_old_blocks: bool, } pub fn open_ui(dapps_conf: &dapps::Configuration, signer_conf: &signer::Configuration) -> Result<(), String> { @@ -202,6 +203,7 @@ pub fn execute(cmd: RunCmd, logger: Arc) -> Result<(), String> { } sync_config.fork_block = spec.fork_block(); sync_config.warp_sync = cmd.warp_sync; + sync_config.download_old_blocks = cmd.download_old_blocks; // prepare account provider let account_provider = Arc::new(try!(prepare_account_provider(&cmd.dirs, cmd.acc_conf))); diff --git a/sync/src/api.rs b/sync/src/api.rs index 3191483e4f8..cdab0983a35 100644 --- a/sync/src/api.rs +++ b/sync/src/api.rs @@ -41,6 +41,8 @@ pub const WARP_SYNC_PROTOCOL_ID: ProtocolId = *b"par"; pub struct SyncConfig { /// Max blocks to download ahead pub max_download_ahead_blocks: usize, + /// Enable ancient block download. + pub download_old_blocks: bool, /// Network ID pub network_id: usize, /// Main "eth" subprotocol name. @@ -55,6 +57,7 @@ impl Default for SyncConfig { fn default() -> SyncConfig { SyncConfig { max_download_ahead_blocks: 20000, + download_old_blocks: true, network_id: 1, subprotocol_name: *b"eth", fork_block: None, diff --git a/sync/src/chain.rs b/sync/src/chain.rs index d98b142cb97..f27a89c980e 100644 --- a/sync/src/chain.rs +++ b/sync/src/chain.rs @@ -352,6 +352,8 @@ pub struct ChainSync { sync_start_time: Option, /// Transactions propagation statistics transactions_stats: TransactionsStats, + /// Enable ancient block downloading + download_old_blocks: bool, } type RlpResponseResult = Result, PacketDecodeError>; @@ -372,6 +374,7 @@ impl ChainSync { last_sent_block_number: 0, network_id: config.network_id, fork_block: config.fork_block, + download_old_blocks: config.download_old_blocks, snapshot: Snapshot::new(), sync_start_time: None, transactions_stats: TransactionsStats::default(), @@ -539,17 +542,18 @@ impl ChainSync { // Do not assume that the block queue/chain still has our last_imported_block let chain = chain.chain_info(); self.new_blocks = BlockDownloader::new(false, &chain.best_block_hash, chain.best_block_number); - if let (Some(ancient_block_hash), Some(ancient_block_number)) = (chain.ancient_block_hash, chain.ancient_block_number) { - - trace!(target: "sync", "Downloading old blocks from {:?} (#{}) till {:?} (#{:?})", ancient_block_hash, ancient_block_number, chain.first_block_hash, chain.first_block_number); - let mut downloader = BlockDownloader::new(true, &ancient_block_hash, ancient_block_number); - if let Some(hash) = chain.first_block_hash { - trace!(target: "sync", "Downloader target set to {:?}", hash); - downloader.set_target(&hash); + self.old_blocks = None; + if self.download_old_blocks { + if let (Some(ancient_block_hash), Some(ancient_block_number)) = (chain.ancient_block_hash, chain.ancient_block_number) { + + trace!(target: "sync", "Downloading old blocks from {:?} (#{}) till {:?} (#{:?})", ancient_block_hash, ancient_block_number, chain.first_block_hash, chain.first_block_number); + let mut downloader = BlockDownloader::new(true, &ancient_block_hash, ancient_block_number); + if let Some(hash) = chain.first_block_hash { + trace!(target: "sync", "Downloader target set to {:?}", hash); + downloader.set_target(&hash); + } + self.old_blocks = Some(downloader); } - self.old_blocks = Some(downloader); - } else { - self.old_blocks = None; } }