From 0c60e452e7c3721eca44c84edfc2e33cbe945f56 Mon Sep 17 00:00:00 2001 From: Zahary Karadjov Date: Tue, 28 Jul 2020 16:36:11 +0300 Subject: [PATCH] Allow the deposit contract deployment block to be specified as a number (needed for Medalla) --- beacon_chain/beacon_node.nim | 22 ++++++++++++++++++---- beacon_chain/conf.nim | 4 ++-- beacon_chain/mainchain_monitor.nim | 6 +++--- beacon_chain/network_metadata.nim | 8 ++++---- vendor/nim-web3 | 2 +- 5 files changed, 28 insertions(+), 14 deletions(-) diff --git a/beacon_chain/beacon_node.nim b/beacon_chain/beacon_node.nim index e80ab16bd..073f30636 100644 --- a/beacon_chain/beacon_node.nim +++ b/beacon_chain/beacon_node.nim @@ -165,14 +165,28 @@ proc init*(T: type BeaconNode, fatal "Deposit contract deployment block not specified" quit 1 + let web3 = web3Provider(conf.web3Url) + let deployedAtAsHash = + if conf.depositContractDeployedAt.get.startsWith "0x": + try: BlockHash.fromHex conf.depositContractDeployedAt.get + except ValueError: + fatal "Invalid hex value specified for deposit-contract-block" + quit 1 + else: + let blockNum = try: parseBiggestUInt conf.depositContractDeployedAt.get + except ValueError: + fatal "Invalid nummeric value for deposit-contract-block" + quit 1 + await getEth1BlockHash(conf.web3Url, blockId blockNum) + # TODO Could move this to a separate "GenesisMonitor" process or task # that would do only this - see Paul's proposal for this. mainchainMonitor = MainchainMonitor.init( conf.runtimePreset, - web3Provider(conf.web3Url), + web3, conf.depositContractAddress.get, - Eth1Data(block_hash: conf.depositContractDeployedAt.get.asEth2Digest, - deposit_count: 0)) + Eth1Data(block_hash: deployedAtAsHash.asEth2Digest, deposit_count: 0)) + mainchainMonitor.start() genesisState = await mainchainMonitor.waitGenesis() @@ -1097,7 +1111,7 @@ programMain: startTime = uint64(times.toUnix(times.getTime()) + config.genesisOffset) outGenesis = config.outputGenesis.string eth1Hash = if config.web3Url.len == 0: eth1BlockHash - else: waitFor getLatestEth1BlockHash(config.web3Url) + else: (waitFor getEth1BlockHash(config.web3Url, blockId("latest"))).asEth2Digest var initialState = initialize_beacon_state_from_eth1( defaultRuntimePreset, eth1Hash, startTime, deposits, {skipBlsValidation}) diff --git a/beacon_chain/conf.nim b/beacon_chain/conf.nim index 9e2f26d8a..46ca73321 100644 --- a/beacon_chain/conf.nim +++ b/beacon_chain/conf.nim @@ -68,8 +68,8 @@ type name: "deposit-contract" }: Option[Eth1Address] depositContractDeployedAt* {. - desc: "The Eth1 block hash where the deposit contract has been deployed" - name: "deposit-contract-block" }: Option[Eth1BlockHash] + desc: "The Eth1 block number or hash where the deposit contract has been deployed" + name: "deposit-contract-block" }: Option[string] nonInteractive* {. desc: "Do not display interative prompts. Quit on missing configuration" diff --git a/beacon_chain/mainchain_monitor.nim b/beacon_chain/mainchain_monitor.nim index 67ab03749..178c5d1d8 100644 --- a/beacon_chain/mainchain_monitor.nim +++ b/beacon_chain/mainchain_monitor.nim @@ -798,11 +798,11 @@ proc start(m: MainchainMonitor, delayBeforeStart: Duration) = proc start*(m: MainchainMonitor) {.inline.} = m.start(0.seconds) -proc getLatestEth1BlockHash*(url: string): Future[Eth2Digest] {.async.} = +proc getEth1BlockHash*(url: string, blockId: RtBlockIdentifier): Future[BlockHash] {.async.} = let web3 = await newWeb3(url) try: - let blk = await web3.provider.eth_getBlockByNumber("latest", false) - return Eth2Digest(data: array[32, byte](blk.hash)) + let blk = await web3.provider.eth_getBlockByNumber(blockId, false) + return blk.hash finally: await web3.close() diff --git a/beacon_chain/network_metadata.nim b/beacon_chain/network_metadata.nim index aa404e0a2..6e1693f65 100644 --- a/beacon_chain/network_metadata.nim +++ b/beacon_chain/network_metadata.nim @@ -38,7 +38,7 @@ type bootstrapNodes*: seq[string] depositContractAddress*: Eth1Address - depositContractDeployedAt*: Eth1BlockHash + depositContractDeployedAt*: string # Please note that we are using `string` here because SSZ.decode # is not currently usable at compile time and we want to load the @@ -110,9 +110,9 @@ proc loadEth2NetworkMetadata*(path: string): Eth2NetworkMetadata default(Eth1Address) depositContractBlock = if fileExists(depositContractBlockPath): - Eth1BlockHash.fromHex readFile(depositContractBlockPath).strip + readFile(depositContractBlockPath).strip else: - default(Eth1BlockHash) + "" bootstrapNodes = if fileExists(bootstrapNodesPath): readFile(bootstrapNodesPath).splitLines() @@ -145,7 +145,7 @@ const # TODO The values below are just placeholders for now bootstrapNodes: @[], depositContractAddress: Eth1Address.fromHex "0x1234567890123456789012345678901234567890", - depositContractDeployedAt: Eth1BlockHash.fromHex "0x73056f16a59bf70abad5b4365438e8a7d646aa0d7f56d22c3d9e4c6000d8e176", + depositContractDeployedAt: "0", genesisData: "") else: Eth2NetworkMetadata( diff --git a/vendor/nim-web3 b/vendor/nim-web3 index 4fe1a81ce..9fb271b87 160000 --- a/vendor/nim-web3 +++ b/vendor/nim-web3 @@ -1 +1 @@ -Subproject commit 4fe1a81ce7e16413b01467a2f88058127941170e +Subproject commit 9fb271b87697bafff9f27c73d5695d9aba648921