From a5a4144ef0ac7f42d24ac0d5620db0950c5685f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= Date: Tue, 14 Aug 2018 13:13:19 +0200 Subject: [PATCH] Reject too large transactions (#558) * Fix is_valid condition when removing transactions from the pool. * Less verbosity. * Reject too large transctions from the pool. * Bring back the warning level. * Fix link. --- polkadot/consensus/src/lib.rs | 6 ------ polkadot/transaction-pool/src/error.rs | 5 +++++ polkadot/transaction-pool/src/lib.rs | 13 +++++++++++-- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/polkadot/consensus/src/lib.rs b/polkadot/consensus/src/lib.rs index be926d1da1..244fdeb55d 100644 --- a/polkadot/consensus/src/lib.rs +++ b/polkadot/consensus/src/lib.rs @@ -770,12 +770,6 @@ impl CreateProposal where C: PolkadotApi { let result = self.transaction_pool.cull_and_get_pending(BlockId::hash(self.parent_hash), |pending_iterator| { let mut pending_size = 0; for pending in pending_iterator { - // skip and cull transactions which are too large. - if pending.encoded_size() > MAX_TRANSACTIONS_SIZE { - unqueue_invalid.push(pending.hash().clone()); - continue - } - if pending_size + pending.encoded_size() >= MAX_TRANSACTIONS_SIZE { break } match block_builder.push_extrinsic(pending.primitive_extrinsic()) { diff --git a/polkadot/transaction-pool/src/error.rs b/polkadot/transaction-pool/src/error.rs index ef6cdf6b41..99281e8d78 100644 --- a/polkadot/transaction-pool/src/error.rs +++ b/polkadot/transaction-pool/src/error.rs @@ -55,6 +55,11 @@ error_chain! { description("Unrecognised address in extrinsic"), display("Unrecognised address in extrinsic: {}", who), } + /// Extrinsic too large + TooLarge(got: usize, max: usize) { + description("Extrinsic too large"), + display("Extrinsic is too large ({} > {})", got, max), + } } } diff --git a/polkadot/transaction-pool/src/lib.rs b/polkadot/transaction-pool/src/lib.rs index d76eae57cb..676b0d9773 100644 --- a/polkadot/transaction-pool/src/lib.rs +++ b/polkadot/transaction-pool/src/lib.rs @@ -59,6 +59,11 @@ use substrate_runtime_primitives::traits::{Bounded, Checkable, Hash as HashT, Bl pub use extrinsic_pool::txpool::{Options, Status, LightStatus, VerifiedTransaction as VerifiedTransactionOps}; pub use error::{Error, ErrorKind, Result}; +/// Maximal size of a single encoded extrinsic. +/// +/// See also polkadot-consensus::MAX_TRANSACTIONS_SIZE +const MAX_TRANSACTION_SIZE: usize = 4 * 1024 * 1024; + /// Type alias for convenience. pub type CheckedExtrinsic = std::result::Result>>::Checked; @@ -279,14 +284,18 @@ impl<'a, A> txpool::Verifier for Verifier<'a, A> where type Error = Error; fn verify_transaction(&self, uxt: UncheckedExtrinsic) -> Result { - if !uxt.is_signed() { bail!(ErrorKind::IsInherent(uxt)) } let encoded = uxt.encode(); - let (encoded_size, hash) = (encoded.len(), BlakeTwo256::hash(&encoded)); + let encoded_size = encoded.len(); + if encoded_size > MAX_TRANSACTION_SIZE { + bail!(ErrorKind::TooLarge(encoded_size, MAX_TRANSACTION_SIZE)); + } + + let hash = BlakeTwo256::hash(&encoded); debug!(target: "transaction-pool", "Transaction submitted: {}", ::substrate_primitives::hexdisplay::HexDisplay::from(&encoded)); let inner = match uxt.clone().check_with(|a| self.lookup(a)) {