diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml
index 3e23d1910..2c7b9d883 100644
--- a/.github/workflows/run-tests.yml
+++ b/.github/workflows/run-tests.yml
@@ -30,7 +30,7 @@ on:
- cron: '0 0 * * *'
jobs:
- precleanup:
+ preclear:
runs-on: self-hosted
if: always()
steps:
@@ -40,43 +40,39 @@ jobs:
rm -rf ./* || true
rm -rf ./.??* || true
ls -la ./
- setup-env:
- runs-on: self-hosted
- needs: precleanup
- steps:
+
+ table_of_contents:
+ runs-on: self-hosted
+ needs: preclear
+ steps:
- name: Checkout this repo
uses: actions/checkout@v3.2.0
with:
ref: ${{ github.event.inputs.commitRef || env.DEFAULT_BRANCH }}
- - uses: actions/cache@v3.2.2
- id: cache-git
- with:
- path: ./*
- key: ${{ github.sha }}
-
- table_of_contents:
- runs-on: self-hosted
- needs: setup-env
- steps:
- - uses: actions/cache@v3.2.2
- id: restore-build
- with:
- path: ./*
- key: ${{ github.sha }}
- name: Check table of contents
run: sudo npm install -g doctoc@2 && make check_toc
codespell:
runs-on: self-hosted
- needs: setup-env
+ needs: preclear
steps:
+ - name: Checkout this repo
+ uses: actions/checkout@v3.2.0
+ with:
+ ref: ${{ github.event.inputs.commitRef || env.DEFAULT_BRANCH }}
- name: Check codespell
run: pip install 'codespell<3.0.0,>=2.0.0' --user && make codespell
lint:
runs-on: self-hosted
- needs: setup-env
+ needs: preclear
steps:
+ - name: Checkout this repo
+ uses: actions/checkout@v3.2.0
+ with:
+ ref: ${{ github.event.inputs.commitRef || env.DEFAULT_BRANCH }}
+ - name: Install pyspec requirements
+ run: make install_test
- name: Run linter for pyspec
run: make lint
- name: Run linter for test generators
@@ -84,16 +80,15 @@ jobs:
pyspec-tests:
runs-on: self-hosted
- needs: [setup-env,lint,codespell,table_of_contents]
+ needs: [preclear,lint,codespell,table_of_contents]
strategy:
matrix:
version: ["phase0", "altair", "bellatrix", "capella", "eip4844"]
steps:
- - uses: actions/cache@v3.2.2
- id: restore-build
+ - name: Checkout this repo
+ uses: actions/checkout@v3.2.0
with:
- path: ./*
- key: ${{ github.sha }}
+ ref: ${{ github.event.inputs.commitRef || env.DEFAULT_BRANCH }}
- name: set TEST_PRESET_TYPE
if: github.event.inputs.test_preset_type != ''
run: |
@@ -122,7 +117,7 @@ jobs:
cleanup:
runs-on: self-hosted
- needs: [setup-env,pyspec-tests,codespell,lint,table_of_contents]
+ needs: [preclear,pyspec-tests,codespell,lint,table_of_contents]
if: always()
steps:
- name: 'Cleanup build folder'
diff --git a/README.md b/README.md
index 0827e06a4..ed8771cb0 100644
--- a/README.md
+++ b/README.md
@@ -25,7 +25,7 @@ Features are researched and developed in parallel, and then consolidated into se
| Code Name or Topic | Specs | Notes |
| - | - | - |
| Capella (tentative) |
- Core
- [Beacon chain changes](specs/capella/beacon-chain.md)
- [Capella fork](specs/capella/fork.md)
- Additions
- [Light client sync protocol changes](specs/capella/light-client/sync-protocol.md) ([fork](specs/capella/light-client/fork.md), [full node](specs/capella/light-client/full-node.md), [networking](specs/capella/light-client/p2p-interface.md))
- [Validator additions](specs/capella/validator.md)
- [P2P networking](specs/capella/p2p-interface.md)
|
-| EIP4844 (tentative) | - Core
- [Beacon Chain changes](specs/eip4844/beacon-chain.md)
- [EIP-4844 fork](specs/eip4844/fork.md)
- [Polynomial commitments](specs/eip4844/polynomial-commitments.md)
- Additions
- [Light client sync protocol changes](specs/eip4844/light-client/sync-protocol.md) ([fork](specs/eip4844/light-client/fork.md), [full node](specs/eip4844/light-client/full-node.md), [networking](specs/eip4844/light-client/p2p-interface.md))
- [Honest validator guide changes](specs/eip4844/validator.md)
- [P2P networking](specs/eip4844/p2p-interface.md)
|
+| EIP4844 (tentative) | - Core
- [Beacon Chain changes](specs/eip4844/beacon-chain.md)
- [EIP-4844 fork](specs/eip4844/fork.md)
- [Polynomial commitments](specs/eip4844/polynomial-commitments.md)
- [Fork choice changes](specs/eip4844/fork-choice.md)
- Additions
- [Light client sync protocol changes](specs/eip4844/light-client/sync-protocol.md) ([fork](specs/eip4844/light-client/fork.md), [full node](specs/eip4844/light-client/full-node.md), [networking](specs/eip4844/light-client/p2p-interface.md))
- [Honest validator guide changes](specs/eip4844/validator.md)
- [P2P networking](specs/eip4844/p2p-interface.md)
|
| Sharding (outdated) | - Core
- [Beacon Chain changes](specs/sharding/beacon-chain.md)
- Additions
- [P2P networking](specs/sharding/p2p-interface.md)
|
| Custody Game (outdated) | - Core
- [Beacon Chain changes](specs/custody_game/beacon-chain.md)
- Additions
- [Honest validator guide changes](specs/custody_game/validator.md)
| Dependent on sharding |
| Data Availability Sampling (outdated) | - Core
- [Core types and functions](specs/das/das-core.md)
- [Fork choice changes](specs/das/fork-choice.md)
- Additions
- [P2P Networking](specs/das/p2p-interface.md)
- [Sampling process](specs/das/sampling.md)
| - Dependent on sharding
- [Technical explainer](https://hackmd.io/@HWeNw8hNRimMm2m2GH56Cw/B1YJPGkpD)
|
diff --git a/setup.py b/setup.py
index e42cb814d..9102f819b 100644
--- a/setup.py
+++ b/setup.py
@@ -653,35 +653,6 @@ T = TypeVar('T') # For generic function
@classmethod
def sundry_functions(cls) -> str:
return super().sundry_functions() + '\n\n' + '''
-#
-# Temporarily disable Withdrawals functions for EIP4844 testnets
-#
-
-
-def no_op(fn): # type: ignore
- # pylint: disable=unused-argument
- def wrapper(*args, **kw): # type: ignore
- return None
- return wrapper
-
-
-def get_empty_list_result(fn): # type: ignore
- # pylint: disable=unused-argument
- def wrapper(*args, **kw): # type: ignore
- return []
- return wrapper
-
-
-process_withdrawals = no_op(process_withdrawals)
-process_bls_to_execution_change = no_op(process_bls_to_execution_change)
-get_expected_withdrawals = get_empty_list_result(get_expected_withdrawals)
-process_historical_summaries_update = no_op(process_historical_summaries_update)
-
-
-#
-# End
-#
-
def retrieve_blobs_sidecar(slot: Slot, beacon_block_root: Root) -> PyUnion[BlobsSidecar, str]:
# pylint: disable=unused-argument
return "TEST"'''
@@ -1045,6 +1016,7 @@ class PySpecCommand(Command):
specs/eip4844/light-client/sync-protocol.md
specs/eip4844/beacon-chain.md
specs/eip4844/fork.md
+ specs/eip4844/fork-choice.md
specs/eip4844/polynomial-commitments.md
specs/eip4844/p2p-interface.md
specs/eip4844/validator.md
diff --git a/specs/capella/beacon-chain.md b/specs/capella/beacon-chain.md
index bd7a2c50c..9a04f2f38 100644
--- a/specs/capella/beacon-chain.md
+++ b/specs/capella/beacon-chain.md
@@ -53,6 +53,11 @@ to validator withdrawals. Including:
* Operation to change from `BLS_WITHDRAWAL_PREFIX` to
`ETH1_ADDRESS_WITHDRAWAL_PREFIX` versioned withdrawal credentials to enable withdrawals for a validator.
+Another new feature is the new independent state and block historical accumulators
+that replace the original singular historical roots. With these accumulators, it becomes possible to validate
+the entire block history that led up to that particular state without any additional information
+beyond the state and the blocks.
+
## Custom types
We define the following Python custom types for type hinting and readability:
diff --git a/specs/eip4844/beacon-chain.md b/specs/eip4844/beacon-chain.md
index 19acb57d8..f681ab951 100644
--- a/specs/eip4844/beacon-chain.md
+++ b/specs/eip4844/beacon-chain.md
@@ -22,8 +22,6 @@
- [`ExecutionPayloadHeader`](#executionpayloadheader)
- [Helper functions](#helper-functions)
- [Misc](#misc)
- - [`validate_blobs_sidecar`](#validate_blobs_sidecar)
- - [`is_data_available`](#is_data_available)
- [`kzg_commitment_to_versioned_hash`](#kzg_commitment_to_versioned_hash)
- [`tx_peek_blob_versioned_hashes`](#tx_peek_blob_versioned_hashes)
- [`verify_kzg_commitments_against_transactions`](#verify_kzg_commitments_against_transactions)
@@ -33,7 +31,6 @@
- [`process_execution_payload`](#process_execution_payload)
- [Blob KZG commitments](#blob-kzg-commitments)
- [Testing](#testing)
- - [Disabling Withdrawals](#disabling-withdrawals)
@@ -146,46 +143,6 @@ class ExecutionPayloadHeader(Container):
### Misc
-#### `validate_blobs_sidecar`
-
-```python
-def validate_blobs_sidecar(slot: Slot,
- beacon_block_root: Root,
- expected_kzg_commitments: Sequence[KZGCommitment],
- blobs_sidecar: BlobsSidecar) -> None:
- assert slot == blobs_sidecar.beacon_block_slot
- assert beacon_block_root == blobs_sidecar.beacon_block_root
- blobs = blobs_sidecar.blobs
- kzg_aggregated_proof = blobs_sidecar.kzg_aggregated_proof
- assert len(expected_kzg_commitments) == len(blobs)
-
- assert verify_aggregate_kzg_proof(blobs, expected_kzg_commitments, kzg_aggregated_proof)
-```
-
-#### `is_data_available`
-
-The implementation of `is_data_available` will become more sophisticated during later sharding upgrades.
-Initially, it requires every verifying actor to retrieve the matching `BlobsSidecar`,
-and validate the sidecar with `validate_blobs_sidecar`.
-
-The block MUST NOT be considered valid until a valid `BlobsSidecar` has been downloaded. Blocks that have been previously validated as available SHOULD be considered available even if the associated `BlobsSidecar` has subsequently been pruned.
-
-```python
-def is_data_available(slot: Slot, beacon_block_root: Root, blob_kzg_commitments: Sequence[KZGCommitment]) -> bool:
- # `retrieve_blobs_sidecar` is implementation and context dependent, raises an exception if not available.
- # Note: the p2p network does not guarantee sidecar retrieval outside of `MIN_EPOCHS_FOR_BLOBS_SIDECARS_REQUESTS`
- sidecar = retrieve_blobs_sidecar(slot, beacon_block_root)
-
- # For testing, `retrieve_blobs_sidecar` returns "TEST".
- # TODO: Remove it once we have a way to inject `BlobsSidecar` into tests.
- if isinstance(sidecar, str):
- return True
-
- validate_blobs_sidecar(slot, beacon_block_root, blob_kzg_commitments, sidecar)
- return True
-```
-
-
#### `kzg_commitment_to_versioned_hash`
```python
@@ -241,9 +198,6 @@ def process_block(state: BeaconState, block: BeaconBlock) -> None:
process_operations(state, block.body)
process_sync_aggregate(state, block.body.sync_aggregate)
process_blob_kzg_commitments(state, block.body) # [New in EIP-4844]
-
- # New in EIP-4844
- assert is_data_available(block.slot, hash_tree_root(block), block.body.blob_kzg_commitments)
```
#### Execution payload
@@ -346,11 +300,3 @@ def initialize_beacon_state_from_eth1(eth1_block_hash: Hash32,
return state
```
-
-### Disabling Withdrawals
-
-During testing we avoid Capella-specific updates to the state transition. We do this by replacing the following functions with a no-op implementation:
-- `process_withdrawals`
-- `process_bls_to_execution_change`
-
-The `get_expected_withdrawals` function is also modified to return an empty withdrawals list. As such, the `PayloadAttributes` used to update forkchoice does not contain withdrawals.
diff --git a/specs/eip4844/fork-choice.md b/specs/eip4844/fork-choice.md
new file mode 100644
index 000000000..8dea28ded
--- /dev/null
+++ b/specs/eip4844/fork-choice.md
@@ -0,0 +1,137 @@
+# EIP-4844 -- Fork Choice
+
+## Table of contents
+
+
+
+
+- [Introduction](#introduction)
+- [Containers](#containers)
+ - [`BlobsSidecar`](#blobssidecar)
+- [Helpers](#helpers)
+ - [`validate_blobs_sidecar`](#validate_blobs_sidecar)
+ - [`is_data_available`](#is_data_available)
+- [Updated fork-choice handlers](#updated-fork-choice-handlers)
+ - [`on_block`](#on_block)
+
+
+
+
+## Introduction
+
+This is the modification of the fork choice accompanying the EIP-4844 upgrade.
+
+## Containers
+
+### `BlobsSidecar`
+
+```python
+class BlobsSidecar(Container):
+ beacon_block_root: Root
+ beacon_block_slot: Slot
+ blobs: List[Blob, MAX_BLOBS_PER_BLOCK]
+ kzg_aggregated_proof: KZGProof
+```
+
+## Helpers
+
+#### `validate_blobs_sidecar`
+
+```python
+def validate_blobs_sidecar(slot: Slot,
+ beacon_block_root: Root,
+ expected_kzg_commitments: Sequence[KZGCommitment],
+ blobs_sidecar: BlobsSidecar) -> None:
+ assert slot == blobs_sidecar.beacon_block_slot
+ assert beacon_block_root == blobs_sidecar.beacon_block_root
+ blobs = blobs_sidecar.blobs
+ kzg_aggregated_proof = blobs_sidecar.kzg_aggregated_proof
+ assert len(expected_kzg_commitments) == len(blobs)
+
+ assert verify_aggregate_kzg_proof(blobs, expected_kzg_commitments, kzg_aggregated_proof)
+```
+
+#### `is_data_available`
+
+The implementation of `is_data_available` will become more sophisticated during later scaling upgrades.
+Initially, verification requires every verifying actor to retrieve the matching `BlobsSidecar`,
+and validate the sidecar with `validate_blobs_sidecar`.
+
+The block MUST NOT be considered valid until a valid `BlobsSidecar` has been downloaded. Blocks that have been previously validated as available SHOULD be considered available even if the associated `BlobsSidecar` has subsequently been pruned.
+
+```python
+def is_data_available(slot: Slot, beacon_block_root: Root, blob_kzg_commitments: Sequence[KZGCommitment]) -> bool:
+ # `retrieve_blobs_sidecar` is implementation and context dependent, raises an exception if not available.
+ # Note: the p2p network does not guarantee sidecar retrieval outside of `MIN_EPOCHS_FOR_BLOBS_SIDECARS_REQUESTS`
+ sidecar = retrieve_blobs_sidecar(slot, beacon_block_root)
+
+ # For testing, `retrieve_blobs_sidecar` returns "TEST".
+ # TODO: Remove it once we have a way to inject `BlobsSidecar` into tests.
+ if isinstance(sidecar, str):
+ return True
+
+ validate_blobs_sidecar(slot, beacon_block_root, blob_kzg_commitments, sidecar)
+ return True
+```
+
+## Updated fork-choice handlers
+
+### `on_block`
+
+*Note*: The only modification is the addition of the verification of transition block conditions.
+
+```python
+def on_block(store: Store, signed_block: SignedBeaconBlock) -> None:
+ """
+ Run ``on_block`` upon receiving a new block.
+ """
+ block = signed_block.message
+ # Parent block must be known
+ assert block.parent_root in store.block_states
+ # Make a copy of the state to avoid mutability issues
+ pre_state = copy(store.block_states[block.parent_root])
+ # Blocks cannot be in the future. If they are, their consideration must be delayed until they are in the past.
+ assert get_current_slot(store) >= block.slot
+
+ # Check that block is later than the finalized epoch slot (optimization to reduce calls to get_ancestor)
+ finalized_slot = compute_start_slot_at_epoch(store.finalized_checkpoint.epoch)
+ assert block.slot > finalized_slot
+ # Check block is a descendant of the finalized block at the checkpoint finalized slot
+ assert get_ancestor(store, block.parent_root, finalized_slot) == store.finalized_checkpoint.root
+
+ # [New in EIP-4844]
+ # Check if blob data is available
+ # If not, this block MAY be queued and subsequently considered when blob data becomes available
+ assert is_data_available(block.slot, hash_tree_root(block), block.body.blob_kzg_commitments)
+
+ # Check the block is valid and compute the post-state
+ state = pre_state.copy()
+ state_transition(state, signed_block, True)
+
+ # Check the merge transition
+ if is_merge_transition_block(pre_state, block.body):
+ validate_merge_block(block)
+
+ # Add new block to the store
+ store.blocks[hash_tree_root(block)] = block
+ # Add new state for this block to the store
+ store.block_states[hash_tree_root(block)] = state
+
+ # Add proposer score boost if the block is timely
+ time_into_slot = (store.time - store.genesis_time) % SECONDS_PER_SLOT
+ is_before_attesting_interval = time_into_slot < SECONDS_PER_SLOT // INTERVALS_PER_SLOT
+ if get_current_slot(store) == block.slot and is_before_attesting_interval:
+ store.proposer_boost_root = hash_tree_root(block)
+
+ # Update justified checkpoint
+ if state.current_justified_checkpoint.epoch > store.justified_checkpoint.epoch:
+ if state.current_justified_checkpoint.epoch > store.best_justified_checkpoint.epoch:
+ store.best_justified_checkpoint = state.current_justified_checkpoint
+ if should_update_justified_checkpoint(store, state.current_justified_checkpoint):
+ store.justified_checkpoint = state.current_justified_checkpoint
+
+ # Update finalized checkpoint
+ if state.finalized_checkpoint.epoch > store.finalized_checkpoint.epoch:
+ store.finalized_checkpoint = state.finalized_checkpoint
+ store.justified_checkpoint = state.current_justified_checkpoint
+```
diff --git a/specs/eip4844/p2p-interface.md b/specs/eip4844/p2p-interface.md
index 1f5fd55cd..f2e8d9ac6 100644
--- a/specs/eip4844/p2p-interface.md
+++ b/specs/eip4844/p2p-interface.md
@@ -12,7 +12,6 @@ The specification of these changes continues in the same format as the network s
- [Configuration](#configuration)
- [Containers](#containers)
- - [`BlobsSidecar`](#blobssidecar)
- [`SignedBeaconBlockAndBlobsSidecar`](#signedbeaconblockandblobssidecar)
- [The gossip domain: gossipsub](#the-gossip-domain-gossipsub)
- [Topics and messages](#topics-and-messages)
@@ -41,16 +40,6 @@ The specification of these changes continues in the same format as the network s
## Containers
-### `BlobsSidecar`
-
-```python
-class BlobsSidecar(Container):
- beacon_block_root: Root
- beacon_block_slot: Slot
- blobs: List[Blob, MAX_BLOBS_PER_BLOCK]
- kzg_aggregated_proof: KZGProof
-```
-
### `SignedBeaconBlockAndBlobsSidecar`
```python
diff --git a/tests/core/pyspec/eth2spec/VERSION.txt b/tests/core/pyspec/eth2spec/VERSION.txt
index 79c724242..b73f10e65 100644
--- a/tests/core/pyspec/eth2spec/VERSION.txt
+++ b/tests/core/pyspec/eth2spec/VERSION.txt
@@ -1 +1 @@
-1.3.0-alpha.2
+1.3.0-rc.0
diff --git a/tests/core/pyspec/eth2spec/test/bellatrix/sync/test_optimistic.py b/tests/core/pyspec/eth2spec/test/bellatrix/sync/test_optimistic.py
index 974719f92..eb56e368a 100644
--- a/tests/core/pyspec/eth2spec/test/bellatrix/sync/test_optimistic.py
+++ b/tests/core/pyspec/eth2spec/test/bellatrix/sync/test_optimistic.py
@@ -64,6 +64,7 @@ def test_from_syncing_to_invalid(spec, state):
block.body.execution_payload.parent_hash = (
block_hashes[f'chain_a_{i - 1}'] if i != 0 else block_hashes['block_0']
)
+ block.body.execution_payload.extra_data = spec.hash(bytes(f'chain_a_{i}', 'UTF-8'))
block.body.execution_payload.block_hash = compute_el_block_hash(spec, block.body.execution_payload)
block_hashes[f'chain_a_{i}'] = block.body.execution_payload.block_hash
@@ -80,6 +81,7 @@ def test_from_syncing_to_invalid(spec, state):
block.body.execution_payload.parent_hash = (
block_hashes[f'chain_b_{i - 1}'] if i != 0 else block_hashes['block_0']
)
+ block.body.execution_payload.extra_data = spec.hash(bytes(f'chain_b_{i}', 'UTF-8'))
block.body.execution_payload.block_hash = compute_el_block_hash(spec, block.body.execution_payload)
block_hashes[f'chain_b_{i}'] = block.body.execution_payload.block_hash
@@ -92,9 +94,13 @@ def test_from_syncing_to_invalid(spec, state):
# Now add block 4 to chain `b` with INVALID
block = build_empty_block_for_next_slot(spec, state)
block.body.execution_payload.parent_hash = signed_blocks_b[-1].message.body.execution_payload.block_hash
+ block.body.execution_payload.extra_data = spec.hash(bytes(f'chain_b_{i}', 'UTF-8'))
block.body.execution_payload.block_hash = compute_el_block_hash(spec, block.body.execution_payload)
block_hashes['chain_b_3'] = block.body.execution_payload.block_hash
+ # Ensure that no duplicate block hashes
+ assert len(block_hashes) == len(set(block_hashes.values()))
+
signed_block = state_transition_and_sign_block(spec, state, block)
payload_status = PayloadStatusV1(
status=PayloadStatusV1Status.INVALID,
diff --git a/tests/core/pyspec/eth2spec/test/capella/block_processing/test_process_bls_to_execution_change.py b/tests/core/pyspec/eth2spec/test/capella/block_processing/test_process_bls_to_execution_change.py
index 6a1ba5b36..094de5eeb 100644
--- a/tests/core/pyspec/eth2spec/test/capella/block_processing/test_process_bls_to_execution_change.py
+++ b/tests/core/pyspec/eth2spec/test/capella/block_processing/test_process_bls_to_execution_change.py
@@ -1,8 +1,7 @@
-from eth2spec.test.helpers.constants import CAPELLA
from eth2spec.test.helpers.keys import pubkeys
from eth2spec.test.helpers.bls_to_execution_changes import get_signed_address_change
-from eth2spec.test.context import spec_state_test, expect_assertion_error, with_phases, always_bls
+from eth2spec.test.context import spec_state_test, expect_assertion_error, with_capella_and_later, always_bls
def run_bls_to_execution_change_processing(spec, state, signed_address_change, valid=True):
@@ -38,14 +37,14 @@ def run_bls_to_execution_change_processing(spec, state, signed_address_change, v
yield 'post', state
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_success(spec, state):
signed_address_change = get_signed_address_change(spec, state)
yield from run_bls_to_execution_change_processing(spec, state, signed_address_change)
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_success_not_activated(spec, state):
validator_index = 3
@@ -63,7 +62,7 @@ def test_success_not_activated(spec, state):
assert not spec.is_fully_withdrawable_validator(validator, balance, spec.get_current_epoch(state))
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_success_in_activation_queue(spec, state):
validator_index = 3
@@ -81,7 +80,7 @@ def test_success_in_activation_queue(spec, state):
assert not spec.is_fully_withdrawable_validator(validator, balance, spec.get_current_epoch(state))
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_success_in_exit_queue(spec, state):
validator_index = 3
@@ -94,7 +93,7 @@ def test_success_in_exit_queue(spec, state):
yield from run_bls_to_execution_change_processing(spec, state, signed_address_change)
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_success_exited(spec, state):
validator_index = 4
@@ -111,7 +110,7 @@ def test_success_exited(spec, state):
assert not spec.is_fully_withdrawable_validator(validator, balance, spec.get_current_epoch(state))
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_success_withdrawable(spec, state):
validator_index = 4
@@ -129,7 +128,7 @@ def test_success_withdrawable(spec, state):
assert spec.is_fully_withdrawable_validator(validator, balance, spec.get_current_epoch(state))
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_invalid_val_index_out_of_range(spec, state):
# Create for one validator beyond the validator list length
@@ -138,7 +137,7 @@ def test_invalid_val_index_out_of_range(spec, state):
yield from run_bls_to_execution_change_processing(spec, state, signed_address_change, valid=False)
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_invalid_already_0x01(spec, state):
# Create for one validator beyond the validator list length
@@ -150,7 +149,7 @@ def test_invalid_already_0x01(spec, state):
yield from run_bls_to_execution_change_processing(spec, state, signed_address_change, valid=False)
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_invalid_incorrect_from_bls_pubkey(spec, state):
# Create for one validator beyond the validator list length
@@ -164,7 +163,7 @@ def test_invalid_incorrect_from_bls_pubkey(spec, state):
yield from run_bls_to_execution_change_processing(spec, state, signed_address_change, valid=False)
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
@always_bls
def test_invalid_bad_signature(spec, state):
diff --git a/tests/core/pyspec/eth2spec/test/capella/block_processing/test_process_deposit.py b/tests/core/pyspec/eth2spec/test/capella/block_processing/test_process_deposit.py
index 685d17651..e0603d301 100644
--- a/tests/core/pyspec/eth2spec/test/capella/block_processing/test_process_deposit.py
+++ b/tests/core/pyspec/eth2spec/test/capella/block_processing/test_process_deposit.py
@@ -1,8 +1,7 @@
from eth2spec.test.context import (
spec_state_test,
- with_phases,
+ with_capella_and_later,
)
-from eth2spec.test.helpers.constants import CAPELLA
from eth2spec.test.helpers.state import next_epoch_via_block
from eth2spec.test.helpers.deposits import (
prepare_state_and_deposit,
@@ -11,7 +10,7 @@ from eth2spec.test.helpers.deposits import (
from eth2spec.test.helpers.withdrawals import set_validator_fully_withdrawable
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_success_top_up_to_withdrawn_validator(spec, state):
validator_index = 0
diff --git a/tests/core/pyspec/eth2spec/test/capella/block_processing/test_process_withdrawals.py b/tests/core/pyspec/eth2spec/test/capella/block_processing/test_process_withdrawals.py
index fa3806d2c..674231096 100644
--- a/tests/core/pyspec/eth2spec/test/capella/block_processing/test_process_withdrawals.py
+++ b/tests/core/pyspec/eth2spec/test/capella/block_processing/test_process_withdrawals.py
@@ -4,9 +4,9 @@ from eth2spec.test.context import (
spec_state_test,
expect_assertion_error,
with_presets,
- with_phases,
+ with_capella_and_later,
)
-from eth2spec.test.helpers.constants import MAINNET, MINIMAL, CAPELLA
+from eth2spec.test.helpers.constants import MAINNET, MINIMAL
from eth2spec.test.helpers.execution_payload import (
build_empty_execution_payload,
compute_el_block_hash,
@@ -97,7 +97,7 @@ def run_withdrawals_processing(spec, state, execution_payload, num_expected_with
return expected_withdrawals
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_success_zero_expected_withdrawals(spec, state):
assert len(spec.get_expected_withdrawals(state)) == 0
@@ -108,7 +108,7 @@ def test_success_zero_expected_withdrawals(spec, state):
yield from run_withdrawals_processing(spec, state, execution_payload)
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_success_one_full_withdrawal(spec, state):
fully_withdrawable_indices, partial_withdrawals_indices = prepare_expected_withdrawals(
@@ -125,7 +125,7 @@ def test_success_one_full_withdrawal(spec, state):
partial_withdrawals_indices=partial_withdrawals_indices)
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_success_one_partial_withdrawal(spec, state):
fully_withdrawable_indices, partial_withdrawals_indices = prepare_expected_withdrawals(
@@ -145,7 +145,7 @@ def test_success_one_partial_withdrawal(spec, state):
)
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_success_max_per_slot(spec, state):
num_full_withdrawals = spec.MAX_WITHDRAWALS_PER_PAYLOAD // 2
@@ -163,7 +163,7 @@ def test_success_max_per_slot(spec, state):
partial_withdrawals_indices=partial_withdrawals_indices)
-@with_phases([CAPELLA])
+@with_capella_and_later
@with_presets([MAINNET], reason="too few validators with minimal config")
@spec_state_test
def test_success_all_fully_withdrawable_in_one_sweep(spec, state):
@@ -182,7 +182,7 @@ def test_success_all_fully_withdrawable_in_one_sweep(spec, state):
partial_withdrawals_indices=partial_withdrawals_indices)
-@with_phases([CAPELLA])
+@with_capella_and_later
@with_presets([MINIMAL], reason="too many validators with mainnet config")
@spec_state_test
def test_success_all_fully_withdrawable(spec, state):
@@ -201,7 +201,7 @@ def test_success_all_fully_withdrawable(spec, state):
partial_withdrawals_indices=partial_withdrawals_indices)
-@with_phases([CAPELLA])
+@with_capella_and_later
@with_presets([MAINNET], reason="too few validators with minimal config")
@spec_state_test
def test_success_all_partially_withdrawable_in_one_sweep(spec, state):
@@ -220,7 +220,7 @@ def test_success_all_partially_withdrawable_in_one_sweep(spec, state):
partial_withdrawals_indices=partial_withdrawals_indices)
-@with_phases([CAPELLA])
+@with_capella_and_later
@with_presets([MINIMAL], reason="too many validators with mainnet config")
@spec_state_test
def test_success_all_partially_withdrawable(spec, state):
@@ -243,7 +243,7 @@ def test_success_all_partially_withdrawable(spec, state):
# Failure cases in which the number of withdrawals in the execution_payload is incorrect
#
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_invalid_non_withdrawable_non_empty_withdrawals(spec, state):
next_slot(spec, state)
@@ -260,7 +260,7 @@ def test_invalid_non_withdrawable_non_empty_withdrawals(spec, state):
yield from run_withdrawals_processing(spec, state, execution_payload, valid=False)
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_invalid_one_expected_full_withdrawal_and_none_in_withdrawals(spec, state):
prepare_expected_withdrawals(spec, state, num_full_withdrawals=1)
@@ -273,7 +273,7 @@ def test_invalid_one_expected_full_withdrawal_and_none_in_withdrawals(spec, stat
yield from run_withdrawals_processing(spec, state, execution_payload, valid=False)
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_invalid_one_expected_partial_withdrawal_and_none_in_withdrawals(spec, state):
prepare_expected_withdrawals(spec, state, num_partial_withdrawals=1)
@@ -286,7 +286,7 @@ def test_invalid_one_expected_partial_withdrawal_and_none_in_withdrawals(spec, s
yield from run_withdrawals_processing(spec, state, execution_payload, valid=False)
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_invalid_one_expected_full_withdrawal_and_duplicate_in_withdrawals(spec, state):
prepare_expected_withdrawals(spec, state, num_full_withdrawals=2)
@@ -299,7 +299,7 @@ def test_invalid_one_expected_full_withdrawal_and_duplicate_in_withdrawals(spec,
yield from run_withdrawals_processing(spec, state, execution_payload, valid=False)
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_invalid_two_expected_partial_withdrawal_and_duplicate_in_withdrawals(spec, state):
prepare_expected_withdrawals(spec, state, num_partial_withdrawals=2)
@@ -312,7 +312,7 @@ def test_invalid_two_expected_partial_withdrawal_and_duplicate_in_withdrawals(sp
yield from run_withdrawals_processing(spec, state, execution_payload, valid=False)
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_invalid_max_per_slot_full_withdrawals_and_one_less_in_withdrawals(spec, state):
prepare_expected_withdrawals(spec, state, num_full_withdrawals=spec.MAX_WITHDRAWALS_PER_PAYLOAD)
@@ -325,7 +325,7 @@ def test_invalid_max_per_slot_full_withdrawals_and_one_less_in_withdrawals(spec,
yield from run_withdrawals_processing(spec, state, execution_payload, valid=False)
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_invalid_max_per_slot_partial_withdrawals_and_one_less_in_withdrawals(spec, state):
prepare_expected_withdrawals(spec, state, num_partial_withdrawals=spec.MAX_WITHDRAWALS_PER_PAYLOAD)
@@ -338,7 +338,7 @@ def test_invalid_max_per_slot_partial_withdrawals_and_one_less_in_withdrawals(sp
yield from run_withdrawals_processing(spec, state, execution_payload, valid=False)
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_invalid_a_lot_fully_withdrawable_too_few_in_withdrawals(spec, state):
prepare_expected_withdrawals(spec, state, num_full_withdrawals=spec.MAX_WITHDRAWALS_PER_PAYLOAD * 4)
@@ -351,7 +351,7 @@ def test_invalid_a_lot_fully_withdrawable_too_few_in_withdrawals(spec, state):
yield from run_withdrawals_processing(spec, state, execution_payload, valid=False)
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_invalid_a_lot_partially_withdrawable_too_few_in_withdrawals(spec, state):
prepare_expected_withdrawals(spec, state, num_partial_withdrawals=spec.MAX_WITHDRAWALS_PER_PAYLOAD * 4)
@@ -364,7 +364,7 @@ def test_invalid_a_lot_partially_withdrawable_too_few_in_withdrawals(spec, state
yield from run_withdrawals_processing(spec, state, execution_payload, valid=False)
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_invalid_a_lot_mixed_withdrawable_in_queue_too_few_in_withdrawals(spec, state):
prepare_expected_withdrawals(spec, state, num_full_withdrawals=spec.MAX_WITHDRAWALS_PER_PAYLOAD,
@@ -382,7 +382,7 @@ def test_invalid_a_lot_mixed_withdrawable_in_queue_too_few_in_withdrawals(spec,
# Failure cases in which the withdrawals in the execution_payload are incorrect
#
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_invalid_incorrect_withdrawal_index(spec, state):
prepare_expected_withdrawals(spec, state, num_full_withdrawals=1)
@@ -395,7 +395,7 @@ def test_invalid_incorrect_withdrawal_index(spec, state):
yield from run_withdrawals_processing(spec, state, execution_payload, valid=False)
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_invalid_incorrect_address_full(spec, state):
prepare_expected_withdrawals(spec, state, num_full_withdrawals=1)
@@ -408,7 +408,7 @@ def test_invalid_incorrect_address_full(spec, state):
yield from run_withdrawals_processing(spec, state, execution_payload, valid=False)
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_invalid_incorrect_address_partial(spec, state):
prepare_expected_withdrawals(spec, state, num_partial_withdrawals=1)
@@ -421,7 +421,7 @@ def test_invalid_incorrect_address_partial(spec, state):
yield from run_withdrawals_processing(spec, state, execution_payload, valid=False)
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_invalid_incorrect_amount_full(spec, state):
prepare_expected_withdrawals(spec, state, num_full_withdrawals=1)
@@ -434,7 +434,7 @@ def test_invalid_incorrect_amount_full(spec, state):
yield from run_withdrawals_processing(spec, state, execution_payload, valid=False)
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_invalid_incorrect_amount_partial(spec, state):
prepare_expected_withdrawals(spec, state, num_full_withdrawals=1)
@@ -447,7 +447,7 @@ def test_invalid_incorrect_amount_partial(spec, state):
yield from run_withdrawals_processing(spec, state, execution_payload, valid=False)
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_invalid_one_of_many_incorrectly_full(spec, state):
prepare_expected_withdrawals(spec, state, num_full_withdrawals=spec.MAX_WITHDRAWALS_PER_PAYLOAD * 4)
@@ -466,7 +466,7 @@ def test_invalid_one_of_many_incorrectly_full(spec, state):
yield from run_withdrawals_processing(spec, state, execution_payload, valid=False)
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_invalid_one_of_many_incorrectly_partial(spec, state):
prepare_expected_withdrawals(spec, state, num_partial_withdrawals=spec.MAX_WITHDRAWALS_PER_PAYLOAD * 4)
@@ -485,7 +485,7 @@ def test_invalid_one_of_many_incorrectly_partial(spec, state):
yield from run_withdrawals_processing(spec, state, execution_payload, valid=False)
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_invalid_many_incorrectly_full(spec, state):
prepare_expected_withdrawals(spec, state, num_full_withdrawals=spec.MAX_WITHDRAWALS_PER_PAYLOAD * 4)
@@ -504,7 +504,7 @@ def test_invalid_many_incorrectly_full(spec, state):
yield from run_withdrawals_processing(spec, state, execution_payload, valid=False)
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_invalid_many_incorrectly_partial(spec, state):
prepare_expected_withdrawals(spec, state, num_partial_withdrawals=spec.MAX_WITHDRAWALS_PER_PAYLOAD * 4)
@@ -527,7 +527,7 @@ def test_invalid_many_incorrectly_partial(spec, state):
# More full withdrawal cases
#
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_withdrawable_epoch_but_0_balance(spec, state):
current_epoch = spec.get_current_epoch(state)
@@ -541,7 +541,7 @@ def test_withdrawable_epoch_but_0_balance(spec, state):
yield from run_withdrawals_processing(spec, state, execution_payload, num_expected_withdrawals=0)
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_withdrawable_epoch_but_0_effective_balance_0_balance(spec, state):
current_epoch = spec.get_current_epoch(state)
@@ -555,7 +555,7 @@ def test_withdrawable_epoch_but_0_effective_balance_0_balance(spec, state):
yield from run_withdrawals_processing(spec, state, execution_payload, num_expected_withdrawals=0)
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_withdrawable_epoch_but_0_effective_balance_nonzero_balance(spec, state):
current_epoch = spec.get_current_epoch(state)
@@ -569,7 +569,7 @@ def test_withdrawable_epoch_but_0_effective_balance_nonzero_balance(spec, state)
yield from run_withdrawals_processing(spec, state, execution_payload, num_expected_withdrawals=1)
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_no_withdrawals_but_some_next_epoch(spec, state):
current_epoch = spec.get_current_epoch(state)
@@ -583,7 +583,7 @@ def test_no_withdrawals_but_some_next_epoch(spec, state):
yield from run_withdrawals_processing(spec, state, execution_payload, num_expected_withdrawals=0)
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_all_withdrawal(spec, state):
# Make all validators withdrawable
@@ -619,25 +619,25 @@ def run_random_full_withdrawals_test(spec, state, rng):
yield from run_withdrawals_processing(spec, state, execution_payload)
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_random_full_withdrawals_0(spec, state):
yield from run_random_full_withdrawals_test(spec, state, random.Random(444))
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_random_full_withdrawals_1(spec, state):
yield from run_random_full_withdrawals_test(spec, state, random.Random(420))
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_random_full_withdrawals_2(spec, state):
yield from run_random_full_withdrawals_test(spec, state, random.Random(200))
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_random_full_withdrawals_3(spec, state):
yield from run_random_full_withdrawals_test(spec, state, random.Random(2000000))
@@ -647,7 +647,7 @@ def test_random_full_withdrawals_3(spec, state):
# More partial withdrawal cases
#
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_success_no_max_effective_balance(spec, state):
validator_index = len(state.validators) // 2
@@ -663,7 +663,7 @@ def test_success_no_max_effective_balance(spec, state):
yield from run_withdrawals_processing(spec, state, execution_payload, num_expected_withdrawals=0)
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_success_no_excess_balance(spec, state):
validator_index = len(state.validators) // 2
@@ -679,7 +679,7 @@ def test_success_no_excess_balance(spec, state):
yield from run_withdrawals_processing(spec, state, execution_payload, num_expected_withdrawals=0)
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_success_excess_balance_but_no_max_effective_balance(spec, state):
validator_index = len(state.validators) // 2
@@ -696,7 +696,7 @@ def test_success_excess_balance_but_no_max_effective_balance(spec, state):
yield from run_withdrawals_processing(spec, state, execution_payload, num_expected_withdrawals=0)
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_success_one_partial_withdrawable_not_yet_active(spec, state):
validator_index = min(len(state.validators) // 2, spec.MAX_VALIDATORS_PER_WITHDRAWALS_SWEEP - 1)
@@ -710,7 +710,7 @@ def test_success_one_partial_withdrawable_not_yet_active(spec, state):
yield from run_withdrawals_processing(spec, state, execution_payload, num_expected_withdrawals=1)
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_success_one_partial_withdrawable_in_exit_queue(spec, state):
validator_index = min(len(state.validators) // 2, spec.MAX_VALIDATORS_PER_WITHDRAWALS_SWEEP - 1)
@@ -725,7 +725,7 @@ def test_success_one_partial_withdrawable_in_exit_queue(spec, state):
yield from run_withdrawals_processing(spec, state, execution_payload, num_expected_withdrawals=1)
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_success_one_partial_withdrawable_exited(spec, state):
validator_index = min(len(state.validators) // 2, spec.MAX_VALIDATORS_PER_WITHDRAWALS_SWEEP - 1)
@@ -739,7 +739,7 @@ def test_success_one_partial_withdrawable_exited(spec, state):
yield from run_withdrawals_processing(spec, state, execution_payload, num_expected_withdrawals=1)
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_success_one_partial_withdrawable_active_and_slashed(spec, state):
validator_index = min(len(state.validators) // 2, spec.MAX_VALIDATORS_PER_WITHDRAWALS_SWEEP - 1)
@@ -753,7 +753,7 @@ def test_success_one_partial_withdrawable_active_and_slashed(spec, state):
yield from run_withdrawals_processing(spec, state, execution_payload, num_expected_withdrawals=1)
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_success_one_partial_withdrawable_exited_and_slashed(spec, state):
validator_index = min(len(state.validators) // 2, spec.MAX_VALIDATORS_PER_WITHDRAWALS_SWEEP - 1)
@@ -768,7 +768,7 @@ def test_success_one_partial_withdrawable_exited_and_slashed(spec, state):
yield from run_withdrawals_processing(spec, state, execution_payload, num_expected_withdrawals=1)
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_success_two_partial_withdrawable(spec, state):
set_validator_partially_withdrawable(spec, state, 0)
@@ -779,7 +779,7 @@ def test_success_two_partial_withdrawable(spec, state):
yield from run_withdrawals_processing(spec, state, execution_payload, num_expected_withdrawals=2)
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_success_max_partial_withdrawable(spec, state):
# Sanity check that this test works for this state
@@ -794,7 +794,7 @@ def test_success_max_partial_withdrawable(spec, state):
spec, state, execution_payload, num_expected_withdrawals=spec.MAX_WITHDRAWALS_PER_PAYLOAD)
-@with_phases([CAPELLA])
+@with_capella_and_later
@with_presets([MINIMAL], reason="not enough validators with mainnet config")
@spec_state_test
def test_success_max_plus_one_withdrawable(spec, state):
@@ -833,37 +833,37 @@ def run_random_partial_withdrawals_test(spec, state, rng):
yield from run_withdrawals_processing(spec, state, execution_payload)
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_random_0(spec, state):
yield from run_random_partial_withdrawals_test(spec, state, random.Random(0))
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_random_partial_withdrawals_1(spec, state):
yield from run_random_partial_withdrawals_test(spec, state, random.Random(1))
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_random_partial_withdrawals_2(spec, state):
yield from run_random_partial_withdrawals_test(spec, state, random.Random(2))
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_random_partial_withdrawals_3(spec, state):
yield from run_random_partial_withdrawals_test(spec, state, random.Random(3))
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_random_partial_withdrawals_4(spec, state):
yield from run_random_partial_withdrawals_test(spec, state, random.Random(4))
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_random_partial_withdrawals_5(spec, state):
yield from run_random_partial_withdrawals_test(spec, state, random.Random(5))
diff --git a/tests/core/pyspec/eth2spec/test/capella/epoch_processing/test_process_historical_batches_update.py b/tests/core/pyspec/eth2spec/test/capella/epoch_processing/test_process_historical_summaries_update.py
similarity index 94%
rename from tests/core/pyspec/eth2spec/test/capella/epoch_processing/test_process_historical_batches_update.py
rename to tests/core/pyspec/eth2spec/test/capella/epoch_processing/test_process_historical_summaries_update.py
index f1f8292eb..c5465d328 100644
--- a/tests/core/pyspec/eth2spec/test/capella/epoch_processing/test_process_historical_batches_update.py
+++ b/tests/core/pyspec/eth2spec/test/capella/epoch_processing/test_process_historical_summaries_update.py
@@ -1,7 +1,6 @@
from eth2spec.test.context import (
- CAPELLA,
spec_state_test,
- with_phases,
+ with_capella_and_later,
)
from eth2spec.test.helpers.epoch_processing import (
run_epoch_processing_with
@@ -12,7 +11,7 @@ def run_process_historical_summaries_update(spec, state):
yield from run_epoch_processing_with(spec, state, 'process_historical_summaries_update')
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_historical_summaries_accumulator(spec, state):
# skip ahead to near the end of the historical batch period (excl block before epoch processing)
diff --git a/tests/core/pyspec/eth2spec/test/capella/sanity/test_blocks.py b/tests/core/pyspec/eth2spec/test/capella/sanity/test_blocks.py
index 1df046c9d..1cd1c1317 100644
--- a/tests/core/pyspec/eth2spec/test/capella/sanity/test_blocks.py
+++ b/tests/core/pyspec/eth2spec/test/capella/sanity/test_blocks.py
@@ -1,7 +1,6 @@
from eth2spec.test.context import (
- with_phases, spec_state_test
+ with_capella_and_later, spec_state_test
)
-from eth2spec.test.helpers.constants import CAPELLA
from eth2spec.test.helpers.state import (
state_transition_and_sign_block,
)
@@ -25,7 +24,7 @@ from eth2spec.test.helpers.voluntary_exits import prepare_signed_exits
# BLSToExecutionChange
#
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_success_bls_change(spec, state):
index = 0
@@ -48,7 +47,7 @@ def test_success_bls_change(spec, state):
assert post_credentials[12:] == signed_address_change.message.to_execution_address
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_success_exit_and_bls_change(spec, state):
# move state forward SHARD_COMMITTEE_PERIOD epochs to allow for exit
@@ -77,7 +76,7 @@ def test_success_exit_and_bls_change(spec, state):
assert spec.is_fully_withdrawable_validator(validator, balance, validator.withdrawable_epoch)
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_invalid_duplicate_bls_changes_same_block(spec, state):
index = 0
@@ -96,7 +95,7 @@ def test_invalid_duplicate_bls_changes_same_block(spec, state):
yield 'post', None
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_invalid_two_bls_changes_of_different_addresses_same_validator_same_block(spec, state):
index = 0
@@ -124,7 +123,7 @@ def test_invalid_two_bls_changes_of_different_addresses_same_validator_same_bloc
# Withdrawals
#
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_full_withdrawal_in_epoch_transition(spec, state):
index = 0
@@ -145,7 +144,7 @@ def test_full_withdrawal_in_epoch_transition(spec, state):
assert len(spec.get_expected_withdrawals(state)) == 0
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_partial_withdrawal_in_epoch_transition(spec, state):
index = state.next_withdrawal_index
@@ -169,7 +168,7 @@ def test_partial_withdrawal_in_epoch_transition(spec, state):
assert len(spec.get_expected_withdrawals(state)) == 0
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_many_partial_withdrawals_in_epoch_transition(spec, state):
assert len(state.validators) > spec.MAX_WITHDRAWALS_PER_PAYLOAD
@@ -221,7 +220,7 @@ def _perform_valid_withdrawal(spec, state):
return pre_state, signed_block_1, pre_next_withdrawal_index
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_withdrawal_success_two_blocks(spec, state):
pre_state, signed_block_1, pre_next_withdrawal_index = _perform_valid_withdrawal(spec, state)
@@ -238,7 +237,7 @@ def test_withdrawal_success_two_blocks(spec, state):
yield 'post', state
-@with_phases([CAPELLA])
+@with_capella_and_later
@spec_state_test
def test_invalid_withdrawal_fail_second_block_payload_isnt_compatible(spec, state):
_perform_valid_withdrawal(spec, state)
diff --git a/tests/core/pyspec/eth2spec/test/eip4844/block_processing/test_process_bls_to_execution_change.py b/tests/core/pyspec/eth2spec/test/eip4844/block_processing/test_process_bls_to_execution_change.py
deleted file mode 100644
index d9b93394f..000000000
--- a/tests/core/pyspec/eth2spec/test/eip4844/block_processing/test_process_bls_to_execution_change.py
+++ /dev/null
@@ -1,40 +0,0 @@
-from eth2spec.test.helpers.bls_to_execution_changes import get_signed_address_change
-from eth2spec.test.context import spec_state_test, expect_assertion_error, with_eip4844_and_later
-
-
-def run_bls_to_execution_change_processing_no_op(spec, state, signed_address_change, valid=True):
- """
- Run ``process_bls_to_execution_change``, yielding:
- - pre-state ('pre')
- - address-change ('address_change')
- - post-state ('post').
- If ``valid == False``, run expecting ``AssertionError``
- """
- pre_state = state.copy()
-
- # yield pre-state
- yield 'pre', state
-
- yield 'address_change', signed_address_change
-
- # If the address_change is invalid, processing is aborted, and there is no post-state.
- if not valid:
- expect_assertion_error(lambda: spec.process_bls_to_execution_change(state, signed_address_change))
- yield 'post', None
- return
-
- # process address change
- spec.process_bls_to_execution_change(state, signed_address_change)
-
- # yield post-state
- yield 'post', state
-
- # Make sure state has NOT been changed
- assert state == pre_state
-
-
-@with_eip4844_and_later
-@spec_state_test
-def test_no_op(spec, state):
- signed_address_change = get_signed_address_change(spec, state)
- yield from run_bls_to_execution_change_processing_no_op(spec, state, signed_address_change)
diff --git a/tests/core/pyspec/eth2spec/test/eip4844/block_processing/test_process_withdrawals.py b/tests/core/pyspec/eth2spec/test/eip4844/block_processing/test_process_withdrawals.py
deleted file mode 100644
index a7db37e42..000000000
--- a/tests/core/pyspec/eth2spec/test/eip4844/block_processing/test_process_withdrawals.py
+++ /dev/null
@@ -1,41 +0,0 @@
-
-from eth2spec.test.context import spec_state_test, expect_assertion_error, with_eip4844_and_later
-from eth2spec.test.helpers.execution_payload import (
- build_empty_execution_payload,
-)
-from eth2spec.test.helpers.state import next_slot
-
-
-def run_withdrawals_processing(spec, state, execution_payload, valid=True):
- """
- Run ``process_execution_payload``, yielding:
- - pre-state ('pre')
- - execution payload ('execution_payload')
- - post-state ('post').
- If ``valid == False``, run expecting ``AssertionError``
- """
- pre_state = state.copy()
-
- yield 'pre', state
- yield 'execution_payload', execution_payload
-
- if not valid:
- expect_assertion_error(lambda: spec.process_withdrawals(state, execution_payload))
- yield 'post', None
- return
-
- spec.process_withdrawals(state, execution_payload)
-
- yield 'post', state
-
- # Make sure state has NOT been changed
- assert state == pre_state
-
-
-@with_eip4844_and_later
-@spec_state_test
-def test_no_op(spec, state):
- next_slot(spec, state)
- execution_payload = build_empty_execution_payload(spec, state)
-
- yield from run_withdrawals_processing(spec, state, execution_payload)
diff --git a/tests/core/pyspec/eth2spec/test/eip4844/epoch_processing/__init__.py b/tests/core/pyspec/eth2spec/test/eip4844/epoch_processing/__init__.py
deleted file mode 100644
index e69de29bb..000000000
diff --git a/tests/core/pyspec/eth2spec/test/eip4844/epoch_processing/test_process_historical_batches_update.py b/tests/core/pyspec/eth2spec/test/eip4844/epoch_processing/test_process_historical_batches_update.py
deleted file mode 100644
index 21865ae38..000000000
--- a/tests/core/pyspec/eth2spec/test/eip4844/epoch_processing/test_process_historical_batches_update.py
+++ /dev/null
@@ -1,23 +0,0 @@
-from eth2spec.test.context import (
- spec_state_test,
- with_eip4844_and_later,
-)
-from eth2spec.test.helpers.epoch_processing import (
- run_epoch_processing_with
-)
-
-
-def run_process_historical_summaries_update(spec, state):
- yield from run_epoch_processing_with(spec, state, 'process_historical_summaries_update')
-
-
-@with_eip4844_and_later
-@spec_state_test
-def test_no_op(spec, state):
- # skip ahead to near the end of the historical batch period (excl block before epoch processing)
- state.slot = spec.SLOTS_PER_HISTORICAL_ROOT - 1
- historical_summaries_len = len(state.historical_summaries)
-
- yield from run_process_historical_summaries_update(spec, state)
-
- assert len(state.historical_summaries) == historical_summaries_len
diff --git a/tests/core/pyspec/eth2spec/test/eip4844/block_processing/__init__.py b/tests/core/pyspec/eth2spec/test/eip4844/unittests/fork_choice/__init__.py
similarity index 100%
rename from tests/core/pyspec/eth2spec/test/eip4844/block_processing/__init__.py
rename to tests/core/pyspec/eth2spec/test/eip4844/unittests/fork_choice/__init__.py
diff --git a/tests/core/pyspec/eth2spec/test/eip4844/unittests/validator/test_validator.py b/tests/core/pyspec/eth2spec/test/eip4844/unittests/fork_choice/test_validate_blobs_sidecar.py
similarity index 100%
rename from tests/core/pyspec/eth2spec/test/eip4844/unittests/validator/test_validator.py
rename to tests/core/pyspec/eth2spec/test/eip4844/unittests/fork_choice/test_validate_blobs_sidecar.py
diff --git a/tests/core/pyspec/eth2spec/test/eip4844/unittests/validator/__init__.py b/tests/core/pyspec/eth2spec/test/eip4844/unittests/validator/__init__.py
deleted file mode 100644
index e69de29bb..000000000
diff --git a/tests/core/pyspec/eth2spec/test/phase0/sanity/test_blocks.py b/tests/core/pyspec/eth2spec/test/phase0/sanity/test_blocks.py
index 71c7798a1..2e1a2a369 100644
--- a/tests/core/pyspec/eth2spec/test/phase0/sanity/test_blocks.py
+++ b/tests/core/pyspec/eth2spec/test/phase0/sanity/test_blocks.py
@@ -29,7 +29,7 @@ from eth2spec.test.helpers.sync_committee import (
compute_committee_indices,
compute_sync_committee_participant_reward_and_penalty,
)
-from eth2spec.test.helpers.constants import PHASE0, EIP4844, MINIMAL
+from eth2spec.test.helpers.constants import PHASE0, MINIMAL
from eth2spec.test.helpers.forks import is_post_altair, is_post_bellatrix, is_post_capella
from eth2spec.test.context import (
spec_test, spec_state_test, dump_skipping_message,
@@ -1046,11 +1046,7 @@ def test_historical_batch(spec, state):
if is_post_capella(spec):
# Frozen `historical_roots`
assert state.historical_roots == pre_historical_roots
- if spec.fork == EIP4844:
- # TODO: no-op for now in EIP4844 testnet
- assert state.historical_summaries == pre_historical_summaries
- else:
- assert len(state.historical_summaries) == len(pre_historical_summaries) + 1
+ assert len(state.historical_summaries) == len(pre_historical_summaries) + 1
else:
assert len(state.historical_roots) == len(pre_historical_roots) + 1
diff --git a/tests/core/pyspec/eth2spec/test/phase0/sanity/test_slots.py b/tests/core/pyspec/eth2spec/test/phase0/sanity/test_slots.py
index 7b860159a..90d332d57 100644
--- a/tests/core/pyspec/eth2spec/test/phase0/sanity/test_slots.py
+++ b/tests/core/pyspec/eth2spec/test/phase0/sanity/test_slots.py
@@ -1,6 +1,3 @@
-from eth2spec.test.helpers.constants import (
- EIP4844,
-)
from eth2spec.test.helpers.forks import (
is_post_capella,
)
@@ -87,10 +84,6 @@ def test_historical_accumulator(spec, state):
if is_post_capella(spec):
# Frozen `historical_roots`
assert state.historical_roots == pre_historical_roots
- if spec.fork == EIP4844:
- # TODO: no-op for now in EIP4844 testnet
- assert state.historical_summaries == pre_historical_summaries
- else:
- assert len(state.historical_summaries) == len(pre_historical_summaries) + 1
+ assert len(state.historical_summaries) == len(pre_historical_summaries) + 1
else:
assert len(state.historical_roots) == len(pre_historical_roots) + 1
diff --git a/tests/generators/epoch_processing/main.py b/tests/generators/epoch_processing/main.py
index 58beb0fd2..dda4345a8 100644
--- a/tests/generators/epoch_processing/main.py
+++ b/tests/generators/epoch_processing/main.py
@@ -32,10 +32,7 @@ if __name__ == "__main__":
]}
capella_mods = combine_mods(_new_capella_mods, bellatrix_mods)
- _new_eip4844_mods = {key: 'eth2spec.test.eip4844.epoch_processing.test_process_' + key for key in [
- 'historical_summaries_update',
- ]}
- eip4844_mods = combine_mods(_new_eip4844_mods, capella_mods)
+ eip4844_mods = capella_mods
# TODO Custody Game testgen is disabled for now
# custody_game_mods = {**{key: 'eth2spec.test.custody_game.epoch_processing.test_process_' + key for key in [
diff --git a/tests/generators/operations/main.py b/tests/generators/operations/main.py
index 4c073ebe4..d370a1b85 100644
--- a/tests/generators/operations/main.py
+++ b/tests/generators/operations/main.py
@@ -36,11 +36,7 @@ if __name__ == "__main__":
]}
capella_mods = combine_mods(_new_capella_mods, bellatrix_mods)
- _new_eip4844_mods = {key: 'eth2spec.test.eip4844.block_processing.test_process_' + key for key in [
- 'bls_to_execution_change',
- 'withdrawals',
- ]}
- eip4844_mods = combine_mods(_new_eip4844_mods, capella_mods)
+ eip4844_mods = capella_mods
# TODO Custody Game testgen is disabled for now
# _new_custody_game_mods = {key: 'eth2spec.test.custody_game.block_processing.test_process_' + key for key in [