From 45b1eb79799afc1e94a81ee3b1d0a1792410d0dd Mon Sep 17 00:00:00 2001 From: terence tsao Date: Wed, 28 Dec 2022 18:42:24 -0800 Subject: [PATCH 01/18] EIP4844: Enable withdrawal --- specs/eip4844/beacon-chain.md | 8 -------- 1 file changed, 8 deletions(-) diff --git a/specs/eip4844/beacon-chain.md b/specs/eip4844/beacon-chain.md index 19acb57d8..afab3fc44 100644 --- a/specs/eip4844/beacon-chain.md +++ b/specs/eip4844/beacon-chain.md @@ -346,11 +346,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. From 2afb02ba302254b8a991dc1575bee045c7f5e86f Mon Sep 17 00:00:00 2001 From: terence tsao Date: Wed, 28 Dec 2022 18:49:02 -0800 Subject: [PATCH 02/18] Fix Toc --- specs/eip4844/beacon-chain.md | 1 - 1 file changed, 1 deletion(-) diff --git a/specs/eip4844/beacon-chain.md b/specs/eip4844/beacon-chain.md index afab3fc44..bc5c41a5c 100644 --- a/specs/eip4844/beacon-chain.md +++ b/specs/eip4844/beacon-chain.md @@ -33,7 +33,6 @@ - [`process_execution_payload`](#process_execution_payload) - [Blob KZG commitments](#blob-kzg-commitments) - [Testing](#testing) - - [Disabling Withdrawals](#disabling-withdrawals) From 6b94aab3af875d97e8574cbc23d6919b6540a235 Mon Sep 17 00:00:00 2001 From: Hsiao-Wei Wang Date: Tue, 3 Jan 2023 23:28:37 +0800 Subject: [PATCH 03/18] Move `is_data_available` check to fork-choice `on_block` --- specs/eip4844/beacon-chain.md | 28 --------- specs/eip4844/fork-choice.md | 105 ++++++++++++++++++++++++++++++++++ 2 files changed, 105 insertions(+), 28 deletions(-) create mode 100644 specs/eip4844/fork-choice.md diff --git a/specs/eip4844/beacon-chain.md b/specs/eip4844/beacon-chain.md index 19acb57d8..e62c455d6 100644 --- a/specs/eip4844/beacon-chain.md +++ b/specs/eip4844/beacon-chain.md @@ -23,7 +23,6 @@ - [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) @@ -162,30 +161,6 @@ def validate_blobs_sidecar(slot: Slot, 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 +216,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 diff --git a/specs/eip4844/fork-choice.md b/specs/eip4844/fork-choice.md new file mode 100644 index 000000000..bc25eeae7 --- /dev/null +++ b/specs/eip4844/fork-choice.md @@ -0,0 +1,105 @@ +# EIP-4844 -- Fork Choice + +## Table of contents + + + + +- [Introduction](#introduction) +- [Helpers](#helpers) + - [`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 according to the executable beacon chain proposal. + +## Helpers + +#### `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 +``` + +## 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 the block is 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 +``` From dba75eece9529ad6bc59c11fcb1382c3eed986b5 Mon Sep 17 00:00:00 2001 From: Hsiao-Wei Wang Date: Wed, 4 Jan 2023 00:45:46 +0800 Subject: [PATCH 04/18] Enable Capella feature in eip4844 fork Fix lint --- setup.py | 29 ----- .../test_process_bls_to_execution_change.py | 23 ++-- .../block_processing/test_process_deposit.py | 5 +- .../test_process_withdrawals.py | 110 +++++++++--------- .../test_process_historical_batches_update.py | 5 +- .../test/capella/sanity/test_blocks.py | 21 ++-- .../test/eip4844/block_processing/__init__.py | 0 .../test_process_bls_to_execution_change.py | 40 ------- .../test_process_withdrawals.py | 41 ------- .../test/eip4844/epoch_processing/__init__.py | 0 .../test_process_historical_batches_update.py | 23 ---- .../test/phase0/sanity/test_blocks.py | 8 +- .../eth2spec/test/phase0/sanity/test_slots.py | 9 +- tests/generators/epoch_processing/main.py | 6 +- tests/generators/operations/main.py | 6 +- 15 files changed, 86 insertions(+), 240 deletions(-) delete mode 100644 tests/core/pyspec/eth2spec/test/eip4844/block_processing/__init__.py delete mode 100644 tests/core/pyspec/eth2spec/test/eip4844/block_processing/test_process_bls_to_execution_change.py delete mode 100644 tests/core/pyspec/eth2spec/test/eip4844/block_processing/test_process_withdrawals.py delete mode 100644 tests/core/pyspec/eth2spec/test/eip4844/epoch_processing/__init__.py delete mode 100644 tests/core/pyspec/eth2spec/test/eip4844/epoch_processing/test_process_historical_batches_update.py diff --git a/setup.py b/setup.py index f95f85284..83c7e857e 100644 --- a/setup.py +++ b/setup.py @@ -638,35 +638,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"''' 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_batches_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_batches_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/__init__.py b/tests/core/pyspec/eth2spec/test/eip4844/block_processing/__init__.py deleted file mode 100644 index e69de29bb..000000000 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/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..384d047be 100644 --- a/tests/generators/epoch_processing/main.py +++ b/tests/generators/epoch_processing/main.py @@ -32,10 +32,8 @@ 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) + # TODO: add process_execution_payload tests + 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 [ From 118daae6d9d62188debcaf34f4f74f21e4705f26 Mon Sep 17 00:00:00 2001 From: Hsiao-Wei Wang Date: Wed, 4 Jan 2023 17:54:59 +0800 Subject: [PATCH 05/18] Add notes for new state historical accumulators --- specs/capella/beacon-chain.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/specs/capella/beacon-chain.md b/specs/capella/beacon-chain.md index bd7a2c50c..5d0df0edd 100644 --- a/specs/capella/beacon-chain.md +++ b/specs/capella/beacon-chain.md @@ -53,6 +53,10 @@ 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 state/block historical accumulators. It becomes possible to validate +the entire block history that led up to that particular state without executing the transitions +and checking them one by one in backward order using a parent chain. + ## Custom types We define the following Python custom types for type hinting and readability: From 9d14dcd8b0171d7e811a2f322174b2d02219ea0d Mon Sep 17 00:00:00 2001 From: Hsiao-Wei Wang Date: Wed, 4 Jan 2023 18:09:38 +0800 Subject: [PATCH 06/18] Ensure that no duplidate block hashes --- .../pyspec/eth2spec/test/bellatrix/sync/test_optimistic.py | 6 ++++++ 1 file changed, 6 insertions(+) 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, From 5ff877cc26dab8ebdbd83ff08689ca3231a64607 Mon Sep 17 00:00:00 2001 From: Hsiao-Wei Wang Date: Wed, 4 Jan 2023 18:24:13 +0800 Subject: [PATCH 07/18] Add link to docs lookup table --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 07b78c0d5..bb69a452a 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
    • [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
    • [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
    • [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)
| From 9d402dd2d21a55c28fdcd01efeb76fe1d823b066 Mon Sep 17 00:00:00 2001 From: Hsiao-Wei Wang Date: Wed, 4 Jan 2023 18:51:51 +0800 Subject: [PATCH 08/18] minor fix --- tests/generators/epoch_processing/main.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/generators/epoch_processing/main.py b/tests/generators/epoch_processing/main.py index 384d047be..dda4345a8 100644 --- a/tests/generators/epoch_processing/main.py +++ b/tests/generators/epoch_processing/main.py @@ -32,7 +32,6 @@ if __name__ == "__main__": ]} capella_mods = combine_mods(_new_capella_mods, bellatrix_mods) - # TODO: add process_execution_payload tests eip4844_mods = capella_mods # TODO Custody Game testgen is disabled for now From 82e9631c5180432b7e3e73570ef100c551ca7d3a Mon Sep 17 00:00:00 2001 From: parithosh Date: Thu, 5 Jan 2023 14:09:18 +0100 Subject: [PATCH 09/18] add cache to linter and codespell --- .github/workflows/run-tests.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml index 3e23d1910..21c286eae 100644 --- a/.github/workflows/run-tests.yml +++ b/.github/workflows/run-tests.yml @@ -70,6 +70,11 @@ jobs: runs-on: self-hosted needs: setup-env steps: + - uses: actions/cache@v3.2.2 + id: restore-build + with: + path: ./* + key: ${{ github.sha }} - name: Check codespell run: pip install 'codespell<3.0.0,>=2.0.0' --user && make codespell @@ -77,6 +82,11 @@ jobs: runs-on: self-hosted needs: setup-env steps: + - uses: actions/cache@v3.2.2 + id: restore-build + with: + path: ./* + key: ${{ github.sha }} - name: Run linter for pyspec run: make lint - name: Run linter for test generators From fd05a7c023bcd0847846a01b948a62df61b755bd Mon Sep 17 00:00:00 2001 From: parithosh Date: Thu, 5 Jan 2023 14:14:38 +0100 Subject: [PATCH 10/18] remove cache fully --- .github/workflows/run-tests.yml | 55 ++++++++++++--------------------- 1 file changed, 19 insertions(+), 36 deletions(-) diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml index 21c286eae..3bab00950 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,53 +40,37 @@ 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: - - 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: 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: - - 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: Run linter for pyspec run: make lint - name: Run linter for test generators @@ -94,16 +78,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: | @@ -132,7 +115,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' From e937e2abbc48aad805d15df64480168ab993b98d Mon Sep 17 00:00:00 2001 From: Hsiao-Wei Wang Date: Fri, 6 Jan 2023 13:08:32 +0800 Subject: [PATCH 11/18] Apply suggestions from code review Co-authored-by: Danny Ryan --- specs/eip4844/fork-choice.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/specs/eip4844/fork-choice.md b/specs/eip4844/fork-choice.md index bc25eeae7..2613bbb7e 100644 --- a/specs/eip4844/fork-choice.md +++ b/specs/eip4844/fork-choice.md @@ -22,8 +22,8 @@ This is the modification of the fork choice according to the executable beacon c #### `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`, +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. @@ -69,7 +69,8 @@ def on_block(store: Store, signed_block: SignedBeaconBlock) -> None: assert get_ancestor(store, block.parent_root, finalized_slot) == store.finalized_checkpoint.root # [New in EIP-4844] - # Check if the block is available + # 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 From d679b2e80d4b8c0a9ffa7198df89f0213e67b3ef Mon Sep 17 00:00:00 2001 From: Danny Ryan Date: Fri, 6 Jan 2023 08:06:39 -0700 Subject: [PATCH 12/18] Update specs/capella/beacon-chain.md --- specs/capella/beacon-chain.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/specs/capella/beacon-chain.md b/specs/capella/beacon-chain.md index 5d0df0edd..9a04f2f38 100644 --- a/specs/capella/beacon-chain.md +++ b/specs/capella/beacon-chain.md @@ -53,9 +53,10 @@ 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 state/block historical accumulators. It becomes possible to validate -the entire block history that led up to that particular state without executing the transitions -and checking them one by one in backward order using a parent chain. +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 From 8255618206fdd9507e1405716918cfb82d5f17f5 Mon Sep 17 00:00:00 2001 From: Danny Ryan Date: Fri, 6 Jan 2023 08:16:14 -0700 Subject: [PATCH 13/18] bump VERSION.txt to 1.3.0-rc.0 --- tests/core/pyspec/eth2spec/VERSION.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 From e154b3414c30131ce970d8319d00d997ede4a162 Mon Sep 17 00:00:00 2001 From: Hsiao-Wei Wang Date: Fri, 6 Jan 2023 23:19:44 +0800 Subject: [PATCH 14/18] Move `validate_blobs_sidecar` to fork-choice and add spec into execution spec scope --- setup.py | 1 + specs/eip4844/beacon-chain.md | 17 ----------------- specs/eip4844/fork-choice.md | 17 +++++++++++++++++ .../{validator => fork_choice}/__init__.py | 0 .../test_validate_blobs_sidecar.py} | 0 5 files changed, 18 insertions(+), 17 deletions(-) rename tests/core/pyspec/eth2spec/test/eip4844/unittests/{validator => fork_choice}/__init__.py (100%) rename tests/core/pyspec/eth2spec/test/eip4844/unittests/{validator/test_validator.py => fork_choice/test_validate_blobs_sidecar.py} (100%) diff --git a/setup.py b/setup.py index be8be6d90..28d55f07e 100644 --- a/setup.py +++ b/setup.py @@ -1020,6 +1020,7 @@ class PySpecCommand(Command): self.md_doc_paths += """ 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/eip4844/beacon-chain.md b/specs/eip4844/beacon-chain.md index e62c455d6..8b0224f86 100644 --- a/specs/eip4844/beacon-chain.md +++ b/specs/eip4844/beacon-chain.md @@ -22,7 +22,6 @@ - [`ExecutionPayloadHeader`](#executionpayloadheader) - [Helper functions](#helper-functions) - [Misc](#misc) - - [`validate_blobs_sidecar`](#validate_blobs_sidecar) - [`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) @@ -145,22 +144,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) -``` - #### `kzg_commitment_to_versioned_hash` ```python diff --git a/specs/eip4844/fork-choice.md b/specs/eip4844/fork-choice.md index 2613bbb7e..ead394234 100644 --- a/specs/eip4844/fork-choice.md +++ b/specs/eip4844/fork-choice.md @@ -7,6 +7,7 @@ - [Introduction](#introduction) - [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) @@ -20,6 +21,22 @@ This is the modification of the fork choice according to the executable beacon c ## 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. diff --git a/tests/core/pyspec/eth2spec/test/eip4844/unittests/validator/__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/unittests/validator/__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 From c9f8e4fef845b2b03a7790ede72c10e13f052187 Mon Sep 17 00:00:00 2001 From: Hsiao-Wei Wang Date: Fri, 6 Jan 2023 23:39:04 +0800 Subject: [PATCH 15/18] Move `BlobsSidecar` --- specs/eip4844/fork-choice.md | 14 ++++++++++++++ specs/eip4844/p2p-interface.md | 11 ----------- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/specs/eip4844/fork-choice.md b/specs/eip4844/fork-choice.md index ead394234..0937b66d7 100644 --- a/specs/eip4844/fork-choice.md +++ b/specs/eip4844/fork-choice.md @@ -6,6 +6,8 @@ - [Introduction](#introduction) +- [Containers](#containers) + - [`BlobsSidecar`](#blobssidecar) - [Helpers](#helpers) - [`validate_blobs_sidecar`](#validate_blobs_sidecar) - [`is_data_available`](#is_data_available) @@ -19,6 +21,18 @@ This is the modification of the fork choice according to the executable beacon chain proposal. +## 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` diff --git a/specs/eip4844/p2p-interface.md b/specs/eip4844/p2p-interface.md index 420a6da05..582331203 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 From 4ba2266fd55f5e0bc330ad2a70090443c23871ac Mon Sep 17 00:00:00 2001 From: Danny Ryan Date: Fri, 6 Jan 2023 08:45:20 -0700 Subject: [PATCH 16/18] Update specs/eip4844/fork-choice.md --- specs/eip4844/fork-choice.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/specs/eip4844/fork-choice.md b/specs/eip4844/fork-choice.md index 0937b66d7..8dea28ded 100644 --- a/specs/eip4844/fork-choice.md +++ b/specs/eip4844/fork-choice.md @@ -19,7 +19,7 @@ ## Introduction -This is the modification of the fork choice according to the executable beacon chain proposal. +This is the modification of the fork choice accompanying the EIP-4844 upgrade. ## Containers From 8b14345143b65c45f35805fdff3af25965a0f5f1 Mon Sep 17 00:00:00 2001 From: Hsiao-Wei Wang Date: Sat, 7 Jan 2023 01:49:23 +0800 Subject: [PATCH 17/18] Fix test file name --- ...ches_update.py => test_process_historical_summaries_update.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename tests/core/pyspec/eth2spec/test/capella/epoch_processing/{test_process_historical_batches_update.py => test_process_historical_summaries_update.py} (100%) 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 100% 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 From 025f80f7677cdef27a305fe5a4e4e27a84610545 Mon Sep 17 00:00:00 2001 From: parithosh Date: Tue, 10 Jan 2023 10:23:04 +0100 Subject: [PATCH 18/18] adding install_test --- .github/workflows/run-tests.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml index 3bab00950..2c7b9d883 100644 --- a/.github/workflows/run-tests.yml +++ b/.github/workflows/run-tests.yml @@ -71,6 +71,8 @@ jobs: 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