Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
G
Geth-Modification
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
张蕾
Geth-Modification
Commits
154b016b
Unverified
Commit
154b016b
authored
1 year ago
by
Dan Laine
Committed by
GitHub
1 year ago
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
core: use slices package for sorting (#27489)
Co-authored-by:
Felix Lange
<
fjl@twurst.com
>
parent
84b05d4f
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
39 additions
and
94 deletions
+39
-94
blockchain.go
core/blockchain.go
+3
-3
forkid.go
core/forkid/forkid.go
+3
-3
mkalloc.go
core/mkalloc.go
+8
-12
accessors_chain.go
core/rawdb/accessors_chain.go
+8
-15
chain_iterator_test.go
core/rawdb/chain_iterator_test.go
+5
-3
difflayer.go
core/state/snapshot/difflayer.go
+3
-3
iterator_fast.go
core/state/snapshot/iterator_fast.go
+9
-19
sort.go
core/state/snapshot/sort.go
+0
-36
No files found.
core/blockchain.go
View file @
154b016b
...
...
@@ -23,7 +23,6 @@ import (
"io"
"math/big"
"runtime"
"sort"
"strings"
"sync"
"sync/atomic"
...
...
@@ -48,6 +47,7 @@ import (
"github.com/ethereum/go-ethereum/params"
"github.com/ethereum/go-ethereum/rlp"
"github.com/ethereum/go-ethereum/trie"
"golang.org/x/exp/slices"
)
var
(
...
...
@@ -1015,8 +1015,8 @@ func (bc *BlockChain) procFutureBlocks() {
}
}
if
len
(
blocks
)
>
0
{
s
ort
.
Slice
(
blocks
,
func
(
i
,
j
int
)
bool
{
return
blocks
[
i
]
.
NumberU64
()
<
blocks
[
j
]
.
NumberU64
()
s
lices
.
SortFunc
(
blocks
,
func
(
a
,
b
*
types
.
Block
)
bool
{
return
a
.
NumberU64
()
<
b
.
NumberU64
()
})
// Insert one by one as chain insertion needs contiguous ancestry between blocks
for
i
:=
range
blocks
{
...
...
This diff is collapsed.
Click to expand it.
core/forkid/forkid.go
View file @
154b016b
...
...
@@ -24,13 +24,13 @@ import (
"math"
"math/big"
"reflect"
"sort"
"strings"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/log"
"github.com/ethereum/go-ethereum/params"
"golang.org/x/exp/slices"
)
var
(
...
...
@@ -270,8 +270,8 @@ func gatherForks(config *params.ChainConfig) ([]uint64, []uint64) {
}
}
}
s
ort
.
Slice
(
forksByBlock
,
func
(
i
,
j
int
)
bool
{
return
forksByBlock
[
i
]
<
forksByBlock
[
j
]
}
)
s
ort
.
Slice
(
forksByTime
,
func
(
i
,
j
int
)
bool
{
return
forksByTime
[
i
]
<
forksByTime
[
j
]
}
)
s
lices
.
Sort
(
forksByBlock
)
s
lices
.
Sort
(
forksByTime
)
// Deduplicate fork identifiers applying multiple forks
for
i
:=
1
;
i
<
len
(
forksByBlock
);
i
++
{
...
...
This diff is collapsed.
Click to expand it.
core/mkalloc.go
View file @
154b016b
...
...
@@ -30,32 +30,28 @@ import (
"fmt"
"math/big"
"os"
"sort"
"strconv"
"github.com/ethereum/go-ethereum/core"
"github.com/ethereum/go-ethereum/rlp"
"golang.org/x/exp/slices"
)
type
allocItem
struct
{
Addr
,
Balance
*
big
.
Int
}
type
allocList
[]
allocItem
func
(
a
allocList
)
Len
()
int
{
return
len
(
a
)
}
func
(
a
allocList
)
Less
(
i
,
j
int
)
bool
{
return
a
[
i
]
.
Addr
.
Cmp
(
a
[
j
]
.
Addr
)
<
0
}
func
(
a
allocList
)
Swap
(
i
,
j
int
)
{
a
[
i
],
a
[
j
]
=
a
[
j
],
a
[
i
]
}
func
makelist
(
g
*
core
.
Genesis
)
allocList
{
a
:=
make
(
allocList
,
0
,
len
(
g
.
Alloc
))
func
makelist
(
g
*
core
.
Genesis
)
[]
allocItem
{
items
:=
make
([]
allocItem
,
0
,
len
(
g
.
Alloc
))
for
addr
,
account
:=
range
g
.
Alloc
{
if
len
(
account
.
Storage
)
>
0
||
len
(
account
.
Code
)
>
0
||
account
.
Nonce
!=
0
{
panic
(
fmt
.
Sprintf
(
"can't encode account %x"
,
addr
))
}
bigAddr
:=
new
(
big
.
Int
)
.
SetBytes
(
addr
.
Bytes
())
a
=
append
(
a
,
allocItem
{
bigAddr
,
account
.
Balance
})
items
=
append
(
items
,
allocItem
{
bigAddr
,
account
.
Balance
})
}
sort
.
Sort
(
a
)
return
a
slices
.
SortFunc
(
items
,
func
(
a
,
b
allocItem
)
bool
{
return
a
.
Addr
.
Cmp
(
b
.
Addr
)
<
0
})
return
items
}
func
makealloc
(
g
*
core
.
Genesis
)
string
{
...
...
This diff is collapsed.
Click to expand it.
core/rawdb/accessors_chain.go
View file @
154b016b
...
...
@@ -22,7 +22,6 @@ import (
"errors"
"fmt"
"math/big"
"sort"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types"
...
...
@@ -31,6 +30,7 @@ import (
"github.com/ethereum/go-ethereum/log"
"github.com/ethereum/go-ethereum/params"
"github.com/ethereum/go-ethereum/rlp"
"golang.org/x/exp/slices"
)
// ReadCanonicalHash retrieves the hash assigned to a canonical block number.
...
...
@@ -836,23 +836,13 @@ type badBlock struct {
Body
*
types
.
Body
}
// badBlockList implements the sort interface to allow sorting a list of
// bad blocks by their number in the reverse order.
type
badBlockList
[]
*
badBlock
func
(
s
badBlockList
)
Len
()
int
{
return
len
(
s
)
}
func
(
s
badBlockList
)
Less
(
i
,
j
int
)
bool
{
return
s
[
i
]
.
Header
.
Number
.
Uint64
()
<
s
[
j
]
.
Header
.
Number
.
Uint64
()
}
func
(
s
badBlockList
)
Swap
(
i
,
j
int
)
{
s
[
i
],
s
[
j
]
=
s
[
j
],
s
[
i
]
}
// ReadBadBlock retrieves the bad block with the corresponding block hash.
func
ReadBadBlock
(
db
ethdb
.
Reader
,
hash
common
.
Hash
)
*
types
.
Block
{
blob
,
err
:=
db
.
Get
(
badBlockKey
)
if
err
!=
nil
{
return
nil
}
var
badBlocks
badBlockList
var
badBlocks
[]
*
badBlock
if
err
:=
rlp
.
DecodeBytes
(
blob
,
&
badBlocks
);
err
!=
nil
{
return
nil
}
...
...
@@ -871,7 +861,7 @@ func ReadAllBadBlocks(db ethdb.Reader) []*types.Block {
if
err
!=
nil
{
return
nil
}
var
badBlocks
badBlockList
var
badBlocks
[]
*
badBlock
if
err
:=
rlp
.
DecodeBytes
(
blob
,
&
badBlocks
);
err
!=
nil
{
return
nil
}
...
...
@@ -889,7 +879,7 @@ func WriteBadBlock(db ethdb.KeyValueStore, block *types.Block) {
if
err
!=
nil
{
log
.
Warn
(
"Failed to load old bad blocks"
,
"error"
,
err
)
}
var
badBlocks
badBlockList
var
badBlocks
[]
*
badBlock
if
len
(
blob
)
>
0
{
if
err
:=
rlp
.
DecodeBytes
(
blob
,
&
badBlocks
);
err
!=
nil
{
log
.
Crit
(
"Failed to decode old bad blocks"
,
"error"
,
err
)
...
...
@@ -905,7 +895,10 @@ func WriteBadBlock(db ethdb.KeyValueStore, block *types.Block) {
Header
:
block
.
Header
(),
Body
:
block
.
Body
(),
})
sort
.
Sort
(
sort
.
Reverse
(
badBlocks
))
slices
.
SortFunc
(
badBlocks
,
func
(
a
,
b
*
badBlock
)
bool
{
// Note: sorting in descending number order.
return
a
.
Header
.
Number
.
Uint64
()
>=
b
.
Header
.
Number
.
Uint64
()
})
if
len
(
badBlocks
)
>
badBlockToKeep
{
badBlocks
=
badBlocks
[
:
badBlockToKeep
]
}
...
...
This diff is collapsed.
Click to expand it.
core/rawdb/chain_iterator_test.go
View file @
154b016b
...
...
@@ -19,12 +19,12 @@ package rawdb
import
(
"math/big"
"reflect"
"sort"
"sync"
"testing"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types"
"golang.org/x/exp/slices"
)
func
TestChainIterator
(
t
*
testing
.
T
)
{
...
...
@@ -92,9 +92,11 @@ func TestChainIterator(t *testing.T) {
}
}
if
!
c
.
reverse
{
s
ort
.
Ints
(
numbers
)
s
lices
.
Sort
(
numbers
)
}
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
)
{
t
.
Fatalf
(
"Case %d failed, visit element mismatch, want %v, got %v"
,
i
,
c
.
expect
,
numbers
)
...
...
This diff is collapsed.
Click to expand it.
core/state/snapshot/difflayer.go
View file @
154b016b
...
...
@@ -21,7 +21,6 @@ import (
"fmt"
"math"
"math/rand"
"sort"
"sync"
"sync/atomic"
"time"
...
...
@@ -30,6 +29,7 @@ import (
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/rlp"
bloomfilter
"github.com/holiman/bloomfilter/v2"
"golang.org/x/exp/slices"
)
var
(
...
...
@@ -525,7 +525,7 @@ func (dl *diffLayer) AccountList() []common.Hash {
dl
.
accountList
=
append
(
dl
.
accountList
,
hash
)
}
}
s
ort
.
Sort
(
hashes
(
dl
.
accountList
)
)
s
lices
.
SortFunc
(
dl
.
accountList
,
common
.
Hash
.
Less
)
dl
.
memory
+=
uint64
(
len
(
dl
.
accountList
)
*
common
.
HashLength
)
return
dl
.
accountList
}
...
...
@@ -563,7 +563,7 @@ func (dl *diffLayer) StorageList(accountHash common.Hash) ([]common.Hash, bool)
for
k
:=
range
storageMap
{
storageList
=
append
(
storageList
,
k
)
}
s
ort
.
Sort
(
hashes
(
storageList
)
)
s
lices
.
SortFunc
(
storageList
,
common
.
Hash
.
Less
)
dl
.
storageList
[
accountHash
]
=
storageList
dl
.
memory
+=
uint64
(
len
(
dl
.
storageList
)
*
common
.
HashLength
+
common
.
HashLength
)
return
storageList
,
destructed
...
...
This diff is collapsed.
Click to expand it.
core/state/snapshot/iterator_fast.go
View file @
154b016b
...
...
@@ -22,6 +22,7 @@ import (
"sort"
"github.com/ethereum/go-ethereum/common"
"golang.org/x/exp/slices"
)
// weightedIterator is a iterator with an assigned weight. It is used to prioritise
...
...
@@ -32,18 +33,10 @@ type weightedIterator struct {
priority
int
}
// weightedIterators is a set of iterators implementing the sort.Interface.
type
weightedIterators
[]
*
weightedIterator
// Len implements sort.Interface, returning the number of active iterators.
func
(
its
weightedIterators
)
Len
()
int
{
return
len
(
its
)
}
// Less implements sort.Interface, returning which of two iterators in the stack
// is before the other.
func
(
its
weightedIterators
)
Less
(
i
,
j
int
)
bool
{
func
(
it
*
weightedIterator
)
Less
(
other
*
weightedIterator
)
bool
{
// Order the iterators primarily by the account hashes
hashI
:=
it
s
[
i
]
.
it
.
Hash
()
hashJ
:=
its
[
j
]
.
it
.
Hash
()
hashI
:=
it
.
it
.
Hash
()
hashJ
:=
other
.
it
.
Hash
()
switch
bytes
.
Compare
(
hashI
[
:
],
hashJ
[
:
])
{
case
-
1
:
...
...
@@ -52,12 +45,7 @@ func (its weightedIterators) Less(i, j int) bool {
return
false
}
// Same account/storage-slot in multiple layers, split by priority
return
its
[
i
]
.
priority
<
its
[
j
]
.
priority
}
// Swap implements sort.Interface, swapping two entries in the iterator stack.
func
(
its
weightedIterators
)
Swap
(
i
,
j
int
)
{
its
[
i
],
its
[
j
]
=
its
[
j
],
its
[
i
]
return
it
.
priority
<
other
.
priority
}
// fastIterator is a more optimized multi-layer iterator which maintains a
...
...
@@ -69,7 +57,7 @@ type fastIterator struct {
curAccount
[]
byte
curSlot
[]
byte
iterators
weightedIterators
iterators
[]
*
weightedIterator
initiated
bool
account
bool
fail
error
...
...
@@ -167,7 +155,9 @@ func (fi *fastIterator) init() {
}
}
// Re-sort the entire list
sort
.
Sort
(
fi
.
iterators
)
slices
.
SortFunc
(
fi
.
iterators
,
func
(
a
,
b
*
weightedIterator
)
bool
{
return
a
.
Less
(
b
)
})
fi
.
initiated
=
false
}
...
...
This diff is collapsed.
Click to expand it.
core/state/snapshot/sort.go
deleted
100644 → 0
View file @
84b05d4f
// Copyright 2019 The go-ethereum Authors
// This file is part of the go-ethereum library.
//
// The go-ethereum library is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// The go-ethereum library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
package
snapshot
import
(
"bytes"
"github.com/ethereum/go-ethereum/common"
)
// hashes is a helper to implement sort.Interface.
type
hashes
[]
common
.
Hash
// Len is the number of elements in the collection.
func
(
hs
hashes
)
Len
()
int
{
return
len
(
hs
)
}
// Less reports whether the element with index i should sort before the element
// with index j.
func
(
hs
hashes
)
Less
(
i
,
j
int
)
bool
{
return
bytes
.
Compare
(
hs
[
i
][
:
],
hs
[
j
][
:
])
<
0
}
// Swap swaps the elements with indexes i and j.
func
(
hs
hashes
)
Swap
(
i
,
j
int
)
{
hs
[
i
],
hs
[
j
]
=
hs
[
j
],
hs
[
i
]
}
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment