From cc0dbd5bc083a4ad3b2db41946040a1f390b5155 Mon Sep 17 00:00:00 2001 From: tersec Date: Thu, 25 Nov 2021 10:53:31 +0000 Subject: [PATCH] implement terminal-total-difficulty-override; keep kintsugi TTDs consistent (#3118) * implement terminal-total-difficulty-override; keep TTD consistent for m2 scripts/docs * use Option[uint64] instead of uint64 --- beacon_chain/conf.nim | 7 +++++++ beacon_chain/eth1/eth1_monitor.nim | 26 +++++++++++++------------- beacon_chain/nimbus_beacon_node.nim | 7 ++++++- docs/neth-m2-nimbus.md | 2 +- 4 files changed, 27 insertions(+), 15 deletions(-) diff --git a/beacon_chain/conf.nim b/beacon_chain/conf.nim index f5efcf852..08fb4d23f 100644 --- a/beacon_chain/conf.nim +++ b/beacon_chain/conf.nim @@ -355,6 +355,13 @@ type defaultValueDesc: "50" name: "sync-horizon" }: uint64 + # https://github.com/ethereum/consensus-specs/blob/v1.1.5/specs/merge/client-settings.md#override-terminal-total-difficulty + terminalTotalDifficultyOverride* {. + hidden + desc: "Override pre-configured TERMINAL_TOTAL_DIFFICULTY parameter" + name: "terminal-total-difficulty-override" + }: Option[uint64] + of createTestnet: testnetDepositsFile* {. desc: "A LaunchPad deposits file for the genesis state validators" diff --git a/beacon_chain/eth1/eth1_monitor.nim b/beacon_chain/eth1/eth1_monitor.nim index 34105ddd7..186f9ccf2 100644 --- a/beacon_chain/eth1/eth1_monitor.nim +++ b/beacon_chain/eth1/eth1_monitor.nim @@ -184,21 +184,21 @@ when hasGenesisDetection: func isGenesisCandidate(m: Eth1Monitor, blk: Eth1Block): bool = m.hasEnoughValidators(blk) and m.isAfterMinGenesisTime(blk) - proc findGenesisBlockInRange(m: Eth1Monitor, startBlock, endBlock: Eth1Block): + func findGenesisBlockInRange(m: Eth1Monitor, startBlock, endBlock: Eth1Block): Future[Eth1Block] {.async, gcsafe.} - proc signalGenesis(m: Eth1Monitor, genesisState: BeaconStateRef) = + func signalGenesis(m: Eth1Monitor, genesisState: BeaconStateRef) = m.genesisState = genesisState if not m.genesisStateFut.isNil: m.genesisStateFut.complete() m.genesisStateFut = nil - proc allGenesisDepositsUpTo(m: Eth1Monitor, totalDeposits: uint64): seq[DepositData] = + func allGenesisDepositsUpTo(m: Eth1Monitor, totalDeposits: uint64): seq[DepositData] = for i in 0'u64 ..< totalDeposits: result.add m.db.genesisDeposits.get(i) - proc createGenesisState(m: Eth1Monitor, eth1Block: Eth1Block): BeaconStateRef = + func createGenesisState(m: Eth1Monitor, eth1Block: Eth1Block): BeaconStateRef = notice "Generating genesis state", blockNum = eth1Block.number, blockHash = eth1Block.voteData.block_hash, @@ -217,7 +217,7 @@ when hasGenesisDetection: if eth1Block.activeValidatorsCount != 0: doAssert result.validators.lenu64 == eth1Block.activeValidatorsCount - proc produceDerivedData(m: Eth1Monitor, deposit: DepositData) = + func produceDerivedData(m: Eth1Monitor, deposit: DepositData) = let htr = hash_tree_root(deposit) if verify_deposit_signature(m.cfg, deposit): @@ -229,7 +229,7 @@ when hasGenesisDetection: withdrawal_credentials: deposit.withdrawal_credentials) m.genesisValidatorKeyToIndex[pubkey] = idx - proc processGenesisDeposit*(m: Eth1Monitor, newDeposit: DepositData) = + func processGenesisDeposit*(m: Eth1Monitor, newDeposit: DepositData) = m.db.genesisDeposits.add newDeposit m.produceDerivedData(newDeposit) @@ -420,7 +420,7 @@ template readJsonField(j: JsonNode, fieldName: string, ValueType: type): untyped template init[N: static int](T: type DynamicBytes[N, N]): T = T newSeq[byte](N) -proc depositEventsToBlocks(depositsList: JsonNode): seq[Eth1Block] {. +func depositEventsToBlocks(depositsList: JsonNode): seq[Eth1Block] {. raises: [Defect, CatchableError].} = if depositsList.kind != JArray: raise newException(CatchableError, @@ -491,7 +491,7 @@ when hasDepositRootChecks: awaitWithTimeout(fut, timeout): raise newException(DataProviderTimeout, "Timeout") - proc fetchDepositContractData(p: Web3DataProviderRef, blk: Eth1Block): + func fetchDepositContractData(p: Web3DataProviderRef, blk: Eth1Block): Future[DepositContractDataStatus] {.async.} = let depositRoot = p.ns.get_deposit_root.call(blockNumber = blk.number) @@ -584,7 +584,7 @@ proc pruneOldBlocks(chain: var Eth1Chain, depositIndex: uint64) = newTailBlock = lastBlock.voteData.block_hash, depositsCount = lastBlock.voteData.deposit_count -proc advanceMerkleizer(chain: Eth1Chain, +func advanceMerkleizer(chain: Eth1Chain, merkleizer: var DepositsMerkleizer, depositIndex: uint64): bool = if chain.blocks.len == 0: @@ -610,7 +610,7 @@ proc advanceMerkleizer(chain: Eth1Chain, return merkleizer.getChunkCount == depositIndex -proc getDepositsRange(chain: Eth1Chain, first, last: uint64): seq[DepositData] = +func getDepositsRange(chain: Eth1Chain, first, last: uint64): seq[DepositData] = # TODO It's possible to make this faster by performing binary search that # will locate the blocks holding the `first` and `last` indices. # TODO There is an assumption here that the requested range will be present @@ -629,7 +629,7 @@ proc getDepositsRange(chain: Eth1Chain, first, last: uint64): seq[DepositData] = if globalIdx >= first and globalIdx < last: result.add blk.deposits[i] -proc lowerBound(chain: Eth1Chain, depositCount: uint64): Eth1Block = +func lowerBound(chain: Eth1Chain, depositCount: uint64): Eth1Block = # TODO: This can be replaced with a proper binary search in the # future, but the `algorithm` module currently requires an # `openArray`, which the `deques` module can't provide yet. @@ -817,7 +817,7 @@ proc safeCancel(fut: var Future[void]) = fut.cancel() fut = nil -proc clear(chain: var Eth1Chain) = +func clear(chain: var Eth1Chain) = chain.blocks.clear() chain.blocksByHash.clear() chain.hasConsensusViolation = false @@ -844,7 +844,7 @@ proc stop*(m: Eth1Monitor) {.async.} = const votedBlocksSafetyMargin = 50 -proc earliestBlockOfInterest(m: Eth1Monitor): Eth1BlockNumber = +func earliestBlockOfInterest(m: Eth1Monitor): Eth1BlockNumber = m.latestEth1BlockNumber - (2 * m.cfg.ETH1_FOLLOW_DISTANCE) - votedBlocksSafetyMargin diff --git a/beacon_chain/nimbus_beacon_node.nim b/beacon_chain/nimbus_beacon_node.nim index 19fb45f47..c19984706 100644 --- a/beacon_chain/nimbus_beacon_node.nim +++ b/beacon_chain/nimbus_beacon_node.nim @@ -1505,7 +1505,12 @@ proc doRunBeaconNode(config: var BeaconNodeConf, rng: ref BrHmacDrbgContext) {.r # letting the default Ctrl+C handler exit is safe, since we only read from # the db. - let metadata = config.loadEth2Network() + var metadata = config.loadEth2Network() + + # https://github.com/ethereum/consensus-specs/blob/v1.1.5/specs/merge/client-settings.md#override-terminal-total-difficulty + if config.terminalTotalDifficultyOverride.isSome: + metadata.cfg.TERMINAL_TOTAL_DIFFICULTY = + config.terminalTotalDifficultyOverride.get.u256 # Updating the config based on the metadata certainly is not beautiful but it # works diff --git a/docs/neth-m2-nimbus.md b/docs/neth-m2-nimbus.md index 6b4e6900d..5c40a1db2 100644 --- a/docs/neth-m2-nimbus.md +++ b/docs/neth-m2-nimbus.md @@ -20,7 +20,7 @@ cd Nethermind.Runner run Nethermind ``` rm -rf bin/Release/net5.0/nethermind_db -dotnet run -c Release -- --config themerge_kintsugi_m2 --Merge.TerminalTotalDifficulty 100 +dotnet run -c Release -- --config themerge_kintsugi_m2 --Merge.TerminalTotalDifficulty 0 ``` # Verify that Nimbus runs through test vectors