Optimize tree route to sync faster (#3665)

* Introduce HeaderMetadata and use it for tree_route. Add lowest_common_ancestor.
* Add tests.
This commit is contained in:
Marcio Diaz
2019-10-02 20:30:43 +02:00
committed by GitHub
parent 8646cd158e
commit f6bd58ac1f
22 changed files with 677 additions and 280 deletions
+2 -1
View File
@@ -19,13 +19,14 @@ futures03 = { package = "futures-preview", version = "0.3.0-alpha.18", features
futures-timer = "0.3"
linked-hash-map = "0.5"
linked_hash_set = "0.1.3"
lru-cache = "0.1.1"
lru-cache = "0.1.2"
rustc-hex = "2.0"
rand = "0.6"
libp2p = { version = "0.12.0", default-features = false, features = ["secp256k1", "libp2p-websocket"] }
fork-tree = { path = "../../core/utils/fork-tree" }
consensus = { package = "substrate-consensus-common", path = "../../core/consensus/common" }
client = { package = "substrate-client", path = "../../core/client" }
header_metadata = { package = "substrate-header-metadata", path = "../../core/client/header-metadata" }
sr-primitives = { path = "../../core/sr-primitives" }
primitives = { package = "substrate-primitives", path = "../../core/primitives" }
codec = { package = "parity-scale-codec", version = "1.0.0", features = ["derive"] }
+2 -8
View File
@@ -153,14 +153,8 @@ impl<B, E, Block, RA> Client<Block> for SubstrateClient<B, E, Block, RA> where
return Ok(false);
}
let tree_route = ::client::blockchain::tree_route(
|id| self.header(&id)?.ok_or_else(||
client::error::Error::UnknownBlock(format!("{:?}", id))
),
BlockId::Hash(*block),
BlockId::Hash(*base),
)?;
let ancestor = header_metadata::lowest_common_ancestor(self, *block, *base)?;
Ok(tree_route.common_block().hash == *base)
Ok(ancestor.hash == *base)
}
}