From edb1f3b1280896a6175174bc4d9bbfa40c1a5282 Mon Sep 17 00:00:00 2001 From: Park Juhyung Date: Mon, 13 Apr 2020 17:08:44 +0900 Subject: [PATCH 1/2] Add document in the fields of HeaderDownloader struct --- sync/src/block/downloader/header.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/sync/src/block/downloader/header.rs b/sync/src/block/downloader/header.rs index b6906c9ed5..096ab2ed15 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 @@ -36,9 +36,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, } From 83ad5bba140a87fdc841e8de22c206dc4aaffc3e Mon Sep 17 00:00:00 2001 From: Park Juhyung Date: Mon, 13 Apr 2020 17:49:48 +0900 Subject: [PATCH 2/2] Use `ctypes::Header` instead of `encoded::Header` in HeaderDownloader The purpose of the encoded type is to read a few fields from binary data when we don't want to full deserialize it. In the header sync, we already deserialized the whole struct in the verification process. We don't need to encoded Header when we have ctypes::Header. --- sync/src/block/downloader/header.rs | 7 +++---- sync/src/block/extension.rs | 7 +++---- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/sync/src/block/downloader/header.rs b/sync/src/block/downloader/header.rs index 096ab2ed15..aef58a8d82 100644 --- a/sync/src/block/downloader/header.rs +++ b/sync/src/block/downloader/header.rs @@ -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; @@ -104,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(), }, } } @@ -164,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