encapsulate LC config into one type (#3817)

Separate LC initialization options from the main ChainDAGRef options to
allow ChainDAGRef to treat them as opaque and reduce risk for conflicts
when extending those options in the future.
This commit is contained in:
Etan Kissling 2022-06-28 22:52:29 +02:00 committed by GitHub
parent 2c3e47d7e6
commit bc1cc8f643
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 39 additions and 36 deletions

View File

@ -71,6 +71,18 @@ type
tailSlot*: Slot tailSlot*: Slot
## The earliest slot for which light client data is imported. ## The earliest slot for which light client data is imported.
LightClientDataConfig* = object
serve*: bool
## Whether to make local light client data available or not
importMode*: LightClientDataImportMode
## Which classes of light client data to import
maxPeriods*: Option[uint64]
## Maximum number of sync committee periods to retain light client data
onLightClientFinalityUpdate*: OnLightClientFinalityUpdateCallback
## On new `LightClientFinalityUpdate` callback
onLightClientOptimisticUpdate*: OnLightClientOptimisticUpdateCallback
## On new `LightClientOptimisticUpdate` callback
LightClientDataStore* = object LightClientDataStore* = object
# ----------------------------------- # -----------------------------------
# Light client data # Light client data

View File

@ -685,12 +685,8 @@ proc init*(T: type ChainDAGRef, cfg: RuntimeConfig, db: BeaconChainDB,
eraPath = ".", eraPath = ".",
onBlockCb: OnBlockCallback = nil, onHeadCb: OnHeadCallback = nil, onBlockCb: OnBlockCallback = nil, onHeadCb: OnHeadCallback = nil,
onReorgCb: OnReorgCallback = nil, onFinCb: OnFinalizedCallback = nil, onReorgCb: OnReorgCallback = nil, onFinCb: OnFinalizedCallback = nil,
onLCFinalityUpdateCb: OnLightClientFinalityUpdateCallback = nil, vanityLogs = default(VanityLogs),
onLCOptimisticUpdateCb: OnLightClientOptimisticUpdateCallback = nil, lcDataConfig = default(LightClientDataConfig)): ChainDAGRef =
lightClientDataServe = false,
lightClientDataImportMode = LightClientDataImportMode.None,
lightClientDataMaxPeriods = none(uint64),
vanityLogs = default(VanityLogs)): ChainDAGRef =
cfg.checkForkConsistency() cfg.checkForkConsistency()
doAssert updateFlags - {verifyFinalization, enableTestFeatures} == {}, doAssert updateFlags - {verifyFinalization, enableTestFeatures} == {},
@ -726,12 +722,7 @@ proc init*(T: type ChainDAGRef, cfg: RuntimeConfig, db: BeaconChainDB,
vanityLogs: vanityLogs, vanityLogs: vanityLogs,
lcDataStore: initLightClientDataStore( lcDataStore: initLightClientDataStore(lcDataConfig, cfg),
serve = lightClientDataServe,
importMode = lightClientDataImportMode,
maxPeriods = lightClientDataMaxPeriods.get(cfg.defaultLCDataMaxPeriods),
onLCFinalityUpdateCb = onLCFinalityUpdateCb,
onLCOptimisticUpdateCb = onLCOptimisticUpdateCb),
onBlockAdded: onBlockCb, onBlockAdded: onBlockCb,
onHeadChanged: onHeadCb, onHeadChanged: onHeadCb,

View File

@ -123,18 +123,15 @@ proc syncCommitteeRootForPeriod(
else: raiseAssert "Unreachable" else: raiseAssert "Unreachable"
do: err() do: err()
func initLightClientDataStore*( proc initLightClientDataStore*(
serve: bool, importMode: LightClientDataImportMode, maxPeriods: uint64, config: LightClientDataConfig, cfg: RuntimeConfig): LightClientDataStore =
onLCFinalityUpdateCb: OnLightClientFinalityUpdateCallback = nil,
onLCOptimisticUpdateCb: OnLightClientOptimisticUpdateCallback = nil
): LightClientDataStore =
## Initialize light client data store. ## Initialize light client data store.
LightClientDataStore( LightClientDataStore(
serve: serve, serve: config.serve,
importMode: importMode, importMode: config.importMode,
maxPeriods: maxPeriods, maxPeriods: config.maxPeriods.get(cfg.defaultLightClientDataMaxPeriods),
onLightClientFinalityUpdate: onLCFinalityUpdateCb, onLightClientFinalityUpdate: config.onLightClientFinalityUpdate,
onLightClientOptimisticUpdate: onLCOptimisticUpdateCb) onLightClientOptimisticUpdate: config.onLightClientOptimisticUpdate)
func targetLightClientTailSlot(dag: ChainDAGRef): Slot = func targetLightClientTailSlot(dag: ChainDAGRef): Slot =
## Earliest slot for which light client data is retained. ## Earliest slot for which light client data is retained.

View File

@ -175,14 +175,14 @@ proc loadChainDag(
else: nil else: nil
dag = ChainDAGRef.init( dag = ChainDAGRef.init(
cfg, db, validatorMonitor, extraFlags + chainDagFlags, config.eraDir, cfg, db, validatorMonitor, extraFlags + chainDagFlags, config.eraDir,
onLCFinalityUpdateCb = onLightClientFinalityUpdateCb, vanityLogs = getPandas(detectTTY(config.logStdout)),
onLCOptimisticUpdateCb = onLightClientOptimisticUpdateCb, lcDataConfig = LightClientDataConfig(
lightClientDataServe = config.lightClientDataServe.get, serve: config.lightClientDataServe.get,
lightClientDataImportMode = config.lightClientDataImportMode.get, importMode: config.lightClientDataImportMode.get,
lightClientDataMaxPeriods = config.lightClientDataMaxPeriods, maxPeriods: config.lightClientDataMaxPeriods,
vanityLogs = getPandas(detectTTY(config.logStdout))) onLightClientFinalityUpdate: onLightClientFinalityUpdateCb,
onLightClientOptimisticUpdate: onLightClientOptimisticUpdateCb))
let
databaseGenesisValidatorsRoot = databaseGenesisValidatorsRoot =
getStateField(dag.headState, genesis_validators_root) getStateField(dag.headState, genesis_validators_root)

View File

@ -484,7 +484,7 @@ template name*(cfg: RuntimeConfig): string =
func MIN_EPOCHS_FOR_BLOCK_REQUESTS*(cfg: RuntimeConfig): uint64 = func MIN_EPOCHS_FOR_BLOCK_REQUESTS*(cfg: RuntimeConfig): uint64 =
cfg.MIN_VALIDATOR_WITHDRAWABILITY_DELAY + cfg.CHURN_LIMIT_QUOTIENT div 2 cfg.MIN_VALIDATOR_WITHDRAWABILITY_DELAY + cfg.CHURN_LIMIT_QUOTIENT div 2
func defaultLCDataMaxPeriods*(cfg: RuntimeConfig): uint64 = func defaultLightClientDataMaxPeriods*(cfg: RuntimeConfig): uint64 =
const epochsPerPeriod = EPOCHS_PER_SYNC_COMMITTEE_PERIOD const epochsPerPeriod = EPOCHS_PER_SYNC_COMMITTEE_PERIOD
let maxEpochs = cfg.MIN_EPOCHS_FOR_BLOCK_REQUESTS let maxEpochs = cfg.MIN_EPOCHS_FOR_BLOCK_REQUESTS
(maxEpochs + epochsPerPeriod - 1) div epochsPerPeriod (maxEpochs + epochsPerPeriod - 1) div epochsPerPeriod

View File

@ -79,8 +79,9 @@ suite "Light client" & preset():
validatorMonitor = newClone(ValidatorMonitor.init()) validatorMonitor = newClone(ValidatorMonitor.init())
dag = ChainDAGRef.init( dag = ChainDAGRef.init(
cfg, makeTestDB(num_validators), validatorMonitor, {}, cfg, makeTestDB(num_validators), validatorMonitor, {},
lightClientDataServe = true, lcDataConfig = LightClientDataConfig(
lightClientDataImportMode = LightClientDataImportMode.OnlyNew) serve: true,
importMode: LightClientDataImportMode.OnlyNew))
quarantine = newClone(Quarantine.init()) quarantine = newClone(Quarantine.init())
taskpool = Taskpool.new() taskpool = Taskpool.new()
var verifier = BatchVerifier(rng: keys.newRng(), taskpool: taskpool) var verifier = BatchVerifier(rng: keys.newRng(), taskpool: taskpool)
@ -185,8 +186,9 @@ suite "Light client" & preset():
dag.headState, dag.getForkedBlock(dag.head.bid).get) dag.headState, dag.getForkedBlock(dag.head.bid).get)
let cpDag = ChainDAGRef.init( let cpDag = ChainDAGRef.init(
cfg, cpDb, validatorMonitor, {}, cfg, cpDb, validatorMonitor, {},
lightClientDataServe = true, lcDataConfig = LightClientDataConfig(
lightClientDataImportMode = LightClientDataImportMode.Full) serve: true,
importMode: LightClientDataImportMode.Full))
# Advance by a couple epochs # Advance by a couple epochs
for i in 1'u64 .. 10: for i in 1'u64 .. 10:

View File

@ -30,8 +30,9 @@ suite "Light client processor" & preset():
validatorMonitor = newClone(ValidatorMonitor.init()) validatorMonitor = newClone(ValidatorMonitor.init())
dag = ChainDAGRef.init( dag = ChainDAGRef.init(
cfg, makeTestDB(numValidators), validatorMonitor, {}, cfg, makeTestDB(numValidators), validatorMonitor, {},
lightClientDataServe = true, lcDataConfig = LightClientDataConfig(
lightClientDataImportMode = LightClientDataImportMode.OnlyNew) serve: true,
importMode: LightClientDataImportMode.OnlyNew))
quarantine = newClone(Quarantine.init()) quarantine = newClone(Quarantine.init())
taskpool = Taskpool.new() taskpool = Taskpool.new()
var verifier = BatchVerifier(rng: keys.newRng(), taskpool: taskpool) var verifier = BatchVerifier(rng: keys.newRng(), taskpool: taskpool)