Add CLI options `--genesis-state` and `--genesis-state-url`

This commit is contained in:
Zahary Karadjov 2023-09-08 13:09:21 +03:00
parent 53589b5a7d
commit c7db7d0f2c
No known key found for this signature in database
GPG Key ID: C1F42EAFF38D570F
4 changed files with 42 additions and 14 deletions

View File

@ -344,6 +344,14 @@ type
desc: "SSZ file specifying a recent finalized state" desc: "SSZ file specifying a recent finalized state"
name: "finalized-checkpoint-state" .}: Option[InputFile] name: "finalized-checkpoint-state" .}: Option[InputFile]
genesisState* {.
desc: "SSZ file specifying the genesis state of the network (for networks without a built-in genesis state)"
name: "genesis-state" .}: Option[InputFile]
genesisStateUrl* {.
desc: "URL for obtaining the genesis state of the network (for networks without a built-in genesis state)"
name: "genesis-state-url" .}: Option[Uri]
finalizedDepositTreeSnapshot* {. finalizedDepositTreeSnapshot* {.
desc: "SSZ file specifying a recent finalized EIP-4881 deposit tree snapshot" desc: "SSZ file specifying a recent finalized EIP-4881 deposit tree snapshot"
name: "finalized-deposit-tree-snapshot" .}: Option[InputFile] name: "finalized-deposit-tree-snapshot" .}: Option[InputFile]

View File

@ -320,7 +320,7 @@ elif const_preset == "mainnet":
vendorDir & "/holesky/custom_config_data", vendorDir & "/holesky/custom_config_data",
some holesky, some holesky,
downloadGenesisFrom = some DownloadInfo( downloadGenesisFrom = some DownloadInfo(
url: "https://github.com/status-im/nimbus-eth2/releases/download/v23.8.0/holesky-genesis.ssz.snappy-framed", url: "https://github.com/status-im/nimbus-eth2/releases/download/v23.9.0/holesky-genesis.ssz.sz",
digest: Eth2Digest.fromHex "0x76631cd0b9ddc5b2c766b496e23f16759ce1181446a4efb40e5540cd15b78a07")) digest: Eth2Digest.fromHex "0x76631cd0b9ddc5b2c766b496e23f16759ce1181446a4efb40e5540cd15b78a07"))
sepoliaMetadata = loadCompileTimeNetworkMetadata( sepoliaMetadata = loadCompileTimeNetworkMetadata(

View File

@ -29,14 +29,15 @@ proc downloadFile(url: Uri): Future[seq[byte]] {.async.} =
msg: "Unexpected status code " & $response[0] & " when fetching " & $url, msg: "Unexpected status code " & $response[0] & " when fetching " & $url,
status: response[0]) status: response[0])
proc fetchBytes*(metadata: GenesisMetadata): Future[seq[byte]] {.async.} = proc fetchBytes*(metadata: GenesisMetadata,
genesisStateUrlOverride = none(Uri)): Future[seq[byte]] {.async.} =
case metadata.kind case metadata.kind
of NoGenesis: of NoGenesis:
raiseAssert "fetchBytes should be called only when metadata.hasGenesis is true" raiseAssert "fetchBytes should be called only when metadata.hasGenesis is true"
of BakedIn: of BakedIn:
result = @(metadata.bakedBytes) result = @(metadata.bakedBytes)
of BakedInUrl: of BakedInUrl:
result = decodeFramed(await downloadFile(parseUri metadata.url)) result = decodeFramed(await downloadFile(genesisStateUrlOverride.get(parseUri metadata.url)))
if eth2digest(result) != metadata.digest: if eth2digest(result) != metadata.digest:
raise (ref DigestMismatchError)( raise (ref DigestMismatchError)(
msg: "The downloaded genesis state cannot be verified (checksum mismatch)") msg: "The downloaded genesis state cannot be verified (checksum mismatch)")

View File

@ -482,6 +482,13 @@ proc init*(T: type BeaconNode,
except Exception as exc: except Exception as exc:
raise newException(Defect, "Failure in taskpool initialization.") raise newException(Defect, "Failure in taskpool initialization.")
if metadata.genesis.kind == BakedIn:
if config.genesisState.isSome:
warn "The --genesis-state option has no effect on networks with built-in genesis state"
if config.genesisStateUrl.isSome:
warn "The --genesis-state-url option has no effect on networks with built-in genesis state"
let let
eventBus = EventBus( eventBus = EventBus(
blocksQueue: newAsyncEventQueue[EventBeaconBlockObject](), blocksQueue: newAsyncEventQueue[EventBeaconBlockObject](),
@ -544,17 +551,29 @@ proc init*(T: type BeaconNode,
var networkGenesisValidatorsRoot = metadata.bakedGenesisValidatorsRoot var networkGenesisValidatorsRoot = metadata.bakedGenesisValidatorsRoot
if not ChainDAGRef.isInitialized(db).isOk(): if not ChainDAGRef.isInitialized(db).isOk():
let genesisState = let genesisState = if checkpointState != nil and getStateField(checkpointState[], slot) == 0:
if metadata.hasGenesis: checkpointState
let genesisBytes = try: else:
if metadata.genesis.kind == BakedInUrl: let genesisBytes = block:
info "Obtaining genesis state", sourceUrl = metadata.genesis.url if metadata.genesis.kind != BakedIn and config.genesisState.isSome:
await metadata.genesis.fetchBytes() let res = io2.readAllBytes(config.genesisState.get.string)
except CatchableError as err: res.valueOr:
error "Failed to obtain genesis state", error "Failed to read genesis state file", err = res.error.ioErrorMsg
source = metadata.genesis.sourceDesc, quit 1
err = err.msg elif metadata.hasGenesis:
quit 1 try:
if metadata.genesis.kind == BakedInUrl:
info "Obtaining genesis state", sourceUrl = metadata.genesis.url
await metadata.genesis.fetchBytes(config.genesisStateUrl)
except CatchableError as err:
error "Failed to obtain genesis state",
source = metadata.genesis.sourceDesc,
err = err.msg
quit 1
else:
@[]
if genesisBytes.len > 0:
try: try:
newClone readSszForkedHashedBeaconState(cfg, genesisBytes) newClone readSszForkedHashedBeaconState(cfg, genesisBytes)
except CatchableError as err: except CatchableError as err: