|
|
|
@ -781,16 +781,22 @@ func (pool *TxPool) addTxs(txs []*types.Transaction, local, sync bool) []error { |
|
|
|
|
knownTxMeter.Mark(1) |
|
|
|
|
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
|
|
|
|
|
news = append(news, tx) |
|
|
|
|
} |
|
|
|
|
if len(news) == 0 { |
|
|
|
|
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
|
|
|
|
|
pool.mu.Lock() |
|
|
|
|
newErrs, dirtyAddrs := pool.addTxsLocked(news, local) |
|
|
|
|