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
3df7df03
Unverified
Commit
3df7df03
authored
Sep 15, 2018
by
Martin Holst Swende
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ethash: less copy-paste for EIP 1234
parent
0732617b
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
67 additions
and
116 deletions
+67
-116
consensus.go
consensus/ethash/consensus.go
+67
-116
No files found.
consensus/ethash/consensus.go
View file @
3df7df03
...
...
@@ -43,6 +43,16 @@ var (
ConstantinopleBlockReward
=
big
.
NewInt
(
2e+18
)
// Block reward in wei for successfully mining a block upward from Constantinople
maxUncles
=
2
// Maximum number of uncles allowed in a single block
allowedFutureBlockTime
=
15
*
time
.
Second
// Max time from current time allowed for blocks, before they're considered future blocks
// calcDifficultyConstantinople is the difficulty adjustment algorithm for Constantinople.
// It returns the difficulty that a new block should have when created at time given the
// parent block's time and difficulty. The calculation uses the Byzantium rules, but with bomb offset 5M.
calcDifficultyConstantinople
=
makeDifficultyCalculator
(
big
.
NewInt
(
4999999
))
// calcDifficultyByzantium is the difficulty adjustment algorithm. It returns
// the difficulty that a new block should have when created at time given the
// parent block's time and difficulty. The calculation uses the Byzantium rules.
calcDifficultyByzantium
=
makeDifficultyCalculator
(
big
.
NewInt
(
2999999
))
)
// Various error messages to mark blocks invalid. These should be private to
...
...
@@ -319,73 +329,13 @@ var (
big9
=
big
.
NewInt
(
9
)
big10
=
big
.
NewInt
(
10
)
bigMinus99
=
big
.
NewInt
(
-
99
)
big2999999
=
big
.
NewInt
(
2999999
)
big4999999
=
big
.
NewInt
(
4999999
)
)
// calcDifficultyConstantinople is the difficulty adjustment algorithm. It returns
// the difficulty that a new block should have when created at time given the
// parent block's time and difficulty. The calculation uses the Constantinople rules.
func
calcDifficultyConstantinople
(
time
uint64
,
parent
*
types
.
Header
)
*
big
.
Int
{
// https://github.com/ethereum/EIPs/issues/100.
// algorithm:
// diff = (parent_diff +
// (parent_diff / 2048 * max((2 if len(parent.uncles) else 1) - ((timestamp - parent.timestamp) // 9), -99))
// ) + 2^(periodCount - 2)
bigTime
:=
new
(
big
.
Int
)
.
SetUint64
(
time
)
bigParentTime
:=
new
(
big
.
Int
)
.
Set
(
parent
.
Time
)
// holds intermediate values to make the algo easier to read & audit
x
:=
new
(
big
.
Int
)
y
:=
new
(
big
.
Int
)
// (2 if len(parent_uncles) else 1) - (block_timestamp - parent_timestamp) // 9
x
.
Sub
(
bigTime
,
bigParentTime
)
x
.
Div
(
x
,
big9
)
if
parent
.
UncleHash
==
types
.
EmptyUncleHash
{
x
.
Sub
(
big1
,
x
)
}
else
{
x
.
Sub
(
big2
,
x
)
}
// max((2 if len(parent_uncles) else 1) - (block_timestamp - parent_timestamp) // 9, -99)
if
x
.
Cmp
(
bigMinus99
)
<
0
{
x
.
Set
(
bigMinus99
)
}
// parent_diff + (parent_diff / 2048 * max((2 if len(parent.uncles) else 1) - ((timestamp - parent.timestamp) // 9), -99))
y
.
Div
(
parent
.
Difficulty
,
params
.
DifficultyBoundDivisor
)
x
.
Mul
(
y
,
x
)
x
.
Add
(
parent
.
Difficulty
,
x
)
// minimum difficulty can ever be (before exponential factor)
if
x
.
Cmp
(
params
.
MinimumDifficulty
)
<
0
{
x
.
Set
(
params
.
MinimumDifficulty
)
}
// calculate a fake block number for the ice-age delay:
// https://github.com/ethereum/EIPs/pull/1234
// fake_block_number = max(0, block.number - 5_000_000)
fakeBlockNumber
:=
new
(
big
.
Int
)
if
parent
.
Number
.
Cmp
(
big4999999
)
>=
0
{
fakeBlockNumber
=
fakeBlockNumber
.
Sub
(
parent
.
Number
,
big4999999
)
// Note, parent is 1 less than the actual block number
}
// for the exponential factor
periodCount
:=
fakeBlockNumber
periodCount
.
Div
(
periodCount
,
expDiffPeriod
)
// the exponential factor, commonly referred to as "the bomb"
// diff = diff + 2^(periodCount - 2)
if
periodCount
.
Cmp
(
big1
)
>
0
{
y
.
Sub
(
periodCount
,
big2
)
y
.
Exp
(
big2
,
y
,
nil
)
x
.
Add
(
x
,
y
)
}
return
x
}
// calcDifficultyByzantium is the difficulty adjustment algorithm. It returns
// the difficulty that a new block should have when created at time given the
// parent block's time and difficulty. The calculation uses the Byzantium rules.
func
calcDifficultyByzantium
(
time
uint64
,
parent
*
types
.
Header
)
*
big
.
Int
{
// makeDifficultyCalculator creates a difficultyCalculator with the given bomb-delay.
// the difficulty is calculated with Byzantium rules, which differs from Homestead in
// how uncles affect the calculation
func
makeDifficultyCalculator
(
bombDelay
*
big
.
Int
)
func
(
time
uint64
,
parent
*
types
.
Header
)
*
big
.
Int
{
return
func
(
time
uint64
,
parent
*
types
.
Header
)
*
big
.
Int
{
// https://github.com/ethereum/EIPs/issues/100.
// algorithm:
// diff = (parent_diff +
...
...
@@ -424,8 +374,8 @@ func calcDifficultyByzantium(time uint64, parent *types.Header) *big.Int {
// https://github.com/ethereum/EIPs/pull/669
// fake_block_number = max(0, block.number - 3_000_000)
fakeBlockNumber
:=
new
(
big
.
Int
)
if
parent
.
Number
.
Cmp
(
big2999999
)
>=
0
{
fakeBlockNumber
=
fakeBlockNumber
.
Sub
(
parent
.
Number
,
big2999999
)
// Note, parent is 1 less than the actual block number
if
parent
.
Number
.
Cmp
(
bombDelay
)
>=
0
{
fakeBlockNumber
=
fakeBlockNumber
.
Sub
(
parent
.
Number
,
bombDelay
)
// Note, parent is 1 less than the actual block number
}
// for the exponential factor
periodCount
:=
fakeBlockNumber
...
...
@@ -439,6 +389,7 @@ func calcDifficultyByzantium(time uint64, parent *types.Header) *big.Int {
x
.
Add
(
x
,
y
)
}
return
x
}
}
// calcDifficultyHomestead is the difficulty adjustment algorithm. It returns
...
...
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