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
1136269a
Unverified
Commit
1136269a
authored
6 years ago
by
Péter Szilágyi
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
miner: differentiate between uncle and lost block
parent
67d6d0bb
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
36 additions
and
14 deletions
+36
-14
unconfirmed.go
miner/unconfirmed.go
+27
-8
unconfirmed_test.go
miner/unconfirmed_test.go
+8
-5
worker.go
miner/worker.go
+1
-1
No files found.
miner/unconfirmed.go
View file @
1136269a
...
...
@@ -25,11 +25,14 @@ import (
"github.com/ethereum/go-ethereum/log"
)
//
header
Retriever is used by the unconfirmed block set to verify whether a previously
//
chain
Retriever is used by the unconfirmed block set to verify whether a previously
// mined block is part of the canonical chain or not.
type
header
Retriever
interface
{
type
chain
Retriever
interface
{
// GetHeaderByNumber retrieves the canonical header associated with a block number.
GetHeaderByNumber
(
number
uint64
)
*
types
.
Header
// GetBlockByNumber retrieves the canonical block associated with a block number.
GetBlockByNumber
(
number
uint64
)
*
types
.
Block
}
// unconfirmedBlock is a small collection of metadata about a locally mined block
...
...
@@ -44,14 +47,14 @@ type unconfirmedBlock struct {
// used by the miner to provide logs to the user when a previously mined block
// has a high enough guarantee to not be reorged out of the canonical chain.
type
unconfirmedBlocks
struct
{
chain
header
Retriever
// Blockchain to verify canonical status through
depth
uint
// Depth after which to discard previous blocks
blocks
*
ring
.
Ring
// Block infos to allow canonical chain cross checks
lock
sync
.
RWMutex
// Protects the fields from concurrent access
chain
chain
Retriever
// Blockchain to verify canonical status through
depth
uint
// Depth after which to discard previous blocks
blocks
*
ring
.
Ring
// Block infos to allow canonical chain cross checks
lock
sync
.
RWMutex
// Protects the fields from concurrent access
}
// newUnconfirmedBlocks returns new data structure to track currently unconfirmed blocks.
func
newUnconfirmedBlocks
(
chain
header
Retriever
,
depth
uint
)
*
unconfirmedBlocks
{
func
newUnconfirmedBlocks
(
chain
chain
Retriever
,
depth
uint
)
*
unconfirmedBlocks
{
return
&
unconfirmedBlocks
{
chain
:
chain
,
depth
:
depth
,
...
...
@@ -103,7 +106,23 @@ func (set *unconfirmedBlocks) Shift(height uint64) {
case
header
.
Hash
()
==
next
.
hash
:
log
.
Info
(
"🔗 block reached canonical chain"
,
"number"
,
next
.
index
,
"hash"
,
next
.
hash
)
default
:
log
.
Info
(
"⑂ block became a side fork"
,
"number"
,
next
.
index
,
"hash"
,
next
.
hash
)
// Block is not canonical, check whether we have an uncle or a lost block
included
:=
false
for
number
:=
next
.
index
;
!
included
&&
number
<
next
.
index
+
uint64
(
set
.
depth
)
&&
number
<=
height
;
number
++
{
if
block
:=
set
.
chain
.
GetBlockByNumber
(
number
);
block
!=
nil
{
for
_
,
uncle
:=
range
block
.
Uncles
()
{
if
uncle
.
Hash
()
==
next
.
hash
{
included
=
true
break
}
}
}
}
if
included
{
log
.
Info
(
"⑂ block became an uncle"
,
"number"
,
next
.
index
,
"hash"
,
next
.
hash
)
}
else
{
log
.
Info
(
"😱 block lost"
,
"number"
,
next
.
index
,
"hash"
,
next
.
hash
)
}
}
// Drop the block out of the ring
if
set
.
blocks
.
Value
==
set
.
blocks
.
Next
()
.
Value
{
...
...
This diff is collapsed.
Click to expand it.
miner/unconfirmed_test.go
View file @
1136269a
...
...
@@ -23,11 +23,14 @@ import (
"github.com/ethereum/go-ethereum/core/types"
)
// noop
Header
Retriever is an implementation of headerRetriever that always
// noop
Chain
Retriever is an implementation of headerRetriever that always
// returns nil for any requested headers.
type
noop
Header
Retriever
struct
{}
type
noop
Chain
Retriever
struct
{}
func
(
r
*
noopHeaderRetriever
)
GetHeaderByNumber
(
number
uint64
)
*
types
.
Header
{
func
(
r
*
noopChainRetriever
)
GetHeaderByNumber
(
number
uint64
)
*
types
.
Header
{
return
nil
}
func
(
r
*
noopChainRetriever
)
GetBlockByNumber
(
number
uint64
)
*
types
.
Block
{
return
nil
}
...
...
@@ -36,7 +39,7 @@ func (r *noopHeaderRetriever) GetHeaderByNumber(number uint64) *types.Header {
func
TestUnconfirmedInsertBounds
(
t
*
testing
.
T
)
{
limit
:=
uint
(
10
)
pool
:=
newUnconfirmedBlocks
(
new
(
noop
Header
Retriever
),
limit
)
pool
:=
newUnconfirmedBlocks
(
new
(
noop
Chain
Retriever
),
limit
)
for
depth
:=
uint64
(
0
);
depth
<
2
*
uint64
(
limit
);
depth
++
{
// Insert multiple blocks for the same level just to stress it
for
i
:=
0
;
i
<
int
(
depth
);
i
++
{
...
...
@@ -58,7 +61,7 @@ func TestUnconfirmedShifts(t *testing.T) {
// Create a pool with a few blocks on various depths
limit
,
start
:=
uint
(
10
),
uint64
(
25
)
pool
:=
newUnconfirmedBlocks
(
new
(
noop
Header
Retriever
),
limit
)
pool
:=
newUnconfirmedBlocks
(
new
(
noop
Chain
Retriever
),
limit
)
for
depth
:=
start
;
depth
<
start
+
uint64
(
limit
);
depth
++
{
pool
.
Insert
(
depth
,
common
.
Hash
([
32
]
byte
{
byte
(
depth
)}))
}
...
...
This diff is collapsed.
Click to expand it.
miner/worker.go
View file @
1136269a
...
...
@@ -55,7 +55,7 @@ const (
resubmitAdjustChanSize
=
10
// miningLogAtDepth is the number of confirmations before logging successful mining.
miningLogAtDepth
=
5
miningLogAtDepth
=
7
// minRecommitInterval is the minimal time interval to recreate the mining block with
// any newly arrived transactions.
...
...
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