mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-20 10:52:25 +00:00
Revert "all: update golang/x/ext and fix slice sorting fallout (#27909)"
This reverts commit 1c411fcea2.
This commit is contained in:
parent
5337c9fa1f
commit
b3a35f84e7
38 changed files with 113 additions and 144 deletions
|
|
@ -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) int {
|
func byURL(a, b accounts.Account) bool {
|
||||||
return a.URL.Cmp(b.URL)
|
return a.URL.Cmp(b.URL) < 0
|
||||||
}
|
}
|
||||||
|
|
||||||
// AmbiguousAddrError is returned when attempting to unlock
|
// AmbiguousAddrError is returned when attempting to unlock
|
||||||
|
|
|
||||||
|
|
@ -288,17 +288,11 @@ 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) int {
|
slices.SortFunc(changes, func(a, b types.Change) bool {
|
||||||
if a.Action == b.Action {
|
if a.Action == b.Action {
|
||||||
return strings.Compare(*a.ResourceRecordSet.Name, *b.ResourceRecordSet.Name)
|
return *a.ResourceRecordSet.Name < *b.ResourceRecordSet.Name
|
||||||
}
|
}
|
||||||
if score[string(a.Action)] < score[string(b.Action)] {
|
return 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) int {
|
slices.SortFunc(result, func(a, b *enode.Node) bool {
|
||||||
return bytes.Compare(a.ID().Bytes(), b.ID().Bytes())
|
return bytes.Compare(a.ID().Bytes(), b.ID().Bytes()) < 0
|
||||||
})
|
})
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
@ -103,14 +103,8 @@ 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) int {
|
slices.SortFunc(byscore, func(a, b nodeJSON) bool {
|
||||||
if a.Score > b.Score {
|
return 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)) }
|
||||||
|
|
||||||
// Cmp compares two hashes.
|
// Less compares two hashes.
|
||||||
func (h Hash) Cmp(other Hash) int {
|
func (h Hash) Less(other Hash) bool {
|
||||||
return bytes.Compare(h[:], other[:])
|
return bytes.Compare(h[:], other[:]) < 0
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Cmp compares two addresses.
|
// Less compares two addresses.
|
||||||
func (a Address) Cmp(other Address) int {
|
func (a Address) Less(other Address) bool {
|
||||||
return bytes.Compare(a[:], other[:])
|
return bytes.Compare(a[:], other[:]) < 0
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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.Cmp)
|
slices.SortFunc(sigs, common.Address.Less)
|
||||||
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.Cmp)
|
slices.SortFunc(auths, common.Address.Less)
|
||||||
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) int {
|
slices.SortFunc(blocks, func(a, b *types.Block) bool {
|
||||||
return a.Number().Cmp(b.Number())
|
return a.NumberU64() < b.NumberU64()
|
||||||
})
|
})
|
||||||
// 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) int {
|
slices.SortFunc(badBlocks, func(a, b *badBlock) bool {
|
||||||
// Note: sorting in descending number order.
|
// Note: sorting in descending number order.
|
||||||
return -a.Header.Number.Cmp(b.Header.Number)
|
return a.Header.Number.Uint64() >= b.Header.Number.Uint64()
|
||||||
})
|
})
|
||||||
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,9 +92,11 @@ func TestChainIterator(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if !c.reverse {
|
if !c.reverse {
|
||||||
sort.Ints(numbers)
|
slices.Sort(numbers)
|
||||||
} else {
|
} else {
|
||||||
sort.Sort(sort.Reverse(sort.IntSlice(numbers)))
|
slices.SortFunc(numbers, func(a, b int) bool {
|
||||||
|
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.Cmp)
|
slices.SortFunc(dl.accountList, common.Hash.Less)
|
||||||
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.Cmp)
|
slices.SortFunc(storageList, common.Hash.Less)
|
||||||
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,25 +33,19 @@ type weightedIterator struct {
|
||||||
priority int
|
priority int
|
||||||
}
|
}
|
||||||
|
|
||||||
func (it *weightedIterator) Cmp(other *weightedIterator) int {
|
func (it *weightedIterator) Less(other *weightedIterator) bool {
|
||||||
// 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 -1
|
return true
|
||||||
case 1:
|
case 1:
|
||||||
return 1
|
return false
|
||||||
}
|
}
|
||||||
// Same account/storage-slot in multiple layers, split by priority
|
// Same account/storage-slot in multiple layers, split by priority
|
||||||
if it.priority < other.priority {
|
return 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
|
||||||
|
|
@ -161,7 +155,9 @@ func (fi *fastIterator) init() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Re-sort the entire list
|
// Re-sort the entire list
|
||||||
slices.SortFunc(fi.iterators, func(a, b *weightedIterator) int { return a.Cmp(b) })
|
slices.SortFunc(fi.iterators, func(a, b *weightedIterator) bool {
|
||||||
|
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.Cmp)
|
slices.SortFunc(hList, common.Hash.Less)
|
||||||
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) int {
|
slices.SortStableFunc(sorter, func(a, b txGasAndReward) bool {
|
||||||
return a.reward.Cmp(b.reward)
|
return a.reward.Cmp(b.reward) < 0
|
||||||
})
|
})
|
||||||
|
|
||||||
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) int { return a.Cmp(b) })
|
slices.SortFunc(results, func(a, b *big.Int) bool { return a.Cmp(b) < 0 })
|
||||||
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) int {
|
slices.SortFunc(sortedTxs, func(a, b *types.Transaction) bool {
|
||||||
// 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)
|
return tip1.Cmp(tip2) < 0
|
||||||
})
|
})
|
||||||
|
|
||||||
var prices []*big.Int
|
var prices []*big.Int
|
||||||
|
|
|
||||||
|
|
@ -1417,8 +1417,8 @@ type kv struct {
|
||||||
k, v []byte
|
k, v []byte
|
||||||
}
|
}
|
||||||
|
|
||||||
func (k *kv) cmp(other *kv) int {
|
func (k *kv) less(other *kv) bool {
|
||||||
return bytes.Compare(k.k, other.k)
|
return bytes.Compare(k.k, other.k) < 0
|
||||||
}
|
}
|
||||||
|
|
||||||
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).cmp)
|
slices.SortFunc(entries, (*kv).less)
|
||||||
|
|
||||||
// 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).cmp)
|
slices.SortFunc(entries, (*kv).less)
|
||||||
|
|
||||||
// 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).cmp)
|
slices.SortFunc(entries, (*kv).less)
|
||||||
|
|
||||||
// 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).cmp)
|
slices.SortFunc(entries, (*kv).less)
|
||||||
|
|
||||||
// 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).cmp)
|
slices.SortFunc(entries, (*kv).less)
|
||||||
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).cmp)
|
slices.SortFunc(entries, (*kv).less)
|
||||||
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) int { return a.addr.Cmp(b.addr) })
|
slices.SortFunc(accounts, func(a, b Account) bool { return a.addr.Less(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) int { return bytes.Compare(a, b) })
|
slices.SortFunc(keys, func(a, b []byte) bool { return bytes.Compare(a, b) < 0 })
|
||||||
}
|
}
|
||||||
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-20230810033253-352e893a4cad
|
golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc
|
||||||
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.11.0 // indirect
|
golang.org/x/mod v0.10.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-20230810033253-352e893a4cad h1:g0bG7Z4uG+OgH2QDODnjp6ggkk1bJDsINcuWmJN1iJU=
|
golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc h1:mCRnTeVUjcrhlRmO0VK8a6k6Rrf6TF9htwo2pJVSjIU=
|
||||||
golang.org/x/exp v0.0.0-20230810033253-352e893a4cad/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc=
|
golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w=
|
||||||
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.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU=
|
golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk=
|
||||||
golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
golang.org/x/mod v0.10.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) int { return a.addr.Cmp(b.addr) })
|
slices.SortFunc(accounts, func(a, b Account) bool { return a.addr.Less(b.addr) })
|
||||||
return accounts
|
return accounts
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -215,14 +215,8 @@ 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) int {
|
slices.SortFunc(peerList, func(a, b *peerTasks) bool {
|
||||||
if a.priority < b.priority {
|
return 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,14 +369,8 @@ func (l *Limiter) dropRequests() {
|
||||||
priority: w / float64(nq.sumCost),
|
priority: w / float64(nq.sumCost),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
slices.SortFunc(list, func(a, b dropListItem) int {
|
slices.SortFunc(list, func(a, b dropListItem) bool {
|
||||||
if a.priority < b.priority {
|
return 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,7 +3,6 @@ package metrics
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"strings"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"golang.org/x/exp/slices"
|
"golang.org/x/exp/slices"
|
||||||
|
|
@ -24,7 +23,8 @@ 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) cmp(other namedMetric) int {
|
func (m namedMetric) less(other namedMetric) bool {
|
||||||
return strings.Compare(m.name, other.name)
|
return m.name < other.name
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@ func TestMetricsSorting(t *testing.T) {
|
||||||
{name: "ggg"},
|
{name: "ggg"},
|
||||||
}
|
}
|
||||||
|
|
||||||
slices.SortFunc(namedMetrics, namedMetric.cmp)
|
slices.SortFunc(namedMetrics, namedMetric.less)
|
||||||
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) int {
|
slices.SortFunc(nodes, func(a, b *enode.Node) bool {
|
||||||
return bytes.Compare(a.ID().Bytes(), b.ID().Bytes())
|
return string(a.ID().Bytes()) < string(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) int {
|
return slices.IsSortedFunc(slice, func(a, b *node) bool {
|
||||||
return enode.DistCmp(distbase, a.ID(), b.ID())
|
return enode.DistCmp(distbase, a.ID(), b.ID()) < 0
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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) int {
|
slices.SortFunc(nodes, func(a, b *enode.Node) bool {
|
||||||
return enode.DistCmp(tn.target.id(), a.ID(), b.ID())
|
return enode.DistCmp(tn.target.id(), a.ID(), b.ID()) < 0
|
||||||
})
|
})
|
||||||
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) int {
|
slices.SortFunc(expectedResult, func(a, b *enode.Node) bool {
|
||||||
return enode.DistCmp(target.ID(), a.ID(), b.ID())
|
return enode.DistCmp(target.ID(), a.ID(), b.ID()) < 0
|
||||||
})
|
})
|
||||||
|
|
||||||
// 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) int {
|
slices.SortFunc(nodes, func(a, b *enode.Node) bool {
|
||||||
return bytes.Compare(a.ID().Bytes(), b.ID().Bytes())
|
return bytes.Compare(a.ID().Bytes(), b.ID().Bytes()) < 0
|
||||||
})
|
})
|
||||||
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.Cmp)
|
slices.SortFunc(caps, Cap.Less)
|
||||||
offset := baseProtocolLength
|
offset := baseProtocolLength
|
||||||
result := make(map[string]*protoRW)
|
result := make(map[string]*protoRW)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,6 @@ 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"
|
||||||
|
|
@ -78,16 +77,10 @@ func (cap Cap) String() string {
|
||||||
return fmt.Sprintf("%s/%d", cap.Name, cap.Version)
|
return fmt.Sprintf("%s/%d", cap.Name, cap.Version)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Cmp defines the canonical sorting order of capabilities.
|
// Less defines the canonical sorting order of capabilities.
|
||||||
func (cap Cap) Cmp(other Cap) int {
|
func (cap Cap) Less(other Cap) bool {
|
||||||
if cap.Name == other.Name {
|
if cap.Name == other.Name {
|
||||||
if cap.Version < other.Version {
|
return cap.Version < other.Version
|
||||||
return -1
|
|
||||||
}
|
}
|
||||||
if cap.Version > other.Version {
|
return cap.Name < other.Name
|
||||||
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.Cmp)
|
slices.SortFunc(srv.ourHandshake.Caps, Cap.Less)
|
||||||
|
|
||||||
// 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) int {
|
slices.SortFunc(entries, func(a, b *kv) bool {
|
||||||
return bytes.Compare(a.k, b.k)
|
return bytes.Compare(a.k, b.k) < 0
|
||||||
})
|
})
|
||||||
|
|
||||||
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) int {
|
slices.SortFunc(vals, func(a, b kv) bool {
|
||||||
return bytes.Compare(a.k, b.k)
|
return bytes.Compare(a.k, b.k) < 0
|
||||||
})
|
})
|
||||||
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) cmp(other *kv) int {
|
func (k *kv) less(other *kv) bool {
|
||||||
return bytes.Compare(k.k, other.k)
|
return bytes.Compare(k.k, other.k) < 0
|
||||||
}
|
}
|
||||||
|
|
||||||
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).cmp)
|
slices.SortFunc(entries, (*kv).less)
|
||||||
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).cmp)
|
slices.SortFunc(entries, (*kv).less)
|
||||||
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).cmp)
|
slices.SortFunc(entries, (*kv).less)
|
||||||
|
|
||||||
// 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).cmp)
|
slices.SortFunc(entries, (*kv).less)
|
||||||
|
|
||||||
// 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).cmp)
|
slices.SortFunc(entries, (*kv).less)
|
||||||
|
|
||||||
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).cmp)
|
slices.SortFunc(entries, (*kv).less)
|
||||||
|
|
||||||
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).cmp)
|
slices.SortFunc(entries, (*kv).less)
|
||||||
|
|
||||||
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).cmp)
|
slices.SortFunc(entries, (*kv).less)
|
||||||
|
|
||||||
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).cmp)
|
slices.SortFunc(entries, (*kv).less)
|
||||||
|
|
||||||
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).cmp)
|
slices.SortFunc(entries, (*kv).less)
|
||||||
|
|
||||||
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).cmp)
|
slices.SortFunc(entries, (*kv).less)
|
||||||
|
|
||||||
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).cmp)
|
slices.SortFunc(entries, (*kv).less)
|
||||||
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).cmp)
|
slices.SortFunc(entries, (*kv).less)
|
||||||
|
|
||||||
// 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).cmp)
|
slices.SortFunc(entries, (*kv).less)
|
||||||
|
|
||||||
// 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).cmp)
|
slices.SortFunc(entries, (*kv).less)
|
||||||
|
|
||||||
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).cmp)
|
slices.SortFunc(entries, (*kv).less)
|
||||||
|
|
||||||
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, common.Address.Cmp)
|
slices.SortFunc(accountList, func(a, b common.Address) bool { return a.Less(b) })
|
||||||
|
|
||||||
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, common.Hash.Cmp)
|
slices.SortFunc(slist, func(a, b common.Hash) bool { return a.Less(b) })
|
||||||
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, common.Address.Cmp)
|
slices.SortFunc(incomplete, func(a, b common.Address) bool { return a.Less(b) })
|
||||||
|
|
||||||
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, common.Hash.Cmp)
|
slices.SortFunc(hs, func(a, b common.Hash) bool { return a.Less(b) })
|
||||||
|
|
||||||
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,7 +83,9 @@ 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
|
||||||
sort.Sort(sort.Reverse(sort.StringSlice(paths)))
|
slices.SortFunc(paths, func(a, b string) bool {
|
||||||
|
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 a new issue