mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-27 23:26:44 +00:00
core/txpool/legacypool: fix incorrect error in authority tracker when removing tx
This commit is contained in:
parent
756310fa43
commit
03f4a1bb12
2 changed files with 43 additions and 2 deletions
|
|
@ -1814,8 +1814,6 @@ func (t *lookup) removeAuthorities(hash common.Hash) {
|
||||||
// Remove tx from tracker.
|
// Remove tx from tracker.
|
||||||
if i := slices.Index(list, hash); i >= 0 {
|
if i := slices.Index(list, hash); i >= 0 {
|
||||||
list = append(list[:i], list[i+1:]...)
|
list = append(list[:i], list[i+1:]...)
|
||||||
} else {
|
|
||||||
log.Error("Authority with untracked tx", "addr", addr, "hash", hash)
|
|
||||||
}
|
}
|
||||||
if len(list) == 0 {
|
if len(list) == 0 {
|
||||||
// If list is newly empty, delete it entirely.
|
// If list is newly empty, delete it entirely.
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"math/big"
|
"math/big"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
|
"slices"
|
||||||
"sync"
|
"sync"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
@ -238,6 +239,23 @@ func validatePoolInternals(pool *LegacyPool) error {
|
||||||
return fmt.Errorf("pending nonce mismatch: have %v, want %v", nonce, last+1)
|
return fmt.Errorf("pending nonce mismatch: have %v, want %v", nonce, last+1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Ensure all auths in pool are tracked
|
||||||
|
for _, tx := range pool.all.txs {
|
||||||
|
for _, addr := range tx.SetCodeAuthorities() {
|
||||||
|
list := pool.all.auths[addr]
|
||||||
|
if i := slices.Index(list, tx.Hash()); i < 0 {
|
||||||
|
return fmt.Errorf("authority not tracked: addr %s, tx %s", addr, tx.Hash())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Ensure all auths in pool have an associated tx.
|
||||||
|
for addr, hashes := range pool.all.auths {
|
||||||
|
for _, hash := range hashes {
|
||||||
|
if _, ok := pool.all.txs[hash]; !ok {
|
||||||
|
return fmt.Errorf("dangling authority, missing originating tx: addr %s, hash %s", addr, hash.Hex())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2381,6 +2399,31 @@ func TestSetCodeTransactions(t *testing.T) {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "remove-hash-from-authority-tracker",
|
||||||
|
pending: 10,
|
||||||
|
run: func(name string) {
|
||||||
|
var keys []*ecdsa.PrivateKey
|
||||||
|
for i := 0; i < 30; i++ {
|
||||||
|
key, _ := crypto.GenerateKey()
|
||||||
|
keys = append(keys, key)
|
||||||
|
addr := crypto.PubkeyToAddress(key.PublicKey)
|
||||||
|
testAddBalance(pool, addr, big.NewInt(params.Ether))
|
||||||
|
}
|
||||||
|
// Create a transactions with 3 unique auths so the lookup's auth map is
|
||||||
|
// filled with addresses.
|
||||||
|
for i := 0; i < 30; i += 3 {
|
||||||
|
if err := pool.addRemoteSync(pricedSetCodeTx(0, 250000, uint256.NewInt(10), uint256.NewInt(3), keys[i], []unsignedAuth{{0, keys[i]}, {0, keys[i+1]}, {0, keys[i+2]}})); err != nil {
|
||||||
|
t.Fatalf("%s: failed to add with remote setcode transaction: %v", name, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Replace one of the transactions with a normal transaction so that the
|
||||||
|
// original hash is removed from the tracker. The hash should be associated with 3 different authorities.
|
||||||
|
if err := pool.addRemoteSync(pricedTransaction(0, 100000, big.NewInt(1000), keys[0])); err != nil {
|
||||||
|
t.Fatalf("%s: failed to replace with remote transaction: %v", name, err)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
} {
|
} {
|
||||||
tt.run(tt.name)
|
tt.run(tt.name)
|
||||||
pending, queued := pool.Stats()
|
pending, queued := pool.Stats()
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue