Ban incoming invalid transactions (#4037)

This commit is contained in:
Arkadiy Paronyan
2019-11-07 12:03:23 +01:00
committed by Gavin Wood
parent 3a7b1b9da5
commit 8de6279300
2 changed files with 13 additions and 7 deletions
@@ -342,14 +342,14 @@ impl<B: ChainApi> Pool<B> {
) -> impl Future<Output=ValidatedTransactionFor<B>> {
let (hash, bytes) = self.validated_pool.api().hash_and_length(&xt);
if !force && self.validated_pool.is_banned(&hash) {
return Either::Left(ready(ValidatedTransaction::Invalid(error::Error::TemporarilyBanned.into())))
return Either::Left(ready(ValidatedTransaction::Invalid(hash, error::Error::TemporarilyBanned.into())))
}
Either::Right(self.validated_pool.api().validate_transaction(block_id, xt.clone())
.then(move |validation_result| ready(match validation_result {
Ok(validity) => match validity {
Ok(validity) => if validity.provides.is_empty() {
ValidatedTransaction::Invalid(error::Error::NoTagsProvided.into())
ValidatedTransaction::Invalid(hash, error::Error::NoTagsProvided.into())
} else {
ValidatedTransaction::Valid(base::Transaction {
data: xt,
@@ -365,11 +365,11 @@ impl<B: ChainApi> Pool<B> {
})
},
Err(TransactionValidityError::Invalid(e)) =>
ValidatedTransaction::Invalid(error::Error::InvalidTransaction(e).into()),
ValidatedTransaction::Invalid(hash, error::Error::InvalidTransaction(e).into()),
Err(TransactionValidityError::Unknown(e)) =>
ValidatedTransaction::Unknown(hash, error::Error::UnknownTransaction(e).into()),
},
Err(e) => ValidatedTransaction::Invalid(e),
Err(e) => ValidatedTransaction::Invalid(hash, e),
})))
}
}
@@ -45,7 +45,7 @@ pub enum ValidatedTransaction<Hash, Ex, Error> {
/// Transaction that has been validated successfully.
Valid(base::Transaction<Hash, Ex>),
/// Transaction that is invalid.
Invalid(Error),
Invalid(Hash, Error),
/// Transaction which validity can't be determined.
///
/// We're notifying watchers about failure, if 'unknown' transaction is submitted.
@@ -125,7 +125,10 @@ impl<B: ChainApi> ValidatedPool<B> {
fire_events(&mut *listener, &imported);
Ok(imported.hash().clone())
}
ValidatedTransaction::Invalid(err) => Err(err.into()),
ValidatedTransaction::Invalid(hash, err) => {
self.rotator.ban(&std::time::Instant::now(), std::iter::once(hash));
Err(err.into())
},
ValidatedTransaction::Unknown(hash, err) => {
self.listener.write().invalid(&hash);
Err(err.into())
@@ -177,7 +180,10 @@ impl<B: ChainApi> ValidatedPool<B> {
.expect("One extrinsic passed; one result returned; qed")
.map(|_| watcher)
},
ValidatedTransaction::Invalid(err) => Err(err.into()),
ValidatedTransaction::Invalid(hash, err) => {
self.rotator.ban(&std::time::Instant::now(), std::iter::once(hash));
Err(err.into())
},
ValidatedTransaction::Unknown(_, err) => Err(err.into()),
}
}