core: pending txs now re-validated once every second
This commit is contained in:
parent
48135657c4
commit
7f14fbd579
|
@ -77,12 +77,18 @@ func NewTxPool(eventMux *event.TypeMux, currentStateFn stateFn) *TxPool {
|
|||
}
|
||||
|
||||
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:
|
||||
for {
|
||||
select {
|
||||
case <-ticker.C:
|
||||
case <-queueTimer.C:
|
||||
pool.checkQueue()
|
||||
case <-removalTimer.C:
|
||||
pool.validatePool()
|
||||
case <-pool.quit:
|
||||
break done
|
||||
}
|
||||
|
@ -253,11 +259,12 @@ func (pool *TxPool) checkQueue() {
|
|||
pool.mu.Lock()
|
||||
defer pool.mu.Unlock()
|
||||
|
||||
statedb := pool.currentState()
|
||||
for address, txs := range pool.queue {
|
||||
sort.Sort(types.TxByNonce{txs})
|
||||
|
||||
var (
|
||||
nonce = pool.currentState().GetNonce(address)
|
||||
nonce = statedb.GetNonce(address)
|
||||
start int
|
||||
)
|
||||
// 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…
Reference in New Issue