Skip to content

Commit

Permalink
Merge pull request #3680 from ethereum/validator-guide-aggregate
Browse files Browse the repository at this point in the history
Use validator guide `compute_on_chain_aggregate` in testing
  • Loading branch information
ralexstokes authored Apr 17, 2024
2 parents da0667b + e6e7c92 commit b02be79
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 58 deletions.
7 changes: 6 additions & 1 deletion specs/electra/validator.md
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,12 @@ def compute_on_chain_aggregate(network_aggregates: Sequence[Attestation]) -> Att
committee_flags = [(index in committee_indices) for index in range(0, MAX_COMMITTEES_PER_SLOT)]
committee_bits = Bitvector[MAX_COMMITTEES_PER_SLOT](committee_flags)

return Attestation(aggregation_bits, data, committee_bits, signature)
return Attestation(
aggregation_bits=aggregation_bits,
data=data,
committee_bits=committee_bits,
signature=signature,
)
```

#### Deposits
Expand Down
59 changes: 2 additions & 57 deletions tests/core/pyspec/eth2spec/test/helpers/attestations.py
Original file line number Diff line number Diff line change
Expand Up @@ -225,51 +225,6 @@ def participants_filter(comm):
)


def _get_aggregate_committee_indices(spec, attestations):
"""
Aggregate all unique committee indices from the given attestations.
"""
all_committee_indices = set()
for attestation in attestations:
committee_indices = spec.get_committee_indices(attestation.committee_bits)
assert len(committee_indices) == 1
all_committee_indices.add(committee_indices[0])

return all_committee_indices


def _aggregate_aggregation_bits_and_signatures(spec, state, slot, aggregate, attestations):
"""
Aggregate the aggregation bits and signatures from the attestations,
incorporating the calculation of aggregation bits offset directly.
"""
# initialize aggregation bits for the aggregate attestation
aggregate.aggregation_bits = get_empty_eip7549_aggregation_bits(
spec, state, aggregate.committee_bits, slot)

signatures = []

offset = 0
attestations = sorted(attestations, key=lambda att: spec.get_committee_indices(att.committee_bits)[0])
for attestation in attestations:
# retrieve the single committee index for the attestation.
committee_index = spec.get_committee_indices(attestation.committee_bits)[0]

# update the aggregate's aggregation bits based on each attestation.
for i, bit in enumerate(attestation.aggregation_bits):
aggregate.aggregation_bits[offset + i] = bit

# collect signatures for aggregation.
signatures.append(attestation.signature)

# update offset
committee = spec.get_beacon_committee(state, slot, committee_index)
offset += len(committee)

# aggregate signatures from all attestations.
aggregate.signature = bls.Aggregate(signatures)


def get_valid_attestation_at_slot(state, spec, slot_to_attest, participation_fn=None, beacon_block_root=None):
"""
Return the aggregate attestation post Electra.
Expand All @@ -282,19 +237,9 @@ def get_valid_attestation_at_slot(state, spec, slot_to_attest, participation_fn=
beacon_block_root=beacon_block_root,
))
if not attestations:
return None

# initialize the aggregate attestation.
aggregate = spec.Attestation(data=attestations[0].data)

# fill in committee_bits
all_committee_indices = _get_aggregate_committee_indices(spec, attestations)
for committee_index in all_committee_indices:
aggregate.committee_bits[committee_index] = True

_aggregate_aggregation_bits_and_signatures(spec, state, slot_to_attest, aggregate, attestations)
raise Exception("No valid attestations found")

return aggregate
return spec.compute_on_chain_aggregate(attestations)


def next_slots_with_attestations(spec,
Expand Down

0 comments on commit b02be79

Please sign in to comment.