From b60a27627b32dd0e76269732b834ece1fe7d5c3a Mon Sep 17 00:00:00 2001 From: Jeffrey Wilcke Date: Fri, 18 Sep 2015 11:59:21 +0200 Subject: core: transaction nonce recovery fix When the transaction state recovery kicked in it assigned the last (incorrect) nonce to the pending state which caused transactions with the same nonce to occur. Added test for nonce recovery --- core/transaction_pool_test.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'core/transaction_pool_test.go') diff --git a/core/transaction_pool_test.go b/core/transaction_pool_test.go index 7d0984740..d9267cc43 100644 --- a/core/transaction_pool_test.go +++ b/core/transaction_pool_test.go @@ -219,3 +219,22 @@ func TestMissingNonce(t *testing.T) { 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) + } +} -- cgit v1.2.3