all: update golang/x/ext and fix slice sorting fallout (#27909)
The Go authors updated golang/x/ext to change the function signature of the slices sort method. It's an entire shitshow now because x/ext is not tagged, so everyone's codebase just picked a new version that some other dep depends on, causing our code to fail building. This PR updates the dep on our code too and does all the refactorings to follow upstream...
This commit is contained in:
parent
0ce331f56a
commit
be65b47645
@ -40,8 +40,8 @@ import (
|
|||||||
const minReloadInterval = 2 * time.Second
|
const minReloadInterval = 2 * time.Second
|
||||||
|
|
||||||
// byURL defines the sorting order for accounts.
|
// byURL defines the sorting order for accounts.
|
||||||
func byURL(a, b accounts.Account) bool {
|
func byURL(a, b accounts.Account) int {
|
||||||
return a.URL.Cmp(b.URL) < 0
|
return a.URL.Cmp(b.URL)
|
||||||
}
|
}
|
||||||
|
|
||||||
// AmbiguousAddrError is returned when attempting to unlock
|
// AmbiguousAddrError is returned when attempting to unlock
|
||||||
|
@ -288,11 +288,17 @@ func makeDeletionChanges(records map[string]recordSet, keep map[string]string) [
|
|||||||
// sortChanges ensures DNS changes are in leaf-added -> root-changed -> leaf-deleted order.
|
// sortChanges ensures DNS changes are in leaf-added -> root-changed -> leaf-deleted order.
|
||||||
func sortChanges(changes []types.Change) {
|
func sortChanges(changes []types.Change) {
|
||||||
score := map[string]int{"CREATE": 1, "UPSERT": 2, "DELETE": 3}
|
score := map[string]int{"CREATE": 1, "UPSERT": 2, "DELETE": 3}
|
||||||
slices.SortFunc(changes, func(a, b types.Change) bool {
|
slices.SortFunc(changes, func(a, b types.Change) int {
|
||||||
if a.Action == b.Action {
|
if a.Action == b.Action {
|
||||||
return *a.ResourceRecordSet.Name < *b.ResourceRecordSet.Name
|
return strings.Compare(*a.ResourceRecordSet.Name, *b.ResourceRecordSet.Name)
|
||||||
}
|
}
|
||||||
return score[string(a.Action)] < score[string(b.Action)]
|
if score[string(a.Action)] < score[string(b.Action)] {
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
if score[string(a.Action)] > score[string(b.Action)] {
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
return 0
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -77,8 +77,8 @@ func (ns nodeSet) nodes() []*enode.Node {
|
|||||||
result = append(result, n.N)
|
result = append(result, n.N)
|
||||||
}
|
}
|
||||||
// Sort by ID.
|
// Sort by ID.
|
||||||
slices.SortFunc(result, func(a, b *enode.Node) bool {
|
slices.SortFunc(result, func(a, b *enode.Node) int {
|
||||||
return bytes.Compare(a.ID().Bytes(), b.ID().Bytes()) < 0
|
return bytes.Compare(a.ID().Bytes(), b.ID().Bytes())
|
||||||
})
|
})
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
@ -103,8 +103,14 @@ func (ns nodeSet) topN(n int) nodeSet {
|
|||||||
for _, v := range ns {
|
for _, v := range ns {
|
||||||
byscore = append(byscore, v)
|
byscore = append(byscore, v)
|
||||||
}
|
}
|
||||||
slices.SortFunc(byscore, func(a, b nodeJSON) bool {
|
slices.SortFunc(byscore, func(a, b nodeJSON) int {
|
||||||
return a.Score >= b.Score
|
if a.Score > b.Score {
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
if a.Score < b.Score {
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
return 0
|
||||||
})
|
})
|
||||||
result := make(nodeSet, n)
|
result := make(nodeSet, n)
|
||||||
for _, v := range byscore[:n] {
|
for _, v := range byscore[:n] {
|
||||||
|
@ -65,9 +65,9 @@ func BigToHash(b *big.Int) Hash { return BytesToHash(b.Bytes()) }
|
|||||||
// If b is larger than len(h), b will be cropped from the left.
|
// If b is larger than len(h), b will be cropped from the left.
|
||||||
func HexToHash(s string) Hash { return BytesToHash(FromHex(s)) }
|
func HexToHash(s string) Hash { return BytesToHash(FromHex(s)) }
|
||||||
|
|
||||||
// Less compares two hashes.
|
// Cmp compares two hashes.
|
||||||
func (h Hash) Less(other Hash) bool {
|
func (h Hash) Cmp(other Hash) int {
|
||||||
return bytes.Compare(h[:], other[:]) < 0
|
return bytes.Compare(h[:], other[:])
|
||||||
}
|
}
|
||||||
|
|
||||||
// Bytes gets the byte representation of the underlying hash.
|
// Bytes gets the byte representation of the underlying hash.
|
||||||
@ -231,9 +231,9 @@ func IsHexAddress(s string) bool {
|
|||||||
return len(s) == 2*AddressLength && isHex(s)
|
return len(s) == 2*AddressLength && isHex(s)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Less compares two addresses.
|
// Cmp compares two addresses.
|
||||||
func (a Address) Less(other Address) bool {
|
func (a Address) Cmp(other Address) int {
|
||||||
return bytes.Compare(a[:], other[:]) < 0
|
return bytes.Compare(a[:], other[:])
|
||||||
}
|
}
|
||||||
|
|
||||||
// Bytes gets the string representation of the underlying address.
|
// Bytes gets the string representation of the underlying address.
|
||||||
|
@ -308,7 +308,7 @@ func (s *Snapshot) signers() []common.Address {
|
|||||||
for sig := range s.Signers {
|
for sig := range s.Signers {
|
||||||
sigs = append(sigs, sig)
|
sigs = append(sigs, sig)
|
||||||
}
|
}
|
||||||
slices.SortFunc(sigs, common.Address.Less)
|
slices.SortFunc(sigs, common.Address.Cmp)
|
||||||
return sigs
|
return sigs
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -53,7 +53,7 @@ func (ap *testerAccountPool) checkpoint(header *types.Header, signers []string)
|
|||||||
for i, signer := range signers {
|
for i, signer := range signers {
|
||||||
auths[i] = ap.address(signer)
|
auths[i] = ap.address(signer)
|
||||||
}
|
}
|
||||||
slices.SortFunc(auths, common.Address.Less)
|
slices.SortFunc(auths, common.Address.Cmp)
|
||||||
for i, auth := range auths {
|
for i, auth := range auths {
|
||||||
copy(header.Extra[extraVanity+i*common.AddressLength:], auth.Bytes())
|
copy(header.Extra[extraVanity+i*common.AddressLength:], auth.Bytes())
|
||||||
}
|
}
|
||||||
|
@ -1053,8 +1053,8 @@ func (bc *BlockChain) procFutureBlocks() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if len(blocks) > 0 {
|
if len(blocks) > 0 {
|
||||||
slices.SortFunc(blocks, func(a, b *types.Block) bool {
|
slices.SortFunc(blocks, func(a, b *types.Block) int {
|
||||||
return a.NumberU64() < b.NumberU64()
|
return a.Number().Cmp(b.Number())
|
||||||
})
|
})
|
||||||
// Insert one by one as chain insertion needs contiguous ancestry between blocks
|
// Insert one by one as chain insertion needs contiguous ancestry between blocks
|
||||||
for i := range blocks {
|
for i := range blocks {
|
||||||
|
@ -902,9 +902,9 @@ func WriteBadBlock(db ethdb.KeyValueStore, block *types.Block) {
|
|||||||
Header: block.Header(),
|
Header: block.Header(),
|
||||||
Body: block.Body(),
|
Body: block.Body(),
|
||||||
})
|
})
|
||||||
slices.SortFunc(badBlocks, func(a, b *badBlock) bool {
|
slices.SortFunc(badBlocks, func(a, b *badBlock) int {
|
||||||
// Note: sorting in descending number order.
|
// Note: sorting in descending number order.
|
||||||
return a.Header.Number.Uint64() >= b.Header.Number.Uint64()
|
return -a.Header.Number.Cmp(b.Header.Number)
|
||||||
})
|
})
|
||||||
if len(badBlocks) > badBlockToKeep {
|
if len(badBlocks) > badBlockToKeep {
|
||||||
badBlocks = badBlocks[:badBlockToKeep]
|
badBlocks = badBlocks[:badBlockToKeep]
|
||||||
|
@ -19,12 +19,12 @@ package rawdb
|
|||||||
import (
|
import (
|
||||||
"math/big"
|
"math/big"
|
||||||
"reflect"
|
"reflect"
|
||||||
|
"sort"
|
||||||
"sync"
|
"sync"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
"github.com/ethereum/go-ethereum/core/types"
|
"github.com/ethereum/go-ethereum/core/types"
|
||||||
"golang.org/x/exp/slices"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestChainIterator(t *testing.T) {
|
func TestChainIterator(t *testing.T) {
|
||||||
@ -92,11 +92,9 @@ func TestChainIterator(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if !c.reverse {
|
if !c.reverse {
|
||||||
slices.Sort(numbers)
|
sort.Ints(numbers)
|
||||||
} else {
|
} else {
|
||||||
slices.SortFunc(numbers, func(a, b int) bool {
|
sort.Sort(sort.Reverse(sort.IntSlice(numbers)))
|
||||||
return a > b // Sort descending
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
if !reflect.DeepEqual(numbers, c.expect) {
|
if !reflect.DeepEqual(numbers, c.expect) {
|
||||||
t.Fatalf("Case %d failed, visit element mismatch, want %v, got %v", i, c.expect, numbers)
|
t.Fatalf("Case %d failed, visit element mismatch, want %v, got %v", i, c.expect, numbers)
|
||||||
|
@ -525,7 +525,7 @@ func (dl *diffLayer) AccountList() []common.Hash {
|
|||||||
dl.accountList = append(dl.accountList, hash)
|
dl.accountList = append(dl.accountList, hash)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
slices.SortFunc(dl.accountList, common.Hash.Less)
|
slices.SortFunc(dl.accountList, common.Hash.Cmp)
|
||||||
dl.memory += uint64(len(dl.accountList) * common.HashLength)
|
dl.memory += uint64(len(dl.accountList) * common.HashLength)
|
||||||
return dl.accountList
|
return dl.accountList
|
||||||
}
|
}
|
||||||
@ -563,7 +563,7 @@ func (dl *diffLayer) StorageList(accountHash common.Hash) ([]common.Hash, bool)
|
|||||||
for k := range storageMap {
|
for k := range storageMap {
|
||||||
storageList = append(storageList, k)
|
storageList = append(storageList, k)
|
||||||
}
|
}
|
||||||
slices.SortFunc(storageList, common.Hash.Less)
|
slices.SortFunc(storageList, common.Hash.Cmp)
|
||||||
dl.storageList[accountHash] = storageList
|
dl.storageList[accountHash] = storageList
|
||||||
dl.memory += uint64(len(dl.storageList)*common.HashLength + common.HashLength)
|
dl.memory += uint64(len(dl.storageList)*common.HashLength + common.HashLength)
|
||||||
return storageList, destructed
|
return storageList, destructed
|
||||||
|
@ -33,19 +33,25 @@ type weightedIterator struct {
|
|||||||
priority int
|
priority int
|
||||||
}
|
}
|
||||||
|
|
||||||
func (it *weightedIterator) Less(other *weightedIterator) bool {
|
func (it *weightedIterator) Cmp(other *weightedIterator) int {
|
||||||
// Order the iterators primarily by the account hashes
|
// Order the iterators primarily by the account hashes
|
||||||
hashI := it.it.Hash()
|
hashI := it.it.Hash()
|
||||||
hashJ := other.it.Hash()
|
hashJ := other.it.Hash()
|
||||||
|
|
||||||
switch bytes.Compare(hashI[:], hashJ[:]) {
|
switch bytes.Compare(hashI[:], hashJ[:]) {
|
||||||
case -1:
|
case -1:
|
||||||
return true
|
return -1
|
||||||
case 1:
|
case 1:
|
||||||
return false
|
return 1
|
||||||
}
|
}
|
||||||
// Same account/storage-slot in multiple layers, split by priority
|
// Same account/storage-slot in multiple layers, split by priority
|
||||||
return it.priority < other.priority
|
if it.priority < other.priority {
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
if it.priority > other.priority {
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
// fastIterator is a more optimized multi-layer iterator which maintains a
|
// fastIterator is a more optimized multi-layer iterator which maintains a
|
||||||
@ -155,9 +161,7 @@ func (fi *fastIterator) init() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Re-sort the entire list
|
// Re-sort the entire list
|
||||||
slices.SortFunc(fi.iterators, func(a, b *weightedIterator) bool {
|
slices.SortFunc(fi.iterators, func(a, b *weightedIterator) int { return a.Cmp(b) })
|
||||||
return a.Less(b)
|
|
||||||
})
|
|
||||||
fi.initiated = false
|
fi.initiated = false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -105,7 +105,7 @@ func TestAccountRange(t *testing.T) {
|
|||||||
}
|
}
|
||||||
// Test to see if it's possible to recover from the middle of the previous
|
// Test to see if it's possible to recover from the middle of the previous
|
||||||
// set and get an even split between the first and second sets.
|
// set and get an even split between the first and second sets.
|
||||||
slices.SortFunc(hList, common.Hash.Less)
|
slices.SortFunc(hList, common.Hash.Cmp)
|
||||||
middleH := hList[AccountRangeMaxResults/2]
|
middleH := hList[AccountRangeMaxResults/2]
|
||||||
middleResult := accountRangeTest(t, &trie, sdb, middleH, AccountRangeMaxResults, AccountRangeMaxResults)
|
middleResult := accountRangeTest(t, &trie, sdb, middleH, AccountRangeMaxResults, AccountRangeMaxResults)
|
||||||
missing, infirst, insecond := 0, 0, 0
|
missing, infirst, insecond := 0, 0, 0
|
||||||
|
@ -111,8 +111,8 @@ func (oracle *Oracle) processBlock(bf *blockFees, percentiles []float64) {
|
|||||||
reward, _ := tx.EffectiveGasTip(bf.block.BaseFee())
|
reward, _ := tx.EffectiveGasTip(bf.block.BaseFee())
|
||||||
sorter[i] = txGasAndReward{gasUsed: bf.receipts[i].GasUsed, reward: reward}
|
sorter[i] = txGasAndReward{gasUsed: bf.receipts[i].GasUsed, reward: reward}
|
||||||
}
|
}
|
||||||
slices.SortStableFunc(sorter, func(a, b txGasAndReward) bool {
|
slices.SortStableFunc(sorter, func(a, b txGasAndReward) int {
|
||||||
return a.reward.Cmp(b.reward) < 0
|
return a.reward.Cmp(b.reward)
|
||||||
})
|
})
|
||||||
|
|
||||||
var txIndex int
|
var txIndex int
|
||||||
|
@ -208,7 +208,7 @@ func (oracle *Oracle) SuggestTipCap(ctx context.Context) (*big.Int, error) {
|
|||||||
}
|
}
|
||||||
price := lastPrice
|
price := lastPrice
|
||||||
if len(results) > 0 {
|
if len(results) > 0 {
|
||||||
slices.SortFunc(results, func(a, b *big.Int) bool { return a.Cmp(b) < 0 })
|
slices.SortFunc(results, func(a, b *big.Int) int { return a.Cmp(b) })
|
||||||
price = results[(len(results)-1)*oracle.percentile/100]
|
price = results[(len(results)-1)*oracle.percentile/100]
|
||||||
}
|
}
|
||||||
if price.Cmp(oracle.maxPrice) > 0 {
|
if price.Cmp(oracle.maxPrice) > 0 {
|
||||||
@ -247,12 +247,12 @@ func (oracle *Oracle) getBlockValues(ctx context.Context, blockNum uint64, limit
|
|||||||
sortedTxs := make([]*types.Transaction, len(txs))
|
sortedTxs := make([]*types.Transaction, len(txs))
|
||||||
copy(sortedTxs, txs)
|
copy(sortedTxs, txs)
|
||||||
baseFee := block.BaseFee()
|
baseFee := block.BaseFee()
|
||||||
slices.SortFunc(sortedTxs, func(a, b *types.Transaction) bool {
|
slices.SortFunc(sortedTxs, func(a, b *types.Transaction) int {
|
||||||
// It's okay to discard the error because a tx would never be
|
// It's okay to discard the error because a tx would never be
|
||||||
// accepted into a block with an invalid effective tip.
|
// accepted into a block with an invalid effective tip.
|
||||||
tip1, _ := a.EffectiveGasTip(baseFee)
|
tip1, _ := a.EffectiveGasTip(baseFee)
|
||||||
tip2, _ := b.EffectiveGasTip(baseFee)
|
tip2, _ := b.EffectiveGasTip(baseFee)
|
||||||
return tip1.Cmp(tip2) < 0
|
return tip1.Cmp(tip2)
|
||||||
})
|
})
|
||||||
|
|
||||||
var prices []*big.Int
|
var prices []*big.Int
|
||||||
|
@ -1417,8 +1417,8 @@ type kv struct {
|
|||||||
k, v []byte
|
k, v []byte
|
||||||
}
|
}
|
||||||
|
|
||||||
func (k *kv) less(other *kv) bool {
|
func (k *kv) cmp(other *kv) int {
|
||||||
return bytes.Compare(k.k, other.k) < 0
|
return bytes.Compare(k.k, other.k)
|
||||||
}
|
}
|
||||||
|
|
||||||
func key32(i uint64) []byte {
|
func key32(i uint64) []byte {
|
||||||
@ -1478,7 +1478,7 @@ func makeAccountTrieNoStorage(n int, scheme string) (string, *trie.Trie, []*kv)
|
|||||||
accTrie.MustUpdate(elem.k, elem.v)
|
accTrie.MustUpdate(elem.k, elem.v)
|
||||||
entries = append(entries, elem)
|
entries = append(entries, elem)
|
||||||
}
|
}
|
||||||
slices.SortFunc(entries, (*kv).less)
|
slices.SortFunc(entries, (*kv).cmp)
|
||||||
|
|
||||||
// Commit the state changes into db and re-create the trie
|
// Commit the state changes into db and re-create the trie
|
||||||
// for accessing later.
|
// for accessing later.
|
||||||
@ -1540,7 +1540,7 @@ func makeBoundaryAccountTrie(scheme string, n int) (string, *trie.Trie, []*kv) {
|
|||||||
accTrie.MustUpdate(elem.k, elem.v)
|
accTrie.MustUpdate(elem.k, elem.v)
|
||||||
entries = append(entries, elem)
|
entries = append(entries, elem)
|
||||||
}
|
}
|
||||||
slices.SortFunc(entries, (*kv).less)
|
slices.SortFunc(entries, (*kv).cmp)
|
||||||
|
|
||||||
// Commit the state changes into db and re-create the trie
|
// Commit the state changes into db and re-create the trie
|
||||||
// for accessing later.
|
// for accessing later.
|
||||||
@ -1587,7 +1587,7 @@ func makeAccountTrieWithStorageWithUniqueStorage(scheme string, accounts, slots
|
|||||||
storageRoots[common.BytesToHash(key)] = stRoot
|
storageRoots[common.BytesToHash(key)] = stRoot
|
||||||
storageEntries[common.BytesToHash(key)] = stEntries
|
storageEntries[common.BytesToHash(key)] = stEntries
|
||||||
}
|
}
|
||||||
slices.SortFunc(entries, (*kv).less)
|
slices.SortFunc(entries, (*kv).cmp)
|
||||||
|
|
||||||
// Commit account trie
|
// Commit account trie
|
||||||
root, set, _ := accTrie.Commit(true)
|
root, set, _ := accTrie.Commit(true)
|
||||||
@ -1652,7 +1652,7 @@ func makeAccountTrieWithStorage(scheme string, accounts, slots int, code, bounda
|
|||||||
storageRoots[common.BytesToHash(key)] = stRoot
|
storageRoots[common.BytesToHash(key)] = stRoot
|
||||||
storageEntries[common.BytesToHash(key)] = stEntries
|
storageEntries[common.BytesToHash(key)] = stEntries
|
||||||
}
|
}
|
||||||
slices.SortFunc(entries, (*kv).less)
|
slices.SortFunc(entries, (*kv).cmp)
|
||||||
|
|
||||||
// Commit account trie
|
// Commit account trie
|
||||||
root, set, _ := accTrie.Commit(true)
|
root, set, _ := accTrie.Commit(true)
|
||||||
@ -1696,7 +1696,7 @@ func makeStorageTrieWithSeed(owner common.Hash, n, seed uint64, db *trie.Databas
|
|||||||
trie.MustUpdate(elem.k, elem.v)
|
trie.MustUpdate(elem.k, elem.v)
|
||||||
entries = append(entries, elem)
|
entries = append(entries, elem)
|
||||||
}
|
}
|
||||||
slices.SortFunc(entries, (*kv).less)
|
slices.SortFunc(entries, (*kv).cmp)
|
||||||
root, nodes, _ := trie.Commit(false)
|
root, nodes, _ := trie.Commit(false)
|
||||||
return root, nodes, entries
|
return root, nodes, entries
|
||||||
}
|
}
|
||||||
@ -1747,7 +1747,7 @@ func makeBoundaryStorageTrie(owner common.Hash, n int, db *trie.Database) (commo
|
|||||||
trie.MustUpdate(elem.k, elem.v)
|
trie.MustUpdate(elem.k, elem.v)
|
||||||
entries = append(entries, elem)
|
entries = append(entries, elem)
|
||||||
}
|
}
|
||||||
slices.SortFunc(entries, (*kv).less)
|
slices.SortFunc(entries, (*kv).cmp)
|
||||||
root, nodes, _ := trie.Commit(false)
|
root, nodes, _ := trie.Commit(false)
|
||||||
return root, nodes, entries
|
return root, nodes, entries
|
||||||
}
|
}
|
||||||
|
@ -790,7 +790,7 @@ func newAccounts(n int) (accounts []Account) {
|
|||||||
addr := crypto.PubkeyToAddress(key.PublicKey)
|
addr := crypto.PubkeyToAddress(key.PublicKey)
|
||||||
accounts = append(accounts, Account{key: key, addr: addr})
|
accounts = append(accounts, Account{key: key, addr: addr})
|
||||||
}
|
}
|
||||||
slices.SortFunc(accounts, func(a, b Account) bool { return a.addr.Less(b.addr) })
|
slices.SortFunc(accounts, func(a, b Account) int { return a.addr.Cmp(b.addr) })
|
||||||
return accounts
|
return accounts
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -527,7 +527,7 @@ func makeDataset(size, ksize, vsize int, order bool) ([][]byte, [][]byte) {
|
|||||||
vals = append(vals, randBytes(vsize))
|
vals = append(vals, randBytes(vsize))
|
||||||
}
|
}
|
||||||
if order {
|
if order {
|
||||||
slices.SortFunc(keys, func(a, b []byte) bool { return bytes.Compare(a, b) < 0 })
|
slices.SortFunc(keys, func(a, b []byte) int { return bytes.Compare(a, b) })
|
||||||
}
|
}
|
||||||
return keys, vals
|
return keys, vals
|
||||||
}
|
}
|
||||||
|
4
go.mod
4
go.mod
@ -63,7 +63,7 @@ require (
|
|||||||
github.com/urfave/cli/v2 v2.24.1
|
github.com/urfave/cli/v2 v2.24.1
|
||||||
go.uber.org/automaxprocs v1.5.2
|
go.uber.org/automaxprocs v1.5.2
|
||||||
golang.org/x/crypto v0.9.0
|
golang.org/x/crypto v0.9.0
|
||||||
golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc
|
golang.org/x/exp v0.0.0-20230810033253-352e893a4cad
|
||||||
golang.org/x/sync v0.3.0
|
golang.org/x/sync v0.3.0
|
||||||
golang.org/x/sys v0.9.0
|
golang.org/x/sys v0.9.0
|
||||||
golang.org/x/text v0.9.0
|
golang.org/x/text v0.9.0
|
||||||
@ -125,7 +125,7 @@ require (
|
|||||||
github.com/tklauser/go-sysconf v0.3.5 // indirect
|
github.com/tklauser/go-sysconf v0.3.5 // indirect
|
||||||
github.com/tklauser/numcpus v0.2.2 // indirect
|
github.com/tklauser/numcpus v0.2.2 // indirect
|
||||||
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect
|
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect
|
||||||
golang.org/x/mod v0.10.0 // indirect
|
golang.org/x/mod v0.11.0 // indirect
|
||||||
golang.org/x/net v0.10.0 // indirect
|
golang.org/x/net v0.10.0 // indirect
|
||||||
golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df // indirect
|
golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df // indirect
|
||||||
google.golang.org/protobuf v1.28.1 // indirect
|
google.golang.org/protobuf v1.28.1 // indirect
|
||||||
|
8
go.sum
8
go.sum
@ -479,8 +479,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y
|
|||||||
golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g=
|
golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g=
|
||||||
golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0=
|
golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0=
|
||||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc h1:mCRnTeVUjcrhlRmO0VK8a6k6Rrf6TF9htwo2pJVSjIU=
|
golang.org/x/exp v0.0.0-20230810033253-352e893a4cad h1:g0bG7Z4uG+OgH2QDODnjp6ggkk1bJDsINcuWmJN1iJU=
|
||||||
golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w=
|
golang.org/x/exp v0.0.0-20230810033253-352e893a4cad/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc=
|
||||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||||
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
||||||
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||||
@ -490,8 +490,8 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
|||||||
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
||||||
golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk=
|
golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU=
|
||||||
golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
||||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
|
@ -817,7 +817,7 @@ func newAccounts(n int) (accounts []Account) {
|
|||||||
addr := crypto.PubkeyToAddress(key.PublicKey)
|
addr := crypto.PubkeyToAddress(key.PublicKey)
|
||||||
accounts = append(accounts, Account{key: key, addr: addr})
|
accounts = append(accounts, Account{key: key, addr: addr})
|
||||||
}
|
}
|
||||||
slices.SortFunc(accounts, func(a, b Account) bool { return a.addr.Less(b.addr) })
|
slices.SortFunc(accounts, func(a, b Account) int { return a.addr.Cmp(b.addr) })
|
||||||
return accounts
|
return accounts
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -215,8 +215,14 @@ func (sq *servingQueue) freezePeers() {
|
|||||||
tasks.list = append(tasks.list, task)
|
tasks.list = append(tasks.list, task)
|
||||||
tasks.sumTime += task.expTime
|
tasks.sumTime += task.expTime
|
||||||
}
|
}
|
||||||
slices.SortFunc(peerList, func(a, b *peerTasks) bool {
|
slices.SortFunc(peerList, func(a, b *peerTasks) int {
|
||||||
return a.priority < b.priority
|
if a.priority < b.priority {
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
if a.priority > b.priority {
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
return 0
|
||||||
})
|
})
|
||||||
drop := true
|
drop := true
|
||||||
for _, tasks := range peerList {
|
for _, tasks := range peerList {
|
||||||
|
@ -369,8 +369,14 @@ func (l *Limiter) dropRequests() {
|
|||||||
priority: w / float64(nq.sumCost),
|
priority: w / float64(nq.sumCost),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
slices.SortFunc(list, func(a, b dropListItem) bool {
|
slices.SortFunc(list, func(a, b dropListItem) int {
|
||||||
return a.priority < b.priority
|
if a.priority < b.priority {
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
if a.priority < b.priority {
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
return 0
|
||||||
})
|
})
|
||||||
for _, item := range list {
|
for _, item := range list {
|
||||||
for _, request := range item.nq.queue {
|
for _, request := range item.nq.queue {
|
||||||
|
@ -3,6 +3,7 @@ package metrics
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"golang.org/x/exp/slices"
|
"golang.org/x/exp/slices"
|
||||||
@ -23,8 +24,7 @@ func WriteOnce(r Registry, w io.Writer) {
|
|||||||
r.Each(func(name string, i interface{}) {
|
r.Each(func(name string, i interface{}) {
|
||||||
namedMetrics = append(namedMetrics, namedMetric{name, i})
|
namedMetrics = append(namedMetrics, namedMetric{name, i})
|
||||||
})
|
})
|
||||||
|
slices.SortFunc(namedMetrics, namedMetric.cmp)
|
||||||
slices.SortFunc(namedMetrics, namedMetric.less)
|
|
||||||
for _, namedMetric := range namedMetrics {
|
for _, namedMetric := range namedMetrics {
|
||||||
switch metric := namedMetric.m.(type) {
|
switch metric := namedMetric.m.(type) {
|
||||||
case Counter:
|
case Counter:
|
||||||
@ -92,6 +92,6 @@ type namedMetric struct {
|
|||||||
m interface{}
|
m interface{}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m namedMetric) less(other namedMetric) bool {
|
func (m namedMetric) cmp(other namedMetric) int {
|
||||||
return m.name < other.name
|
return strings.Compare(m.name, other.name)
|
||||||
}
|
}
|
||||||
|
@ -14,7 +14,7 @@ func TestMetricsSorting(t *testing.T) {
|
|||||||
{name: "ggg"},
|
{name: "ggg"},
|
||||||
}
|
}
|
||||||
|
|
||||||
slices.SortFunc(namedMetrics, namedMetric.less)
|
slices.SortFunc(namedMetrics, namedMetric.cmp)
|
||||||
for i, name := range []string{"bbb", "fff", "ggg", "zzz"} {
|
for i, name := range []string{"bbb", "fff", "ggg", "zzz"} {
|
||||||
if namedMetrics[i].name != name {
|
if namedMetrics[i].name != name {
|
||||||
t.Fail()
|
t.Fail()
|
||||||
|
@ -217,14 +217,14 @@ func nodeEqual(n1 *enode.Node, n2 *enode.Node) bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func sortByID(nodes []*enode.Node) {
|
func sortByID(nodes []*enode.Node) {
|
||||||
slices.SortFunc(nodes, func(a, b *enode.Node) bool {
|
slices.SortFunc(nodes, func(a, b *enode.Node) int {
|
||||||
return string(a.ID().Bytes()) < string(b.ID().Bytes())
|
return bytes.Compare(a.ID().Bytes(), b.ID().Bytes())
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func sortedByDistanceTo(distbase enode.ID, slice []*node) bool {
|
func sortedByDistanceTo(distbase enode.ID, slice []*node) bool {
|
||||||
return slices.IsSortedFunc(slice, func(a, b *node) bool {
|
return slices.IsSortedFunc(slice, func(a, b *node) int {
|
||||||
return enode.DistCmp(distbase, a.ID(), b.ID()) < 0
|
return enode.DistCmp(distbase, a.ID(), b.ID())
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -302,8 +302,8 @@ func (tn *preminedTestnet) closest(n int) (nodes []*enode.Node) {
|
|||||||
nodes = append(nodes, tn.node(d, i))
|
nodes = append(nodes, tn.node(d, i))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
slices.SortFunc(nodes, func(a, b *enode.Node) bool {
|
slices.SortFunc(nodes, func(a, b *enode.Node) int {
|
||||||
return enode.DistCmp(tn.target.id(), a.ID(), b.ID()) < 0
|
return enode.DistCmp(tn.target.id(), a.ID(), b.ID())
|
||||||
})
|
})
|
||||||
return nodes[:n]
|
return nodes[:n]
|
||||||
}
|
}
|
||||||
|
@ -61,8 +61,8 @@ func TestUDPv5_lookupE2E(t *testing.T) {
|
|||||||
for i := range nodes {
|
for i := range nodes {
|
||||||
expectedResult[i] = nodes[i].Self()
|
expectedResult[i] = nodes[i].Self()
|
||||||
}
|
}
|
||||||
slices.SortFunc(expectedResult, func(a, b *enode.Node) bool {
|
slices.SortFunc(expectedResult, func(a, b *enode.Node) int {
|
||||||
return enode.DistCmp(target.ID(), a.ID(), b.ID()) < 0
|
return enode.DistCmp(target.ID(), a.ID(), b.ID())
|
||||||
})
|
})
|
||||||
|
|
||||||
// Do the lookup.
|
// Do the lookup.
|
||||||
|
@ -214,8 +214,8 @@ func (t *Tree) build(entries []entry) entry {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func sortByID(nodes []*enode.Node) []*enode.Node {
|
func sortByID(nodes []*enode.Node) []*enode.Node {
|
||||||
slices.SortFunc(nodes, func(a, b *enode.Node) bool {
|
slices.SortFunc(nodes, func(a, b *enode.Node) int {
|
||||||
return bytes.Compare(a.ID().Bytes(), b.ID().Bytes()) < 0
|
return bytes.Compare(a.ID().Bytes(), b.ID().Bytes())
|
||||||
})
|
})
|
||||||
return nodes
|
return nodes
|
||||||
}
|
}
|
||||||
|
@ -386,7 +386,7 @@ func countMatchingProtocols(protocols []Protocol, caps []Cap) int {
|
|||||||
|
|
||||||
// matchProtocols creates structures for matching named subprotocols.
|
// matchProtocols creates structures for matching named subprotocols.
|
||||||
func matchProtocols(protocols []Protocol, caps []Cap, rw MsgReadWriter) map[string]*protoRW {
|
func matchProtocols(protocols []Protocol, caps []Cap, rw MsgReadWriter) map[string]*protoRW {
|
||||||
slices.SortFunc(caps, Cap.Less)
|
slices.SortFunc(caps, Cap.Cmp)
|
||||||
offset := baseProtocolLength
|
offset := baseProtocolLength
|
||||||
result := make(map[string]*protoRW)
|
result := make(map[string]*protoRW)
|
||||||
|
|
||||||
|
@ -18,6 +18,7 @@ package p2p
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/p2p/enode"
|
"github.com/ethereum/go-ethereum/p2p/enode"
|
||||||
"github.com/ethereum/go-ethereum/p2p/enr"
|
"github.com/ethereum/go-ethereum/p2p/enr"
|
||||||
@ -77,10 +78,16 @@ func (cap Cap) String() string {
|
|||||||
return fmt.Sprintf("%s/%d", cap.Name, cap.Version)
|
return fmt.Sprintf("%s/%d", cap.Name, cap.Version)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Less defines the canonical sorting order of capabilities.
|
// Cmp defines the canonical sorting order of capabilities.
|
||||||
func (cap Cap) Less(other Cap) bool {
|
func (cap Cap) Cmp(other Cap) int {
|
||||||
if cap.Name == other.Name {
|
if cap.Name == other.Name {
|
||||||
return cap.Version < other.Version
|
if cap.Version < other.Version {
|
||||||
|
return -1
|
||||||
}
|
}
|
||||||
return cap.Name < other.Name
|
if cap.Version > other.Version {
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
return strings.Compare(cap.Name, other.Name)
|
||||||
}
|
}
|
||||||
|
@ -510,7 +510,7 @@ func (srv *Server) setupLocalNode() error {
|
|||||||
for _, p := range srv.Protocols {
|
for _, p := range srv.Protocols {
|
||||||
srv.ourHandshake.Caps = append(srv.ourHandshake.Caps, p.cap())
|
srv.ourHandshake.Caps = append(srv.ourHandshake.Caps, p.cap())
|
||||||
}
|
}
|
||||||
slices.SortFunc(srv.ourHandshake.Caps, Cap.Less)
|
slices.SortFunc(srv.ourHandshake.Caps, Cap.Cmp)
|
||||||
|
|
||||||
// Create the local node.
|
// Create the local node.
|
||||||
db, err := enode.OpenDB(srv.NodeDatabase)
|
db, err := enode.OpenDB(srv.NodeDatabase)
|
||||||
|
@ -98,8 +98,8 @@ func (f *fuzzer) fuzz() int {
|
|||||||
if len(entries) <= 1 {
|
if len(entries) <= 1 {
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
slices.SortFunc(entries, func(a, b *kv) bool {
|
slices.SortFunc(entries, func(a, b *kv) int {
|
||||||
return bytes.Compare(a.k, b.k) < 0
|
return bytes.Compare(a.k, b.k)
|
||||||
})
|
})
|
||||||
|
|
||||||
var ok = 0
|
var ok = 0
|
||||||
|
@ -182,8 +182,8 @@ func (f *fuzzer) fuzz() int {
|
|||||||
dbA.Commit(rootA, false)
|
dbA.Commit(rootA, false)
|
||||||
|
|
||||||
// Stacktrie requires sorted insertion
|
// Stacktrie requires sorted insertion
|
||||||
slices.SortFunc(vals, func(a, b kv) bool {
|
slices.SortFunc(vals, func(a, b kv) int {
|
||||||
return bytes.Compare(a.k, b.k) < 0
|
return bytes.Compare(a.k, b.k)
|
||||||
})
|
})
|
||||||
for _, kv := range vals {
|
for _, kv := range vals {
|
||||||
if f.debugging {
|
if f.debugging {
|
||||||
|
@ -81,8 +81,8 @@ type kv struct {
|
|||||||
t bool
|
t bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func (k *kv) less(other *kv) bool {
|
func (k *kv) cmp(other *kv) int {
|
||||||
return bytes.Compare(k.k, other.k) < 0
|
return bytes.Compare(k.k, other.k)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestIteratorLargeData(t *testing.T) {
|
func TestIteratorLargeData(t *testing.T) {
|
||||||
|
@ -173,7 +173,7 @@ func TestRangeProof(t *testing.T) {
|
|||||||
for _, kv := range vals {
|
for _, kv := range vals {
|
||||||
entries = append(entries, kv)
|
entries = append(entries, kv)
|
||||||
}
|
}
|
||||||
slices.SortFunc(entries, (*kv).less)
|
slices.SortFunc(entries, (*kv).cmp)
|
||||||
for i := 0; i < 500; i++ {
|
for i := 0; i < 500; i++ {
|
||||||
start := mrand.Intn(len(entries))
|
start := mrand.Intn(len(entries))
|
||||||
end := mrand.Intn(len(entries)-start) + start + 1
|
end := mrand.Intn(len(entries)-start) + start + 1
|
||||||
@ -206,7 +206,7 @@ func TestRangeProofWithNonExistentProof(t *testing.T) {
|
|||||||
for _, kv := range vals {
|
for _, kv := range vals {
|
||||||
entries = append(entries, kv)
|
entries = append(entries, kv)
|
||||||
}
|
}
|
||||||
slices.SortFunc(entries, (*kv).less)
|
slices.SortFunc(entries, (*kv).cmp)
|
||||||
for i := 0; i < 500; i++ {
|
for i := 0; i < 500; i++ {
|
||||||
start := mrand.Intn(len(entries))
|
start := mrand.Intn(len(entries))
|
||||||
end := mrand.Intn(len(entries)-start) + start + 1
|
end := mrand.Intn(len(entries)-start) + start + 1
|
||||||
@ -278,7 +278,7 @@ func TestRangeProofWithInvalidNonExistentProof(t *testing.T) {
|
|||||||
for _, kv := range vals {
|
for _, kv := range vals {
|
||||||
entries = append(entries, kv)
|
entries = append(entries, kv)
|
||||||
}
|
}
|
||||||
slices.SortFunc(entries, (*kv).less)
|
slices.SortFunc(entries, (*kv).cmp)
|
||||||
|
|
||||||
// Case 1
|
// Case 1
|
||||||
start, end := 100, 200
|
start, end := 100, 200
|
||||||
@ -335,7 +335,7 @@ func TestOneElementRangeProof(t *testing.T) {
|
|||||||
for _, kv := range vals {
|
for _, kv := range vals {
|
||||||
entries = append(entries, kv)
|
entries = append(entries, kv)
|
||||||
}
|
}
|
||||||
slices.SortFunc(entries, (*kv).less)
|
slices.SortFunc(entries, (*kv).cmp)
|
||||||
|
|
||||||
// One element with existent edge proof, both edge proofs
|
// One element with existent edge proof, both edge proofs
|
||||||
// point to the SAME key.
|
// point to the SAME key.
|
||||||
@ -422,7 +422,7 @@ func TestAllElementsProof(t *testing.T) {
|
|||||||
for _, kv := range vals {
|
for _, kv := range vals {
|
||||||
entries = append(entries, kv)
|
entries = append(entries, kv)
|
||||||
}
|
}
|
||||||
slices.SortFunc(entries, (*kv).less)
|
slices.SortFunc(entries, (*kv).cmp)
|
||||||
|
|
||||||
var k [][]byte
|
var k [][]byte
|
||||||
var v [][]byte
|
var v [][]byte
|
||||||
@ -474,7 +474,7 @@ func TestSingleSideRangeProof(t *testing.T) {
|
|||||||
trie.MustUpdate(value.k, value.v)
|
trie.MustUpdate(value.k, value.v)
|
||||||
entries = append(entries, value)
|
entries = append(entries, value)
|
||||||
}
|
}
|
||||||
slices.SortFunc(entries, (*kv).less)
|
slices.SortFunc(entries, (*kv).cmp)
|
||||||
|
|
||||||
var cases = []int{0, 1, 50, 100, 1000, 2000, len(entries) - 1}
|
var cases = []int{0, 1, 50, 100, 1000, 2000, len(entries) - 1}
|
||||||
for _, pos := range cases {
|
for _, pos := range cases {
|
||||||
@ -509,7 +509,7 @@ func TestReverseSingleSideRangeProof(t *testing.T) {
|
|||||||
trie.MustUpdate(value.k, value.v)
|
trie.MustUpdate(value.k, value.v)
|
||||||
entries = append(entries, value)
|
entries = append(entries, value)
|
||||||
}
|
}
|
||||||
slices.SortFunc(entries, (*kv).less)
|
slices.SortFunc(entries, (*kv).cmp)
|
||||||
|
|
||||||
var cases = []int{0, 1, 50, 100, 1000, 2000, len(entries) - 1}
|
var cases = []int{0, 1, 50, 100, 1000, 2000, len(entries) - 1}
|
||||||
for _, pos := range cases {
|
for _, pos := range cases {
|
||||||
@ -543,7 +543,7 @@ func TestBadRangeProof(t *testing.T) {
|
|||||||
for _, kv := range vals {
|
for _, kv := range vals {
|
||||||
entries = append(entries, kv)
|
entries = append(entries, kv)
|
||||||
}
|
}
|
||||||
slices.SortFunc(entries, (*kv).less)
|
slices.SortFunc(entries, (*kv).cmp)
|
||||||
|
|
||||||
for i := 0; i < 500; i++ {
|
for i := 0; i < 500; i++ {
|
||||||
start := mrand.Intn(len(entries))
|
start := mrand.Intn(len(entries))
|
||||||
@ -646,7 +646,7 @@ func TestSameSideProofs(t *testing.T) {
|
|||||||
for _, kv := range vals {
|
for _, kv := range vals {
|
||||||
entries = append(entries, kv)
|
entries = append(entries, kv)
|
||||||
}
|
}
|
||||||
slices.SortFunc(entries, (*kv).less)
|
slices.SortFunc(entries, (*kv).cmp)
|
||||||
|
|
||||||
pos := 1000
|
pos := 1000
|
||||||
first := decreaseKey(common.CopyBytes(entries[pos].k))
|
first := decreaseKey(common.CopyBytes(entries[pos].k))
|
||||||
@ -690,7 +690,7 @@ func TestHasRightElement(t *testing.T) {
|
|||||||
trie.MustUpdate(value.k, value.v)
|
trie.MustUpdate(value.k, value.v)
|
||||||
entries = append(entries, value)
|
entries = append(entries, value)
|
||||||
}
|
}
|
||||||
slices.SortFunc(entries, (*kv).less)
|
slices.SortFunc(entries, (*kv).cmp)
|
||||||
|
|
||||||
var cases = []struct {
|
var cases = []struct {
|
||||||
start int
|
start int
|
||||||
@ -762,7 +762,7 @@ func TestEmptyRangeProof(t *testing.T) {
|
|||||||
for _, kv := range vals {
|
for _, kv := range vals {
|
||||||
entries = append(entries, kv)
|
entries = append(entries, kv)
|
||||||
}
|
}
|
||||||
slices.SortFunc(entries, (*kv).less)
|
slices.SortFunc(entries, (*kv).cmp)
|
||||||
|
|
||||||
var cases = []struct {
|
var cases = []struct {
|
||||||
pos int
|
pos int
|
||||||
@ -797,7 +797,7 @@ func TestBloatedProof(t *testing.T) {
|
|||||||
for _, kv := range kvs {
|
for _, kv := range kvs {
|
||||||
entries = append(entries, kv)
|
entries = append(entries, kv)
|
||||||
}
|
}
|
||||||
slices.SortFunc(entries, (*kv).less)
|
slices.SortFunc(entries, (*kv).cmp)
|
||||||
var keys [][]byte
|
var keys [][]byte
|
||||||
var vals [][]byte
|
var vals [][]byte
|
||||||
|
|
||||||
@ -831,7 +831,7 @@ func TestEmptyValueRangeProof(t *testing.T) {
|
|||||||
for _, kv := range values {
|
for _, kv := range values {
|
||||||
entries = append(entries, kv)
|
entries = append(entries, kv)
|
||||||
}
|
}
|
||||||
slices.SortFunc(entries, (*kv).less)
|
slices.SortFunc(entries, (*kv).cmp)
|
||||||
|
|
||||||
// Create a new entry with a slightly modified key
|
// Create a new entry with a slightly modified key
|
||||||
mid := len(entries) / 2
|
mid := len(entries) / 2
|
||||||
@ -875,7 +875,7 @@ func TestAllElementsEmptyValueRangeProof(t *testing.T) {
|
|||||||
for _, kv := range values {
|
for _, kv := range values {
|
||||||
entries = append(entries, kv)
|
entries = append(entries, kv)
|
||||||
}
|
}
|
||||||
slices.SortFunc(entries, (*kv).less)
|
slices.SortFunc(entries, (*kv).cmp)
|
||||||
|
|
||||||
// Create a new entry with a slightly modified key
|
// Create a new entry with a slightly modified key
|
||||||
mid := len(entries) / 2
|
mid := len(entries) / 2
|
||||||
@ -981,7 +981,7 @@ func benchmarkVerifyRangeProof(b *testing.B, size int) {
|
|||||||
for _, kv := range vals {
|
for _, kv := range vals {
|
||||||
entries = append(entries, kv)
|
entries = append(entries, kv)
|
||||||
}
|
}
|
||||||
slices.SortFunc(entries, (*kv).less)
|
slices.SortFunc(entries, (*kv).cmp)
|
||||||
|
|
||||||
start := 2
|
start := 2
|
||||||
end := start + size
|
end := start + size
|
||||||
@ -1018,7 +1018,7 @@ func benchmarkVerifyRangeNoProof(b *testing.B, size int) {
|
|||||||
for _, kv := range vals {
|
for _, kv := range vals {
|
||||||
entries = append(entries, kv)
|
entries = append(entries, kv)
|
||||||
}
|
}
|
||||||
slices.SortFunc(entries, (*kv).less)
|
slices.SortFunc(entries, (*kv).cmp)
|
||||||
|
|
||||||
var keys [][]byte
|
var keys [][]byte
|
||||||
var values [][]byte
|
var values [][]byte
|
||||||
|
@ -262,20 +262,20 @@ func newHistory(root common.Hash, parent common.Hash, block uint64, states *trie
|
|||||||
for addr := range states.Accounts {
|
for addr := range states.Accounts {
|
||||||
accountList = append(accountList, addr)
|
accountList = append(accountList, addr)
|
||||||
}
|
}
|
||||||
slices.SortFunc(accountList, func(a, b common.Address) bool { return a.Less(b) })
|
slices.SortFunc(accountList, common.Address.Cmp)
|
||||||
|
|
||||||
for addr, slots := range states.Storages {
|
for addr, slots := range states.Storages {
|
||||||
slist := make([]common.Hash, 0, len(slots))
|
slist := make([]common.Hash, 0, len(slots))
|
||||||
for slotHash := range slots {
|
for slotHash := range slots {
|
||||||
slist = append(slist, slotHash)
|
slist = append(slist, slotHash)
|
||||||
}
|
}
|
||||||
slices.SortFunc(slist, func(a, b common.Hash) bool { return a.Less(b) })
|
slices.SortFunc(slist, common.Hash.Cmp)
|
||||||
storageList[addr] = slist
|
storageList[addr] = slist
|
||||||
}
|
}
|
||||||
for addr := range states.Incomplete {
|
for addr := range states.Incomplete {
|
||||||
incomplete = append(incomplete, addr)
|
incomplete = append(incomplete, addr)
|
||||||
}
|
}
|
||||||
slices.SortFunc(incomplete, func(a, b common.Address) bool { return a.Less(b) })
|
slices.SortFunc(incomplete, common.Address.Cmp)
|
||||||
|
|
||||||
return &history{
|
return &history{
|
||||||
meta: &meta{
|
meta: &meta{
|
||||||
|
@ -117,7 +117,7 @@ func hash(states map[common.Hash][]byte) (common.Hash, []byte) {
|
|||||||
for hash := range states {
|
for hash := range states {
|
||||||
hs = append(hs, hash)
|
hs = append(hs, hash)
|
||||||
}
|
}
|
||||||
slices.SortFunc(hs, func(a, b common.Hash) bool { return a.Less(b) })
|
slices.SortFunc(hs, common.Hash.Cmp)
|
||||||
|
|
||||||
var input []byte
|
var input []byte
|
||||||
for _, hash := range hs {
|
for _, hash := range hs {
|
||||||
|
@ -18,10 +18,10 @@ package trienode
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
"golang.org/x/exp/slices"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Node is a wrapper which contains the encoded blob of the trie node and its
|
// Node is a wrapper which contains the encoded blob of the trie node and its
|
||||||
@ -83,9 +83,7 @@ func (set *NodeSet) ForEachWithOrder(callback func(path string, n *Node)) {
|
|||||||
paths = append(paths, path)
|
paths = append(paths, path)
|
||||||
}
|
}
|
||||||
// Bottom-up, the longest path first
|
// Bottom-up, the longest path first
|
||||||
slices.SortFunc(paths, func(a, b string) bool {
|
sort.Sort(sort.Reverse(sort.StringSlice(paths)))
|
||||||
return a > b // Sort in reverse order
|
|
||||||
})
|
|
||||||
for _, path := range paths {
|
for _, path := range paths {
|
||||||
callback(path, set.Nodes[path])
|
callback(path, set.Nodes[path])
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user