add gray glacier difficulty calculator

fixes #1264
This commit is contained in:
jangko 2022-10-17 17:22:01 +07:00
parent f894f6673b
commit a48cc04ea7
No known key found for this signature in database
GPG Key ID: 31702AE10541E6B9
8 changed files with 80 additions and 52 deletions

View File

@ -40,11 +40,10 @@ type
berlinBlock : Option[BlockNumber]
londonBlock : Option[BlockNumber]
arrowGlacierBlock : Option[BlockNumber]
mergeForkBlock : Option[BlockNumber] ##\
## EIP-3675 (TheMerge) switch block: "For the purposes of the EIP-2124\
## fork identifier, nodes implementing this EIP *MUST* set the\
## `FORK_NEXT` parameter to the `FORK_NEXT_VALUE`."
grayGlacierBlock : Option[BlockNumber]
mergeForkBlock : Option[BlockNumber]
shanghaiBlock : Option[BlockNumber]
cancunBlock : Option[BlockNumber]
clique : CliqueOptions
terminalTotalDifficulty*: Option[UInt256]
@ -70,7 +69,10 @@ type
berlinBlock* : BlockNumber
londonBlock* : BlockNumber
arrowGlacierBlock* : BlockNumber
mergeForkBlock* : Option[BlockNumber] # EIP-3675 (TheMerge) switch block
grayGlacierBlock* : BlockNumber
mergeForkBlock* : BlockNumber # EIP-3675 (TheMerge) switch block
shanghaiBlock* : BlockNumber
cancunBlock* : BlockNumber
poaEngine* : bool
cliquePeriod* : int
@ -269,12 +271,9 @@ proc loadNetworkParams*(cc: CustomChain, cg: var NetworkParams): bool =
cg.config.terminalTotalDifficulty = cc.config.terminalTotalDifficulty
template validateFork(forkName: untyped, nextBlock: BlockNumber) =
template validateFork(forkName: untyped, nextBlock: untyped) =
let fork = astToStr(forkName)
if cc.config.forkName.isSome:
cg.config.forkName = cc.config.forkName.get()
else:
cg.config.forkName = nextBlock
cg.config.forkName = cc.config.forkName.get(nextBlock)
if cg.config.forkName > nextBlock:
error "Forks can't be assigned out of order", fork=fork
return false
@ -287,7 +286,11 @@ proc loadNetworkParams*(cc: CustomChain, cg: var NetworkParams): bool =
# The difference to the ref implementation is that we have no optional values
# everywhere for the block numbers but rather assign the next larger block.
validateFork(arrowGlacierBlock, high(BlockNumber))
validateFork(cancunBlock, high(BlockNumber))
validateFork(shanghaiBlock, cg.config.cancunBlock)
validateFork(mergeForkBlock, cg.config.shanghaiBlock)
validateFork(grayGlacierBlock, cg.config.mergeForkBlock)
validateFork(arrowGlacierBlock, cg.config.grayGlacierBlock)
validateFork(londonBlock, cg.config.arrowGlacierBlock)
validateFork(berlinBlock, cg.config.londonBlock)
validateFork(muirGlacierBlock, cg.config.berlinBlock)
@ -301,15 +304,6 @@ proc loadNetworkParams*(cc: CustomChain, cg: var NetworkParams): bool =
validateFork(daoForkBlock, cg.config.eip150Block)
validateFork(homesteadBlock, cg.config.daoForkBlock)
# Only this last entry remains optional.
cg.config.mergeForkBlock = cc.config.mergeForkBlock
if cc.config.mergeForkBlock.isSome:
# Must be larger than the largest block
let topBlock = min(cg.config.arrowGlacierBlock, cg.config.londonBlock)
if cg.config.mergeForkBlock.get < topBlock:
error "Forks can't be assigned out of order", fork="mergeForkBlock"
return false
return true
proc loadNetworkParams*(fileName: string, cg: var NetworkParams):
@ -357,10 +351,10 @@ proc parseGenesisAlloc*(data: string, ga: var GenesisAlloc): bool
proc toFork*(c: ChainConfig, number: BlockNumber): Fork =
## Map to EVM fork, which doesn't include the DAO or Glacier forks.
if c.mergeForkBlock.isSome and number >= c.mergeForkBlock.get:
return FkParis
if number >= c.londonBlock: FkLondon
if number >= c.cancunBlock: FkCancun
elif number >= c.shanghaiBlock: FkShanghai
elif number >= c.mergeForkBlock: FkParis
elif number >= c.londonBlock: FkLondon
elif number >= c.berlinBlock: FkBerlin
elif number >= c.istanbulBlock: FkIstanbul
elif number >= c.petersburgBlock: FkPetersburg
@ -397,7 +391,10 @@ proc chainConfigForNetwork*(id: NetworkId): ChainConfig =
berlinBlock: 12_244_000.toBlockNumber, # 2021-04-15 10:07:03 UTC
londonBlock: 12_965_000.toBlockNumber, # 2021-08-05 12:33:42 UTC
arrowGlacierBlock: 13_773_000.toBlockNumber, # 2021-12-09 19:55:23 UTC
mergeForkBlock: none(BlockNumber),
grayGlacierBlock: 15_050_000.toBlockNumber, # 2022-06-30 10:54:04 UTC
mergeForkBlock: high(BlockNumber),
shanghaiBlock: high(BlockNumber),
cancunBlock: high(BlockNumber),
)
of RopstenNet:
ChainConfig(
@ -418,7 +415,10 @@ proc chainConfigForNetwork*(id: NetworkId): ChainConfig =
berlinBlock: 9_812_189.toBlockNumber, # 2021-03-10 13:32:08 UTC
londonBlock: 10_499_401.toBlockNumber, # 2021-06-24 02:03:37 UTC
arrowGlacierBlock: high(BlockNumber), # No current plan
mergeForkBlock: none(BlockNumber),
grayGlacierBlock: high(BlockNumber), # No current plan
mergeForkBlock: high(BlockNumber),
shanghaiBlock: high(BlockNumber),
cancunBlock: high(BlockNumber),
)
of RinkebyNet:
ChainConfig(
@ -439,7 +439,10 @@ proc chainConfigForNetwork*(id: NetworkId): ChainConfig =
berlinBlock: 8_290_928.toBlockNumber, # 2021-03-24 14:48:36 UTC
londonBlock: 8_897_988.toBlockNumber, # 2021-07-08 01:27:32 UTC
arrowGlacierBlock: high(BlockNumber), # No current plan
mergeForkBlock: none(BlockNumber),
grayGlacierBlock: high(BlockNumber), # No current plan
mergeForkBlock: high(BlockNumber),
shanghaiBlock: high(BlockNumber),
cancunBlock: high(BlockNumber),
)
of GoerliNet:
ChainConfig(
@ -460,14 +463,20 @@ proc chainConfigForNetwork*(id: NetworkId): ChainConfig =
berlinBlock: 4_460_644.toBlockNumber, # 2021-03-18 05:29:51 UTC
londonBlock: 5_062_605.toBlockNumber, # 2021-07-01 03:19:39 UTC
arrowGlacierBlock: high(BlockNumber), # No current plan
mergeForkBlock: none(BlockNumber),
grayGlacierBlock: high(BlockNumber), # No current plan
mergeForkBlock: high(BlockNumber),
shanghaiBlock: high(BlockNumber),
cancunBlock: high(BlockNumber),
)
of SepoliaNet:
ChainConfig(
poaEngine: false,
chainId: SepoliaNet.ChainId,
arrowGlacierBlock: high(BlockNumber), # No current plan
mergeForkBlock: none(BlockNumber),
grayGlacierBlock: high(BlockNumber), # No current plan
mergeForkBlock: high(BlockNumber),
shanghaiBlock: high(BlockNumber),
cancunBlock: high(BlockNumber),
)
else:
ChainConfig()

