Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use validator guide compute_on_chain_aggregate in testing #3680

Merged
merged 2 commits into from
Apr 17, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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,
)
Comment on lines +69 to +74
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

actually, I don't understand why this fixed the CI error...

without this fix, the result aggregate.data.target.epoch is 0 when it should be 2 in some tests.

/cc @protolambda, in case you can share some remerkleable wisdom. 🧙‍♂️

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

not sure either, but I'll just assume there is some subtlety in how remerkleable initializes things

```

#### 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
Loading