ncli: time operations (#3966)
This commit is contained in:
parent
cd9b50bbbc
commit
94a479f1c9
|
@ -22,6 +22,11 @@ type
|
||||||
desc: "The Eth2 network preset to use"
|
desc: "The Eth2 network preset to use"
|
||||||
name: "network" }: Option[string]
|
name: "network" }: Option[string]
|
||||||
|
|
||||||
|
printTimes* {.
|
||||||
|
defaultValue: false # false to avoid polluting minimal output
|
||||||
|
name: "print-times"
|
||||||
|
desc: "Print timing information".}: bool
|
||||||
|
|
||||||
# TODO confutils argument pragma doesn't seem to do much; also, the cases
|
# TODO confutils argument pragma doesn't seem to do much; also, the cases
|
||||||
# are largely equivalent, but this helps create command line usage text
|
# are largely equivalent, but this helps create command line usage text
|
||||||
case cmd* {.command}: Cmd
|
case cmd* {.command}: Cmd
|
||||||
|
@ -97,10 +102,18 @@ proc loadFile(filename: string, T: type): T =
|
||||||
quit 1
|
quit 1
|
||||||
|
|
||||||
proc doTransition(conf: NcliConf) =
|
proc doTransition(conf: NcliConf) =
|
||||||
|
type
|
||||||
|
Timers = enum
|
||||||
|
tLoadState = "Load state from file"
|
||||||
|
tTransition = "Apply slot"
|
||||||
|
tSaveState = "Save state to file"
|
||||||
|
var timers: array[Timers, RunningStat]
|
||||||
|
|
||||||
let
|
let
|
||||||
cfg = getRuntimeConfig(conf.eth2Network)
|
cfg = getRuntimeConfig(conf.eth2Network)
|
||||||
stateY = newClone(readSszForkedHashedBeaconState(
|
stateY = withTimerRet(timers[tLoadState]):
|
||||||
cfg, readAllBytes(conf.preState).tryGet()))
|
newClone(readSszForkedHashedBeaconState(
|
||||||
|
cfg, readAllBytes(conf.preState).tryGet()))
|
||||||
blckX = readSszForkedSignedBeaconBlock(
|
blckX = readSszForkedSignedBeaconBlock(
|
||||||
cfg, readAllBytes(conf.blck).tryGet())
|
cfg, readAllBytes(conf.blck).tryGet())
|
||||||
flags = if not conf.verifyStateRoot: {skipStateRootValidation} else: {}
|
flags = if not conf.verifyStateRoot: {skipStateRootValidation} else: {}
|
||||||
|
@ -108,14 +121,18 @@ proc doTransition(conf: NcliConf) =
|
||||||
var
|
var
|
||||||
cache = StateCache()
|
cache = StateCache()
|
||||||
info = ForkedEpochInfo()
|
info = ForkedEpochInfo()
|
||||||
let res = withBlck(blckX):
|
let res = withTimerRet(timers[tTransition]): withBlck(blckX):
|
||||||
state_transition(
|
state_transition(
|
||||||
cfg, stateY[], blck, cache, info, flags, noRollback)
|
cfg, stateY[], blck, cache, info, flags, noRollback)
|
||||||
if res.isErr():
|
if res.isErr():
|
||||||
error "State transition failed", error = res.error()
|
error "State transition failed", error = res.error()
|
||||||
quit 1
|
quit 1
|
||||||
else:
|
else:
|
||||||
saveSSZFile(conf.postState, stateY[])
|
withTimer(timers[tSaveState]):
|
||||||
|
saveSSZFile(conf.postState, stateY[])
|
||||||
|
|
||||||
|
if conf.printTimes:
|
||||||
|
printTimers(false, timers)
|
||||||
|
|
||||||
proc doSlots(conf: NcliConf) =
|
proc doSlots(conf: NcliConf) =
|
||||||
type
|
type
|
||||||
|
@ -144,9 +161,15 @@ proc doSlots(conf: NcliConf) =
|
||||||
withTimer(timers[tSaveState]):
|
withTimer(timers[tSaveState]):
|
||||||
saveSSZFile(conf.postState2, stateY[])
|
saveSSZFile(conf.postState2, stateY[])
|
||||||
|
|
||||||
printTimers(false, timers)
|
if conf.printTimes:
|
||||||
|
printTimers(false, timers)
|
||||||
|
|
||||||
proc doSSZ(conf: NcliConf) =
|
proc doSSZ(conf: NcliConf) =
|
||||||
|
type Timers = enum
|
||||||
|
tLoad = "Load file"
|
||||||
|
tCompute = "Compute"
|
||||||
|
var timers: array[Timers, RunningStat]
|
||||||
|
|
||||||
let (kind, file) =
|
let (kind, file) =
|
||||||
case conf.cmd:
|
case conf.cmd:
|
||||||
of hashTreeRoot: (conf.htrKind, conf.htrFile)
|
of hashTreeRoot: (conf.htrKind, conf.htrFile)
|
||||||
|
@ -155,19 +178,26 @@ proc doSSZ(conf: NcliConf) =
|
||||||
raiseAssert "doSSZ() only implements hashTreeRoot and pretty commands"
|
raiseAssert "doSSZ() only implements hashTreeRoot and pretty commands"
|
||||||
|
|
||||||
template printit(t: untyped) {.dirty.} =
|
template printit(t: untyped) {.dirty.} =
|
||||||
let v = newClone(loadFile(file, t))
|
|
||||||
|
let v = withTimerRet(timers[tLoad]):
|
||||||
|
newClone(loadFile(file, t))
|
||||||
|
|
||||||
case conf.cmd:
|
case conf.cmd:
|
||||||
of hashTreeRoot:
|
of hashTreeRoot:
|
||||||
when t is ForkySignedBeaconBlock:
|
let root = withTimerRet(timers[tCompute]):
|
||||||
echo hash_tree_root(v.message).data.toHex()
|
when t is ForkySignedBeaconBlock:
|
||||||
else:
|
hash_tree_root(v[].message)
|
||||||
echo hash_tree_root(v[]).data.toHex()
|
else:
|
||||||
|
hash_tree_root(v[])
|
||||||
|
|
||||||
|
echo root.data.toHex()
|
||||||
of pretty:
|
of pretty:
|
||||||
echo RestJson.encode(v[], pretty = true)
|
echo RestJson.encode(v[], pretty = true)
|
||||||
else:
|
else:
|
||||||
raiseAssert "doSSZ() only implements hashTreeRoot and pretty commands"
|
raiseAssert "doSSZ() only implements hashTreeRoot and pretty commands"
|
||||||
|
|
||||||
|
if conf.printTimes:
|
||||||
|
printTimers(false, timers)
|
||||||
|
|
||||||
case kind
|
case kind
|
||||||
of "attester_slashing": printit(AttesterSlashing)
|
of "attester_slashing": printit(AttesterSlashing)
|
||||||
|
@ -186,7 +216,7 @@ proc doSSZ(conf: NcliConf) =
|
||||||
of "deposit_data": printit(DepositData)
|
of "deposit_data": printit(DepositData)
|
||||||
of "eth1_data": printit(Eth1Data)
|
of "eth1_data": printit(Eth1Data)
|
||||||
of "phase0_state": printit(phase0.BeaconState)
|
of "phase0_state": printit(phase0.BeaconState)
|
||||||
of "altiar_state": printit(altair.BeaconState)
|
of "altair_state": printit(altair.BeaconState)
|
||||||
of "bellatrix_state": printit(bellatrix.BeaconState)
|
of "bellatrix_state": printit(bellatrix.BeaconState)
|
||||||
of "proposer_slashing": printit(ProposerSlashing)
|
of "proposer_slashing": printit(ProposerSlashing)
|
||||||
of "voluntary_exit": printit(VoluntaryExit)
|
of "voluntary_exit": printit(VoluntaryExit)
|
||||||
|
|
Loading…
Reference in New Issue