From 586f46ccc04e108bf216c696ed995e3a59da7ea0 Mon Sep 17 00:00:00 2001 From: Jim Posen Date: Tue, 21 Aug 2018 09:16:04 -0700 Subject: [PATCH] Cache headers in HeaderWithAncestors response. Also fulfills request locally if all headers are in cache. --- ethcore/light/src/on_demand/request.rs | 27 +++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/ethcore/light/src/on_demand/request.rs b/ethcore/light/src/on_demand/request.rs index 3fb53cca4ca..a398713ccc1 100644 --- a/ethcore/light/src/on_demand/request.rs +++ b/ethcore/light/src/on_demand/request.rs @@ -415,6 +415,26 @@ impl CheckedRequest { None } + CheckedRequest::HeaderWithAncestors(_, ref req) => { + if req.skip != 1 || !req.reverse { + return None; + } + + if let Some(&net_request::HashOrNumber::Hash(start)) = req.start.as_ref() { + let mut result = Vec::with_capacity(req.max as usize); + let mut hash = start; + for _ in 0..req.max { + match cache.lock().block_header(&hash) { + Some(header) => { + hash = header.parent_hash(); + result.push(header); + } + None => return None, + } + } + Some(Response::HeaderWithAncestors(result)) + } else { None } + } CheckedRequest::Receipts(ref check, ref req) => { // empty transactions -> no receipts if check.0.as_ref().ok().map_or(false, |hdr| hdr.receipts_root() == KECCAK_NULL_RLP) { @@ -791,7 +811,7 @@ impl HeaderWithAncestors { /// Check a response for the headers. pub fn check_response( &self, - _cache: &Mutex<::cache::Cache>, + cache: &Mutex<::cache::Cache>, start: &net_request::HashOrNumber, headers: &[encoded::Header] ) -> Result, Error> { @@ -828,6 +848,11 @@ impl HeaderWithAncestors { } } + let mut cache = cache.lock(); + for header in headers { + cache.insert_block_header(header.hash(), header.clone()); + } + Ok(headers.to_vec()) } }