core: pending txs now re-validated once every second

pull/769/head
obscuren 10 years ago
parent 48135657c4
commit 7f14fbd579
  1. 30
      core/transaction_pool.go

@ -77,12 +77,18 @@ func NewTxPool(eventMux *event.TypeMux, currentStateFn stateFn) *TxPool {
} }
func (pool *TxPool) Start() { func (pool *TxPool) Start() {
ticker := time.NewTicker(300 * time.Millisecond) // Queue timer will tick so we can attempt to move items from the queue to the
// main transaction pool.
queueTimer := time.NewTicker(300 * time.Millisecond)
// Removal timer will tick and attempt to remove bad transactions (account.nonce>tx.nonce)
removalTimer := time.NewTicker(1 * time.Second)
done: done:
for { for {
select { select {
case <-ticker.C: case <-queueTimer.C:
pool.checkQueue() pool.checkQueue()
case <-removalTimer.C:
pool.validatePool()
case <-pool.quit: case <-pool.quit:
break done break done
} }
@ -253,11 +259,12 @@ func (pool *TxPool) checkQueue() {
pool.mu.Lock() pool.mu.Lock()
defer pool.mu.Unlock() defer pool.mu.Unlock()
statedb := pool.currentState()
for address, txs := range pool.queue { for address, txs := range pool.queue {
sort.Sort(types.TxByNonce{txs}) sort.Sort(types.TxByNonce{txs})
var ( var (
nonce = pool.currentState().GetNonce(address) nonce = statedb.GetNonce(address)
start int start int
) )
// Clean up the transactions first and determine the start of the nonces // Clean up the transactions first and determine the start of the nonces
@ -288,3 +295,20 @@ func (pool *TxPool) checkQueue() {
} }
} }
} }
func (pool *TxPool) validatePool() {
pool.mu.Lock()
defer pool.mu.Unlock()
statedb := pool.currentState()
for hash, tx := range pool.txs {
from, _ := tx.From()
if nonce := statedb.GetNonce(from); nonce > tx.Nonce() {
if glog.V(logger.Debug) {
glog.Infof("removed tx (%x) from pool due to nonce error. state=%d tx=%d\n", hash[:4], nonce, tx.Nonce())
}
delete(pool.txs, hash)
}
}
}

Loading…
Cancel
Save