diff --git a/sync/src/block/downloader/header.rs b/sync/src/block/downloader/header.rs index b6906c9ed5..aef58a8d82 100644 --- a/sync/src/block/downloader/header.rs +++ b/sync/src/block/downloader/header.rs @@ -1,4 +1,4 @@ -// Copyright 2018 Kodebox, Inc. +// Copyright 2018-2020 Kodebox, Inc. // This file is part of CodeChain. // // This program is free software: you can redistribute it and/or modify @@ -15,9 +15,8 @@ // along with this program. If not, see . use super::super::message::RequestMessage; -use ccore::encoded::Header; use ccore::{BlockChainClient, BlockId}; -use ctypes::BlockHash; +use ctypes::{BlockHash, Header}; use primitives::U256; use std::cmp::Ordering; use std::collections::HashMap; @@ -36,9 +35,11 @@ pub struct HeaderDownloader { seq: U256, best_hash: BlockHash, + /// The last header we downloaded from this peer. pivot: BlockHash, request_time: Option, downloaded: HashMap, + /// Headers that are importing now. queued: HashMap, trial: usize, } @@ -102,7 +103,7 @@ impl HeaderDownloader { Some(header) => header.clone(), None => match self.downloaded.get(&self.pivot) { Some(header) => header.clone(), - None => self.client.block_header(&BlockId::Hash(self.pivot)).unwrap(), + None => self.client.block_header(&BlockId::Hash(self.pivot)).unwrap().decode(), }, } } @@ -162,7 +163,7 @@ impl HeaderDownloader { ); } else if first_header_number == pivot_header.number() { if pivot_header.number() != 0 { - self.pivot = pivot_header.parent_hash(); + self.pivot = *pivot_header.parent_hash(); } } else { cerror!( diff --git a/sync/src/block/extension.rs b/sync/src/block/extension.rs index acf9b7be96..b504606df6 100644 --- a/sync/src/block/extension.rs +++ b/sync/src/block/extension.rs @@ -973,20 +973,19 @@ impl Extension { }, State::Full => { let (mut completed, peer_is_caught_up) = if let Some(peer) = self.header_downloaders.get_mut(from) { - let encoded: Vec<_> = headers.iter().map(|h| EncodedHeader::new(h.rlp_bytes().to_vec())).collect(); - peer.import_headers(&encoded); + peer.import_headers(&headers); (peer.downloaded(), peer.is_caught_up()) } else { (Vec::new(), true) }; - completed.sort_unstable_by_key(EncodedHeader::number); + completed.sort_unstable_by_key(Header::number); let mut exists = Vec::new(); let mut queued = Vec::new(); for header in completed { let hash = header.hash(); - match self.client.import_header(header.clone().into_inner()) { + match self.client.import_header(header.rlp_bytes()) { Err(BlockImportError::Import(ImportError::AlreadyInChain)) => exists.push(hash), Err(BlockImportError::Import(ImportError::AlreadyQueued)) => queued.push(hash), // FIXME: handle import errors