From abd6581b22a6f3ee1f028fb17b82fb9af0c1f6ee Mon Sep 17 00:00:00 2001 From: Etan Kissling Date: Mon, 19 Sep 2022 11:25:41 +0200 Subject: [PATCH] allow custom configs in Gnosis binary (#4134) When running as Gnosis-chain binary the config was no longer adjustable. Restores loading custom configs when running as Gnosis-chain binary, as long as the following keys remain same: - SLOTS_PER_EPOCH=16 - SECONDS_PER_SLOT=5 - BASE_REWARD_FACTOR=25 - EPOCHS_PER_SYNC_COMMITTEE_PERIOD=512 This allows running the Gnosis-chain binary on custom test networks. --- beacon_chain/conf.nim | 32 +++-- beacon_chain/networking/network_metadata.nim | 123 ++++++++++--------- 2 files changed, 82 insertions(+), 73 deletions(-) diff --git a/beacon_chain/conf.nim b/beacon_chain/conf.nim index 5ba15e08b..d89a655e2 100644 --- a/beacon_chain/conf.nim +++ b/beacon_chain/conf.nim @@ -1223,21 +1223,27 @@ proc readValue*(r: var TomlReader, a: var Address) proc loadEth2Network*( eth2Network: Option[string] ): Eth2NetworkMetadata {.raises: [Defect, IOError].} = - network_name.set(2, labelValues = [eth2Network.get(otherwise = "mainnet")]) - when not defined(gnosisChainBinary): - if eth2Network.isSome: - getMetadataForNetwork(eth2Network.get) + const defaultName = + when defined(gnosisChainBinary) and const_preset == "mainnet": + "gnosis" + elif const_preset == "mainnet": + "mainnet" else: - when const_preset == "mainnet": - mainnetMetadata - else: - # Presumably other configurations can have other defaults, but for now - # this simplifies the flow - echo "Must specify network on non-mainnet node" - quit 1 + "(unspecified)" + network_name.set(2, labelValues = [eth2Network.get(otherwise = defaultName)]) + + if eth2Network.isSome: + getMetadataForNetwork(eth2Network.get) else: - checkNetworkParameterUse eth2Network - gnosisMetadata + when defined(gnosisChainBinary) and const_preset == "mainnet": + gnosisMetadata + elif const_preset == "mainnet": + mainnetMetadata + else: + # Presumably other configurations can have other defaults, but for now + # this simplifies the flow + fatal "Must specify network on non-mainnet node" + quit 1 template loadEth2Network*(config: BeaconNodeConf): Eth2NetworkMetadata = loadEth2Network(config.eth2Network) diff --git a/beacon_chain/networking/network_metadata.nim b/beacon_chain/networking/network_metadata.nim index 34ac104ed..7bc919217 100644 --- a/beacon_chain/networking/network_metadata.nim +++ b/beacon_chain/networking/network_metadata.nim @@ -200,76 +200,79 @@ template mergeTestnet(path: string, eth1Network: Eth1Network): Eth2NetworkMetada loadCompileTimeNetworkMetadata(mergeTestnetsDir & "/" & path, some eth1Network) -when not defined(gnosisChainBinary): - when const_preset == "mainnet": - const - mainnetMetadata* = eth2Network("shared/mainnet", mainnet) - praterMetadata* = eth2Network("shared/prater", goerli) - ropstenMetadata* = mergeTestnet("ropsten-beacon-chain", ropsten) - sepoliaMetadata* = mergeTestnet("sepolia", sepolia) - static: - for network in [mainnetMetadata, praterMetadata, ropstenMetadata, sepoliaMetadata]: - checkForkConsistency(network.cfg) +when defined(gnosisChainBinary) and const_preset == "mainnet": + const + gnosisMetadata* = loadCompileTimeNetworkMetadata( + currentSourcePath.parentDir.replace('\\', '/') & + "/../../media/gnosis") + static: + for network in [gnosisMetadata]: + checkForkConsistency(network.cfg) - proc getMetadataForNetwork*(networkName: string): Eth2NetworkMetadata {.raises: [Defect, IOError].} = - template loadRuntimeMetadata: auto = - if fileExists(networkName / "config.yaml"): - try: - loadEth2NetworkMetadata(networkName) - except CatchableError as exc: - fatal "Cannot load network", msg = exc.msg, networkName - quit 1 - else: - fatal "config.yaml not found for network", networkName +elif const_preset == "mainnet": + const + mainnetMetadata* = eth2Network("shared/mainnet", mainnet) + praterMetadata* = eth2Network("shared/prater", goerli) + ropstenMetadata* = mergeTestnet("ropsten-beacon-chain", ropsten) + sepoliaMetadata* = mergeTestnet("sepolia", sepolia) + static: + for network in [ + mainnetMetadata, praterMetadata, ropstenMetadata, sepoliaMetadata]: + checkForkConsistency(network.cfg) + +proc getMetadataForNetwork*( + networkName: string): Eth2NetworkMetadata {.raises: [Defect, IOError].} = + template loadRuntimeMetadata(): auto = + if fileExists(networkName / "config.yaml"): + try: + loadEth2NetworkMetadata(networkName) + except CatchableError as exc: + fatal "Cannot load network", msg = exc.msg, networkName quit 1 + else: + fatal "config.yaml not found for network", networkName + quit 1 - var - metadata = when const_preset == "mainnet": - case toLowerAscii(networkName) - of "mainnet": - mainnetMetadata - of "prater", "goerli": - praterMetadata - of "ropsten": - ropstenMetadata - of "sepolia": - sepoliaMetadata - else: - loadRuntimeMetadata() + let metadata = + when defined(gnosisChainBinary) and const_preset == "mainnet": + case toLowerAscii(networkName) + of "gnosis": + gnosisMetadata + of "gnosis-chain": + warn "`--network:gnosis-chain` is deprecated, " & + "use `--network:gnosis` instead" + gnosisMetadata else: loadRuntimeMetadata() - if metadata.incompatible: - fatal "The selected network is not compatible with the current build", - reason = metadata.incompatibilityDesc - quit 1 - metadata + elif const_preset == "mainnet": + case toLowerAscii(networkName) + of "mainnet": + mainnetMetadata + of "prater", "goerli": + praterMetadata + of "ropsten": + ropstenMetadata + of "sepolia": + sepoliaMetadata + else: + loadRuntimeMetadata() - proc getRuntimeConfig*( - eth2Network: Option[string]): RuntimeConfig {.raises: [Defect, IOError].} = - if eth2Network.isSome: - return getMetadataForNetwork(eth2Network.get).cfg - defaultRuntimeConfig + else: + loadRuntimeMetadata() -else: - const - gnosisMetadata* = loadCompileTimeNetworkMetadata( - currentSourcePath.parentDir.replace('\\', '/') & "/../../media/gnosis") + if metadata.incompatible: + fatal "The selected network is not compatible with the current build", + reason = metadata.incompatibilityDesc + quit 1 - static: checkForkConsistency(gnosisMetadata.cfg) + metadata - proc checkNetworkParameterUse*(eth2Network: Option[string]) = - # Support `gnosis-chain` as network name which was used in v22.3 - if eth2Network.isSome and eth2Network.get notin ["gnosis", "gnosis-chain"]: - fatal "The only supported value for the --network parameter is 'gnosis'" - quit 1 - - if eth2Network.isSome and eth2Network.get == "gnosis-chain": - warn "`--network:gnosis-chain` is deprecated, use `--network:gnosis` instead" - - proc getRuntimeConfig*(eth2Network: Option[string]): RuntimeConfig {.raises: [Defect, IOError].} = - checkNetworkParameterUse eth2Network - gnosisMetadata.cfg +proc getRuntimeConfig*( + eth2Network: Option[string]): RuntimeConfig {.raises: [Defect, IOError].} = + if eth2Network.isSome: + return getMetadataForNetwork(eth2Network.get).cfg + defaultRuntimeConfig proc extractGenesisValidatorRootFromSnapshot*( snapshot: string): Eth2Digest {.raises: [Defect, IOError, SszError].} =