mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-13 00:01:09 +00:00
Ban incoming invalid transactions (#4037)
This commit is contained in:
committed by
Gavin Wood
parent
3a7b1b9da5
commit
8de6279300
@@ -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()),
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user