-
Notifications
You must be signed in to change notification settings - Fork 977
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #3559 from dapplion/attestation-index
EIP-7549: Move committee index outside Attestation
- Loading branch information
Showing
19 changed files
with
299 additions
and
44 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
from .base import BaseSpecBuilder | ||
from ..constants import EIP7549 | ||
|
||
|
||
class EIP7549SpecBuilder(BaseSpecBuilder): | ||
fork: str = EIP7549 | ||
|
||
@classmethod | ||
def imports(cls, preset_name: str): | ||
return super().imports(preset_name) + f''' | ||
''' |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,138 @@ | ||
# EIP-7549 -- The Beacon Chain | ||
|
||
## Table of contents | ||
|
||
<!-- TOC --> | ||
<!-- START doctoc generated TOC please keep comment here to allow auto update --> | ||
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE --> | ||
|
||
- [Introduction](#introduction) | ||
- [Preset](#preset) | ||
- [Containers](#containers) | ||
- [Modified containers](#modified-containers) | ||
- [`Attestation`](#attestation) | ||
- [`IndexedAttestation`](#indexedattestation) | ||
- [Helper functions](#helper-functions) | ||
- [Misc](#misc) | ||
- [`get_committee_indices`](#get_committee_indices) | ||
- [Beacon state accessors](#beacon-state-accessors) | ||
- [Modified `get_attesting_indices`](#modified-get_attesting_indices) | ||
- [Block processing](#block-processing) | ||
- [Modified `process_attestation`](#modified-process_attestation) | ||
|
||
<!-- END doctoc generated TOC please keep comment here to allow auto update --> | ||
<!-- /TOC --> | ||
|
||
## Introduction | ||
|
||
This is the beacon chain specification to move the attestation committee index outside of the signed message. For motivation, refer to [EIP-7549](https://eips.ethereum.org/EIPS/eip-7549). | ||
|
||
*Note:* This specification is built upon [Deneb](../../deneb/beacon_chain.md) and is under active development. | ||
|
||
## Preset | ||
|
||
| Name | Value | Description | | ||
| - | - | - | | ||
| `MAX_ATTESTER_SLASHINGS` | `2**0` (= 1) | | ||
| `MAX_ATTESTATIONS` | `2**3` (= 8) | | ||
|
||
## Containers | ||
|
||
### Modified containers | ||
|
||
#### `Attestation` | ||
|
||
```python | ||
class Attestation(Container): | ||
aggregation_bits: List[Bitlist[MAX_VALIDATORS_PER_COMMITTEE], MAX_COMMITTEES_PER_SLOT] # [Modified in EIP7549] | ||
data: AttestationData | ||
committee_bits: Bitvector[MAX_COMMITTEES_PER_SLOT] # [New in EIP7549] | ||
signature: BLSSignature | ||
``` | ||
|
||
#### `IndexedAttestation` | ||
|
||
```python | ||
class IndexedAttestation(Container): | ||
# [Modified in EIP7549] | ||
attesting_indices: List[ValidatorIndex, MAX_VALIDATORS_PER_COMMITTEE * MAX_COMMITTEES_PER_SLOT] | ||
data: AttestationData | ||
signature: BLSSignature | ||
``` | ||
|
||
## Helper functions | ||
|
||
### Misc | ||
|
||
#### `get_committee_indices` | ||
|
||
```python | ||
def get_committee_indices(commitee_bits: Bitvector) -> List[CommitteeIndex]: | ||
return [CommitteeIndex(index) for bit, index in enumerate(commitee_bits) if bit] | ||
``` | ||
|
||
### Beacon state accessors | ||
|
||
#### Modified `get_attesting_indices` | ||
|
||
```python | ||
def get_attesting_indices(state: BeaconState, attestation: Attestation) -> Set[ValidatorIndex]: | ||
""" | ||
Return the set of attesting indices corresponding to ``aggregation_bits`` and ``committee_bits``. | ||
""" | ||
|
||
output = set() | ||
committee_indices = get_committee_indices(attestation.committee_bits) | ||
for index in committee_indices: | ||
attesting_bits = attestation.aggregation_bits[index] | ||
committee = get_beacon_committee(state, attestation.data.slot, index) | ||
committee_attesters = set(index for i, index in enumerate(committee) if attesting_bits[i]) | ||
output = output.union(committee_attesters) | ||
|
||
return output | ||
``` | ||
|
||
### Block processing | ||
|
||
#### Modified `process_attestation` | ||
|
||
```python | ||
def process_attestation(state: BeaconState, attestation: Attestation) -> None: | ||
data = attestation.data | ||
assert data.target.epoch in (get_previous_epoch(state), get_current_epoch(state)) | ||
assert data.target.epoch == compute_epoch_at_slot(data.slot) | ||
assert data.slot + MIN_ATTESTATION_INCLUSION_DELAY <= state.slot | ||
|
||
# [Modified in EIP7549] | ||
assert data.index == 0 | ||
committee_indices = get_committee_indices(attestation.committee_bits) | ||
assert len(committee_indices) == len(attestation.aggregation_bits) | ||
for index in committee_indices: | ||
assert index < get_committee_count_per_slot(state, data.target.epoch) | ||
committee = get_beacon_committee(state, data.slot, index) | ||
assert len(attestation.aggregation_bits[index]) == len(committee) | ||
|
||
# Participation flag indices | ||
participation_flag_indices = get_attestation_participation_flag_indices(state, data, state.slot - data.slot) | ||
|
||
# Verify signature | ||
assert is_valid_indexed_attestation(state, get_indexed_attestation(state, attestation)) | ||
|
||
# Update epoch participation flags | ||
if data.target.epoch == get_current_epoch(state): | ||
epoch_participation = state.current_epoch_participation | ||
else: | ||
epoch_participation = state.previous_epoch_participation | ||
|
||
proposer_reward_numerator = 0 | ||
for index in get_attesting_indices(state, attestation): | ||
for flag_index, weight in enumerate(PARTICIPATION_FLAG_WEIGHTS): | ||
if flag_index in participation_flag_indices and not has_flag(epoch_participation[index], flag_index): | ||
epoch_participation[index] = add_flag(epoch_participation[index], flag_index) | ||
proposer_reward_numerator += get_base_reward(state, index) * weight | ||
|
||
# Reward proposer | ||
proposer_reward_denominator = (WEIGHT_DENOMINATOR - PROPOSER_WEIGHT) * WEIGHT_DENOMINATOR // PROPOSER_WEIGHT | ||
proposer_reward = Gwei(proposer_reward_numerator // proposer_reward_denominator) | ||
increase_balance(state, get_beacon_proposer_index(state), proposer_reward) | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
# EIP-7549 -- Networking | ||
|
||
This document contains the consensus-layer networking specification for EIP-7549. | ||
|
||
The specification of these changes continues in the same format as the network specifications of previous upgrades, and assumes them as pre-requisite. | ||
|
||
## Table of contents | ||
|
||
<!-- TOC --> | ||
<!-- START doctoc generated TOC please keep comment here to allow auto update --> | ||
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE --> | ||
|
||
- [Modifications in EIP-7549](#modifications-in-eip-7549) | ||
- [The gossip domain: gossipsub](#the-gossip-domain-gossipsub) | ||
- [Topics and messages](#topics-and-messages) | ||
- [Global topics](#global-topics) | ||
- [`beacon_aggregate_and_proof`](#beacon_aggregate_and_proof) | ||
- [`beacon_attestation_{subnet_id}`](#beacon_attestation_subnet_id) | ||
|
||
<!-- END doctoc generated TOC please keep comment here to allow auto update --> | ||
<!-- /TOC --> | ||
|
||
## Modifications in EIP-7549 | ||
|
||
### The gossip domain: gossipsub | ||
|
||
#### Topics and messages | ||
|
||
The `beacon_aggregate_and_proof` and `beacon_attestation_{subnet_id}` topics are modified to support the gossip of a new attestation type. | ||
|
||
##### Global topics | ||
|
||
###### `beacon_aggregate_and_proof` | ||
|
||
*[Modified in EIP7549]* | ||
|
||
The following convenience variables are re-defined | ||
- `index = get_committee_indices(aggregate.committee_bits)[0]` | ||
- `aggregation_bits = aggregate.aggregation_bits[0]` | ||
|
||
The following validations are added: | ||
* [REJECT] `len(committee_indices) == len(aggregate.attestation_bits) == 1`, where `committee_indices = get_committee_indices(aggregate)`. | ||
* [REJECT] `aggregate.data.index == 0` | ||
|
||
###### `beacon_attestation_{subnet_id}` | ||
|
||
The following convenience variables are re-defined | ||
- `index = get_committee_indices(attestation.committee_bits)[0]` | ||
- `aggregation_bits = attestation.aggregation_bits[0]` | ||
|
||
The following validations are added: | ||
* [REJECT] `len(committee_indices) == len(attestation.attestation_bits) == 1`, where `committee_indices = get_committee_indices(attestation)`. | ||
* [REJECT] `attestation.data.index == 0` | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
# Deneb -- Honest Validator | ||
|
||
## Table of contents | ||
|
||
<!-- TOC --> | ||
<!-- START doctoc generated TOC please keep comment here to allow auto update --> | ||
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE --> | ||
|
||
- [Modifications in EIP-7549](#modifications-in-eip-7549) | ||
- [Block proposal](#block-proposal) | ||
- [Constructing the `BeaconBlockBody`](#constructing-the-beaconblockbody) | ||
- [Attestations](#attestations) | ||
- [Attesting](#attesting) | ||
- [Construct attestation](#construct-attestation) | ||
- [Attestation aggregation](#attestation-aggregation) | ||
- [Construct aggregate](#construct-aggregate) | ||
|
||
<!-- END doctoc generated TOC please keep comment here to allow auto update --> | ||
<!-- /TOC --> | ||
|
||
## Modifications in EIP-7549 | ||
|
||
### Block proposal | ||
|
||
#### Constructing the `BeaconBlockBody` | ||
|
||
##### Attestations | ||
|
||
Attestations received from aggregators with disjoint `committee_bits` sets and equal `AttestationData` SHOULD be consolidated into a single `Attestation` object. | ||
|
||
### Attesting | ||
|
||
#### Construct attestation | ||
|
||
- Set `attestation_data.index = 0`. | ||
- Let `aggregation_bits` be a `Bitlist[MAX_VALIDATORS_PER_COMMITTEE]` of length `len(committee)`, where the bit of the index of the validator in the `committee` is set to `0b1`. | ||
- Set `attestation.aggregation_bits = [aggregation_bits]`, a list of length 1 | ||
- Let `committee_bits` be a `Bitvector[MAX_COMMITTEES_PER_SLOT]`, where the bit at the index associated with the validator's committee is set to `0b1` | ||
- Set `attestation.committee_bits = committee_bits` | ||
|
||
*Note*: Calling `get_attesting_indices(state, attestation)` should return a list of length equal to 1, containing `validator_index`. | ||
|
||
### Attestation aggregation | ||
|
||
#### Construct aggregate | ||
|
||
- Set `attestation_data.index = 0`. | ||
- Let `aggregation_bits` be a `Bitlist[MAX_VALIDATORS_PER_COMMITTEE]` of length `len(committee)`, where each bit set from each individual attestation is set to `0b1`. | ||
- Set `attestation.aggregation_bits = [aggregation_bits]`, a list of length 1 | ||
- Set `attestation.committee_bits = committee_bits`, where `committee_bits` has the same value as in each individual attestation | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.