good morning!!!!
Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
B
bor
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Iterations
Wiki
Requirements
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Locked files
Build
Pipelines
Jobs
Pipeline schedules
Test cases
Artifacts
Deploy
Releases
Package Registry
Container Registry
Harbor Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Code review analytics
Issue analytics
Insights
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
github
maticnetwork
bor
Commits
41ac8dd8
Unverified
Commit
41ac8dd8
authored
6 years ago
by
Péter Szilágyi
Committed by
GitHub
6 years ago
Browse files
Options
Downloads
Plain Diff
Merge pull request #17675 from holiman/eip1234
Eip1234
parents
c1345b07
7efb12d2
No related branches found
Branches containing commit
No related tags found
Tags containing commit
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
consensus/ethash/consensus.go
+82
-60
82 additions, 60 deletions
consensus/ethash/consensus.go
with
82 additions
and
60 deletions
consensus/ethash/consensus.go
+
82
−
60
View file @
41ac8dd8
...
...
@@ -38,10 +38,24 @@ import (
// Ethash proof-of-work protocol constants.
var
(
FrontierBlockReward
=
big
.
NewInt
(
5e+18
)
// Block reward in wei for successfully mining a block
ByzantiumBlockReward
=
big
.
NewInt
(
3e+18
)
// Block reward in wei for successfully mining a block upward from Byzantium
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
FrontierBlockReward
=
big
.
NewInt
(
5e+18
)
// Block reward in wei for successfully mining a block
ByzantiumBlockReward
=
big
.
NewInt
(
3e+18
)
// Block reward in wei for successfully mining a block upward from Byzantium
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.
// Specification EIP-1234: https://eips.ethereum.org/EIPS/eip-1234
calcDifficultyConstantinople
=
makeDifficultyCalculator
(
big
.
NewInt
(
5000000
))
// 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.
// Specification EIP-649: https://eips.ethereum.org/EIPS/eip-649
calcDifficultyByzantium
=
makeDifficultyCalculator
(
big
.
NewInt
(
3000000
))
)
// Various error messages to mark blocks invalid. These should be private to
...
...
@@ -299,6 +313,8 @@ func (ethash *Ethash) CalcDifficulty(chain consensus.ChainReader, time uint64, p
func
CalcDifficulty
(
config
*
params
.
ChainConfig
,
time
uint64
,
parent
*
types
.
Header
)
*
big
.
Int
{
next
:=
new
(
big
.
Int
)
.
Add
(
parent
.
Number
,
big1
)
switch
{
case
config
.
IsConstantinople
(
next
)
:
return
calcDifficultyConstantinople
(
time
,
parent
)
case
config
.
IsByzantium
(
next
)
:
return
calcDifficultyByzantium
(
time
,
parent
)
case
config
.
IsHomestead
(
next
)
:
...
...
@@ -316,66 +332,69 @@ var (
big9
=
big
.
NewInt
(
9
)
big10
=
big
.
NewInt
(
10
)
bigMinus99
=
big
.
NewInt
(
-
99
)
big2999999
=
big
.
NewInt
(
2999999
)
)
// 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
{
// 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/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
}
// for the exponential factor
periodCount
:=
fakeBlockNumber
periodCount
.
Div
(
periodCount
,
expDiffPeriod
)
// 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
{
// Note, the calculations below looks at the parent number, which is 1 below
// the block number. Thus we remove one from the delay given
bombDelayFromParent
:=
new
(
big
.
Int
)
.
Sub
(
bombDelay
,
big1
)
return
func
(
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
// Specification: https://eips.ethereum.org/EIPS/eip-1234
fakeBlockNumber
:=
new
(
big
.
Int
)
if
parent
.
Number
.
Cmp
(
bombDelayFromParent
)
>=
0
{
fakeBlockNumber
=
fakeBlockNumber
.
Sub
(
parent
.
Number
,
bombDelayFromParent
)
}
// 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
)
// 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
}
return
x
}
// calcDifficultyHomestead is the difficulty adjustment algorithm. It returns
...
...
@@ -592,6 +611,9 @@ func accumulateRewards(config *params.ChainConfig, state *state.StateDB, header
if
config
.
IsByzantium
(
header
.
Number
)
{
blockReward
=
ByzantiumBlockReward
}
if
config
.
IsConstantinople
(
header
.
Number
)
{
blockReward
=
ConstantinopleBlockReward
}
// Accumulate the rewards for the miner and any included uncles
reward
:=
new
(
big
.
Int
)
.
Set
(
blockReward
)
r
:=
new
(
big
.
Int
)
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment