aboutsummaryrefslogtreecommitdiffstats
path: root/core/transaction_pool.go
diff options
context:
space:
mode:
Diffstat (limited to 'core/transaction_pool.go')
-rw-r--r--core/transaction_pool.go24
1 files changed, 14 insertions, 10 deletions
diff --git a/core/transaction_pool.go b/core/transaction_pool.go
index e31f5c6b3..34a1733d7 100644
--- a/core/transaction_pool.go
+++ b/core/transaction_pool.go
@@ -105,7 +105,9 @@ func (pool *TxPool) resetState() {
if addr, err := tx.From(); err == nil {
// Set the nonce. Transaction nonce can never be lower
// than the state nonce; validatePool took care of that.
- pool.pendingState.SetNonce(addr, tx.Nonce())
+ if pool.pendingState.GetNonce(addr) < tx.Nonce() {
+ pool.pendingState.SetNonce(addr, tx.Nonce())
+ }
}
}
@@ -147,12 +149,17 @@ func (pool *TxPool) validateTx(tx *types.Transaction) error {
return ErrInvalidSender
}
- // Make sure the account exist. Non existant accounts
+ // Make sure the account exist. Non existent accounts
// haven't got funds and well therefor never pass.
if !pool.currentState().HasAccount(from) {
return ErrNonExistentAccount
}
+ // Last but not least check for nonce errors
+ if pool.currentState().GetNonce(from) > tx.Nonce() {
+ return ErrNonce
+ }
+
// Check the transaction doesn't exceed the current
// block limit gas.
if pool.gasLimit().Cmp(tx.GasLimit) < 0 {
@@ -179,12 +186,6 @@ func (pool *TxPool) validateTx(tx *types.Transaction) error {
return ErrIntrinsicGas
}
- // Last but not least check for nonce errors (intensive
- // operation, saved for last)
- if pool.currentState().GetNonce(from) > tx.Nonce() {
- return ErrNonce
- }
-
return nil
}
@@ -394,10 +395,13 @@ func (pool *TxPool) removeTx(hash common.Hash) {
// validatePool removes invalid and processed transactions from the main pool.
func (pool *TxPool) validatePool() {
+ state := pool.currentState()
for hash, tx := range pool.pending {
- if err := pool.validateTx(tx); err != nil {
+ from, _ := tx.From() // err already checked
+ // perform light nonce validation
+ if state.GetNonce(from) > tx.Nonce() {
if glog.V(logger.Core) {
- glog.Infof("removed tx (%x) from pool: %v\n", hash[:4], err)
+ glog.Infof("removed tx (%x) from pool: low tx nonce\n", hash[:4])
}
delete(pool.pending, hash)
}