mirror of
https://github.com/status-im/nimbus-eth2.git
synced 2025-02-02 17:53:52 +00:00
harden sync sub committee selection (#2965)
* harden sync sub committee selection also turn it into an iterator * fix test and warning
This commit is contained in:
parent
dfb87f1d5b
commit
fabec894dd
@ -1027,19 +1027,16 @@ proc pruneBlocksDAG(dag: ChainDAGRef) =
|
|||||||
prunedHeads = hlen - dag.heads.len,
|
prunedHeads = hlen - dag.heads.len,
|
||||||
dagPruneDur = Moment.now() - startTick
|
dagPruneDur = Moment.now() - startTick
|
||||||
|
|
||||||
func syncSubcommittee*(syncCommittee: openarray[ValidatorPubKey],
|
iterator syncSubcommittee*(
|
||||||
committeeIdx: SyncCommitteeIndex): seq[ValidatorPubKey] =
|
syncCommittee: openarray[ValidatorPubKey],
|
||||||
## TODO Return a view type
|
committeeIdx: SyncCommitteeIndex): ValidatorPubKey =
|
||||||
## Unfortunately, this doesn't work as a template right now.
|
var
|
||||||
if syncCommittee.len == 0:
|
i = committeeIdx.asInt * SYNC_SUBCOMMITTEE_SIZE
|
||||||
return @[]
|
onePastEndIdx = min(syncCommittee.len, i + SYNC_SUBCOMMITTEE_SIZE)
|
||||||
|
|
||||||
let
|
while i < onePastEndIdx:
|
||||||
startIdx = committeeIdx.asInt * SYNC_SUBCOMMITTEE_SIZE
|
yield syncCommittee[i]
|
||||||
onePastEndIdx = startIdx + SYNC_SUBCOMMITTEE_SIZE
|
inc i
|
||||||
doAssert startIdx < syncCommittee.len
|
|
||||||
|
|
||||||
@(toOpenArray(syncCommittee, startIdx, onePastEndIdx - 1))
|
|
||||||
|
|
||||||
func syncCommitteeParticipants*(dagParam: ChainDAGRef,
|
func syncCommitteeParticipants*(dagParam: ChainDAGRef,
|
||||||
slotParam: Slot): seq[ValidatorPubKey] =
|
slotParam: Slot): seq[ValidatorPubKey] =
|
||||||
@ -1081,7 +1078,7 @@ func getSubcommitteePositionsAux(
|
|||||||
return @[]
|
return @[]
|
||||||
let validatorPubKey = validatorKey.get().toPubKey
|
let validatorPubKey = validatorKey.get().toPubKey
|
||||||
|
|
||||||
for pos, key in syncCommittee.syncSubcommittee(committeeIdx):
|
for pos, key in toSeq(syncCommittee.syncSubcommittee(committeeIdx)):
|
||||||
if validatorPubKey == key:
|
if validatorPubKey == key:
|
||||||
result.add uint64(pos)
|
result.add uint64(pos)
|
||||||
|
|
||||||
|
@ -68,7 +68,7 @@ type
|
|||||||
of BeaconBlockFork.Merge:
|
of BeaconBlockFork.Merge:
|
||||||
mergeBlock*: merge.TrustedSignedBeaconBlock
|
mergeBlock*: merge.TrustedSignedBeaconBlock
|
||||||
|
|
||||||
ForkDigests* {.requiresInit.} = object
|
ForkDigests* = object
|
||||||
phase0*: ForkDigest
|
phase0*: ForkDigest
|
||||||
altair*: ForkDigest
|
altair*: ForkDigest
|
||||||
merge*: ForkDigest
|
merge*: ForkDigest
|
||||||
|
@ -178,13 +178,13 @@ suite "Gossip validation " & preset():
|
|||||||
suite "Gossip validation - Extra": # Not based on preset config
|
suite "Gossip validation - Extra": # Not based on preset config
|
||||||
test "validateSyncCommitteeMessage":
|
test "validateSyncCommitteeMessage":
|
||||||
const num_validators = SLOTS_PER_EPOCH
|
const num_validators = SLOTS_PER_EPOCH
|
||||||
let
|
let
|
||||||
cfg = block:
|
cfg = block:
|
||||||
var cfg = defaultRuntimeConfig
|
var cfg = defaultRuntimeConfig
|
||||||
cfg.ALTAIR_FORK_EPOCH = (GENESIS_EPOCH + 1).Epoch
|
cfg.ALTAIR_FORK_EPOCH = (GENESIS_EPOCH + 1).Epoch
|
||||||
cfg
|
cfg
|
||||||
dag = block:
|
dag = block:
|
||||||
let
|
let
|
||||||
dag = ChainDAGRef.init(cfg, makeTestDB(num_validators), {})
|
dag = ChainDAGRef.init(cfg, makeTestDB(num_validators), {})
|
||||||
taskpool = Taskpool.new()
|
taskpool = Taskpool.new()
|
||||||
quarantine = QuarantineRef.init(keys.newRng(), taskpool)
|
quarantine = QuarantineRef.init(keys.newRng(), taskpool)
|
||||||
@ -192,7 +192,7 @@ suite "Gossip validation - Extra": # Not based on preset config
|
|||||||
for blck in makeTestBlocks(
|
for blck in makeTestBlocks(
|
||||||
dag.headState.data, dag.head.root, cache,
|
dag.headState.data, dag.head.root, cache,
|
||||||
int(SLOTS_PER_EPOCH), false, cfg = cfg):
|
int(SLOTS_PER_EPOCH), false, cfg = cfg):
|
||||||
let added =
|
let added =
|
||||||
case blck.kind
|
case blck.kind
|
||||||
of BeaconBlockFork.Phase0:
|
of BeaconBlockFork.Phase0:
|
||||||
const nilCallback = OnPhase0BlockAdded(nil)
|
const nilCallback = OnPhase0BlockAdded(nil)
|
||||||
@ -210,7 +210,7 @@ suite "Gossip validation - Extra": # Not based on preset config
|
|||||||
|
|
||||||
syncCommitteeIdx = 0.SyncCommitteeIndex
|
syncCommitteeIdx = 0.SyncCommitteeIndex
|
||||||
syncCommittee = @(dag.syncCommitteeParticipants(state[].data.slot))
|
syncCommittee = @(dag.syncCommitteeParticipants(state[].data.slot))
|
||||||
subcommittee = syncCommittee.syncSubcommittee(syncCommitteeIdx)
|
subcommittee = toSeq(syncCommittee.syncSubcommittee(syncCommitteeIdx))
|
||||||
|
|
||||||
pubkey = subcommittee[0]
|
pubkey = subcommittee[0]
|
||||||
expectedCount = subcommittee.count(pubkey)
|
expectedCount = subcommittee.count(pubkey)
|
||||||
@ -225,7 +225,7 @@ suite "Gossip validation - Extra": # Not based on preset config
|
|||||||
|
|
||||||
syncCommitteeMsgPool = newClone(SyncCommitteeMsgPool.init())
|
syncCommitteeMsgPool = newClone(SyncCommitteeMsgPool.init())
|
||||||
res = validateSyncCommitteeMessage(
|
res = validateSyncCommitteeMessage(
|
||||||
dag, syncCommitteeMsgPool, msg, syncCommitteeIdx,
|
dag, syncCommitteeMsgPool, msg, syncCommitteeIdx,
|
||||||
state[].data.slot.toBeaconTime(), true)
|
state[].data.slot.toBeaconTime(), true)
|
||||||
contribution = block:
|
contribution = block:
|
||||||
var contribution: SyncCommitteeContribution
|
var contribution: SyncCommitteeContribution
|
||||||
|
Loading…
x
Reference in New Issue
Block a user