-
Notifications
You must be signed in to change notification settings - Fork 987
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
Separate type for aggregated committee attestation #4005
base: dev
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -28,6 +28,7 @@ | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- [Construct attestation](#construct-attestation) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
- [Attestation aggregation](#attestation-aggregation) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
- [Construct aggregate](#construct-aggregate) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
- [Broadcast aggregate](#broadcast-aggregate) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
<!-- END doctoc generated TOC please keep comment here to allow auto update --> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
<!-- /TOC --> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -66,7 +67,7 @@ class GetPayloadResponse(object): | |||||||||||||||||||||||||||||||||||||||||||||||||||||
```python | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
class AggregateAndProof(Container): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
aggregator_index: ValidatorIndex | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
aggregate: Attestation # [Modified in Electra:EIP7549] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
aggregate: CommitteeAttestation # [Modified in Electra:EIP7549] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
selection_proof: BLSSignature | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
``` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -109,22 +110,22 @@ Changed the max attester slashings size to `MAX_ATTESTER_SLASHINGS_ELECTRA`. | |||||||||||||||||||||||||||||||||||||||||||||||||||||
Changed the max attestations size to `MAX_ATTESTATIONS_ELECTRA`. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
The network attestation aggregates contain only the assigned committee attestations. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
Attestation aggregates received by the block proposer from the committee aggregators with disjoint `committee_bits` sets and equal `AttestationData` SHOULD be consolidated into a single `Attestation` object. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
The proposer should run the following function to construct an on chain final aggregate form a list of network aggregates with equal `AttestationData`: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
Committee attestations received by the block proposer from the committee aggregators with different `committee_index` sets and equal `AttestationData` SHOULD be consolidated into a single `Attestation` object. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
The proposer should run the following function to construct an on chain final aggregate form a list of committee attestations with equal `AttestationData`: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
```python | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
def compute_on_chain_aggregate(network_aggregates: Sequence[Attestation]) -> Attestation: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
aggregates = sorted(network_aggregates, key=lambda a: get_committee_indices(a.committee_bits)[0]) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
def compute_on_chain_aggregate(committee_attestations: Sequence[CommitteeAttestation]) -> Attestation: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
attestations = sorted(committee_attestations, key=lambda a: a.committee_index) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
data = aggregates[0].data | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
data = attestations[0].data | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
aggregation_bits = Bitlist[MAX_VALIDATORS_PER_COMMITTEE * MAX_COMMITTEES_PER_SLOT]() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
for a in aggregates: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
for b in a.aggregation_bits: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
aggregation_bits.append(b) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
signature = bls.Aggregate([a.signature for a in aggregates]) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
committee_indices = [get_committee_indices(a.committee_bits)[0] for a in aggregates] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
committee_indices = [a.committee_index for a in aggregates] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
committee_flags = [(index in committee_indices) for index in range(0, MAX_COMMITTEES_PER_SLOT)] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
committee_bits = Bitvector[MAX_COMMITTEES_PER_SLOT](committee_flags) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -220,4 +221,30 @@ with updated field assignments: | |||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
- Set `attestation_data.index = 0`. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
- Let `aggregation_bits` be a `Bitlist[MAX_VALIDATORS_PER_COMMITTEE * MAX_COMMITTEES_PER_SLOT]` of length `len(committee)`, where each bit set from each individual attestation is set to `0b1`. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
- Set `attestation.committee_bits = committee_bits`, where `committee_bits` has the bit set corresponding to `committee_index` in each individual attestation. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
- Set `attestation.committee_index = committee_index`, where `committee_index` is the `committee_index` in each individual attestation. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Making it the same as in "Construct attestation" would be easier. Reordering this to be the second one as in "Construct attestation" would even be better.
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
#### Aggregate signature | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
Set `aggregate_attestation.signature = aggregate_signature` where `aggregate_signature` is obtained from: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
```python | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
def get_aggregate_signature(attestations: Sequence[CommitteeAttestation]) -> BLSSignature: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
signatures = [attestation.signature for attestation in attestations] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
return bls.Aggregate(signatures) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
``` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
### Broadcast aggregate | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
`get_aggregate_and_proof` is modified to accept `CommitteeAttestation` for `aggregate`. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
```python | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
def get_aggregate_and_proof(state: BeaconState, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
aggregator_index: ValidatorIndex, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
committee_attestation: CommitteeAttestation, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
privkey: int) -> AggregateAndProof: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
return AggregateAndProof( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
aggregator_index=aggregator_index, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
aggregate=committee_attestation, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
selection_proof=get_slot_signature(state, aggregate.data.slot, privkey), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
``` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+225
to
+250
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think these two sections are trivial and wordy and unrelated to the change, right? I would say they are not needed.
Suggested change
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.