forked from cerc-io/plugeth
core: filter out txs with invalid signatures as soon as possible
Once we detect an invalid transaction during recovering signatures, we should directly exclude this transaction to avoid validating the signatures hereafter. This should optimize the validations times of transactions with invalid signatures to only one time.
This commit is contained in:
parent
8b83125739
commit
8523ad450d
@ -781,16 +781,22 @@ func (pool *TxPool) addTxs(txs []*types.Transaction, local, sync bool) []error {
|
|||||||
knownTxMeter.Mark(1)
|
knownTxMeter.Mark(1)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
// Exclude transactions with invalid signatures as soon as
|
||||||
|
// possible and cache senders in transactions before
|
||||||
|
// obtaining lock
|
||||||
|
_, err := types.Sender(pool.signer, tx)
|
||||||
|
if err != nil {
|
||||||
|
errs[i] = ErrInvalidSender
|
||||||
|
invalidTxMeter.Mark(1)
|
||||||
|
continue
|
||||||
|
}
|
||||||
// Accumulate all unknown transactions for deeper processing
|
// Accumulate all unknown transactions for deeper processing
|
||||||
news = append(news, tx)
|
news = append(news, tx)
|
||||||
}
|
}
|
||||||
if len(news) == 0 {
|
if len(news) == 0 {
|
||||||
return errs
|
return errs
|
||||||
}
|
}
|
||||||
// Cache senders in transactions before obtaining lock (pool.signer is immutable)
|
|
||||||
for _, tx := range news {
|
|
||||||
types.Sender(pool.signer, tx)
|
|
||||||
}
|
|
||||||
// Process all the new transaction and merge any errors into the original slice
|
// Process all the new transaction and merge any errors into the original slice
|
||||||
pool.mu.Lock()
|
pool.mu.Lock()
|
||||||
newErrs, dirtyAddrs := pool.addTxsLocked(news, local)
|
newErrs, dirtyAddrs := pool.addTxsLocked(news, local)
|
||||||
|
Loading…
Reference in New Issue
Block a user