Add exportBlockProofBellatrix command to eth_data_exporter (#2093)
Add functionality to export bellatrix block proofs from era files to the eth_data_exporter tool.
This commit is contained in:
parent
7ea6d719d9
commit
5c1cf0410c
|
@ -87,12 +87,12 @@ type
|
||||||
|
|
||||||
BeaconChainBlockProof* = object
|
BeaconChainBlockProof* = object
|
||||||
# Total size (8 + 1 + 3 + 1 + 14) * 32 bytes + 4 bytes = 868 bytes
|
# Total size (8 + 1 + 3 + 1 + 14) * 32 bytes + 4 bytes = 868 bytes
|
||||||
beaconBlockBodyProof: BeaconBlockBodyProof
|
beaconBlockBodyProof*: BeaconBlockBodyProof
|
||||||
beaconBlockBodyRoot: Digest
|
beaconBlockBodyRoot*: Digest
|
||||||
beaconBlockHeaderProof: BeaconBlockHeaderProof
|
beaconBlockHeaderProof*: BeaconBlockHeaderProof
|
||||||
beaconBlockHeaderRoot: Digest
|
beaconBlockHeaderRoot*: Digest
|
||||||
historicalRootsProof: HistoricalRootsProof
|
historicalRootsProof*: HistoricalRootsProof
|
||||||
slot: Slot
|
slot*: Slot
|
||||||
|
|
||||||
func getHistoricalRootsIndex*(slot: Slot): uint64 =
|
func getHistoricalRootsIndex*(slot: Slot): uint64 =
|
||||||
slot div SLOTS_PER_HISTORICAL_ROOT
|
slot div SLOTS_PER_HISTORICAL_ROOT
|
||||||
|
@ -109,7 +109,7 @@ func getBlockRootsIndex*(blockHeader: BeaconBlockHeader): uint64 =
|
||||||
# Builds proof to be able to verify that the EL block hash is part of
|
# Builds proof to be able to verify that the EL block hash is part of
|
||||||
# BeaconBlockBody for given root.
|
# BeaconBlockBody for given root.
|
||||||
func buildProof*(
|
func buildProof*(
|
||||||
blockBody: bellatrix.BeaconBlockBody
|
blockBody: bellatrix.TrustedBeaconBlockBody | bellatrix.BeaconBlockBody
|
||||||
): Result[BeaconBlockBodyProof, string] =
|
): Result[BeaconBlockBodyProof, string] =
|
||||||
# 16 as there are 10 fields
|
# 16 as there are 10 fields
|
||||||
# 9 as index (pos) of field = 9
|
# 9 as index (pos) of field = 9
|
||||||
|
@ -152,7 +152,7 @@ func buildProof*(
|
||||||
func buildProof*(
|
func buildProof*(
|
||||||
batch: HistoricalBatch,
|
batch: HistoricalBatch,
|
||||||
blockHeader: BeaconBlockHeader,
|
blockHeader: BeaconBlockHeader,
|
||||||
blockBody: bellatrix.BeaconBlockBody,
|
blockBody: bellatrix.TrustedBeaconBlockBody | bellatrix.BeaconBlockBody,
|
||||||
): Result[BeaconChainBlockProof, string] =
|
): Result[BeaconChainBlockProof, string] =
|
||||||
let
|
let
|
||||||
blockRootIndex = getBlockRootsIndex(blockHeader)
|
blockRootIndex = getBlockRootsIndex(blockHeader)
|
||||||
|
|
|
@ -692,3 +692,7 @@ when isMainModule:
|
||||||
waitFor exportHistoricalRoots(
|
waitFor exportHistoricalRoots(
|
||||||
config.restUrl, string config.dataDir, cfg, forkDigests
|
config.restUrl, string config.dataDir, cfg, forkDigests
|
||||||
)
|
)
|
||||||
|
of BeaconCmd.exportBlockProofBellatrix:
|
||||||
|
cmdExportBlockProofBellatrix(
|
||||||
|
string config.dataDir, string config.eraDir, config.slotNumber
|
||||||
|
)
|
||||||
|
|
|
@ -13,12 +13,19 @@ import
|
||||||
chronos,
|
chronos,
|
||||||
stew/[byteutils, io2],
|
stew/[byteutils, io2],
|
||||||
eth/async_utils,
|
eth/async_utils,
|
||||||
|
beacon_chain/era_db,
|
||||||
|
beacon_chain/spec/forks,
|
||||||
beacon_chain/networking/network_metadata,
|
beacon_chain/networking/network_metadata,
|
||||||
beacon_chain/spec/eth2_apis/rest_beacon_client,
|
beacon_chain/spec/eth2_apis/rest_beacon_client,
|
||||||
beacon_chain/beacon_clock,
|
beacon_chain/beacon_clock,
|
||||||
../../network/beacon/beacon_content,
|
../../network/beacon/beacon_content,
|
||||||
|
../../network/beacon/beacon_init_loader,
|
||||||
|
../../network/history/experimental/beacon_chain_block_proof,
|
||||||
|
../../network_metadata,
|
||||||
./exporter_common
|
./exporter_common
|
||||||
|
|
||||||
|
from beacon_chain/el/el_manager import toBeaconBlockHeader
|
||||||
|
|
||||||
export beacon_clock
|
export beacon_clock
|
||||||
|
|
||||||
const
|
const
|
||||||
|
@ -296,3 +303,48 @@ proc exportHistoricalRoots*(
|
||||||
quit 1
|
quit 1
|
||||||
else:
|
else:
|
||||||
notice "Succesfully wrote historical_roots to file", file
|
notice "Succesfully wrote historical_roots to file", file
|
||||||
|
|
||||||
|
proc cmdExportBlockProofBellatrix*(
|
||||||
|
dataDir: string, eraDir: string, slotNumber: uint64
|
||||||
|
) =
|
||||||
|
let
|
||||||
|
networkData = loadNetworkData("mainnet")
|
||||||
|
db =
|
||||||
|
EraDB.new(networkData.metadata.cfg, eraDir, networkData.genesis_validators_root)
|
||||||
|
historical_roots = loadHistoricalRoots().asSeq()
|
||||||
|
slot = Slot(slotNumber)
|
||||||
|
era = era(slot)
|
||||||
|
|
||||||
|
# Note: Provide just empty historical_summaries here as this is only
|
||||||
|
# supposed to generate proofs for Bellatrix for now.
|
||||||
|
# For later proofs, it will be more difficult to use this call as we need
|
||||||
|
# to provide the (changing) historical summaries. Probably want to directly
|
||||||
|
# grab the right era file through different calls then.
|
||||||
|
var state: ForkedHashedBeaconState
|
||||||
|
db.getState(historical_roots, [], start_slot(era + 1), state).isOkOr:
|
||||||
|
error "Failed to load state", error = error
|
||||||
|
quit QuitFailure
|
||||||
|
|
||||||
|
let batch = HistoricalBatch(
|
||||||
|
block_roots: getStateField(state, block_roots).data,
|
||||||
|
state_roots: getStateField(state, state_roots).data,
|
||||||
|
)
|
||||||
|
|
||||||
|
let beaconBlock = db.getBlock(
|
||||||
|
historical_roots, [], slot, Opt.none(Eth2Digest), bellatrix.TrustedSignedBeaconBlock
|
||||||
|
).valueOr:
|
||||||
|
error "Failed to load Bellatrix block", slot
|
||||||
|
quit QuitFailure
|
||||||
|
|
||||||
|
let beaconBlockHeader = beaconBlock.toBeaconBlockHeader()
|
||||||
|
let blockProof = buildProof(batch, beaconBlockHeader, beaconBlock.message.body).valueOr:
|
||||||
|
error "Failed to build proof for Bellatrix block", slot, error
|
||||||
|
quit QuitFailure
|
||||||
|
|
||||||
|
let file = dataDir / "block_proof_" & $slot & ".ssz"
|
||||||
|
let res = io2.writeFile(file, SSZ.encode(blockProof))
|
||||||
|
if res.isErr():
|
||||||
|
error "Failed writing block proof to file", file, error = ioErrorMsg(res.error)
|
||||||
|
quit 1
|
||||||
|
else:
|
||||||
|
notice "Succesfully wrote block proof to file", file
|
||||||
|
|
|
@ -70,6 +70,7 @@ type
|
||||||
exportLCFinalityUpdate = "Export Light Client Finality Update"
|
exportLCFinalityUpdate = "Export Light Client Finality Update"
|
||||||
exportLCOptimisticUpdate = "Export Light Client Optimistic Update"
|
exportLCOptimisticUpdate = "Export Light Client Optimistic Update"
|
||||||
exportHistoricalRoots = "Export historical roots from the beacon state (SSZ format)"
|
exportHistoricalRoots = "Export historical roots from the beacon state (SSZ format)"
|
||||||
|
exportBlockProofBellatrix = "Export Bellatrix EL block proof from era files"
|
||||||
|
|
||||||
ExporterConf* = object
|
ExporterConf* = object
|
||||||
logLevel* {.
|
logLevel* {.
|
||||||
|
@ -210,6 +211,11 @@ type
|
||||||
discard
|
discard
|
||||||
of exportHistoricalRoots:
|
of exportHistoricalRoots:
|
||||||
discard
|
discard
|
||||||
|
of exportBlockProofBellatrix:
|
||||||
|
slotNumber* {.
|
||||||
|
desc: "The slot for which to export the block proof", name: "slot"
|
||||||
|
.}: uint64
|
||||||
|
eraDir* {.desc: "Directory containing era files", name: "era-dir".}: InputDir
|
||||||
|
|
||||||
proc parseCmdArg*(T: type Web3Url, p: string): T {.raises: [ValueError].} =
|
proc parseCmdArg*(T: type Web3Url, p: string): T {.raises: [ValueError].} =
|
||||||
let
|
let
|
||||||
|
|
Loading…
Reference in New Issue