aboutsummaryrefslogtreecommitdiffstats
path: root/core/transaction_pool.go
diff options
context:
space:
mode:
authorobscuren <geffobscura@gmail.com>2015-06-17 23:09:39 +0800
committerobscuren <geffobscura@gmail.com>2015-06-17 23:10:22 +0800
commitf5abc9f188fb684e3601314b8ae454ac5abbf0e9 (patch)
treebeb401b716ba208f73dff68e0eef0f3fc44f79ed /core/transaction_pool.go
parent753d62a4ddd974a1410b1ed3ee92a30115a1e0df (diff)
downloadgo-tangerine-f5abc9f188fb684e3601314b8ae454ac5abbf0e9.tar.gz
go-tangerine-f5abc9f188fb684e3601314b8ae454ac5abbf0e9.tar.zst
go-tangerine-f5abc9f188fb684e3601314b8ae454ac5abbf0e9.zip
core, core/vm: state improvements and tx pool speed up
Removed full tx validation during state transitions
Diffstat (limited to 'core/transaction_pool.go')
-rw-r--r--core/transaction_pool.go22
1 files changed, 13 insertions, 9 deletions
diff --git a/core/transaction_pool.go b/core/transaction_pool.go
index e31f5c6b3..5ebe3576b 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())
+ }
}
}
@@ -153,6 +155,11 @@ func (pool *TxPool) validateTx(tx *types.Transaction) error {
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)
}