Pass transaction source to validate_transaction (#5366)

* WiP

* Support source in the runtime API.

* Finish implementation in txpool.

* Fix warning.

* Fix tests.

* Apply suggestions from code review

Co-Authored-By: Kian Paimani <5588131+kianenigma@users.noreply.github.com>
Co-Authored-By: Nikolay Volf <nikvolf@gmail.com>

* Extra changes.

* Fix test and benches.

* fix test

* Fix test & benches again.

* Fix tests.

* Update bumpalo

* Fix doc test.

* Fix doctest.

* Fix doctest.

Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com>
Co-authored-by: Nikolay Volf <nikvolf@gmail.com>
This commit is contained in:
Tomasz Drwięga
2020-03-25 14:09:23 +01:00
committed by GitHub
parent 601ac11e52
commit 04ccb179e9
37 changed files with 414 additions and 163 deletions
@@ -33,6 +33,7 @@ use sp_runtime::transaction_validity::{
TransactionTag as Tag,
TransactionLongevity as Longevity,
TransactionPriority as Priority,
TransactionSource as Source,
};
use sp_transaction_pool::{error, PoolStatus, InPoolTransaction};
@@ -102,6 +103,8 @@ pub struct Transaction<Hash, Extrinsic> {
pub provides: Vec<Tag>,
/// Should that transaction be propagated.
pub propagate: bool,
/// Source of that transaction.
pub source: Source,
}
impl<Hash, Extrinsic> AsRef<Extrinsic> for Transaction<Hash, Extrinsic> {
@@ -155,6 +158,7 @@ impl<Hash: Clone, Extrinsic: Clone> Transaction<Hash, Extrinsic> {
bytes: self.bytes.clone(),
hash: self.hash.clone(),
priority: self.priority.clone(),
source: self.source,
valid_till: self.valid_till.clone(),
requires: self.requires.clone(),
provides: self.provides.clone(),
@@ -185,6 +189,7 @@ impl<Hash, Extrinsic> fmt::Debug for Transaction<Hash, Extrinsic> where
write!(fmt, "valid_till: {:?}, ", &self.valid_till)?;
write!(fmt, "bytes: {:?}, ", &self.bytes)?;
write!(fmt, "propagate: {:?}, ", &self.propagate)?;
write!(fmt, "source: {:?}, ", &self.source)?;
write!(fmt, "requires: [")?;
print_tags(fmt, &self.requires)?;
write!(fmt, "], provides: [")?;
@@ -556,6 +561,7 @@ mod tests {
requires: vec![],
provides: vec![vec![1]],
propagate: true,
source: Source::External,
}).unwrap();
// then
@@ -578,6 +584,7 @@ mod tests {
requires: vec![],
provides: vec![vec![1]],
propagate: true,
source: Source::External,
}).unwrap();
pool.import(Transaction {
data: vec![1u8],
@@ -588,6 +595,7 @@ mod tests {
requires: vec![],
provides: vec![vec![1]],
propagate: true,
source: Source::External,
}).unwrap_err();
// then
@@ -611,6 +619,7 @@ mod tests {
requires: vec![vec![0]],
provides: vec![vec![1]],
propagate: true,
source: Source::External,
}).unwrap();
assert_eq!(pool.ready().count(), 0);
assert_eq!(pool.ready.len(), 0);
@@ -623,6 +632,7 @@ mod tests {
requires: vec![],
provides: vec![vec![0]],
propagate: true,
source: Source::External,
}).unwrap();
// then
@@ -645,6 +655,7 @@ mod tests {
requires: vec![vec![0]],
provides: vec![vec![1]],
propagate: true,
source: Source::External,
}).unwrap();
pool.import(Transaction {
data: vec![3u8],
@@ -655,6 +666,7 @@ mod tests {
requires: vec![vec![2]],
provides: vec![],
propagate: true,
source: Source::External,
}).unwrap();
pool.import(Transaction {
data: vec![2u8],
@@ -665,6 +677,7 @@ mod tests {
requires: vec![vec![1]],
provides: vec![vec![3], vec![2]],
propagate: true,
source: Source::External,
}).unwrap();
pool.import(Transaction {
data: vec![4u8],
@@ -675,6 +688,7 @@ mod tests {
requires: vec![vec![3], vec![4]],
provides: vec![],
propagate: true,
source: Source::External,
}).unwrap();
assert_eq!(pool.ready().count(), 0);
assert_eq!(pool.ready.len(), 0);
@@ -688,6 +702,7 @@ mod tests {
requires: vec![],
provides: vec![vec![0], vec![4]],
propagate: true,
source: Source::External,
}).unwrap();
// then
@@ -720,6 +735,7 @@ mod tests {
requires: vec![vec![0]],
provides: vec![vec![1]],
propagate: true,
source: Source::External,
}).unwrap();
pool.import(Transaction {
data: vec![3u8],
@@ -730,6 +746,7 @@ mod tests {
requires: vec![vec![1]],
provides: vec![vec![2]],
propagate: true,
source: Source::External,
}).unwrap();
assert_eq!(pool.ready().count(), 0);
assert_eq!(pool.ready.len(), 0);
@@ -744,6 +761,7 @@ mod tests {
requires: vec![vec![2]],
provides: vec![vec![0]],
propagate: true,
source: Source::External,
}).unwrap();
// then
@@ -764,6 +782,7 @@ mod tests {
requires: vec![],
provides: vec![vec![0]],
propagate: true,
source: Source::External,
}).unwrap();
let mut it = pool.ready().into_iter().map(|tx| tx.data[0]);
assert_eq!(it.next(), Some(4));
@@ -792,6 +811,7 @@ mod tests {
requires: vec![vec![0]],
provides: vec![vec![1]],
propagate: true,
source: Source::External,
}).unwrap();
pool.import(Transaction {
data: vec![3u8],
@@ -802,6 +822,7 @@ mod tests {
requires: vec![vec![1]],
provides: vec![vec![2]],
propagate: true,
source: Source::External,
}).unwrap();
assert_eq!(pool.ready().count(), 0);
assert_eq!(pool.ready.len(), 0);
@@ -816,6 +837,7 @@ mod tests {
requires: vec![vec![2]],
provides: vec![vec![0]],
propagate: true,
source: Source::External,
}).unwrap();
// then
@@ -836,6 +858,7 @@ mod tests {
requires: vec![],
provides: vec![vec![0]],
propagate: true,
source: Source::External,
}).unwrap_err();
let mut it = pool.ready().into_iter().map(|tx| tx.data[0]);
assert_eq!(it.next(), None);
@@ -859,6 +882,7 @@ mod tests {
requires: vec![],
provides: vec![vec![0], vec![4]],
propagate: true,
source: Source::External,
}).expect("import 1 should be ok");
pool.import(Transaction {
data: vec![3u8; 1024],
@@ -869,6 +893,7 @@ mod tests {
requires: vec![],
provides: vec![vec![2], vec![7]],
propagate: true,
source: Source::External,
}).expect("import 2 should be ok");
assert!(parity_util_mem::malloc_size(&pool) > 5000);
@@ -887,6 +912,7 @@ mod tests {
requires: vec![],
provides: vec![vec![0], vec![4]],
propagate: true,
source: Source::External,
}).unwrap();
pool.import(Transaction {
data: vec![1u8],
@@ -897,6 +923,7 @@ mod tests {
requires: vec![vec![0]],
provides: vec![vec![1]],
propagate: true,
source: Source::External,
}).unwrap();
pool.import(Transaction {
data: vec![3u8],
@@ -907,6 +934,7 @@ mod tests {
requires: vec![vec![2]],
provides: vec![],
propagate: true,
source: Source::External,
}).unwrap();
pool.import(Transaction {
data: vec![2u8],
@@ -917,6 +945,7 @@ mod tests {
requires: vec![vec![1]],
provides: vec![vec![3], vec![2]],
propagate: true,
source: Source::External,
}).unwrap();
pool.import(Transaction {
data: vec![4u8],
@@ -927,6 +956,7 @@ mod tests {
requires: vec![vec![3], vec![4]],
provides: vec![],
propagate: true,
source: Source::External,
}).unwrap();
// future
pool.import(Transaction {
@@ -938,6 +968,7 @@ mod tests {
requires: vec![vec![11]],
provides: vec![],
propagate: true,
source: Source::External,
}).unwrap();
assert_eq!(pool.ready().count(), 5);
assert_eq!(pool.future.len(), 1);
@@ -964,6 +995,7 @@ mod tests {
requires: vec![vec![0]],
provides: vec![vec![100]],
propagate: true,
source: Source::External,
}).unwrap();
// ready
pool.import(Transaction {
@@ -975,6 +1007,7 @@ mod tests {
requires: vec![],
provides: vec![vec![1]],
propagate: true,
source: Source::External,
}).unwrap();
pool.import(Transaction {
data: vec![2u8],
@@ -985,6 +1018,7 @@ mod tests {
requires: vec![vec![2]],
provides: vec![vec![3]],
propagate: true,
source: Source::External,
}).unwrap();
pool.import(Transaction {
data: vec![3u8],
@@ -995,6 +1029,7 @@ mod tests {
requires: vec![vec![1]],
provides: vec![vec![2]],
propagate: true,
source: Source::External,
}).unwrap();
pool.import(Transaction {
data: vec![4u8],
@@ -1005,6 +1040,7 @@ mod tests {
requires: vec![vec![3], vec![2]],
provides: vec![vec![4]],
propagate: true,
source: Source::External,
}).unwrap();
assert_eq!(pool.ready().count(), 4);
@@ -1040,10 +1076,11 @@ mod tests {
requires: vec![vec![3], vec![2]],
provides: vec![vec![4]],
propagate: true,
source: Source::External,
}),
"Transaction { \
hash: 4, priority: 1000, valid_till: 64, bytes: 1, propagate: true, \
requires: [03,02], provides: [04], data: [4]}".to_owned()
source: TransactionSource::External, requires: [03,02], provides: [04], data: [4]}".to_owned()
);
}
@@ -1058,6 +1095,7 @@ requires: [03,02], provides: [04], data: [4]}".to_owned()
requires: vec![vec![3], vec![2]],
provides: vec![vec![4]],
propagate: true,
source: Source::External,
}.is_propagable(), true);
assert_eq!(Transaction {
@@ -1069,6 +1107,7 @@ requires: [03,02], provides: [04], data: [4]}".to_owned()
requires: vec![vec![3], vec![2]],
provides: vec![vec![4]],
propagate: false,
source: Source::External,
}.is_propagable(), false);
}
@@ -1090,6 +1129,7 @@ requires: [03,02], provides: [04], data: [4]}".to_owned()
requires: vec![vec![0]],
provides: vec![],
propagate: true,
source: Source::External,
});
if let Err(error::Error::RejectedFutureTransaction) = err {
@@ -1113,6 +1153,7 @@ requires: [03,02], provides: [04], data: [4]}".to_owned()
requires: vec![vec![0]],
provides: vec![],
propagate: true,
source: Source::External,
}).unwrap();
// then
@@ -1142,6 +1183,7 @@ requires: [03,02], provides: [04], data: [4]}".to_owned()
requires: vec![vec![0]],
provides: vec![],
propagate: true,
source: Source::External,
}).unwrap();
flag