View File

@ -40,7 +40,10 @@ type
Berlin,
London,
ArrowGlacier,
MergeFork
GrayGlacier,
MergeFork,
Shanghai,
Cancun
Chain* = ref object of RootRef
db: BaseChainDB
@ -107,7 +110,10 @@ func getNextFork(c: ChainConfig, fork: ChainFork): uint64 =
toNextFork(c.berlinBlock),
toNextFork(c.londonBlock),
toNextFork(c.arrowGlacierBlock),
toNextFork(c.mergeForkBlock)
toNextFork(c.grayGlacierBlock),
toNextFork(c.mergeForkBlock),
toNextFork(c.shanghaiBlock),
toNextFork(c.cancunBlock),
]
if fork == high(ChainFork):

View File

@ -24,9 +24,11 @@ import
# ------------------------------------------------------------------------------
func toChainFork(c: ChainConfig, number: BlockNumber): ChainFork =
if c.mergeForkBlock.isSome and number >= c.mergeForkBlock.get:
return MergeFork
if number >= c.arrowGlacierBlock: ArrowGlacier
if number >= c.cancunBlock: Cancun
elif number >= c.shanghaiBlock: Shanghai
elif number >= c.mergeForkBlock: MergeFork
elif number >= c.grayGlacierBlock: GrayGlacier
elif number >= c.arrowGlacierBlock: ArrowGlacier
elif number >= c.londonBlock: London
elif number >= c.berlinBlock: Berlin
elif number >= c.muirGlacierBlock: MuirGlacier

