From 321f47bb273934e4afe04fd0a408719af9c44362 Mon Sep 17 00:00:00 2001 From: Etan Kissling Date: Fri, 3 Nov 2023 11:27:56 +0100 Subject: [PATCH 01/28] Remove `SignedBlobSidecar` refs from p2p spec P2P spec still mentions _signed_ blob sidecars. Remove _signed_ as that is no longer accurate. --- specs/deneb/p2p-interface.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/specs/deneb/p2p-interface.md b/specs/deneb/p2p-interface.md index 0e53af83a..f7b331e84 100644 --- a/specs/deneb/p2p-interface.md +++ b/specs/deneb/p2p-interface.md @@ -150,7 +150,7 @@ New validation: *[New in Deneb:EIP4844]* -This topic is used to propagate signed blob sidecars, where each blob index maps to some `subnet_id`. +This topic is used to propagate blob sidecars, where each blob index maps to some `subnet_id`. The following validations MUST pass before forwarding the `blob_sidecar` on the network, assuming the alias `block_header = blob_sidecar.signed_block_header.message`: @@ -341,7 +341,7 @@ The response MUST consist of zero or more `response_chunk`. Each _successful_ `response_chunk` MUST contain a single `BlobSidecar` payload. Let `blob_serve_range` be `[max(current_epoch - MIN_EPOCHS_FOR_BLOB_SIDECARS_REQUESTS, DENEB_FORK_EPOCH), current_epoch]`. -Clients MUST keep a record of signed blob sidecars seen on the epoch range `blob_serve_range` +Clients MUST keep a record of blob sidecars seen on the epoch range `blob_serve_range` where `current_epoch` is defined by the current wall-clock time, and clients MUST support serving requests of blobs on this range. From 3ef362ce9091fdb0a6421b4ed32a44179b57450f Mon Sep 17 00:00:00 2001 From: Etan Kissling Date: Fri, 3 Nov 2023 11:30:28 +0100 Subject: [PATCH 02/28] Remove unused `DOMAIN_BLOB_SIDECAR` Blob sidecars are no longer signed, remove signing domain. --- specs/deneb/beacon-chain.md | 6 ------ 1 file changed, 6 deletions(-) diff --git a/specs/deneb/beacon-chain.md b/specs/deneb/beacon-chain.md index 852f98308..09679489c 100644 --- a/specs/deneb/beacon-chain.md +++ b/specs/deneb/beacon-chain.md @@ -67,12 +67,6 @@ Deneb is a consensus-layer upgrade containing a number of features. Including: ## Constants -### Domain types - -| Name | Value | -| - | - | -| `DOMAIN_BLOB_SIDECAR` | `DomainType('0x0B000000')` | - ### Blob | Name | Value | From 9338d37c1536fc5de48791580a53abfa15c8d868 Mon Sep 17 00:00:00 2001 From: Etan Kissling Date: Fri, 3 Nov 2023 11:47:30 +0100 Subject: [PATCH 03/28] Update toc --- specs/deneb/beacon-chain.md | 1 - 1 file changed, 1 deletion(-) diff --git a/specs/deneb/beacon-chain.md b/specs/deneb/beacon-chain.md index 09679489c..b6c97d6f4 100644 --- a/specs/deneb/beacon-chain.md +++ b/specs/deneb/beacon-chain.md @@ -11,7 +11,6 @@ - [Introduction](#introduction) - [Custom types](#custom-types) - [Constants](#constants) - - [Domain types](#domain-types) - [Blob](#blob) - [Preset](#preset) - [Execution](#execution) From 70ce4f28c0768d4e882b78876dbbecb1938aa07b Mon Sep 17 00:00:00 2001 From: Hsiao-Wei Wang Date: Tue, 14 Nov 2023 12:06:33 +0300 Subject: [PATCH 04/28] Remove extra tick --- .../fork_choice/test_should_override_forkchoice_update.py | 2 -- .../eth2spec/test/phase0/fork_choice/test_get_proposer_head.py | 2 -- 2 files changed, 4 deletions(-) diff --git a/tests/core/pyspec/eth2spec/test/bellatrix/fork_choice/test_should_override_forkchoice_update.py b/tests/core/pyspec/eth2spec/test/bellatrix/fork_choice/test_should_override_forkchoice_update.py index 465a00f1a..b40cc5bbe 100644 --- a/tests/core/pyspec/eth2spec/test/bellatrix/fork_choice/test_should_override_forkchoice_update.py +++ b/tests/core/pyspec/eth2spec/test/bellatrix/fork_choice/test_should_override_forkchoice_update.py @@ -135,8 +135,6 @@ def test_should_override_forkchoice_update__true(spec, state): # Add attestations to the parent block temp_state = state.copy() next_slot(spec, temp_state) - current_time = state.slot * spec.config.SECONDS_PER_SLOT + store.genesis_time + 1 - on_tick_and_append_step(spec, store, current_time, test_steps) attestations = get_valid_attestation_at_slot( temp_state, spec, diff --git a/tests/core/pyspec/eth2spec/test/phase0/fork_choice/test_get_proposer_head.py b/tests/core/pyspec/eth2spec/test/phase0/fork_choice/test_get_proposer_head.py index 249e76b08..9419a18df 100644 --- a/tests/core/pyspec/eth2spec/test/phase0/fork_choice/test_get_proposer_head.py +++ b/tests/core/pyspec/eth2spec/test/phase0/fork_choice/test_get_proposer_head.py @@ -128,8 +128,6 @@ def test_basic_is_parent_root(spec, state): slot = state.slot # Add attestations to the parent block - current_time = slot * spec.config.SECONDS_PER_SLOT + store.genesis_time - on_tick_and_append_step(spec, store, current_time, test_steps) attestations = get_valid_attestation_at_slot( state, spec, From 3d853b0ec9f641470c8bbbde48d8d9f9da884e58 Mon Sep 17 00:00:00 2001 From: Hsiao-Wei Wang Date: Thu, 16 Nov 2023 17:25:54 +0300 Subject: [PATCH 05/28] Add `assert time >= store.time` to `on_tick` --- specs/phase0/fork-choice.md | 3 +++ tests/core/pyspec/eth2spec/test/helpers/fork_choice.py | 7 ++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/specs/phase0/fork-choice.md b/specs/phase0/fork-choice.md index 6a5437115..78d3eca02 100644 --- a/specs/phase0/fork-choice.md +++ b/specs/phase0/fork-choice.md @@ -623,6 +623,9 @@ def update_latest_messages(store: Store, attesting_indices: Sequence[ValidatorIn ```python def on_tick(store: Store, time: uint64) -> None: + # Precondition + assert time >= store.time + # If the ``store.time`` falls behind, while loop catches up slot by slot # to ensure that every previous slot is processed with ``on_tick_per_slot`` tick_slot = (time - store.genesis_time) // SECONDS_PER_SLOT diff --git a/tests/core/pyspec/eth2spec/test/helpers/fork_choice.py b/tests/core/pyspec/eth2spec/test/helpers/fork_choice.py index ef80a3ab6..bc40c1f6d 100644 --- a/tests/core/pyspec/eth2spec/test/helpers/fork_choice.py +++ b/tests/core/pyspec/eth2spec/test/helpers/fork_choice.py @@ -144,9 +144,10 @@ def get_blobs_file_name(blobs=None, blobs_root=None): def on_tick_and_append_step(spec, store, time, test_steps): - spec.on_tick(store, time) - test_steps.append({'tick': int(time)}) - output_store_checks(spec, store, test_steps) + if store.time < time: + spec.on_tick(store, time) + test_steps.append({'tick': int(time)}) + output_store_checks(spec, store, test_steps) def run_on_block(spec, store, signed_block, valid=True): From 6fb9b0a9a4e062b8bae786bdd9de937301037b4b Mon Sep 17 00:00:00 2001 From: Hsiao-Wei Wang Date: Thu, 30 Nov 2023 03:58:27 +0800 Subject: [PATCH 06/28] Revert the spec. Only handle it in tests --- specs/phase0/fork-choice.md | 3 --- tests/core/pyspec/eth2spec/test/helpers/fork_choice.py | 4 +++- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/specs/phase0/fork-choice.md b/specs/phase0/fork-choice.md index 78d3eca02..6a5437115 100644 --- a/specs/phase0/fork-choice.md +++ b/specs/phase0/fork-choice.md @@ -623,9 +623,6 @@ def update_latest_messages(store: Store, attesting_indices: Sequence[ValidatorIn ```python def on_tick(store: Store, time: uint64) -> None: - # Precondition - assert time >= store.time - # If the ``store.time`` falls behind, while loop catches up slot by slot # to ensure that every previous slot is processed with ``on_tick_per_slot`` tick_slot = (time - store.genesis_time) // SECONDS_PER_SLOT diff --git a/tests/core/pyspec/eth2spec/test/helpers/fork_choice.py b/tests/core/pyspec/eth2spec/test/helpers/fork_choice.py index bc40c1f6d..e63bda641 100644 --- a/tests/core/pyspec/eth2spec/test/helpers/fork_choice.py +++ b/tests/core/pyspec/eth2spec/test/helpers/fork_choice.py @@ -60,7 +60,8 @@ def tick_and_add_block(spec, store, signed_block, test_steps, valid=True, block_time = pre_state.genesis_time + signed_block.message.slot * spec.config.SECONDS_PER_SLOT while store.time < block_time: time = pre_state.genesis_time + (spec.get_current_slot(store) + 1) * spec.config.SECONDS_PER_SLOT - on_tick_and_append_step(spec, store, time, test_steps) + if time > store.time: + on_tick_and_append_step(spec, store, time, test_steps) post_state = yield from add_block( spec, store, signed_block, test_steps, @@ -144,6 +145,7 @@ def get_blobs_file_name(blobs=None, blobs_root=None): def on_tick_and_append_step(spec, store, time, test_steps): + assert time >= store.time if store.time < time: spec.on_tick(store, time) test_steps.append({'tick': int(time)}) From 581a64be2b5c838d209a33ef157ee2db873543e3 Mon Sep 17 00:00:00 2001 From: Hsiao-Wei Wang Date: Thu, 30 Nov 2023 18:56:51 +0800 Subject: [PATCH 07/28] cleanup leftover --- tests/core/pyspec/eth2spec/test/helpers/fork_choice.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/tests/core/pyspec/eth2spec/test/helpers/fork_choice.py b/tests/core/pyspec/eth2spec/test/helpers/fork_choice.py index e63bda641..094e2e8a5 100644 --- a/tests/core/pyspec/eth2spec/test/helpers/fork_choice.py +++ b/tests/core/pyspec/eth2spec/test/helpers/fork_choice.py @@ -60,8 +60,7 @@ def tick_and_add_block(spec, store, signed_block, test_steps, valid=True, block_time = pre_state.genesis_time + signed_block.message.slot * spec.config.SECONDS_PER_SLOT while store.time < block_time: time = pre_state.genesis_time + (spec.get_current_slot(store) + 1) * spec.config.SECONDS_PER_SLOT - if time > store.time: - on_tick_and_append_step(spec, store, time, test_steps) + on_tick_and_append_step(spec, store, time, test_steps) post_state = yield from add_block( spec, store, signed_block, test_steps, @@ -146,10 +145,9 @@ def get_blobs_file_name(blobs=None, blobs_root=None): def on_tick_and_append_step(spec, store, time, test_steps): assert time >= store.time - if store.time < time: - spec.on_tick(store, time) - test_steps.append({'tick': int(time)}) - output_store_checks(spec, store, test_steps) + spec.on_tick(store, time) + test_steps.append({'tick': int(time)}) + output_store_checks(spec, store, test_steps) def run_on_block(spec, store, signed_block, valid=True): From e664d407ca52a83c6a9957dc7ef2442bb5c72f39 Mon Sep 17 00:00:00 2001 From: Enrico Del Fante Date: Thu, 16 Nov 2023 17:29:16 +0100 Subject: [PATCH 08/28] Specify RPC byRoot blocks-sidecars elegibility --- specs/deneb/p2p-interface.md | 7 +++++++ specs/phase0/p2p-interface.md | 4 ++++ 2 files changed, 11 insertions(+) diff --git a/specs/deneb/p2p-interface.md b/specs/deneb/p2p-interface.md index f7b331e84..13aadf33d 100644 --- a/specs/deneb/p2p-interface.md +++ b/specs/deneb/p2p-interface.md @@ -252,6 +252,9 @@ Per `context = compute_fork_digest(fork_version, genesis_validators_root)`: No more than `MAX_REQUEST_BLOCKS_DENEB` may be requested at a time. +*[Modified in Deneb:EIP4844]* +Clients SHOULD consider including a block in the response as soon as it it passes the gossip validation rules. + ##### BlobSidecarsByRoot v1 **Protocol ID:** `/eth2/beacon_chain/req/blob_sidecars_by_root/1/` @@ -300,6 +303,10 @@ Clients MUST support requesting sidecars since `minimum_request_epoch`, where `m Clients MUST respond with at least one sidecar, if they have it. Clients MAY limit the number of blocks and sidecars in the response. +Clients SHOULD consider including a sidecar in the response as soon as it passes the gossip validation rules. +Clients MUST NOT respond with sidecars that failed gossip vaildation. +Clients MUST NOT respond with sidecars related to blocks that failed `fork_choice.on_block`. + ##### BlobSidecarsByRange v1 **Protocol ID:** `/eth2/beacon_chain/req/blob_sidecars_by_range/1/` diff --git a/specs/phase0/p2p-interface.md b/specs/phase0/p2p-interface.md index a374443b8..313c56ad0 100644 --- a/specs/phase0/p2p-interface.md +++ b/specs/phase0/p2p-interface.md @@ -856,6 +856,10 @@ Clients MUST support requesting blocks since the latest finalized epoch. Clients MUST respond with at least one block, if they have it. Clients MAY limit the number of blocks in the response. +Clients CAN consider including a block in the response as soon as it it passes the gossip validation rules. +Clients MUST NOT respond with blocks that failed gossip vaildation rules. +Clients MUST NOT respond with blocks that failed `fork_choice.on_block`. + `/eth2/beacon_chain/req/beacon_blocks_by_root/1/` is deprecated. Clients MAY respond with an empty list during the deprecation transition period. ##### Ping From c46c4ec7cbea9e74ac960a54d42039de15b9d829 Mon Sep 17 00:00:00 2001 From: Enrico Del Fante Date: Thu, 16 Nov 2023 17:49:30 +0100 Subject: [PATCH 09/28] fix typo --- specs/deneb/p2p-interface.md | 2 +- specs/phase0/p2p-interface.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/specs/deneb/p2p-interface.md b/specs/deneb/p2p-interface.md index 13aadf33d..c5e85a58a 100644 --- a/specs/deneb/p2p-interface.md +++ b/specs/deneb/p2p-interface.md @@ -304,7 +304,7 @@ Clients MUST respond with at least one sidecar, if they have it. Clients MAY limit the number of blocks and sidecars in the response. Clients SHOULD consider including a sidecar in the response as soon as it passes the gossip validation rules. -Clients MUST NOT respond with sidecars that failed gossip vaildation. +Clients MUST NOT respond with sidecars that failed gossip validation. Clients MUST NOT respond with sidecars related to blocks that failed `fork_choice.on_block`. ##### BlobSidecarsByRange v1 diff --git a/specs/phase0/p2p-interface.md b/specs/phase0/p2p-interface.md index 313c56ad0..3de79cc44 100644 --- a/specs/phase0/p2p-interface.md +++ b/specs/phase0/p2p-interface.md @@ -857,7 +857,7 @@ Clients MUST respond with at least one block, if they have it. Clients MAY limit the number of blocks in the response. Clients CAN consider including a block in the response as soon as it it passes the gossip validation rules. -Clients MUST NOT respond with blocks that failed gossip vaildation rules. +Clients MUST NOT respond with blocks that failed gossip validation rules. Clients MUST NOT respond with blocks that failed `fork_choice.on_block`. `/eth2/beacon_chain/req/beacon_blocks_by_root/1/` is deprecated. Clients MAY respond with an empty list during the deprecation transition period. From 6bbdeb88e0ed5b7b857227156d86f229337529ab Mon Sep 17 00:00:00 2001 From: Enrico Del Fante Date: Fri, 17 Nov 2023 09:02:15 +0100 Subject: [PATCH 10/28] Update specs/phase0/p2p-interface.md Co-authored-by: Mikhail Kalinin --- specs/phase0/p2p-interface.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/specs/phase0/p2p-interface.md b/specs/phase0/p2p-interface.md index 3de79cc44..e838fe755 100644 --- a/specs/phase0/p2p-interface.md +++ b/specs/phase0/p2p-interface.md @@ -856,7 +856,7 @@ Clients MUST support requesting blocks since the latest finalized epoch. Clients MUST respond with at least one block, if they have it. Clients MAY limit the number of blocks in the response. -Clients CAN consider including a block in the response as soon as it it passes the gossip validation rules. +Clients MAY consider including a block in the response as soon as it it passes the gossip validation rules. Clients MUST NOT respond with blocks that failed gossip validation rules. Clients MUST NOT respond with blocks that failed `fork_choice.on_block`. From ccf9e3419b87cfe260f78d9f3a91bc01532e1235 Mon Sep 17 00:00:00 2001 From: Enrico Del Fante Date: Fri, 17 Nov 2023 09:02:21 +0100 Subject: [PATCH 11/28] Update specs/deneb/p2p-interface.md Co-authored-by: Mikhail Kalinin --- specs/deneb/p2p-interface.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/specs/deneb/p2p-interface.md b/specs/deneb/p2p-interface.md index c5e85a58a..858a0433e 100644 --- a/specs/deneb/p2p-interface.md +++ b/specs/deneb/p2p-interface.md @@ -253,7 +253,7 @@ Per `context = compute_fork_digest(fork_version, genesis_validators_root)`: No more than `MAX_REQUEST_BLOCKS_DENEB` may be requested at a time. *[Modified in Deneb:EIP4844]* -Clients SHOULD consider including a block in the response as soon as it it passes the gossip validation rules. +Clients SHOULD consider including a block in the response as soon as it passes the gossip validation rules. ##### BlobSidecarsByRoot v1 From e2ca4b351999091ea64618f46b1ea162976ed716 Mon Sep 17 00:00:00 2001 From: Enrico Del Fante Date: Wed, 22 Nov 2023 23:30:18 +0100 Subject: [PATCH 12/28] add failed on_block condition --- specs/deneb/p2p-interface.md | 1 + 1 file changed, 1 insertion(+) diff --git a/specs/deneb/p2p-interface.md b/specs/deneb/p2p-interface.md index 858a0433e..1b437c28c 100644 --- a/specs/deneb/p2p-interface.md +++ b/specs/deneb/p2p-interface.md @@ -306,6 +306,7 @@ Clients MAY limit the number of blocks and sidecars in the response. Clients SHOULD consider including a sidecar in the response as soon as it passes the gossip validation rules. Clients MUST NOT respond with sidecars that failed gossip validation. Clients MUST NOT respond with sidecars related to blocks that failed `fork_choice.on_block`. +Clients MAY continue serving blocks\sidecars after failed `fork_choice.on_block` only if the failure reason is due to `is_data_available` failing for missing blobs. (i.e. some sidecars are missing but the available ones have been fully verified against the fully validated block)." ##### BlobSidecarsByRange v1 From d749a49665097a56e1cc824bfcdb68bcb1f8cea9 Mon Sep 17 00:00:00 2001 From: Enrico Del Fante Date: Wed, 22 Nov 2023 23:46:13 +0100 Subject: [PATCH 13/28] rephrase --- specs/deneb/p2p-interface.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/specs/deneb/p2p-interface.md b/specs/deneb/p2p-interface.md index 1b437c28c..bc12f3714 100644 --- a/specs/deneb/p2p-interface.md +++ b/specs/deneb/p2p-interface.md @@ -306,7 +306,7 @@ Clients MAY limit the number of blocks and sidecars in the response. Clients SHOULD consider including a sidecar in the response as soon as it passes the gossip validation rules. Clients MUST NOT respond with sidecars that failed gossip validation. Clients MUST NOT respond with sidecars related to blocks that failed `fork_choice.on_block`. -Clients MAY continue serving blocks\sidecars after failed `fork_choice.on_block` only if the failure reason is due to `is_data_available` failing for missing blobs. (i.e. some sidecars are missing but the available ones have been fully verified against the fully validated block)." +Clients MAY continue serving blocks\sidecars after failed `fork_choice.on_block` if and only if the failure reason is due to missing blobs. (i.e. some sidecars are missing but the available ones have been fully verified against the fully validated block). ##### BlobSidecarsByRange v1 From 4c5e5c886feab96287f9a180b7bad94d870a9f24 Mon Sep 17 00:00:00 2001 From: Enrico Del Fante Date: Wed, 29 Nov 2023 14:55:07 +0100 Subject: [PATCH 14/28] Update specs/phase0/p2p-interface.md Co-authored-by: Mikhail Kalinin --- specs/phase0/p2p-interface.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/specs/phase0/p2p-interface.md b/specs/phase0/p2p-interface.md index e838fe755..efae68832 100644 --- a/specs/phase0/p2p-interface.md +++ b/specs/phase0/p2p-interface.md @@ -856,7 +856,7 @@ Clients MUST support requesting blocks since the latest finalized epoch. Clients MUST respond with at least one block, if they have it. Clients MAY limit the number of blocks in the response. -Clients MAY consider including a block in the response as soon as it it passes the gossip validation rules. +Clients MAY consider including a block in the response as soon as it passes the gossip validation rules. Clients MUST NOT respond with blocks that failed gossip validation rules. Clients MUST NOT respond with blocks that failed `fork_choice.on_block`. From ccca4498c9f0975d4652c9badc04eed6c3f4a93c Mon Sep 17 00:00:00 2001 From: Enrico Del Fante Date: Wed, 29 Nov 2023 16:26:41 +0100 Subject: [PATCH 15/28] apply suggestion --- specs/deneb/p2p-interface.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/specs/deneb/p2p-interface.md b/specs/deneb/p2p-interface.md index bc12f3714..8150dee8d 100644 --- a/specs/deneb/p2p-interface.md +++ b/specs/deneb/p2p-interface.md @@ -255,6 +255,9 @@ No more than `MAX_REQUEST_BLOCKS_DENEB` may be requested at a time. *[Modified in Deneb:EIP4844]* Clients SHOULD consider including a block in the response as soon as it passes the gossip validation rules. +*[New in Deneb:EIP4844]* +Clients MAY continue serving blocks after failed `fork_choice.on_block` if and only if the failure reason is due to missing blobs. (i.e. some sidecars are missing but the available ones have been fully verified against the fully validated block). + ##### BlobSidecarsByRoot v1 **Protocol ID:** `/eth2/beacon_chain/req/blob_sidecars_by_root/1/` @@ -306,7 +309,7 @@ Clients MAY limit the number of blocks and sidecars in the response. Clients SHOULD consider including a sidecar in the response as soon as it passes the gossip validation rules. Clients MUST NOT respond with sidecars that failed gossip validation. Clients MUST NOT respond with sidecars related to blocks that failed `fork_choice.on_block`. -Clients MAY continue serving blocks\sidecars after failed `fork_choice.on_block` if and only if the failure reason is due to missing blobs. (i.e. some sidecars are missing but the available ones have been fully verified against the fully validated block). +Clients MAY continue serving sidecars after failed `fork_choice.on_block` if and only if the failure reason is due to missing blobs. (i.e. some sidecars are missing but the available ones have been fully verified against the fully validated block). ##### BlobSidecarsByRange v1 From 88b1818e9ba46fcc412457a31010e4909205e255 Mon Sep 17 00:00:00 2001 From: Enrico Del Fante Date: Thu, 30 Nov 2023 11:55:52 +0100 Subject: [PATCH 16/28] Update specs/deneb/p2p-interface.md Co-authored-by: danny --- specs/deneb/p2p-interface.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/specs/deneb/p2p-interface.md b/specs/deneb/p2p-interface.md index 8150dee8d..928f872dc 100644 --- a/specs/deneb/p2p-interface.md +++ b/specs/deneb/p2p-interface.md @@ -253,7 +253,7 @@ Per `context = compute_fork_digest(fork_version, genesis_validators_root)`: No more than `MAX_REQUEST_BLOCKS_DENEB` may be requested at a time. *[Modified in Deneb:EIP4844]* -Clients SHOULD consider including a block in the response as soon as it passes the gossip validation rules. +Clients SHOULD include a block in the response as soon as it passes the gossip validation rules. *[New in Deneb:EIP4844]* Clients MAY continue serving blocks after failed `fork_choice.on_block` if and only if the failure reason is due to missing blobs. (i.e. some sidecars are missing but the available ones have been fully verified against the fully validated block). From b525e9ed35e932d46bcb97ff7e8e2336f0e8b9f8 Mon Sep 17 00:00:00 2001 From: Enrico Del Fante Date: Thu, 30 Nov 2023 11:56:14 +0100 Subject: [PATCH 17/28] Update specs/deneb/p2p-interface.md Co-authored-by: danny --- specs/deneb/p2p-interface.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/specs/deneb/p2p-interface.md b/specs/deneb/p2p-interface.md index 928f872dc..ac4b6c96c 100644 --- a/specs/deneb/p2p-interface.md +++ b/specs/deneb/p2p-interface.md @@ -306,7 +306,7 @@ Clients MUST support requesting sidecars since `minimum_request_epoch`, where `m Clients MUST respond with at least one sidecar, if they have it. Clients MAY limit the number of blocks and sidecars in the response. -Clients SHOULD consider including a sidecar in the response as soon as it passes the gossip validation rules. +Clients SHOULD include a sidecar in the response as soon as it passes the gossip validation rules. Clients MUST NOT respond with sidecars that failed gossip validation. Clients MUST NOT respond with sidecars related to blocks that failed `fork_choice.on_block`. Clients MAY continue serving sidecars after failed `fork_choice.on_block` if and only if the failure reason is due to missing blobs. (i.e. some sidecars are missing but the available ones have been fully verified against the fully validated block). From 662c6ebc386133ee5e115f57e3ce5a466ab799ec Mon Sep 17 00:00:00 2001 From: Enrico Del Fante Date: Thu, 30 Nov 2023 12:08:42 +0100 Subject: [PATCH 18/28] remove the last consider --- specs/phase0/p2p-interface.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/specs/phase0/p2p-interface.md b/specs/phase0/p2p-interface.md index efae68832..9391b3656 100644 --- a/specs/phase0/p2p-interface.md +++ b/specs/phase0/p2p-interface.md @@ -856,7 +856,7 @@ Clients MUST support requesting blocks since the latest finalized epoch. Clients MUST respond with at least one block, if they have it. Clients MAY limit the number of blocks in the response. -Clients MAY consider including a block in the response as soon as it passes the gossip validation rules. +Clients MAY include a block in the response as soon as it passes the gossip validation rules. Clients MUST NOT respond with blocks that failed gossip validation rules. Clients MUST NOT respond with blocks that failed `fork_choice.on_block`. From bdac932ebbefd1b2db3ea52b3fc51701d88c5815 Mon Sep 17 00:00:00 2001 From: Enrico Del Fante Date: Thu, 30 Nov 2023 15:20:27 +0100 Subject: [PATCH 19/28] from on_block to state_transition --- specs/deneb/p2p-interface.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/specs/deneb/p2p-interface.md b/specs/deneb/p2p-interface.md index ac4b6c96c..2c6023a87 100644 --- a/specs/deneb/p2p-interface.md +++ b/specs/deneb/p2p-interface.md @@ -256,7 +256,9 @@ No more than `MAX_REQUEST_BLOCKS_DENEB` may be requested at a time. Clients SHOULD include a block in the response as soon as it passes the gossip validation rules. *[New in Deneb:EIP4844]* -Clients MAY continue serving blocks after failed `fork_choice.on_block` if and only if the failure reason is due to missing blobs. (i.e. some sidecars are missing but the available ones have been fully verified against the fully validated block). +Clients SHOULD NOT include blocks for which one of the following conditions is met: +- `state_transition(block)` fails. +- the kzg proof of an available blob is invalid with respect to `blob_kzg_commitments` in the `block` (i.e. `verify_blob_kzg_proof_batch` fails on one or more known blobs). ##### BlobSidecarsByRoot v1 @@ -307,9 +309,9 @@ Clients MUST respond with at least one sidecar, if they have it. Clients MAY limit the number of blocks and sidecars in the response. Clients SHOULD include a sidecar in the response as soon as it passes the gossip validation rules. -Clients MUST NOT respond with sidecars that failed gossip validation. -Clients MUST NOT respond with sidecars related to blocks that failed `fork_choice.on_block`. -Clients MAY continue serving sidecars after failed `fork_choice.on_block` if and only if the failure reason is due to missing blobs. (i.e. some sidecars are missing but the available ones have been fully verified against the fully validated block). +Clients SHOULD NOT include sidecars related to blocks for which one of the following conditions is met: +- `state_transition(block)` fails. +- the kzg proof of an available blob is invalid with respect to `blob_kzg_commitments` in the `block` (i.e. `verify_blob_kzg_proof_batch` fails on one or more known blobs). ##### BlobSidecarsByRange v1 From 6a460aeba1338a5753c8e357236bbed78ed379cc Mon Sep 17 00:00:00 2001 From: Hsiao-Wei Wang Date: Thu, 30 Nov 2023 23:06:27 +0800 Subject: [PATCH 20/28] Add randomized block cases --- .../merkle_proof/test_single_merkle_proof.py | 56 +++++++++++++++++-- 1 file changed, 50 insertions(+), 6 deletions(-) diff --git a/tests/core/pyspec/eth2spec/test/deneb/merkle_proof/test_single_merkle_proof.py b/tests/core/pyspec/eth2spec/test/deneb/merkle_proof/test_single_merkle_proof.py index 75bcacc7f..8ec6a1d92 100644 --- a/tests/core/pyspec/eth2spec/test/deneb/merkle_proof/test_single_merkle_proof.py +++ b/tests/core/pyspec/eth2spec/test/deneb/merkle_proof/test_single_merkle_proof.py @@ -1,3 +1,5 @@ +import random + from eth2spec.test.context import ( spec_state_test, with_deneb_and_later, @@ -5,7 +7,7 @@ from eth2spec.test.context import ( ) from eth2spec.test.helpers.block import ( build_empty_block_for_next_slot, - sign_block + sign_block, ) from eth2spec.test.helpers.execution_payload import ( compute_el_block_hash, @@ -13,14 +15,25 @@ from eth2spec.test.helpers.execution_payload import ( from eth2spec.test.helpers.sharding import ( get_sample_opaque_tx, ) +from eth2spec.debug.random_value import ( + RandomizationMode, + get_random_ssz_object, +) -@with_test_suite_name("BeaconBlockBody") -@with_deneb_and_later -@spec_state_test -def test_blob_kzg_commitment_merkle_proof(spec, state): +def _run_blob_kzg_commitment_merkle_proof_test(spec, state, rng=None): opaque_tx, blobs, blob_kzg_commitments, proofs = get_sample_opaque_tx(spec, blob_count=1) - block = build_empty_block_for_next_slot(spec, state) + if rng is None: + block = build_empty_block_for_next_slot(spec, state) + else: + block = get_random_ssz_object( + rng, + spec.BeaconBlock, + max_bytes_length=2000, + max_list_length=2000, + mode=RandomizationMode, + chaos=True, + ) block.body.blob_kzg_commitments = blob_kzg_commitments block.body.execution_payload.transactions = [opaque_tx] block.body.execution_payload.block_hash = compute_el_block_hash(spec, block.body.execution_payload) @@ -44,3 +57,34 @@ def test_blob_kzg_commitment_merkle_proof(spec, state): index=spec.get_subtree_index(gindex), root=blob_sidecar.signed_block_header.message.body_root, ) + + +@with_test_suite_name("BeaconBlockBody") +@with_deneb_and_later +@spec_state_test +def test_blob_kzg_commitment_merkle_proof__basic(spec, state): + yield from _run_blob_kzg_commitment_merkle_proof_test(spec, state) + + +@with_test_suite_name("BeaconBlockBody") +@with_deneb_and_later +@spec_state_test +def test_blob_kzg_commitment_merkle_proof__random_block_1(spec, state): + rng = random.Random(1111) + yield from _run_blob_kzg_commitment_merkle_proof_test(spec, state, rng=rng) + + +@with_test_suite_name("BeaconBlockBody") +@with_deneb_and_later +@spec_state_test +def test_blob_kzg_commitment_merkle_proof__random_block_2(spec, state): + rng = random.Random(2222) + yield from _run_blob_kzg_commitment_merkle_proof_test(spec, state, rng=rng) + + +@with_test_suite_name("BeaconBlockBody") +@with_deneb_and_later +@spec_state_test +def test_blob_kzg_commitment_merkle_proof__random_block_3(spec, state): + rng = random.Random(3333) + yield from _run_blob_kzg_commitment_merkle_proof_test(spec, state, rng=rng) From c661e20e60dc6d5f282f763146b8e8d84962d4a2 Mon Sep 17 00:00:00 2001 From: Enrico Del Fante Date: Thu, 30 Nov 2023 16:11:33 +0100 Subject: [PATCH 21/28] simplify and add a new rule --- specs/deneb/p2p-interface.md | 11 +++-------- specs/phase0/p2p-interface.md | 4 ++-- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/specs/deneb/p2p-interface.md b/specs/deneb/p2p-interface.md index 2c6023a87..04fc9ecc7 100644 --- a/specs/deneb/p2p-interface.md +++ b/specs/deneb/p2p-interface.md @@ -255,11 +255,6 @@ No more than `MAX_REQUEST_BLOCKS_DENEB` may be requested at a time. *[Modified in Deneb:EIP4844]* Clients SHOULD include a block in the response as soon as it passes the gossip validation rules. -*[New in Deneb:EIP4844]* -Clients SHOULD NOT include blocks for which one of the following conditions is met: -- `state_transition(block)` fails. -- the kzg proof of an available blob is invalid with respect to `blob_kzg_commitments` in the `block` (i.e. `verify_blob_kzg_proof_batch` fails on one or more known blobs). - ##### BlobSidecarsByRoot v1 **Protocol ID:** `/eth2/beacon_chain/req/blob_sidecars_by_root/1/` @@ -309,9 +304,9 @@ Clients MUST respond with at least one sidecar, if they have it. Clients MAY limit the number of blocks and sidecars in the response. Clients SHOULD include a sidecar in the response as soon as it passes the gossip validation rules. -Clients SHOULD NOT include sidecars related to blocks for which one of the following conditions is met: -- `state_transition(block)` fails. -- the kzg proof of an available blob is invalid with respect to `blob_kzg_commitments` in the `block` (i.e. `verify_blob_kzg_proof_batch` fails on one or more known blobs). +Clients MUST NOT respond with sidecars that fails gossip validation rules. +Clients MUST NOT respond with sidecars related to blocks that fail gossip validation rules. +Clients SHOULD NOT include sidecars related to blocks that fail `state_transition(block)`. ##### BlobSidecarsByRange v1 diff --git a/specs/phase0/p2p-interface.md b/specs/phase0/p2p-interface.md index 9391b3656..41b7a060a 100644 --- a/specs/phase0/p2p-interface.md +++ b/specs/phase0/p2p-interface.md @@ -857,8 +857,8 @@ Clients MUST respond with at least one block, if they have it. Clients MAY limit the number of blocks in the response. Clients MAY include a block in the response as soon as it passes the gossip validation rules. -Clients MUST NOT respond with blocks that failed gossip validation rules. -Clients MUST NOT respond with blocks that failed `fork_choice.on_block`. +Clients MUST NOT respond with blocks that fail gossip validation rules. +Clients SHOULD NOT include blocks that fail `state_transition(block)`. `/eth2/beacon_chain/req/beacon_blocks_by_root/1/` is deprecated. Clients MAY respond with an empty list during the deprecation transition period. From dad09f64b328dbb14571ae482992bc6c80bb2838 Mon Sep 17 00:00:00 2001 From: Enrico Del Fante Date: Fri, 1 Dec 2023 08:28:29 +0100 Subject: [PATCH 22/28] Update specs/phase0/p2p-interface.md Co-authored-by: Mikhail Kalinin --- specs/phase0/p2p-interface.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/specs/phase0/p2p-interface.md b/specs/phase0/p2p-interface.md index 41b7a060a..cbc5c8cb5 100644 --- a/specs/phase0/p2p-interface.md +++ b/specs/phase0/p2p-interface.md @@ -858,7 +858,7 @@ Clients MAY limit the number of blocks in the response. Clients MAY include a block in the response as soon as it passes the gossip validation rules. Clients MUST NOT respond with blocks that fail gossip validation rules. -Clients SHOULD NOT include blocks that fail `state_transition(block)`. +Clients SHOULD NOT respond with blocks that fail beacon chain state transition. `/eth2/beacon_chain/req/beacon_blocks_by_root/1/` is deprecated. Clients MAY respond with an empty list during the deprecation transition period. From eed7a66b25d6379923d62d67d28f9492d857c9fa Mon Sep 17 00:00:00 2001 From: Enrico Del Fante Date: Fri, 1 Dec 2023 08:28:41 +0100 Subject: [PATCH 23/28] Update specs/deneb/p2p-interface.md Co-authored-by: Mikhail Kalinin --- specs/deneb/p2p-interface.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/specs/deneb/p2p-interface.md b/specs/deneb/p2p-interface.md index 04fc9ecc7..363871ed8 100644 --- a/specs/deneb/p2p-interface.md +++ b/specs/deneb/p2p-interface.md @@ -305,7 +305,7 @@ Clients MAY limit the number of blocks and sidecars in the response. Clients SHOULD include a sidecar in the response as soon as it passes the gossip validation rules. Clients MUST NOT respond with sidecars that fails gossip validation rules. -Clients MUST NOT respond with sidecars related to blocks that fail gossip validation rules. +Clients SHOULD NOT respond with sidecars related to blocks that fail gossip validation rules. Clients SHOULD NOT include sidecars related to blocks that fail `state_transition(block)`. ##### BlobSidecarsByRange v1 From cf39eeda3d8a4c77a4361199829e17f65ff3f46f Mon Sep 17 00:00:00 2001 From: Enrico Del Fante Date: Fri, 1 Dec 2023 17:29:54 +0100 Subject: [PATCH 24/28] Update specs/deneb/p2p-interface.md Co-authored-by: danny --- specs/deneb/p2p-interface.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/specs/deneb/p2p-interface.md b/specs/deneb/p2p-interface.md index 363871ed8..82dfa3cc2 100644 --- a/specs/deneb/p2p-interface.md +++ b/specs/deneb/p2p-interface.md @@ -304,7 +304,7 @@ Clients MUST respond with at least one sidecar, if they have it. Clients MAY limit the number of blocks and sidecars in the response. Clients SHOULD include a sidecar in the response as soon as it passes the gossip validation rules. -Clients MUST NOT respond with sidecars that fails gossip validation rules. +Clients MUST NOT respond with sidecars that fail gossip validation rules. Clients SHOULD NOT respond with sidecars related to blocks that fail gossip validation rules. Clients SHOULD NOT include sidecars related to blocks that fail `state_transition(block)`. From ba09761ec39636204b9a00aaa807326a7eb53a58 Mon Sep 17 00:00:00 2001 From: Enrico Del Fante Date: Fri, 1 Dec 2023 18:36:25 +0100 Subject: [PATCH 25/28] remove gossip failure rules --- specs/deneb/p2p-interface.md | 1 - specs/phase0/p2p-interface.md | 1 - 2 files changed, 2 deletions(-) diff --git a/specs/deneb/p2p-interface.md b/specs/deneb/p2p-interface.md index 82dfa3cc2..6f848823a 100644 --- a/specs/deneb/p2p-interface.md +++ b/specs/deneb/p2p-interface.md @@ -304,7 +304,6 @@ Clients MUST respond with at least one sidecar, if they have it. Clients MAY limit the number of blocks and sidecars in the response. Clients SHOULD include a sidecar in the response as soon as it passes the gossip validation rules. -Clients MUST NOT respond with sidecars that fail gossip validation rules. Clients SHOULD NOT respond with sidecars related to blocks that fail gossip validation rules. Clients SHOULD NOT include sidecars related to blocks that fail `state_transition(block)`. diff --git a/specs/phase0/p2p-interface.md b/specs/phase0/p2p-interface.md index cbc5c8cb5..f54405301 100644 --- a/specs/phase0/p2p-interface.md +++ b/specs/phase0/p2p-interface.md @@ -857,7 +857,6 @@ Clients MUST respond with at least one block, if they have it. Clients MAY limit the number of blocks in the response. Clients MAY include a block in the response as soon as it passes the gossip validation rules. -Clients MUST NOT respond with blocks that fail gossip validation rules. Clients SHOULD NOT respond with blocks that fail beacon chain state transition. `/eth2/beacon_chain/req/beacon_blocks_by_root/1/` is deprecated. Clients MAY respond with an empty list during the deprecation transition period. From c43173e5bff59e4e7b2d66e293bc11a83891bc1b Mon Sep 17 00:00:00 2001 From: Hsiao-Wei Wang Date: Sat, 2 Dec 2023 07:33:18 +0800 Subject: [PATCH 26/28] Move `blob_sidecar_{subnet_id}` to `Blob subnets` section --- specs/deneb/p2p-interface.md | 41 ++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/specs/deneb/p2p-interface.md b/specs/deneb/p2p-interface.md index f7b331e84..2203a34ce 100644 --- a/specs/deneb/p2p-interface.md +++ b/specs/deneb/p2p-interface.md @@ -23,8 +23,9 @@ The specification of these changes continues in the same format as the network s - [Topics and messages](#topics-and-messages) - [Global topics](#global-topics) - [`beacon_block`](#beacon_block) - - [`blob_sidecar_{subnet_id}`](#blob_sidecar_subnet_id) - [`beacon_aggregate_and_proof`](#beacon_aggregate_and_proof) + - [Blob subnets](#blob-subnets) + - [`blob_sidecar_{subnet_id}`](#blob_sidecar_subnet_id) - [Attestation subnets](#attestation-subnets) - [`beacon_attestation_{subnet_id}`](#beacon_attestation_subnet_id) - [Transitioning the gossip](#transitioning-the-gossip) @@ -133,8 +134,6 @@ The new topics along with the type of the `data` field of a gossipsub message ar ##### Global topics -Deneb introduces new global topics for blob sidecars. - ###### `beacon_block` The *type* of the payload of this topic changes to the (modified) `SignedBeaconBlock` found in Deneb. @@ -146,6 +145,25 @@ New validation: - _[REJECT]_ The length of KZG commitments is less than or equal to the limitation defined in Consensus Layer -- i.e. validate that `len(body.signed_beacon_block.message.blob_kzg_commitments) <= MAX_BLOBS_PER_BLOCK` +###### `beacon_aggregate_and_proof` + +*[Modified in Deneb:EIP7045]* + +The following validation is removed: +* _[IGNORE]_ `aggregate.data.slot` is within the last `ATTESTATION_PROPAGATION_SLOT_RANGE` slots (with a `MAXIMUM_GOSSIP_CLOCK_DISPARITY` allowance) -- + i.e. `aggregate.data.slot + ATTESTATION_PROPAGATION_SLOT_RANGE >= current_slot >= aggregate.data.slot` + (a client MAY queue future aggregates for processing at the appropriate slot). + +The following validations are added in its place: +* _[IGNORE]_ `aggregate.data.slot` is equal to or earlier than the `current_slot` (with a `MAXIMUM_GOSSIP_CLOCK_DISPARITY` allowance) -- + i.e. `aggregate.data.slot <= current_slot` + (a client MAY queue future aggregates for processing at the appropriate slot). +* _[IGNORE]_ the epoch of `aggregate.data.slot` is either the current or previous epoch + (with a `MAXIMUM_GOSSIP_CLOCK_DISPARITY` allowance) -- + i.e. `compute_epoch_at_slot(aggregate.data.slot) in (get_previous_epoch(state), get_current_epoch(state))` + +##### Blob subnets + ###### `blob_sidecar_{subnet_id}` *[New in Deneb:EIP4844]* @@ -169,23 +187,6 @@ The following validations MUST pass before forwarding the `blob_sidecar` on the - _[REJECT]_ The sidecar is proposed by the expected `proposer_index` for the block's slot in the context of the current shuffling (defined by `block_header.parent_root`/`block_header.slot`). If the `proposer_index` cannot immediately be verified against the expected shuffling, the sidecar MAY be queued for later processing while proposers for the block's branch are calculated -- in such a case _do not_ `REJECT`, instead `IGNORE` this message. -###### `beacon_aggregate_and_proof` - -*[Modified in Deneb:EIP7045]* - -The following validation is removed: -* _[IGNORE]_ `aggregate.data.slot` is within the last `ATTESTATION_PROPAGATION_SLOT_RANGE` slots (with a `MAXIMUM_GOSSIP_CLOCK_DISPARITY` allowance) -- - i.e. `aggregate.data.slot + ATTESTATION_PROPAGATION_SLOT_RANGE >= current_slot >= aggregate.data.slot` - (a client MAY queue future aggregates for processing at the appropriate slot). - -The following validations are added in its place: -* _[IGNORE]_ `aggregate.data.slot` is equal to or earlier than the `current_slot` (with a `MAXIMUM_GOSSIP_CLOCK_DISPARITY` allowance) -- - i.e. `aggregate.data.slot <= current_slot` - (a client MAY queue future aggregates for processing at the appropriate slot). -* _[IGNORE]_ the epoch of `aggregate.data.slot` is either the current or previous epoch - (with a `MAXIMUM_GOSSIP_CLOCK_DISPARITY` allowance) -- - i.e. `compute_epoch_at_slot(aggregate.data.slot) in (get_previous_epoch(state), get_current_epoch(state))` - ##### Attestation subnets ###### `beacon_attestation_{subnet_id}` From d343b6f1d908453ca5d9bdc2f8a856b0a6599700 Mon Sep 17 00:00:00 2001 From: danny Date: Mon, 4 Dec 2023 07:47:12 -0700 Subject: [PATCH 27/28] Apply suggestions from code review --- specs/deneb/p2p-interface.md | 3 ++- specs/phase0/p2p-interface.md | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/specs/deneb/p2p-interface.md b/specs/deneb/p2p-interface.md index 6f848823a..84357c40b 100644 --- a/specs/deneb/p2p-interface.md +++ b/specs/deneb/p2p-interface.md @@ -254,6 +254,7 @@ No more than `MAX_REQUEST_BLOCKS_DENEB` may be requested at a time. *[Modified in Deneb:EIP4844]* Clients SHOULD include a block in the response as soon as it passes the gossip validation rules. +Clients SHOULD NOT respond with blocks that fail the beacon chain state transition. ##### BlobSidecarsByRoot v1 @@ -305,7 +306,7 @@ Clients MAY limit the number of blocks and sidecars in the response. Clients SHOULD include a sidecar in the response as soon as it passes the gossip validation rules. Clients SHOULD NOT respond with sidecars related to blocks that fail gossip validation rules. -Clients SHOULD NOT include sidecars related to blocks that fail `state_transition(block)`. +Clients SHOULD NOT respond with sidecars related to blocks that fail the beacon chain state transition ##### BlobSidecarsByRange v1 diff --git a/specs/phase0/p2p-interface.md b/specs/phase0/p2p-interface.md index f54405301..e9d43e5a7 100644 --- a/specs/phase0/p2p-interface.md +++ b/specs/phase0/p2p-interface.md @@ -857,7 +857,7 @@ Clients MUST respond with at least one block, if they have it. Clients MAY limit the number of blocks in the response. Clients MAY include a block in the response as soon as it passes the gossip validation rules. -Clients SHOULD NOT respond with blocks that fail beacon chain state transition. +Clients SHOULD NOT respond with blocks that fail the beacon chain state transition. `/eth2/beacon_chain/req/beacon_blocks_by_root/1/` is deprecated. Clients MAY respond with an empty list during the deprecation transition period. From a558f1956cb1d818d4a81f30e5ade6146f8f4112 Mon Sep 17 00:00:00 2001 From: Hsiao-Wei Wang Date: Mon, 4 Dec 2023 23:06:27 +0800 Subject: [PATCH 28/28] bump version to v1.4.0-beta.5 --- 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 744da44f2..3be2eb4f7 100644 --- a/tests/core/pyspec/eth2spec/VERSION.txt +++ b/tests/core/pyspec/eth2spec/VERSION.txt @@ -1 +1 @@ -1.4.0-beta.4 +1.4.0-beta.5