Make transaction pool prune transactions only of canonical blocks (#6123)

* Make tx pool aware of retracted fork blocks

* Make it compile

* Update client/transaction-pool/src/lib.rs

Co-authored-by: Nikolay Volf <nikvolf@gmail.com>

* Fix doc test

* Simplify the implementation

* Send tree route as arc to prevent heavy clones

* Switch to use `ExtrinsicHash` to make it more clear

* Fix benchmark

Co-authored-by: Nikolay Volf <nikvolf@gmail.com>
This commit is contained in:
Bastian Köcher
2020-06-05 23:12:00 +02:00
committed by GitHub
parent 8a8b4f99c3
commit d2846e2b9a
31 changed files with 808 additions and 359 deletions
@@ -12,7 +12,6 @@ documentation = "https://docs.rs/sp-blockchain"
[package.metadata.docs.rs]
targets = ["x86_64-unknown-linux-gnu"]
[dependencies]
log = "0.4.8"
lru = "0.4.0"
@@ -137,7 +137,8 @@ pub fn tree_route<Block: BlockT, T: HeaderMetadata<Block>>(
from = backend.header_metadata(from.parent)?;
}
// add the pivot block. and append the reversed to-branch (note that it's reverse order originals)
// add the pivot block. and append the reversed to-branch
// (note that it's reverse order originals)
let pivot = from_branch.len();
from_branch.push(HashAndNumber {
number: to.number,
@@ -182,18 +183,24 @@ pub struct HashAndNumber<Block: BlockT> {
/// Tree route from C to E2. Retracted empty. Common is C, enacted [E1, E2]
/// C -> E1 -> E2
/// ```
#[derive(Debug)]
#[derive(Debug, Clone)]
pub struct TreeRoute<Block: BlockT> {
route: Vec<HashAndNumber<Block>>,
pivot: usize,
}
impl<Block: BlockT> TreeRoute<Block> {
/// Get a slice of all retracted blocks in reverse order (towards common ancestor)
/// Get a slice of all retracted blocks in reverse order (towards common ancestor).
pub fn retracted(&self) -> &[HashAndNumber<Block>] {
&self.route[..self.pivot]
}
/// Convert into all retracted blocks in reverse order (towards common ancestor).
pub fn into_retracted(mut self) -> Vec<HashAndNumber<Block>> {
self.route.truncate(self.pivot);
self.route
}
/// Get the common ancestor block. This might be one of the two blocks of the
/// route.
pub fn common_block(&self) -> &HashAndNumber<Block> {
@@ -213,8 +220,15 @@ pub trait HeaderMetadata<Block: BlockT> {
/// Error used in case the header metadata is not found.
type Error;
fn header_metadata(&self, hash: Block::Hash) -> Result<CachedHeaderMetadata<Block>, Self::Error>;
fn insert_header_metadata(&self, hash: Block::Hash, header_metadata: CachedHeaderMetadata<Block>);
fn header_metadata(
&self,
hash: Block::Hash,
) -> Result<CachedHeaderMetadata<Block>, Self::Error>;
fn insert_header_metadata(
&self,
hash: Block::Hash,
header_metadata: CachedHeaderMetadata<Block>,
);
fn remove_header_metadata(&self, hash: Block::Hash);
}
@@ -20,6 +20,7 @@ futures = { version = "0.3.1", optional = true }
log = { version = "0.4.8", optional = true }
serde = { version = "1.0.101", features = ["derive"], optional = true}
sp-api = { version = "2.0.0-rc2", default-features = false, path = "../api" }
sp-blockchain = { version = "2.0.0-rc2", optional = true, path = "../blockchain" }
sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../runtime" }
sp-utils = { version = "2.0.0-rc2", default-features = false, path = "../utils" }
@@ -32,5 +33,6 @@ std = [
"log",
"serde",
"sp-api/std",
"sp-blockchain",
"sp-runtime/std",
]
@@ -255,8 +255,10 @@ pub enum ChainEvent<B: BlockT> {
id: BlockId<B>,
/// Header of the just imported block
header: B::Header,
/// List of retracted blocks ordered by block number.
retracted: Vec<B::Hash>,
/// Tree route from old best to new best that was calculated on import.
///
/// If `None`, no re-org happened on import.
tree_route: Option<Arc<sp_blockchain::TreeRoute<B>>>,
},
/// An existing block has been finalized.
Finalized {