From 3f8020005034973d0196a0e5bb44981f062073c3 Mon Sep 17 00:00:00 2001 From: potuz Date: Mon, 11 May 2026 13:18:20 -0300 Subject: [PATCH 01/13] Check gas limit consistency with the target --- specs/gloas/p2p-interface.md | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/specs/gloas/p2p-interface.md b/specs/gloas/p2p-interface.md index b81edab548..8ac2ac3e40 100644 --- a/specs/gloas/p2p-interface.md +++ b/specs/gloas/p2p-interface.md @@ -338,8 +338,9 @@ The following validations MUST pass before forwarding the `signed_proposer_preferences` for the validated `SignedProposerPreferences` whose `message.proposal_slot` is `bid.slot` and `message.dependent_root` is `get_proposer_dependent_root(parent_state, compute_epoch_at_slot(bid.slot))`, -where `parent_state` is the post-state of `bid.parent_block_root`, and the alias -`proposer_preferences = signed_proposer_preferences.message`: +where `parent_block` is the block with block root equal to +`bid.parent_block_root`, `parent_state` is the post-state of `parent_block`, and +the alias `proposer_preferences = signed_proposer_preferences.message`. - _[IGNORE]_ `bid.slot` is the current slot or the next slot. - _[IGNORE]_ The matching `signed_proposer_preferences` has been seen. @@ -347,7 +348,6 @@ where `parent_state` is the post-state of `bid.parent_block_root`, and the alias `is_active_builder(state, bid.builder_index)` returns `True`. - _[REJECT]_ `bid.execution_payment == 0`. - _[REJECT]_ `bid.fee_recipient == proposer_preferences.fee_recipient`. -- _[REJECT]_ `bid.gas_limit == proposer_preferences.gas_limit`. - _[REJECT]_ The length of KZG commitments is less than or equal to the limitation defined in the consensus layer -- i.e. validate that `len(bid.blob_kzg_commitments) <= get_blob_parameters(compute_epoch_at_slot(bid.slot)).max_blobs_per_block`. @@ -358,12 +358,34 @@ where `parent_state` is the post-state of `bid.parent_block_root`, and the alias - _[IGNORE]_ `bid.value` is less or equal than the builder's excess balance -- i.e. `can_builder_cover_bid(state, builder_index, amount)` returns `True`. - _[IGNORE]_ `bid.parent_block_hash` is the block hash of a known execution - payload in fork choice. + payload in fork choice. Let `parent_bid` be the `ExecutionPayloadBid` in the + beacon block such that `parent_bid.block_hash == bid.parent_block_hash`. +- _[IGNORE]_ + `is_gas_limit_target_compatible(parent_bid.gas_limit, bid.gas_limit, proposer_preferences.gas_limit) == True`. - _[IGNORE]_ `bid.parent_block_root` is the hash tree root of a known beacon block in fork choice. - _[REJECT]_ `signed_execution_payload_bid.signature` is valid with respect to the `bid.builder_index`. +The following helper is used to validate the bid's gas limit + +```python +def is_gas_limit_target_compatible( + parent_gas_limit: uint64, gas_limit: uint64, preferences_gas_limit: uint64 +) -> bool: + """ + Check if the bid's gas limit is compatible with the proposer's preferences. + """ + min_gas_limit = parent_gas_limit - parent_gas_limit // 1024 + max_gas_limit = parent_gas_limit + parent_gas_limit // 1024 + + if preferences_gas_limit >= min_gas_limit and preferences_gas_limit <= max_gas_limit: + return gas_limit == preferences_gas_limit + if preferences_gas_limit > max_gas_limit: + return gas_limit == max_gas_limit + return gas_limit == min_gas_limit +``` + *Note*: Implementations SHOULD include DoS prevention measures to mitigate spam from malicious builders submitting numerous bids with minimal value increments. Possible strategies include: (1) only forwarding bids that exceed the current From 60e24b45bcdc551997791a6e3ab1a4d36aa5f95b Mon Sep 17 00:00:00 2001 From: Justin Traglia <95511699+jtraglia@users.noreply.github.com> Date: Mon, 11 May 2026 11:57:51 -0500 Subject: [PATCH 02/13] Replace "preferences" with "proposer" in var name --- specs/gloas/p2p-interface.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/specs/gloas/p2p-interface.md b/specs/gloas/p2p-interface.md index 8ac2ac3e40..4541f9de6d 100644 --- a/specs/gloas/p2p-interface.md +++ b/specs/gloas/p2p-interface.md @@ -371,7 +371,7 @@ The following helper is used to validate the bid's gas limit ```python def is_gas_limit_target_compatible( - parent_gas_limit: uint64, gas_limit: uint64, preferences_gas_limit: uint64 + parent_gas_limit: uint64, gas_limit: uint64, proposer_gas_limit: uint64 ) -> bool: """ Check if the bid's gas limit is compatible with the proposer's preferences. @@ -379,9 +379,9 @@ def is_gas_limit_target_compatible( min_gas_limit = parent_gas_limit - parent_gas_limit // 1024 max_gas_limit = parent_gas_limit + parent_gas_limit // 1024 - if preferences_gas_limit >= min_gas_limit and preferences_gas_limit <= max_gas_limit: - return gas_limit == preferences_gas_limit - if preferences_gas_limit > max_gas_limit: + if proposer_gas_limit >= min_gas_limit and proposer_gas_limit <= max_gas_limit: + return gas_limit == proposer_gas_limit + if proposer_gas_limit > max_gas_limit: return gas_limit == max_gas_limit return gas_limit == min_gas_limit ``` From 0df6375471d3810baa44244d4a836f0a221ff1c0 Mon Sep 17 00:00:00 2001 From: Nico Flaig Date: Tue, 12 May 2026 11:23:23 +0200 Subject: [PATCH 03/13] Review 5236 --- specs/gloas/builder.md | 4 ++-- specs/gloas/fork.md | 1 + specs/gloas/p2p-interface.md | 16 ++++++++-------- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/specs/gloas/builder.md b/specs/gloas/builder.md index 462c4b2928..2b1767838f 100644 --- a/specs/gloas/builder.md +++ b/specs/gloas/builder.md @@ -123,8 +123,8 @@ to include. They produce a `SignedExecutionPayloadBid` as follows. `get_proposer_dependent_root(parent_state, compute_epoch_at_slot(bid.slot))`, where `parent_state` is the post-state of `bid.parent_block_root`. 07. Set `bid.gas_limit` to be the gas limit of the constructed payload, which - must match the `gas_limit` in the `SignedProposerPreferences` referenced in - step 6. + **MUST** satisfy `is_gas_limit_target_compatible` with respect to the + `gas_limit` in the `SignedProposerPreferences` referenced in step 6. 08. Set `bid.builder_index` to be the index of the builder performing these actions. 09. Set `bid.slot` to be the slot for which this bid is aimed. This slot diff --git a/specs/gloas/fork.md b/specs/gloas/fork.md index c1182d89b8..75dbb1a376 100644 --- a/specs/gloas/fork.md +++ b/specs/gloas/fork.md @@ -182,6 +182,7 @@ def upgrade_to_gloas(pre: fulu.BeaconState) -> BeaconState: # [New in Gloas:EIP7732] latest_execution_payload_bid=ExecutionPayloadBid( block_hash=pre.latest_execution_payload_header.block_hash, + gas_limit=pre.latest_execution_payload_header.gas_limit, execution_requests_root=hash_tree_root(ExecutionRequests()), ), # [New in Gloas:EIP7732] diff --git a/specs/gloas/p2p-interface.md b/specs/gloas/p2p-interface.md index 4541f9de6d..f039ac5e6b 100644 --- a/specs/gloas/p2p-interface.md +++ b/specs/gloas/p2p-interface.md @@ -338,9 +338,8 @@ The following validations MUST pass before forwarding the `signed_proposer_preferences` for the validated `SignedProposerPreferences` whose `message.proposal_slot` is `bid.slot` and `message.dependent_root` is `get_proposer_dependent_root(parent_state, compute_epoch_at_slot(bid.slot))`, -where `parent_block` is the block with block root equal to -`bid.parent_block_root`, `parent_state` is the post-state of `parent_block`, and -the alias `proposer_preferences = signed_proposer_preferences.message`. +where `parent_state` is the post-state of `bid.parent_block_root`, and the alias +`proposer_preferences = signed_proposer_preferences.message`: - _[IGNORE]_ `bid.slot` is the current slot or the next slot. - _[IGNORE]_ The matching `signed_proposer_preferences` has been seen. @@ -358,10 +357,10 @@ the alias `proposer_preferences = signed_proposer_preferences.message`. - _[IGNORE]_ `bid.value` is less or equal than the builder's excess balance -- i.e. `can_builder_cover_bid(state, builder_index, amount)` returns `True`. - _[IGNORE]_ `bid.parent_block_hash` is the block hash of a known execution - payload in fork choice. Let `parent_bid` be the `ExecutionPayloadBid` in the - beacon block such that `parent_bid.block_hash == bid.parent_block_hash`. + payload in fork choice. Let `parent_gas_limit` be the `gas_limit` of that + execution payload. - _[IGNORE]_ - `is_gas_limit_target_compatible(parent_bid.gas_limit, bid.gas_limit, proposer_preferences.gas_limit) == True`. + `is_gas_limit_target_compatible(parent_gas_limit, bid.gas_limit, proposer_preferences.gas_limit) == True`. - _[IGNORE]_ `bid.parent_block_root` is the hash tree root of a known beacon block in fork choice. - _[REJECT]_ `signed_execution_payload_bid.signature` is valid with respect to @@ -376,8 +375,9 @@ def is_gas_limit_target_compatible( """ Check if the bid's gas limit is compatible with the proposer's preferences. """ - min_gas_limit = parent_gas_limit - parent_gas_limit // 1024 - max_gas_limit = parent_gas_limit + parent_gas_limit // 1024 + max_gas_limit_difference = parent_gas_limit // 1024 - 1 + min_gas_limit = parent_gas_limit - max_gas_limit_difference + max_gas_limit = parent_gas_limit + max_gas_limit_difference if proposer_gas_limit >= min_gas_limit and proposer_gas_limit <= max_gas_limit: return gas_limit == proposer_gas_limit From dd3127758514b92ce6bd8a855437a3973b90763b Mon Sep 17 00:00:00 2001 From: potuz Date: Tue, 12 May 2026 08:10:10 -0300 Subject: [PATCH 04/13] fix off-by-one --- specs/gloas/p2p-interface.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/specs/gloas/p2p-interface.md b/specs/gloas/p2p-interface.md index 4541f9de6d..11e4528612 100644 --- a/specs/gloas/p2p-interface.md +++ b/specs/gloas/p2p-interface.md @@ -376,8 +376,8 @@ def is_gas_limit_target_compatible( """ Check if the bid's gas limit is compatible with the proposer's preferences. """ - min_gas_limit = parent_gas_limit - parent_gas_limit // 1024 - max_gas_limit = parent_gas_limit + parent_gas_limit // 1024 + min_gas_limit = parent_gas_limit - parent_gas_limit // 1024 + 1 + max_gas_limit = parent_gas_limit + parent_gas_limit // 1024 - 1 if proposer_gas_limit >= min_gas_limit and proposer_gas_limit <= max_gas_limit: return gas_limit == proposer_gas_limit From 2dcc10ca1d5d07002be7b8725898d296ee6ac37c Mon Sep 17 00:00:00 2001 From: Nico Flaig Date: Tue, 12 May 2026 13:58:58 +0200 Subject: [PATCH 05/13] clamp max diff --- specs/gloas/p2p-interface.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/specs/gloas/p2p-interface.md b/specs/gloas/p2p-interface.md index f039ac5e6b..4c7c00f399 100644 --- a/specs/gloas/p2p-interface.md +++ b/specs/gloas/p2p-interface.md @@ -375,7 +375,7 @@ def is_gas_limit_target_compatible( """ Check if the bid's gas limit is compatible with the proposer's preferences. """ - max_gas_limit_difference = parent_gas_limit // 1024 - 1 + max_gas_limit_difference = max(parent_gas_limit // 1024, 1) - 1 min_gas_limit = parent_gas_limit - max_gas_limit_difference max_gas_limit = parent_gas_limit + max_gas_limit_difference From 964919b95d60bf151ff3cf9f95f6013f2f2c95ce Mon Sep 17 00:00:00 2001 From: Nico Flaig Date: Tue, 12 May 2026 22:11:06 +0200 Subject: [PATCH 06/13] keep change --- specs/gloas/p2p-interface.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/specs/gloas/p2p-interface.md b/specs/gloas/p2p-interface.md index 4c7c00f399..89095d3859 100644 --- a/specs/gloas/p2p-interface.md +++ b/specs/gloas/p2p-interface.md @@ -338,8 +338,9 @@ The following validations MUST pass before forwarding the `signed_proposer_preferences` for the validated `SignedProposerPreferences` whose `message.proposal_slot` is `bid.slot` and `message.dependent_root` is `get_proposer_dependent_root(parent_state, compute_epoch_at_slot(bid.slot))`, -where `parent_state` is the post-state of `bid.parent_block_root`, and the alias -`proposer_preferences = signed_proposer_preferences.message`: +where `parent_block` is the block with block root equal to +`bid.parent_block_root`, `parent_state` is the post-state of `parent_block`, and +the alias `proposer_preferences = signed_proposer_preferences.message`. - _[IGNORE]_ `bid.slot` is the current slot or the next slot. - _[IGNORE]_ The matching `signed_proposer_preferences` has been seen. From e92f06f4d8e9db4d4995f2b78820cebe7d859b3d Mon Sep 17 00:00:00 2001 From: Nico Flaig Date: Wed, 13 May 2026 00:19:36 +0200 Subject: [PATCH 07/13] is_gas_limit_target_compatible unit tests --- .../test_is_gas_limit_target_compatible.py | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 tests/core/pyspec/eth_consensus_specs/test/gloas/unittests/test_is_gas_limit_target_compatible.py diff --git a/tests/core/pyspec/eth_consensus_specs/test/gloas/unittests/test_is_gas_limit_target_compatible.py b/tests/core/pyspec/eth_consensus_specs/test/gloas/unittests/test_is_gas_limit_target_compatible.py new file mode 100644 index 0000000000..d7ee5ae486 --- /dev/null +++ b/tests/core/pyspec/eth_consensus_specs/test/gloas/unittests/test_is_gas_limit_target_compatible.py @@ -0,0 +1,50 @@ +from eth_consensus_specs.test.context import ( + single_phase, + spec_test, + with_gloas_and_later, +) + + +@with_gloas_and_later +@spec_test +@single_phase +def test_increase_within_limit(spec): + assert spec.is_gas_limit_target_compatible(60_000_000, 60_000_100, 60_000_100) + + +@with_gloas_and_later +@spec_test +@single_phase +def test_increase_exceeding_limit(spec): + # max_gas_limit_difference = 60_000_000 // 1024 - 1 = 58_592 + assert spec.is_gas_limit_target_compatible(60_000_000, 60_058_592, 100_000_000) + + +@with_gloas_and_later +@spec_test +@single_phase +def test_increase_exceeding_limit_off_by_one_fails(spec): + # gas_limit one above max_gas_limit (= 60_058_592) must fail (off by one) + assert not spec.is_gas_limit_target_compatible(60_000_000, 60_058_593, 100_000_000) + + +@with_gloas_and_later +@spec_test +@single_phase +def test_decrease_within_limit(spec): + assert spec.is_gas_limit_target_compatible(60_000_000, 59_999_990, 59_999_990) + + +@with_gloas_and_later +@spec_test +@single_phase +def test_decrease_exceeding_limit(spec): + # max_gas_limit_difference = 60_000_000 // 1024 - 1 = 58_592 + assert spec.is_gas_limit_target_compatible(60_000_000, 59_941_408, 30_000_000) + + +@with_gloas_and_later +@spec_test +@single_phase +def test_target_equals_parent(spec): + assert spec.is_gas_limit_target_compatible(60_000_000, 60_000_000, 60_000_000) From ae110b159d2b20db5a9f157aa2e9104deb18f90e Mon Sep 17 00:00:00 2001 From: Nico Flaig Date: Wed, 13 May 2026 00:44:07 +0200 Subject: [PATCH 08/13] add underflow test for coverage --- .../unittests/test_is_gas_limit_target_compatible.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/core/pyspec/eth_consensus_specs/test/gloas/unittests/test_is_gas_limit_target_compatible.py b/tests/core/pyspec/eth_consensus_specs/test/gloas/unittests/test_is_gas_limit_target_compatible.py index d7ee5ae486..46d011ec32 100644 --- a/tests/core/pyspec/eth_consensus_specs/test/gloas/unittests/test_is_gas_limit_target_compatible.py +++ b/tests/core/pyspec/eth_consensus_specs/test/gloas/unittests/test_is_gas_limit_target_compatible.py @@ -48,3 +48,11 @@ def test_decrease_exceeding_limit(spec): @single_phase def test_target_equals_parent(spec): assert spec.is_gas_limit_target_compatible(60_000_000, 60_000_000, 60_000_000) + + +@with_gloas_and_later +@spec_test +@single_phase +def test_parent_gas_limit_underflows(spec): + # parent_gas_limit // 1024 = 0; guard clamps to max(0, 1) - 1 = 0 (no underflow) + assert spec.is_gas_limit_target_compatible(1023, 1023, 60_000_000) From 9b480f3efb690220e6cd2e7c4460fae589650d84 Mon Sep 17 00:00:00 2001 From: Nico Flaig Date: Thu, 14 May 2026 16:35:47 +0200 Subject: [PATCH 09/13] Rename to target_gas_limit in proposer preferences (#22) --- specs/gloas/builder.md | 2 +- specs/gloas/p2p-interface.md | 17 +++++++++-------- specs/gloas/validator.md | 10 +++++----- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/specs/gloas/builder.md b/specs/gloas/builder.md index 2b1767838f..64297cfdb0 100644 --- a/specs/gloas/builder.md +++ b/specs/gloas/builder.md @@ -124,7 +124,7 @@ to include. They produce a `SignedExecutionPayloadBid` as follows. where `parent_state` is the post-state of `bid.parent_block_root`. 07. Set `bid.gas_limit` to be the gas limit of the constructed payload, which **MUST** satisfy `is_gas_limit_target_compatible` with respect to the - `gas_limit` in the `SignedProposerPreferences` referenced in step 6. + `target_gas_limit` in the `SignedProposerPreferences` referenced in step 6. 08. Set `bid.builder_index` to be the index of the builder performing these actions. 09. Set `bid.slot` to be the slot for which this bid is aimed. This slot diff --git a/specs/gloas/p2p-interface.md b/specs/gloas/p2p-interface.md index 89095d3859..fdb2afc59f 100644 --- a/specs/gloas/p2p-interface.md +++ b/specs/gloas/p2p-interface.md @@ -90,7 +90,7 @@ class ProposerPreferences(Container): proposal_slot: Slot validator_index: ValidatorIndex fee_recipient: ExecutionAddress - gas_limit: uint64 + target_gas_limit: uint64 ``` #### New `SignedProposerPreferences` @@ -361,7 +361,7 @@ the alias `proposer_preferences = signed_proposer_preferences.message`. payload in fork choice. Let `parent_gas_limit` be the `gas_limit` of that execution payload. - _[IGNORE]_ - `is_gas_limit_target_compatible(parent_gas_limit, bid.gas_limit, proposer_preferences.gas_limit) == True`. + `is_gas_limit_target_compatible(parent_gas_limit, bid.gas_limit, proposer_preferences.target_gas_limit) == True`. - _[IGNORE]_ `bid.parent_block_root` is the hash tree root of a known beacon block in fork choice. - _[REJECT]_ `signed_execution_payload_bid.signature` is valid with respect to @@ -371,18 +371,19 @@ The following helper is used to validate the bid's gas limit ```python def is_gas_limit_target_compatible( - parent_gas_limit: uint64, gas_limit: uint64, proposer_gas_limit: uint64 + parent_gas_limit: uint64, gas_limit: uint64, target_gas_limit: uint64 ) -> bool: """ - Check if the bid's gas limit is compatible with the proposer's preferences. + Check if ``gas_limit`` is compatible with ``target_gas_limit`` under the + EIP-1559 transition rule from ``parent_gas_limit``. """ max_gas_limit_difference = max(parent_gas_limit // 1024, 1) - 1 min_gas_limit = parent_gas_limit - max_gas_limit_difference max_gas_limit = parent_gas_limit + max_gas_limit_difference - if proposer_gas_limit >= min_gas_limit and proposer_gas_limit <= max_gas_limit: - return gas_limit == proposer_gas_limit - if proposer_gas_limit > max_gas_limit: + if target_gas_limit >= min_gas_limit and target_gas_limit <= max_gas_limit: + return gas_limit == target_gas_limit + if target_gas_limit > max_gas_limit: return gas_limit == max_gas_limit return gas_limit == min_gas_limit ``` @@ -399,7 +400,7 @@ bid at regular time intervals. This topic is used to propagate signed proposer preferences as `SignedProposerPreferences`. These messages allow validators to communicate -their preferred `fee_recipient` and `gas_limit` to builders. +their preferred `fee_recipient` and `target_gas_limit` to builders. The following validations MUST pass before forwarding the `signed_proposer_preferences` on the network, assuming the alias diff --git a/specs/gloas/validator.md b/specs/gloas/validator.md index 49b690c280..f2ef7c320e 100644 --- a/specs/gloas/validator.md +++ b/specs/gloas/validator.md @@ -127,9 +127,9 @@ A validator MAY broadcast `SignedProposerPreferences` messages to the `get_upcoming_proposal_slots(state, validator_index)`. These include any future proposal slots within the proposer lookahead, i.e. the current epoch up to `MIN_SEED_LOOKAHEAD` epochs ahead. This allows builders to construct execution -payloads with the validator's preferred `fee_recipient` and `gas_limit`. If a -validator does not broadcast a `SignedProposerPreferences` message, this implies -that the validator will not accept any trustless bids for that slot. +payloads with the validator's preferred `fee_recipient` and `target_gas_limit`. +If a validator does not broadcast a `SignedProposerPreferences` message, this +implies that the validator will not accept any trustless bids for that slot. ```python def get_upcoming_proposal_slots( @@ -161,8 +161,8 @@ To construct each `SignedProposerPreferences`: 4. Set `preferences.validator_index` to the validator's index. 5. Set `preferences.fee_recipient` to the execution address where the validator wishes to receive the builder payment. -6. Set `preferences.gas_limit` to the validator's preferred gas limit for this - execution payload. +6. Set `preferences.target_gas_limit` to the validator's preferred gas limit for + this execution payload. 7. Instantiate a new `SignedProposerPreferences` object as `signed_preferences`. 8. Set `signed_preferences.message` to `preferences`. 9. Set `signed_preferences.signature` to the result of From 1bb549b7ecb66f7815930b328af5a03dba3e33c7 Mon Sep 17 00:00:00 2001 From: Justin Traglia Date: Thu, 14 May 2026 21:13:16 -0500 Subject: [PATCH 10/13] Remove reference to parent_block --- specs/gloas/p2p-interface.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/specs/gloas/p2p-interface.md b/specs/gloas/p2p-interface.md index fdb2afc59f..d8d355f0c3 100644 --- a/specs/gloas/p2p-interface.md +++ b/specs/gloas/p2p-interface.md @@ -338,9 +338,8 @@ The following validations MUST pass before forwarding the `signed_proposer_preferences` for the validated `SignedProposerPreferences` whose `message.proposal_slot` is `bid.slot` and `message.dependent_root` is `get_proposer_dependent_root(parent_state, compute_epoch_at_slot(bid.slot))`, -where `parent_block` is the block with block root equal to -`bid.parent_block_root`, `parent_state` is the post-state of `parent_block`, and -the alias `proposer_preferences = signed_proposer_preferences.message`. +where `parent_state` is the post-state of `bid.parent_block_root`, and the alias +`proposer_preferences = signed_proposer_preferences.message`: - _[IGNORE]_ `bid.slot` is the current slot or the next slot. - _[IGNORE]_ The matching `signed_proposer_preferences` has been seen. From 5357718a2bff19aaf813312f9a778c40eb38e271 Mon Sep 17 00:00:00 2001 From: Justin Traglia Date: Thu, 14 May 2026 21:49:48 -0500 Subject: [PATCH 11/13] Clarify where parent_gas_limit comes from --- specs/gloas/builder.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/specs/gloas/builder.md b/specs/gloas/builder.md index 64297cfdb0..af465eede4 100644 --- a/specs/gloas/builder.md +++ b/specs/gloas/builder.md @@ -123,8 +123,11 @@ to include. They produce a `SignedExecutionPayloadBid` as follows. `get_proposer_dependent_root(parent_state, compute_epoch_at_slot(bid.slot))`, where `parent_state` is the post-state of `bid.parent_block_root`. 07. Set `bid.gas_limit` to be the gas limit of the constructed payload, which - **MUST** satisfy `is_gas_limit_target_compatible` with respect to the - `target_gas_limit` in the `SignedProposerPreferences` referenced in step 6. + **MUST** satisfy + `is_gas_limit_target_compatible(parent_gas_limit, bid.gas_limit, target_gas_limit)`, + where `parent_gas_limit` is the `gas_limit` of the parent execution payload + and `target_gas_limit` is the `target_gas_limit` in the + `SignedProposerPreferences` referenced in step 6. 08. Set `bid.builder_index` to be the index of the builder performing these actions. 09. Set `bid.slot` to be the slot for which this bid is aimed. This slot From d66e57d297cc65074ba8d09ba218d020a2a36f34 Mon Sep 17 00:00:00 2001 From: Justin Traglia Date: Thu, 14 May 2026 22:01:59 -0500 Subject: [PATCH 12/13] Rephrase gossip condition --- specs/gloas/p2p-interface.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/specs/gloas/p2p-interface.md b/specs/gloas/p2p-interface.md index d8d355f0c3..425c3783eb 100644 --- a/specs/gloas/p2p-interface.md +++ b/specs/gloas/p2p-interface.md @@ -357,10 +357,10 @@ where `parent_state` is the post-state of `bid.parent_block_root`, and the alias - _[IGNORE]_ `bid.value` is less or equal than the builder's excess balance -- i.e. `can_builder_cover_bid(state, builder_index, amount)` returns `True`. - _[IGNORE]_ `bid.parent_block_hash` is the block hash of a known execution - payload in fork choice. Let `parent_gas_limit` be the `gas_limit` of that - execution payload. -- _[IGNORE]_ - `is_gas_limit_target_compatible(parent_gas_limit, bid.gas_limit, proposer_preferences.target_gas_limit) == True`. + payload in fork choice and + `is_gas_limit_target_compatible(parent_gas_limit, bid.gas_limit, proposer_preferences.target_gas_limit)` + is `True` where `parent_gas_limit` is the `gas_limit` of that execution + payload. - _[IGNORE]_ `bid.parent_block_root` is the hash tree root of a known beacon block in fork choice. - _[REJECT]_ `signed_execution_payload_bid.signature` is valid with respect to From 3b613856d14e787617405ea9d1eee5179caa86e3 Mon Sep 17 00:00:00 2001 From: Justin Traglia Date: Thu, 14 May 2026 22:07:31 -0500 Subject: [PATCH 13/13] Remove unnecessary sentence --- specs/gloas/p2p-interface.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/specs/gloas/p2p-interface.md b/specs/gloas/p2p-interface.md index 425c3783eb..5b4ead9244 100644 --- a/specs/gloas/p2p-interface.md +++ b/specs/gloas/p2p-interface.md @@ -366,8 +366,6 @@ where `parent_state` is the post-state of `bid.parent_block_root`, and the alias - _[REJECT]_ `signed_execution_payload_bid.signature` is valid with respect to the `bid.builder_index`. -The following helper is used to validate the bid's gas limit - ```python def is_gas_limit_target_compatible( parent_gas_limit: uint64, gas_limit: uint64, target_gas_limit: uint64