mirror of
https://gitlab.com/pulsechaincom/go-pulse.git
synced 2025-01-13 14:05:32 +00:00
Merge pull request #1817 from obscuren/nonce-fix
core: transaction nonce recovery
This commit is contained in:
commit
b94b9b0158
@ -121,8 +121,8 @@ func (pool *TxPool) resetState() {
|
|||||||
if addr, err := tx.From(); err == nil {
|
if addr, err := tx.From(); err == nil {
|
||||||
// Set the nonce. Transaction nonce can never be lower
|
// Set the nonce. Transaction nonce can never be lower
|
||||||
// than the state nonce; validatePool took care of that.
|
// than the state nonce; validatePool took care of that.
|
||||||
if pool.pendingState.GetNonce(addr) < tx.Nonce() {
|
if pool.pendingState.GetNonce(addr) <= tx.Nonce() {
|
||||||
pool.pendingState.SetNonce(addr, tx.Nonce())
|
pool.pendingState.SetNonce(addr, tx.Nonce()+1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -219,3 +219,22 @@ func TestMissingNonce(t *testing.T) {
|
|||||||
t.Error("expected 1 queued transaction, got", len(pool.queue[addr]))
|
t.Error("expected 1 queued transaction, got", len(pool.queue[addr]))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestNonceRecovery(t *testing.T) {
|
||||||
|
const n = 10
|
||||||
|
pool, key := setupTxPool()
|
||||||
|
addr := crypto.PubkeyToAddress(key.PublicKey)
|
||||||
|
pool.currentState().SetNonce(addr, n)
|
||||||
|
pool.currentState().AddBalance(addr, big.NewInt(100000000000000))
|
||||||
|
pool.resetState()
|
||||||
|
tx := transaction(n, big.NewInt(100000), key)
|
||||||
|
if err := pool.Add(tx); err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
// simulate some weird re-order of transactions and missing nonce(s)
|
||||||
|
pool.currentState().SetNonce(addr, n-1)
|
||||||
|
pool.resetState()
|
||||||
|
if fn := pool.pendingState.GetNonce(addr); fn != n+1 {
|
||||||
|
t.Errorf("expected nonce to be %d, got %d", n+1, fn)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user