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:
Jacek Sieka 2021-10-07 15:19:47 +02:00 committed by GitHub
parent dfb87f1d5b
commit fabec894dd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 16 additions and 19 deletions

View File

@ -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)

View File

@ -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

View File

@ -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