View File

@ -162,9 +162,17 @@ template calcDifficultyArrowGlacier*(timeStamp: EthTime, parent: BlockHeader): D
## Offset the bomb a total of 10.7M blocks.
makeDifficultyCalculator(10_700_000, timeStamp, parent)
template calcDifficultyGrayGlacier*(timeStamp: EthTime, parent: BlockHeader): DifficultyInt =
## "EIP-4345: Difficulty Bomb Delay to September 2022"
## <https://eips.ethereum.org/EIPS/eip-5133>
## Offset the bomb a total of 11.4M blocks.
makeDifficultyCalculator(11_400_000, timeStamp, parent)
func calcDifficulty*(c: ChainConfig, timeStamp: EthTime, parent: BlockHeader): DifficultyInt =
let next = parent.blockNumber + bigOne
if next >= c.arrowGlacierBlock:
if next >= c.grayGlacierBlock:
result = calcDifficultyGrayGlacier(timeStamp, parent)
elif next >= c.arrowGlacierBlock:
result = calcDifficultyArrowGlacier(timeStamp, parent)
elif next >= c.londonBlock:
result = calcDifficultyLondon(timeStamp, parent)

View File

@ -147,7 +147,7 @@ func vmConfiguration(network: string, c: var ChainConfig) =
c.berlinBlock = number[FkBerlin]
c.londonBlock = number[FkLondon]
c.arrowGlacierBlock = number[FkLondon]
c.mergeForkBlock = some(number[FkParis])
c.mergeForkBlock = number[FkParis]
c.terminalTotalDifficulty = none(UInt256)
case network
@ -254,8 +254,8 @@ proc importBlock(tester: var Tester, chainDB: BaseChainDB,
deepCopy(result, preminedBlock)
let ttdReached = chainDB.isBlockAfterTtd(preminedBlock.header)
if ttdReached and chainDB.config.mergeForkBlock.isNone:
chainDB.config.mergeForkBlock = some(preminedBlock.header.blockNumber)
if ttdReached and chainDB.config.mergeForkBlock == high(BlockNumber):
chainDB.config.mergeForkBlock = preminedBlock.header.blockNumber
if ttdReached:
baseHeaderForImport.prevRandao = preminedBlock.header.prevRandao
@ -327,13 +327,13 @@ proc runTester(tester: var Tester, chainDB: BaseChainDB, testStatusIMPL: var Tes
for idx, testBlock in tester.blocks:
if testBlock.goodBlock:
#try:
try:
let (preminedBlock, _, _) = tester.applyFixtureBlockToChain(
testBlock, chainDB, checkSeal, validation = false)
let ttdReached = chainDB.isBlockAfterTtd(preminedBlock.header)
if ttdReached and chainDB.config.mergeForkBlock.isNone:
chainDB.config.mergeForkBlock = some(preminedBlock.header.blockNumber)
if ttdReached and chainDB.config.mergeForkBlock == high(BlockNumber):
chainDB.config.mergeForkBlock = preminedBlock.header.blockNumber
# manually validating
let res = chainDB.validateHeaderAndKinship(
@ -346,8 +346,8 @@ proc runTester(tester: var Tester, chainDB: BaseChainDB, testStatusIMPL: var Tes
debugEcho "error message: ", res.error
debugEcho "ttdReached: ", ttdReached
#except:
#debugEcho "FATAL ERROR(WE HAVE BUG): ", getCurrentExceptionMsg()
except:
debugEcho "FATAL ERROR(WE HAVE BUG): ", getCurrentExceptionMsg()
else:
var noError = true

View File

@ -237,8 +237,7 @@ proc genesisLoadRunner(noisy = true;
params = params)
check mdb.ttd == sSpcs.termTotalDff
check mdb.config.mergeForkBlock.isSome
check mdb.config.mergeForkBlock.get == sSpcs.mergeFork.u256
check mdb.config.mergeForkBlock == sSpcs.mergeFork.u256
test &"Construct persistent BaseChainDB on {tmpDir}, {persistPruneInfo}":
if disablePersistentDB:
@ -258,8 +257,7 @@ proc genesisLoadRunner(noisy = true;
params = params)
check ddb.ttd == sSpcs.termTotalDff
check ddb.config.mergeForkBlock.isSome
check ddb.config.mergeForkBlock.get == sSpcs.mergeFork.u256
check ddb.config.mergeForkBlock == sSpcs.mergeFork.u256
test "Initialise in-memory Genesis":
mdb.initializeEmptyDb
@ -388,7 +386,6 @@ when isMainModule:
# typically on the `nimbus-eth1-blobs` module.
noisy.testnetChainRunner(
stopAfterBlock = 999999999)
# ------------------------------------------------------------------------------
# End
# ------------------------------------------------------------------------------

View File

@ -28,8 +28,10 @@ const
(blockNumber: 12964999'u64, id: (crc: 0x0eb440f6'u32, nextFork: 12965000'u64)), # Last Berlin block
(blockNumber: 12965000'u64, id: (crc: 0xb715077d'u32, nextFork: 13773000'u64)), # First London block
(blockNumber: 13772999'u64, id: (crc: 0xb715077d'u32, nextFork: 13773000'u64)), # Last London block
(blockNumber: 13773000'u64, id: (crc: 0x20c327fc'u32, nextFork: 0'u64)), # First Arrow Glacier block
(blockNumber: 20000000'u64, id: (crc: 0x20c327fc'u32, nextFork: 0'u64)), # Future Arrow Glacier block
(blockNumber: 13773000'u64, id: (crc: 0x20c327fc'u32, nextFork: 15050000'u64)), # First Arrow Glacier block
(blockNumber: 15049999'u64, id: (crc: 0x20c327fc'u32, nextFork: 15050000'u64)), # Last Arrow Glacier block
(blockNumber: 15050000'u64, id: (crc: 0xf0afd0e3'u32, nextFork: 0'u64)), # First Gray Glacier block
(blockNumber: 20000000'u64, id: (crc: 0xf0afd0e3'u32, nextFork: 0'u64)), # Future Gray Glacier block
]
RopstenNetIDs = [

View File

@ -42,7 +42,11 @@ proc setupChain(): BaseChainDB =
muirGlacierBlock : 0.toBlockNumber,
berlinBlock : 10.toBlockNumber,
londonBlock : high(BlockNumber),
arrowGlacierBlock : high(BlockNumber)
arrowGlacierBlock : high(BlockNumber),
grayGlacierBlock : high(BlockNumber),
mergeForkBlock : high(BlockNumber),
shanghaiBlock : high(BlockNumber),
cancunBlock : high(BlockNumber),
)
var jn = json.parseFile(dataFolder / "oneUncle.json")