use epochref for get_committee_assignments() to avoid repeated shuffling (#2463)
* use epochref for get_committee_assignments() to avoid repeated shuffling * remove unnecessary imports and StateCache() construction
This commit is contained in:
parent
a9938a2067
commit
bd8b60f8c8
|
@ -8,10 +8,10 @@
|
|||
{.push raises: [Defect].}
|
||||
|
||||
import
|
||||
std/[algorithm, sequtils],
|
||||
std/[algorithm, intsets, sequtils],
|
||||
chronicles,
|
||||
../spec/[
|
||||
crypto, datatypes, digest, helpers, presets, signatures,
|
||||
crypto, datatypes, digest, helpers, network, presets, signatures,
|
||||
validator],
|
||||
../extras,
|
||||
./block_pools_types, ./blockchain_dag
|
||||
|
@ -193,3 +193,26 @@ func makeAttestationData*(
|
|||
root: epoch_boundary_block.blck.root
|
||||
)
|
||||
)
|
||||
|
||||
# https://github.com/ethereum/eth2.0-specs/blob/v1.0.1/specs/phase0/validator.md#validator-assignments
|
||||
iterator get_committee_assignments*(
|
||||
epochRef: EpochRef, epoch: Epoch, validator_indices: IntSet):
|
||||
tuple[validatorIndices: IntSet,
|
||||
committeeIndex: CommitteeIndex,
|
||||
subnetIndex: uint8, slot: Slot] =
|
||||
let
|
||||
committees_per_slot = get_committee_count_per_slot(epochRef)
|
||||
start_slot = compute_start_slot_at_epoch(epoch)
|
||||
|
||||
for slot in start_slot ..< start_slot + SLOTS_PER_EPOCH:
|
||||
for index in 0'u64 ..< committees_per_slot:
|
||||
let
|
||||
idx = index.CommitteeIndex
|
||||
includedIndices =
|
||||
toIntSet(get_beacon_committee(epochRef, slot, idx)) *
|
||||
validator_indices
|
||||
if includedIndices.len > 0:
|
||||
yield (
|
||||
includedIndices, idx,
|
||||
compute_subnet_for_attestation(committees_per_slot, slot, idx).uint8,
|
||||
slot)
|
||||
|
|
|
@ -463,8 +463,6 @@ proc updateSubscriptionSchedule(node: BeaconNode, epoch: Epoch) {.async.} =
|
|||
attachedValidators = node.getAttachedValidators()
|
||||
validatorIndices = toIntSet(toSeq(attachedValidators.keys()))
|
||||
|
||||
var cache = StateCache()
|
||||
|
||||
# https://github.com/ethereum/eth2.0-specs/blob/v1.0.1/specs/phase0/validator.md#lookahead
|
||||
# Only subscribe when this node should aggregate; libp2p broadcasting works
|
||||
# on subnet topics regardless.
|
||||
|
@ -496,8 +494,7 @@ proc updateSubscriptionSchedule(node: BeaconNode, epoch: Epoch) {.async.} =
|
|||
static: doAssert SLOTS_PER_EPOCH <= 32
|
||||
|
||||
for (validatorIndices, committeeIndex, subnetIndex, slot) in
|
||||
get_committee_assignments(
|
||||
node.chainDag.headState.data.data, epoch, validatorIndices, cache):
|
||||
get_committee_assignments(epochRef, epoch, validatorIndices):
|
||||
|
||||
doAssert compute_epoch_at_slot(slot) == epoch
|
||||
|
||||
|
@ -653,14 +650,13 @@ proc getInitialAttestationSubnets(node: BeaconNode): Table[uint8, Slot] =
|
|||
wallEpoch = node.beaconClock.now().slotOrZero().epoch
|
||||
validatorIndices = toIntSet(toSeq(node.getAttachedValidators().keys()))
|
||||
|
||||
var cache = StateCache()
|
||||
|
||||
template mergeAttestationSubnets(epoch: Epoch) =
|
||||
# TODO when https://github.com/nim-lang/Nim/issues/15972 and
|
||||
# https://github.com/nim-lang/Nim/issues/16217 are fixed, in
|
||||
# Nimbus's Nim, use (_, _, subnetIndex, slot).
|
||||
let epochRef = node.chainDag.getEpochRef(node.chainDag.head, epoch)
|
||||
for (_, ci, subnetIndex, slot) in get_committee_assignments(
|
||||
node.chainDag.headState.data.data, epoch, validatorIndices, cache):
|
||||
epochRef, epoch, validatorIndices):
|
||||
result.withValue(subnetIndex, v) do:
|
||||
v[] = max(v[], slot + 1)
|
||||
do:
|
||||
|
|
|
@ -8,8 +8,8 @@
|
|||
{.push raises: [Defect].}
|
||||
|
||||
import
|
||||
std/[intsets, strformat],
|
||||
./datatypes, ./helpers, ./validator
|
||||
std/strformat,
|
||||
./datatypes
|
||||
|
||||
const
|
||||
# https://github.com/ethereum/eth2.0-specs/blob/v1.0.1/specs/phase0/p2p-interface.md#topics-and-messages
|
||||
|
@ -85,28 +85,3 @@ func getAttestationTopic*(forkDigest: ForkDigest, subnetIndex: uint64):
|
|||
&"/eth2/{$forkDigest}/beacon_attestation_{subnetIndex}/ssz"
|
||||
except ValueError as e:
|
||||
raiseAssert e.msg
|
||||
|
||||
# https://github.com/ethereum/eth2.0-specs/blob/v1.0.1/specs/phase0/validator.md#validator-assignments
|
||||
iterator get_committee_assignments*(
|
||||
state: BeaconState, epoch: Epoch,
|
||||
validator_indices: IntSet,
|
||||
cache: var StateCache):
|
||||
tuple[validatorIndices: IntSet,
|
||||
committeeIndex: CommitteeIndex,
|
||||
subnetIndex: uint8, slot: Slot] =
|
||||
let
|
||||
committees_per_slot = get_committee_count_per_slot(state, epoch, cache)
|
||||
start_slot = compute_start_slot_at_epoch(epoch)
|
||||
|
||||
for slot in start_slot ..< start_slot + SLOTS_PER_EPOCH:
|
||||
for index in 0'u64 ..< committees_per_slot:
|
||||
let
|
||||
idx = index.CommitteeIndex
|
||||
includedIndices =
|
||||
toIntSet(get_beacon_committee(state, slot, idx, cache)) *
|
||||
validator_indices
|
||||
if includedIndices.len > 0:
|
||||
yield (
|
||||
includedIndices, idx,
|
||||
compute_subnet_for_attestation(committees_per_slot, slot, idx).uint8,
|
||||
slot)
|
||||
|
|
Loading…
Reference in New Issue