Add `PeerDAS` feature

This commit is contained in:
Hsiao-Wei Wang 2024-01-05 18:43:37 +08:00
parent 5854c7efb8
commit 7f8858b2ac
No known key found for this signature in database
GPG Key ID: AE3D6B174F971DE4
11 changed files with 157 additions and 2 deletions

1
.gitignore vendored
View File

@ -24,6 +24,7 @@ tests/core/pyspec/eth2spec/deneb/
tests/core/pyspec/eth2spec/eip6110/ tests/core/pyspec/eth2spec/eip6110/
tests/core/pyspec/eth2spec/eip7002/ tests/core/pyspec/eth2spec/eip7002/
tests/core/pyspec/eth2spec/whisk/ tests/core/pyspec/eth2spec/whisk/
tests/core/pyspec/eth2spec/peerdas/
# coverage reports # coverage reports
.htmlcov .htmlcov

View File

@ -35,7 +35,7 @@ MARKDOWN_FILES = $(wildcard $(SPEC_DIR)/*/*.md) \
$(wildcard $(SPEC_DIR)/_features/*/*/*.md) \ $(wildcard $(SPEC_DIR)/_features/*/*/*.md) \
$(wildcard $(SSZ_DIR)/*.md) $(wildcard $(SSZ_DIR)/*.md)
ALL_EXECUTABLE_SPEC_NAMES = phase0 altair bellatrix capella deneb eip6110 eip7002 whisk ALL_EXECUTABLE_SPEC_NAMES = phase0 altair bellatrix capella deneb eip6110 eip7002 whisk peerdas
# The parameters for commands. Use `foreach` to avoid listing specs again. # The parameters for commands. Use `foreach` to avoid listing specs again.
COVERAGE_SCOPE := $(foreach S,$(ALL_EXECUTABLE_SPEC_NAMES), --cov=eth2spec.$S.$(TEST_PRESET_TYPE)) COVERAGE_SCOPE := $(foreach S,$(ALL_EXECUTABLE_SPEC_NAMES), --cov=eth2spec.$S.$(TEST_PRESET_TYPE))
PYLINT_SCOPE := $(foreach S,$(ALL_EXECUTABLE_SPEC_NAMES), ./eth2spec/$S) PYLINT_SCOPE := $(foreach S,$(ALL_EXECUTABLE_SPEC_NAMES), ./eth2spec/$S)

View File

@ -154,3 +154,7 @@ BLOB_SIDECAR_SUBNET_COUNT: 6
WHISK_EPOCHS_PER_SHUFFLING_PHASE: 256 WHISK_EPOCHS_PER_SHUFFLING_PHASE: 256
# `Epoch(2)` # `Epoch(2)`
WHISK_PROPOSER_SELECTION_GAP: 2 WHISK_PROPOSER_SELECTION_GAP: 2
# PEERDAS
PEERDAS_FORK_VERSION: 0x06000001
PEERDAS_FORK_EPOCH: 18446744073709551615

View File

@ -153,3 +153,7 @@ BLOB_SIDECAR_SUBNET_COUNT: 6
# Whisk # Whisk
WHISK_EPOCHS_PER_SHUFFLING_PHASE: 4 WHISK_EPOCHS_PER_SHUFFLING_PHASE: 4
WHISK_PROPOSER_SELECTION_GAP: 1 WHISK_PROPOSER_SELECTION_GAP: 1
# PEERDAS
PEERDAS_FORK_VERSION: 0x06000001
PEERDAS_FORK_EPOCH: 18446744073709551615

View File

@ -7,6 +7,7 @@ DENEB = 'deneb'
EIP6110 = 'eip6110' EIP6110 = 'eip6110'
EIP7002 = 'eip7002' EIP7002 = 'eip7002'
WHISK = 'whisk' WHISK = 'whisk'
PEERDAS = 'peerdas'

View File

@ -9,6 +9,7 @@ from .constants import (
EIP6110, EIP6110,
WHISK, WHISK,
EIP7002, EIP7002,
PEERDAS,
) )
@ -21,6 +22,7 @@ PREVIOUS_FORK_OF = {
EIP6110: DENEB, EIP6110: DENEB,
WHISK: CAPELLA, WHISK: CAPELLA,
EIP7002: CAPELLA, EIP7002: CAPELLA,
PEERDAS: DENEB,
} }
ALL_FORKS = list(PREVIOUS_FORK_OF.keys()) ALL_FORKS = list(PREVIOUS_FORK_OF.keys())

View File

@ -6,12 +6,13 @@ from .deneb import DenebSpecBuilder
from .eip6110 import EIP6110SpecBuilder from .eip6110 import EIP6110SpecBuilder
from .eip7002 import EIP7002SpecBuilder from .eip7002 import EIP7002SpecBuilder
from .whisk import WhiskSpecBuilder from .whisk import WhiskSpecBuilder
from .peerdas import PeerDASSpecBuilder
spec_builders = { spec_builders = {
builder.fork: builder builder.fork: builder
for builder in ( for builder in (
Phase0SpecBuilder, AltairSpecBuilder, BellatrixSpecBuilder, CapellaSpecBuilder, DenebSpecBuilder, Phase0SpecBuilder, AltairSpecBuilder, BellatrixSpecBuilder, CapellaSpecBuilder, DenebSpecBuilder,
EIP6110SpecBuilder, EIP7002SpecBuilder, WhiskSpecBuilder, EIP6110SpecBuilder, EIP7002SpecBuilder, WhiskSpecBuilder, PeerDASSpecBuilder,
) )
} }

View File

@ -0,0 +1,14 @@
from typing import Dict
from .base import BaseSpecBuilder
from ..constants import PEERDAS
class PeerDASSpecBuilder(BaseSpecBuilder):
fork: str = PEERDAS
@classmethod
def imports(cls, preset_name: str):
return f'''
from eth2spec.deneb import {preset_name} as deneb
'''

View File

@ -0,0 +1,125 @@
# PeerDAS -- Fork Logic
**Notice**: This document is a work-in-progress for researchers and implementers.
## Table of contents
<!-- 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)
- [Configuration](#configuration)
- [Helper functions](#helper-functions)
- [Misc](#misc)
- [Modified `compute_fork_version`](#modified-compute_fork_version)
- [Fork to PeerDAS](#fork-to-peerdas)
- [Fork trigger](#fork-trigger)
- [Upgrading the state](#upgrading-the-state)
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
## Introduction
This document describes the process of PeerDAS upgrade.
## Configuration
Warning: this configuration is not definitive.
| Name | Value |
| - | - |
| `PEERDAS_FORK_VERSION` | `Version('0x05000000')` |
| `PEERDAS_FORK_EPOCH` | `Epoch(18446744073709551615)` **TBD** |
## Helper functions
### Misc
#### Modified `compute_fork_version`
```python
def compute_fork_version(epoch: Epoch) -> Version:
"""
Return the fork version at the given ``epoch``.
"""
if epoch >= PEERDAS_FORK_EPOCH:
return PEERDAS_FORK_VERSION
if epoch >= DENEB_FORK_EPOCH:
return DENEB_FORK_VERSION
if epoch >= CAPELLA_FORK_EPOCH:
return CAPELLA_FORK_VERSION
if epoch >= BELLATRIX_FORK_EPOCH:
return BELLATRIX_FORK_VERSION
if epoch >= ALTAIR_FORK_EPOCH:
return ALTAIR_FORK_VERSION
return GENESIS_FORK_VERSION
```
## Fork to PeerDAS
### Fork trigger
PeerDAS does not need a hard fork. We only add this fork doc for compiling this new feature in pyspec.
For now, we assume the condition will be triggered at epoch `PEERDAS_FORK_EPOCH`.
Note that for the pure PeerDAS networks, we don't apply `upgrade_to_peerdas` since it starts with PeerDAS version logic.
### Upgrading the state
If `state.slot % SLOTS_PER_EPOCH == 0` and `compute_epoch_at_slot(state.slot) == PEERDAS_FORK_EPOCH`,
an irregular state change is made to upgrade to PeerDAS.
```python
def upgrade_to_peerdas(pre: deneb.BeaconState) -> BeaconState:
epoch = deneb.get_current_epoch(pre)
post = BeaconState(
# Versioning
genesis_time=pre.genesis_time,
genesis_validators_root=pre.genesis_validators_root,
slot=pre.slot,
fork=Fork(
previous_version=pre.fork.current_version,
current_version=PEERDAS_FORK_VERSION, # [Modified in PeerDAS]
epoch=epoch,
),
# History
latest_block_header=pre.latest_block_header,
block_roots=pre.block_roots,
state_roots=pre.state_roots,
historical_roots=pre.historical_roots,
# Eth1
eth1_data=pre.eth1_data,
eth1_data_votes=pre.eth1_data_votes,
eth1_deposit_index=pre.eth1_deposit_index,
# Registry
validators=pre.validators,
balances=pre.balances,
# Randomness
randao_mixes=pre.randao_mixes,
# Slashings
slashings=pre.slashings,
# Participation
previous_epoch_participation=pre.previous_epoch_participation,
current_epoch_participation=pre.current_epoch_participation,
# Finality
justification_bits=pre.justification_bits,
previous_justified_checkpoint=pre.previous_justified_checkpoint,
current_justified_checkpoint=pre.current_justified_checkpoint,
finalized_checkpoint=pre.finalized_checkpoint,
# Inactivity
inactivity_scores=pre.inactivity_scores,
# Sync
current_sync_committee=pre.current_sync_committee,
next_sync_committee=pre.next_sync_committee,
# Execution-layer
latest_execution_payload_header=pre.latest_execution_payload_header,
# Withdrawals
next_withdrawal_index=pre.next_withdrawal_index,
next_withdrawal_validator_index=pre.next_withdrawal_validator_index,
# Deep history valid from Capella onwards
historical_summaries=pre.historical_summaries,
)
return post
```

View File

@ -19,6 +19,7 @@ DAS = SpecForkName('das')
EIP6110 = SpecForkName('eip6110') EIP6110 = SpecForkName('eip6110')
EIP7002 = SpecForkName('eip7002') EIP7002 = SpecForkName('eip7002')
WHISK = SpecForkName('whisk') WHISK = SpecForkName('whisk')
PEERDAS = SpecForkName('peerdas')
# #
# SpecFork settings # SpecFork settings
@ -37,6 +38,7 @@ ALL_PHASES = (
# Experimental patches # Experimental patches
EIP6110, EIP6110,
EIP7002, EIP7002,
PEERDAS,
) )
# The forks that have light client specs # The forks that have light client specs
LIGHT_CLIENT_TESTING_FORKS = (*[item for item in MAINNET_FORKS if item != PHASE0], DENEB) LIGHT_CLIENT_TESTING_FORKS = (*[item for item in MAINNET_FORKS if item != PHASE0], DENEB)
@ -57,6 +59,7 @@ PREVIOUS_FORK_OF = {
EIP6110: DENEB, EIP6110: DENEB,
WHISK: CAPELLA, WHISK: CAPELLA,
EIP7002: CAPELLA, EIP7002: CAPELLA,
PEERDAS: DENEB,
} }
# For fork transition tests # For fork transition tests