Compare commits

...

9 Commits

Author SHA1 Message Date
Preston Van Loon
db2bb5505c db: Copy byte slices that live outside of the view transaction (#16332)
**What type of PR is this?**

Bug fix

**What does this PR do? Why is it needed?**

The bbolt documentation suggests that the byte slices used during the
View transaction should not be used outside of the transaction and
mutating those slices could break things.

**Which issues(s) does this PR fix?**

**Other notes for review**

**Acknowledgements**

- [x] I have read
[CONTRIBUTING.md](https://github.com/prysmaticlabs/prysm/blob/develop/CONTRIBUTING.md).
- [x] I have included a uniquely named [changelog fragment
file](https://github.com/prysmaticlabs/prysm/blob/develop/CONTRIBUTING.md#maintaining-changelogmd).
- [x] I have added a description with sufficient context for reviewers
to understand this PR.
- [x] I have tested that my changes work as expected and I added a
testing plan to the PR description (if applicable).
2026-02-07 14:10:07 +00:00
terence
14f01bbc6c gloas: move kzg commitments to bid (#16309)
This PR moves kzg commitments to bid. The rationale behind is captured
in this [issue](https://github.com/ethereum/consensus-specs/issues/4870)
* Moves blob KZG commitments to the earlier point where builder intent
is known
* Removes duplicated commitments from data column sidecars which saves
descent b/w per slot
* Enables nodes to start fetching blobs via getBlobs as soon as the bid
is received
* Slightly increases bid size and may add minor bidding channel latency
but the tradeoff favors lower network load and simpler DA handling
2026-02-06 23:07:54 +00:00
Potuz
c3e74e4a5d Remove unused method in forkchoice (#16337) 2026-02-06 19:21:58 +00:00
Potuz
e7ae6a004b Remove unused method in forkchoice (#16331) 2026-02-06 15:30:50 +00:00
Bastin
862fb2eb4a Fix gen-logs.sh - gitignore bug (#16328)
**What does this PR do? Why is it needed?**
`gen-logs.sh` was skipping `cmd/beacon-chain/execution/` due to a rule
in `.gitignore`.
Added a fix in `gen-logs.sh` to ignore `.gitignore` entries by
specification.
2026-02-05 14:06:42 +00:00
Potuz
bb80a9c832 Remove unused map in forkchoice (#16329)
nodeByPayload was not being used.
2026-02-05 13:25:06 +00:00
Bastin
c1b668a50a Fix logging issue (#16322)
**What does this PR do? Why is it needed?**
This PR, in an attempt to fix the logging issue described in #16314,
does the following:
- Adds a new field `Identifier` to the `WriterHook` struct, and filters
out log entries that have the key `log_target` and the value of the
hook's `Identifier`. For now the identifiers are `ephemeral` and `user`,
differentiating between the user facing terminal/log file, and the
debugger facing ephemeral log file.
- Stores the value of the `--verbosity` and `--log.vmodule` flags in
`io/logs`, so it can be accessed by packages that need to know the
verbosity they're logging with. (note that since #16272 each package can
have a different verbosity, so verbosity is now defined per package
instead of globally)
- Improves the calculation of the global logging level by ignoring the
`ephemeralLogFileVerbosity` when the `--disable-ephemeral-log-file` flag
is enabled.
- Uses these added logic to fix the problem in
`logStateTransitionData()` (described in #16314)

Note: since we're saving this new data in `io/logs`, we should refactor
`prefixFormatter` to read the data from here. but that creates a
circular import error. I will try to fix this and refactor the formatter
in a future PR.

---------

Co-authored-by: Manu NALEPA <enalepa@offchainlabs.com>
2026-02-05 10:24:50 +00:00
Justin Traglia
fab687d96d Improve ethspecify integration (#16304)
**What type of PR is this?**

Documentation

**What does this PR do? Why is it needed?**

* Move the ethspecify config from `/specrefs/.ethspecify` to
`/.ethspecify`.
* This allows developers to use inline specrefs (eg spec functions in
godoc comments).
* To do this, simply add a spec tag and run `ethspecify` to populate it.
* Clean up specref exceptions; organize by upgrade & put items in the
correct section.
* Update a few godoc comments to use the new inline specref feature.
* Update check-specrefs GitHub action so that it enforces up-to-date
godocs.
* Standardize specref naming; requiring a `#fork` tag for everything.
* Add new specrefs (which haven't been implemented yet) which were
missing.

**Acknowledgements**

- [x] I have read
[CONTRIBUTING.md](https://github.com/prysmaticlabs/prysm/blob/develop/CONTRIBUTING.md).
- [x] I have included a uniquely named [changelog fragment
file](https://github.com/prysmaticlabs/prysm/blob/develop/CONTRIBUTING.md#maintaining-changelogmd).
- [x] I have added a description with sufficient context for reviewers
to understand this PR.
- [x] I have tested that my changes work as expected and I added a
testing plan to the PR description (if applicable).

---------

Co-authored-by: james-prysm <90280386+james-prysm@users.noreply.github.com>
2026-02-04 18:44:01 +00:00
james-prysm
cf94ccbf72 node fallback cleanup (#16316)
**What type of PR is this?**

 Other

**What does this PR do? Why is it needed?**

Follow up to https://github.com/OffchainLabs/prysm/pull/16215 this pr
improves logging, fixes stuttering in package naming, adds additional
unit tests, and deduplicates fallback node code.

**Which issues(s) does this PR fix?**

fixes a potential race if reconnecting to the same host very quickly
which has a stale connection still.

**Other notes for review**

**Acknowledgements**

- [x] I have read
[CONTRIBUTING.md](https://github.com/prysmaticlabs/prysm/blob/develop/CONTRIBUTING.md).
- [x] I have included a uniquely named [changelog fragment
file](https://github.com/prysmaticlabs/prysm/blob/develop/CONTRIBUTING.md#maintaining-changelogmd).
- [x] I have added a description with sufficient context for reviewers
to understand this PR.
- [x] I have tested that my changes work as expected and I added a
testing plan to the PR description (if applicable).
2026-02-04 15:59:42 +00:00
157 changed files with 6442 additions and 3156 deletions

View File

@@ -1,25 +1,39 @@
version: v1.7.0-alpha.1 version: v1.7.0-alpha.2
style: full style: full
specrefs: specrefs:
search_root: .. search_root: .
auto_standardize_names: true
auto_add_missing_entries: true
require_exceptions_have_fork: true
files: files:
- configs.yml - specrefs/configs.yml
- constants.yml - specrefs/constants.yml
- containers.yml - specrefs/containers.yml
- dataclasses.yml - specrefs/dataclasses.yml
- functions.yml - specrefs/functions.yml
- presets.yml - specrefs/presets.yml
exceptions: exceptions:
presets: presets:
# Not implemented: gloas (future fork) # gloas
- BUILDER_PENDING_WITHDRAWALS_LIMIT#gloas - BUILDER_PENDING_WITHDRAWALS_LIMIT#gloas
- MAX_PAYLOAD_ATTESTATIONS#gloas - MAX_PAYLOAD_ATTESTATIONS#gloas
- PTC_SIZE#gloas - PTC_SIZE#gloas
constants: constants:
# Constants in the KZG library # phase0
- BASIS_POINTS#phase0
- ENDIANNESS#phase0
- MAX_CONCURRENT_REQUESTS#phase0
- UINT64_MAX#phase0
- UINT64_MAX_SQRT#phase0
# altair
- PARTICIPATION_FLAG_WEIGHTS#altair
# bellatrix
- SAFE_SLOTS_TO_IMPORT_OPTIMISTICALLY#bellatrix
# deneb
- BLS_MODULUS#deneb - BLS_MODULUS#deneb
- BYTES_PER_COMMITMENT#deneb - BYTES_PER_COMMITMENT#deneb
- BYTES_PER_FIELD_ELEMENT#deneb - BYTES_PER_FIELD_ELEMENT#deneb
@@ -33,18 +47,9 @@ exceptions:
- PRIMITIVE_ROOT_OF_UNITY#deneb - PRIMITIVE_ROOT_OF_UNITY#deneb
- RANDOM_CHALLENGE_KZG_BATCH_DOMAIN#deneb - RANDOM_CHALLENGE_KZG_BATCH_DOMAIN#deneb
- RANDOM_CHALLENGE_KZG_CELL_BATCH_DOMAIN#fulu - RANDOM_CHALLENGE_KZG_CELL_BATCH_DOMAIN#fulu
# fulu
# Not implemented
- BASIS_POINTS#phase0
- ENDIANNESS#phase0
- MAX_CONCURRENT_REQUESTS#phase0
- PARTICIPATION_FLAG_WEIGHTS#altair
- SAFE_SLOTS_TO_IMPORT_OPTIMISTICALLY#bellatrix
- UINT256_MAX#fulu - UINT256_MAX#fulu
- UINT64_MAX#phase0 # gloas
- UINT64_MAX_SQRT#phase0
# Not implemented: gloas (future fork)
- BUILDER_PAYMENT_THRESHOLD_DENOMINATOR#gloas - BUILDER_PAYMENT_THRESHOLD_DENOMINATOR#gloas
- BUILDER_PAYMENT_THRESHOLD_NUMERATOR#gloas - BUILDER_PAYMENT_THRESHOLD_NUMERATOR#gloas
- BUILDER_WITHDRAWAL_PREFIX#gloas - BUILDER_WITHDRAWAL_PREFIX#gloas
@@ -61,61 +66,62 @@ exceptions:
- PTC_TIMELINESS_INDEX#gloas - PTC_TIMELINESS_INDEX#gloas
configs: configs:
# Not implemented: gloas (future fork) # gloas
- AGGREGATE_DUE_BPS_GLOAS#gloas - AGGREGATE_DUE_BPS_GLOAS#gloas
- ATTESTATION_DUE_BPS_GLOAS#gloas - ATTESTATION_DUE_BPS_GLOAS#gloas
- CONTRIBUTION_DUE_BPS_GLOAS#gloas - CONTRIBUTION_DUE_BPS_GLOAS#gloas
- GLOAS_FORK_EPOCH#gloas - GLOAS_FORK_EPOCH#gloas
- GLOAS_FORK_VERSION#gloas - GLOAS_FORK_VERSION#gloas
- MAX_REQUEST_PAYLOADS#gloas - MAX_REQUEST_PAYLOADS#gloas
- MIN_BUILDER_WITHDRAWABILITY_DELAY#gloas
- PAYLOAD_ATTESTATION_DUE_BPS#gloas - PAYLOAD_ATTESTATION_DUE_BPS#gloas
- SYNC_MESSAGE_DUE_BPS_GLOAS#gloas - SYNC_MESSAGE_DUE_BPS_GLOAS#gloas
- MIN_BUILDER_WITHDRAWABILITY_DELAY#gloas
ssz_objects: ssz_objects:
# Not implemented # phase0
- Eth1Block#phase0 - Eth1Block#phase0
- MatrixEntry#fulu # capella
# Not implemented: capella
- LightClientBootstrap#capella - LightClientBootstrap#capella
- LightClientFinalityUpdate#capella - LightClientFinalityUpdate#capella
- LightClientOptimisticUpdate#capella - LightClientOptimisticUpdate#capella
- LightClientUpdate#capella - LightClientUpdate#capella
# fulu
# Not implemented: gloas (future fork) - MatrixEntry#fulu
# gloas
- BeaconBlockBody#gloas - BeaconBlockBody#gloas
- BeaconState#gloas - BeaconState#gloas
- Builder#gloas
- BuilderPendingPayment#gloas - BuilderPendingPayment#gloas
- BuilderPendingWithdrawal#gloas - BuilderPendingWithdrawal#gloas
- DataColumnSidecar#gloas - DataColumnSidecar#gloas
- ExecutionPayloadEnvelope#gloas
- ExecutionPayloadBid#gloas - ExecutionPayloadBid#gloas
- ExecutionPayloadEnvelope#gloas
- ForkChoiceNode#gloas - ForkChoiceNode#gloas
- IndexedPayloadAttestation#gloas - IndexedPayloadAttestation#gloas
- PayloadAttestation#gloas - PayloadAttestation#gloas
- PayloadAttestationData#gloas - PayloadAttestationData#gloas
- PayloadAttestationMessage#gloas - PayloadAttestationMessage#gloas
- SignedExecutionPayloadEnvelope#gloas
- SignedExecutionPayloadBid#gloas
- Builder#gloas
- ProposerPreferences#gloas - ProposerPreferences#gloas
- SignedExecutionPayloadBid#gloas
- SignedExecutionPayloadEnvelope#gloas
- SignedProposerPreferences#gloas - SignedProposerPreferences#gloas
dataclasses: dataclasses:
# Not implemented # phase0
- BlobParameters#fulu
- ExpectedWithdrawals#capella
- ExpectedWithdrawals#electra
- LatestMessage#phase0 - LatestMessage#phase0
- LightClientStore#altair
- OptimisticStore#bellatrix
- Store#phase0 - Store#phase0
# altair
# Not implemented: capella - LightClientStore#altair
# bellatrix
- OptimisticStore#bellatrix
# capella
- ExpectedWithdrawals#capella
- LightClientStore#capella - LightClientStore#capella
# electra
# Not implemented: gloas (future fork) - ExpectedWithdrawals#electra
# fulu
- BlobParameters#fulu
# gloas
- ExpectedWithdrawals#gloas - ExpectedWithdrawals#gloas
- LatestMessage#gloas - LatestMessage#gloas
- Store#gloas - Store#gloas
@@ -140,7 +146,6 @@ exceptions:
- g1_lincomb#deneb - g1_lincomb#deneb
- hash_to_bls_field#deneb - hash_to_bls_field#deneb
- is_power_of_two#deneb - is_power_of_two#deneb
- multi_exp#deneb
- reverse_bits#deneb - reverse_bits#deneb
- validate_kzg_g1#deneb - validate_kzg_g1#deneb
- verify_blob_kzg_proof#deneb - verify_blob_kzg_proof#deneb
@@ -175,7 +180,12 @@ exceptions:
- verify_cell_kzg_proof_batch#fulu - verify_cell_kzg_proof_batch#fulu
- verify_cell_kzg_proof_batch_impl#fulu - verify_cell_kzg_proof_batch_impl#fulu
# Not implemented: phase0 # phase0
- update_proposer_boost_root#phase0
- is_proposer_equivocation#phase0
- record_block_timeliness#phase0
- compute_proposer_score#phase0
- get_attestation_score#phase0
- calculate_committee_fraction#phase0 - calculate_committee_fraction#phase0
- compute_fork_version#phase0 - compute_fork_version#phase0
- compute_pulled_up_tip#phase0 - compute_pulled_up_tip#phase0
@@ -221,8 +231,7 @@ exceptions:
- validate_on_attestation#phase0 - validate_on_attestation#phase0
- validate_target_epoch_against_current_time#phase0 - validate_target_epoch_against_current_time#phase0
- xor#phase0 - xor#phase0
# altair
# Not implemented: altair
- compute_merkle_proof#altair - compute_merkle_proof#altair
- compute_sync_committee_period_at_slot#altair - compute_sync_committee_period_at_slot#altair
- get_contribution_and_proof#altair - get_contribution_and_proof#altair
@@ -244,27 +253,29 @@ exceptions:
- process_sync_committee_contributions#altair - process_sync_committee_contributions#altair
- set_or_append_list#altair - set_or_append_list#altair
- validate_light_client_update#altair - validate_light_client_update#altair
# bellatrix
# Not implemented: bellatrix
- get_execution_payload#bellatrix - get_execution_payload#bellatrix
- is_merge_transition_block#bellatrix - is_merge_transition_block#bellatrix
- is_optimistic_candidate_block#bellatrix - is_optimistic_candidate_block#bellatrix
- latest_verified_ancestor#bellatrix - latest_verified_ancestor#bellatrix
- prepare_execution_payload#bellatrix - prepare_execution_payload#bellatrix
# capella
# Not implemented: capella - apply_withdrawals#capella
- get_balance_after_withdrawals#capella
- get_lc_execution_root#capella - get_lc_execution_root#capella
- get_validators_sweep_withdrawals#capella
- is_valid_light_client_header#capella - is_valid_light_client_header#capella
- prepare_execution_payload#capella - prepare_execution_payload#capella
- process_epoch#capella - process_epoch#capella
- update_next_withdrawal_index#capella
- update_next_withdrawal_validator_index#capella
- upgrade_lc_bootstrap_to_capella#capella - upgrade_lc_bootstrap_to_capella#capella
- upgrade_lc_finality_update_to_capella#capella - upgrade_lc_finality_update_to_capella#capella
- upgrade_lc_header_to_capella#capella - upgrade_lc_header_to_capella#capella
- upgrade_lc_optimistic_update_to_capella#capella - upgrade_lc_optimistic_update_to_capella#capella
- upgrade_lc_store_to_capella#capella - upgrade_lc_store_to_capella#capella
- upgrade_lc_update_to_capella#capella - upgrade_lc_update_to_capella#capella
# deneb
# Not implemented: deneb
- get_lc_execution_root#deneb - get_lc_execution_root#deneb
- is_valid_light_client_header#deneb - is_valid_light_client_header#deneb
- prepare_execution_payload#deneb - prepare_execution_payload#deneb
@@ -274,33 +285,34 @@ exceptions:
- upgrade_lc_optimistic_update_to_deneb#deneb - upgrade_lc_optimistic_update_to_deneb#deneb
- upgrade_lc_store_to_deneb#deneb - upgrade_lc_store_to_deneb#deneb
- upgrade_lc_update_to_deneb#deneb - upgrade_lc_update_to_deneb#deneb
# electra
# Not implemented: electra
- compute_weak_subjectivity_period#electra - compute_weak_subjectivity_period#electra
- current_sync_committee_gindex_at_slot#electra - current_sync_committee_gindex_at_slot#electra
- finalized_root_gindex_at_slot#electra - finalized_root_gindex_at_slot#electra
- get_eth1_vote#electra - get_eth1_vote#electra
- get_lc_execution_root#electra - get_lc_execution_root#electra
- get_pending_partial_withdrawals#electra
- get_validators_sweep_withdrawals#electra
- is_compounding_withdrawal_credential#electra - is_compounding_withdrawal_credential#electra
- is_eligible_for_partial_withdrawals#electra
- is_within_weak_subjectivity_period#electra - is_within_weak_subjectivity_period#electra
- next_sync_committee_gindex_at_slot#electra - next_sync_committee_gindex_at_slot#electra
- normalize_merkle_branch#electra - normalize_merkle_branch#electra
- prepare_execution_payload#electra - prepare_execution_payload#electra
- update_pending_partial_withdrawals#electra
- upgrade_lc_bootstrap_to_electra#electra - upgrade_lc_bootstrap_to_electra#electra
- upgrade_lc_finality_update_to_electra#electra - upgrade_lc_finality_update_to_electra#electra
- upgrade_lc_header_to_electra#electra - upgrade_lc_header_to_electra#electra
- upgrade_lc_optimistic_update_to_electra#electra - upgrade_lc_optimistic_update_to_electra#electra
- upgrade_lc_store_to_electra#electra - upgrade_lc_store_to_electra#electra
- upgrade_lc_update_to_electra#electra - upgrade_lc_update_to_electra#electra
# fulu
# Not implemented: fulu
- compute_matrix#fulu - compute_matrix#fulu
- get_blob_parameters#fulu - get_blob_parameters#fulu
- get_data_column_sidecars_from_block#fulu - get_data_column_sidecars_from_block#fulu
- get_data_column_sidecars_from_column_sidecar#fulu - get_data_column_sidecars_from_column_sidecar#fulu
- recover_matrix#fulu - recover_matrix#fulu
# gloas
# Not implemented: gloas (future fork)
- compute_balance_weighted_acceptance#gloas - compute_balance_weighted_acceptance#gloas
- compute_balance_weighted_selection#gloas - compute_balance_weighted_selection#gloas
- compute_fork_version#gloas - compute_fork_version#gloas
@@ -368,49 +380,42 @@ exceptions:
- verify_execution_payload_bid_signature#gloas - verify_execution_payload_bid_signature#gloas
- add_builder_to_registry#gloas - add_builder_to_registry#gloas
- apply_deposit_for_builder#gloas - apply_deposit_for_builder#gloas
- apply_withdrawals#capella
- apply_withdrawals#gloas - apply_withdrawals#gloas
- can_builder_cover_bid#gloas - can_builder_cover_bid#gloas
- compute_proposer_score#phase0
- convert_builder_index_to_validator_index#gloas - convert_builder_index_to_validator_index#gloas
- convert_validator_index_to_builder_index#gloas - convert_validator_index_to_builder_index#gloas
- get_attestation_score#gloas - get_attestation_score#gloas
- get_attestation_score#phase0 - get_attestation_score#phase0
- get_balance_after_withdrawals#capella - get_balance_after_withdrawals#capella
- get_builder_from_deposit#gloas
- get_builder_withdrawals#gloas - get_builder_withdrawals#gloas
- get_builders_sweep_withdrawals#gloas - get_builders_sweep_withdrawals#gloas
- get_index_for_new_builder#gloas - get_index_for_new_builder#gloas
- get_pending_balance_to_withdraw_for_builder#gloas - get_pending_balance_to_withdraw_for_builder#gloas
- get_pending_partial_withdrawals#electra
- get_proposer_preferences_signature#gloas - get_proposer_preferences_signature#gloas
- get_upcoming_proposal_slots#gloas - get_upcoming_proposal_slots#gloas
- get_validators_sweep_withdrawals#capella
- get_validators_sweep_withdrawals#electra
- initiate_builder_exit#gloas - initiate_builder_exit#gloas
- is_active_builder#gloas - is_active_builder#gloas
- is_builder_index#gloas - is_builder_index#gloas
- is_data_available#gloas
- is_eligible_for_partial_withdrawals#electra - is_eligible_for_partial_withdrawals#electra
- is_head_late#gloas - is_head_late#gloas
- is_head_weak#gloas - is_head_weak#gloas
- is_parent_strong#gloas - is_parent_strong#gloas
- is_proposer_equivocation#phase0
- is_valid_proposal_slot#gloas - is_valid_proposal_slot#gloas
- onboard_builders_from_pending_deposits#gloas
- process_deposit_request#gloas - process_deposit_request#gloas
- process_voluntary_exit#gloas - process_voluntary_exit#gloas
- record_block_timeliness#gloas - record_block_timeliness#gloas
- record_block_timeliness#phase0 - record_block_timeliness#phase0
- verify_data_column_sidecar_kzg_proofs#gloas
- should_apply_proposer_boost#gloas - should_apply_proposer_boost#gloas
- update_builder_pending_withdrawals#gloas - update_builder_pending_withdrawals#gloas
- update_next_withdrawal_builder_index#gloas - update_next_withdrawal_builder_index#gloas
- update_next_withdrawal_index#capella
- update_next_withdrawal_validator_index#capella
- update_payload_expected_withdrawals#gloas - update_payload_expected_withdrawals#gloas
- update_pending_partial_withdrawals#electra
- update_proposer_boost_root#gloas - update_proposer_boost_root#gloas
- update_proposer_boost_root#phase0
presets: presets:
# gloas
- BUILDER_PENDING_WITHDRAWALS_LIMIT#gloas - BUILDER_PENDING_WITHDRAWALS_LIMIT#gloas
- BUILDER_REGISTRY_LIMIT#gloas - BUILDER_REGISTRY_LIMIT#gloas
- MAX_BUILDERS_PER_WITHDRAWALS_SWEEP#gloas - MAX_BUILDERS_PER_WITHDRAWALS_SWEEP#gloas

View File

@@ -12,11 +12,11 @@ jobs:
- name: Check version consistency - name: Check version consistency
run: | run: |
WORKSPACE_VERSION=$(grep 'consensus_spec_version = ' WORKSPACE | sed 's/.*"\(.*\)"/\1/') WORKSPACE_VERSION=$(grep 'consensus_spec_version = ' WORKSPACE | sed 's/.*"\(.*\)"/\1/')
ETHSPECIFY_VERSION=$(grep '^version:' specrefs/.ethspecify.yml | sed 's/version: //') ETHSPECIFY_VERSION=$(grep '^version:' .ethspecify.yml | sed 's/version: //')
if [ "$WORKSPACE_VERSION" != "$ETHSPECIFY_VERSION" ]; then if [ "$WORKSPACE_VERSION" != "$ETHSPECIFY_VERSION" ]; then
echo "Version mismatch between WORKSPACE and ethspecify" echo "Version mismatch between WORKSPACE and ethspecify"
echo " WORKSPACE: $WORKSPACE_VERSION" echo " WORKSPACE: $WORKSPACE_VERSION"
echo " specrefs/.ethspecify.yml: $ETHSPECIFY_VERSION" echo " .ethspecify.yml: $ETHSPECIFY_VERSION"
exit 1 exit 1
else else
echo "Versions match: $WORKSPACE_VERSION" echo "Versions match: $WORKSPACE_VERSION"
@@ -26,7 +26,7 @@ jobs:
run: python3 -mpip install ethspecify run: python3 -mpip install ethspecify
- name: Update spec references - name: Update spec references
run: ethspecify process --path=specrefs run: ethspecify
- name: Check for differences - name: Check for differences
run: | run: |
@@ -40,4 +40,4 @@ jobs:
fi fi
- name: Check spec references - name: Check spec references
run: ethspecify check --path=specrefs run: ethspecify check

View File

@@ -273,16 +273,16 @@ filegroup(
url = "https://github.com/ethereum/EIPs/archive/5480440fe51742ed23342b68cf106cefd427e39d.tar.gz", url = "https://github.com/ethereum/EIPs/archive/5480440fe51742ed23342b68cf106cefd427e39d.tar.gz",
) )
consensus_spec_version = "v1.7.0-alpha.1" consensus_spec_version = "v1.7.0-alpha.2"
load("@prysm//tools:download_spectests.bzl", "consensus_spec_tests") load("@prysm//tools:download_spectests.bzl", "consensus_spec_tests")
consensus_spec_tests( consensus_spec_tests(
name = "consensus_spec_tests", name = "consensus_spec_tests",
flavors = { flavors = {
"general": "sha256-j5R3jA7Oo4OSDMTvpMuD+8RomaCByeFSwtfkq6fL0Zg=", "general": "sha256-iGQsGZ1cHah+2CSod9jC3kN8Ku4n6KO0hIwfINrn/po=",
"minimal": "sha256-tdTqByoyswOS4r6OxFmo70y2BP7w1TgEok+gf4cbxB0=", "minimal": "sha256-TgcYt8N8sXSttdHTGvOa+exUZ1zn1UzlAMz0V7i37xc=",
"mainnet": "sha256-5gB4dt6SnSDKzdBc06VedId3NkgvSYyv9n9FRxWKwYI=", "mainnet": "sha256-LnXyiLoJtrvEvbqLDSAAqpLMdN/lXv92SAgYG8fNjCs=",
}, },
version = consensus_spec_version, version = consensus_spec_version,
) )
@@ -298,7 +298,7 @@ filegroup(
visibility = ["//visibility:public"], visibility = ["//visibility:public"],
) )
""", """,
integrity = "sha256-J+43DrK1pF658kTXTwMS6zGf4KDjvas++m8w2a8swpg=", integrity = "sha256-Y/67Dg393PksZj5rTFNLntiJ6hNdB7Rxbu5gZE2gebY=",
strip_prefix = "consensus-specs-" + consensus_spec_version[1:], strip_prefix = "consensus-specs-" + consensus_spec_version[1:],
url = "https://github.com/ethereum/consensus-specs/archive/refs/tags/%s.tar.gz" % consensus_spec_version, url = "https://github.com/ethereum/consensus-specs/archive/refs/tags/%s.tar.gz" % consensus_spec_version,
) )

19
api/fallback/BUILD.bazel Normal file
View File

@@ -0,0 +1,19 @@
load("@prysm//tools/go:def.bzl", "go_library", "go_test")
go_library(
name = "go_default_library",
srcs = [
"fallback.go",
"log.go",
],
importpath = "github.com/OffchainLabs/prysm/v7/api/fallback",
visibility = ["//visibility:public"],
deps = ["@com_github_sirupsen_logrus//:go_default_library"],
)
go_test(
name = "go_default_test",
srcs = ["fallback_test.go"],
embed = [":go_default_library"],
deps = ["//testing/assert:go_default_library"],
)

66
api/fallback/fallback.go Normal file
View File

@@ -0,0 +1,66 @@
package fallback
import (
"context"
"github.com/sirupsen/logrus"
)
// HostProvider is the subset of connection-provider methods that EnsureReady
// needs. Both grpc.GrpcConnectionProvider and rest.RestConnectionProvider
// satisfy this interface.
type HostProvider interface {
Hosts() []string
CurrentHost() string
SwitchHost(index int) error
}
// ReadyChecker can report whether the current endpoint is ready.
// iface.NodeClient satisfies this implicitly.
type ReadyChecker interface {
IsReady(ctx context.Context) bool
}
// EnsureReady iterates through the configured hosts and returns true as soon as
// one responds as ready. It starts from the provider's current host and wraps
// around using modular arithmetic, performing failover when a host is not ready.
func EnsureReady(ctx context.Context, provider HostProvider, checker ReadyChecker) bool {
hosts := provider.Hosts()
numHosts := len(hosts)
startingHost := provider.CurrentHost()
var attemptedHosts []string
// Find current index
currentIdx := 0
for i, h := range hosts {
if h == startingHost {
currentIdx = i
break
}
}
for i := range numHosts {
if checker.IsReady(ctx) {
if len(attemptedHosts) > 0 {
log.WithFields(logrus.Fields{
"previous": startingHost,
"current": provider.CurrentHost(),
"tried": attemptedHosts,
}).Info("Switched to responsive beacon node")
}
return true
}
attemptedHosts = append(attemptedHosts, provider.CurrentHost())
// Try next host if not the last iteration
if i < numHosts-1 {
nextIdx := (currentIdx + i + 1) % numHosts
if err := provider.SwitchHost(nextIdx); err != nil {
log.WithError(err).Error("Failed to switch host")
}
}
}
log.WithField("tried", attemptedHosts).Warn("No responsive beacon node found")
return false
}

View File

@@ -0,0 +1,94 @@
package fallback
import (
"context"
"testing"
"github.com/OffchainLabs/prysm/v7/testing/assert"
)
// mockHostProvider is a minimal HostProvider for unit tests.
type mockHostProvider struct {
hosts []string
hostIndex int
}
func (m *mockHostProvider) Hosts() []string { return m.hosts }
func (m *mockHostProvider) CurrentHost() string {
return m.hosts[m.hostIndex%len(m.hosts)]
}
func (m *mockHostProvider) SwitchHost(index int) error { m.hostIndex = index; return nil }
// mockReadyChecker records per-call IsReady results in sequence.
type mockReadyChecker struct {
results []bool
idx int
}
func (m *mockReadyChecker) IsReady(_ context.Context) bool {
if m.idx >= len(m.results) {
return false
}
r := m.results[m.idx]
m.idx++
return r
}
func TestEnsureReady_SingleHostReady(t *testing.T) {
provider := &mockHostProvider{hosts: []string{"http://host1:3500"}, hostIndex: 0}
checker := &mockReadyChecker{results: []bool{true}}
assert.Equal(t, true, EnsureReady(t.Context(), provider, checker))
assert.Equal(t, 0, provider.hostIndex)
}
func TestEnsureReady_SingleHostNotReady(t *testing.T) {
provider := &mockHostProvider{hosts: []string{"http://host1:3500"}, hostIndex: 0}
checker := &mockReadyChecker{results: []bool{false}}
assert.Equal(t, false, EnsureReady(t.Context(), provider, checker))
}
func TestEnsureReady_SingleHostError(t *testing.T) {
provider := &mockHostProvider{hosts: []string{"http://host1:3500"}, hostIndex: 0}
checker := &mockReadyChecker{results: []bool{false}}
assert.Equal(t, false, EnsureReady(t.Context(), provider, checker))
}
func TestEnsureReady_MultipleHostsFirstReady(t *testing.T) {
provider := &mockHostProvider{
hosts: []string{"http://host1:3500", "http://host2:3500"},
hostIndex: 0,
}
checker := &mockReadyChecker{results: []bool{true}}
assert.Equal(t, true, EnsureReady(t.Context(), provider, checker))
assert.Equal(t, 0, provider.hostIndex)
}
func TestEnsureReady_MultipleHostsFailoverToSecond(t *testing.T) {
provider := &mockHostProvider{
hosts: []string{"http://host1:3500", "http://host2:3500"},
hostIndex: 0,
}
checker := &mockReadyChecker{results: []bool{false, true}}
assert.Equal(t, true, EnsureReady(t.Context(), provider, checker))
assert.Equal(t, 1, provider.hostIndex)
}
func TestEnsureReady_MultipleHostsNoneReady(t *testing.T) {
provider := &mockHostProvider{
hosts: []string{"http://host1:3500", "http://host2:3500", "http://host3:3500"},
hostIndex: 0,
}
checker := &mockReadyChecker{results: []bool{false, false, false}}
assert.Equal(t, false, EnsureReady(t.Context(), provider, checker))
}
func TestEnsureReady_WrapAroundFromNonZeroIndex(t *testing.T) {
provider := &mockHostProvider{
hosts: []string{"http://host0:3500", "http://host1:3500", "http://host2:3500"},
hostIndex: 1,
}
// host1 (start) fails, host2 fails, host0 succeeds
checker := &mockReadyChecker{results: []bool{false, false, true}}
assert.Equal(t, true, EnsureReady(t.Context(), provider, checker))
assert.Equal(t, 0, provider.hostIndex)
}

9
api/fallback/log.go Normal file
View File

@@ -0,0 +1,9 @@
// Code generated by hack/gen-logs.sh; DO NOT EDIT.
// This file is created and regenerated automatically. Anything added here might get removed.
package fallback
import "github.com/sirupsen/logrus"
// The prefix for logs from this package will be the text after the last slash in the package path.
// If you wish to change this, you should add your desired name in the runtime/logging/logrus-prefixed-formatter/prefix-replacement.go file.
var log = logrus.WithField("package", "api/fallback")

View File

@@ -25,6 +25,11 @@ type GrpcConnectionProvider interface {
// SwitchHost switches to the endpoint at the given index. // SwitchHost switches to the endpoint at the given index.
// The new connection is created lazily on next CurrentConn() call. // The new connection is created lazily on next CurrentConn() call.
SwitchHost(index int) error SwitchHost(index int) error
// ConnectionCounter returns a monotonically increasing counter that increments
// each time SwitchHost changes the active endpoint. This allows consumers to
// detect connection changes even when the host string returns to a previous value
// (e.g., host0 → host1 → host0).
ConnectionCounter() uint64
// Close closes the current connection. // Close closes the current connection.
Close() Close()
} }
@@ -38,6 +43,7 @@ type grpcConnectionProvider struct {
// Current connection state (protected by mutex) // Current connection state (protected by mutex)
currentIndex uint64 currentIndex uint64
conn *grpc.ClientConn conn *grpc.ClientConn
connCounter uint64
mu sync.Mutex mu sync.Mutex
closed bool closed bool
@@ -138,6 +144,7 @@ func (p *grpcConnectionProvider) SwitchHost(index int) error {
p.conn = nil // Clear immediately - new connection created lazily p.conn = nil // Clear immediately - new connection created lazily
p.currentIndex = uint64(index) p.currentIndex = uint64(index)
p.connCounter++
// Close old connection asynchronously to avoid blocking the caller // Close old connection asynchronously to avoid blocking the caller
if oldConn != nil { if oldConn != nil {
@@ -155,6 +162,12 @@ func (p *grpcConnectionProvider) SwitchHost(index int) error {
return nil return nil
} }
func (p *grpcConnectionProvider) ConnectionCounter() uint64 {
p.mu.Lock()
defer p.mu.Unlock()
return p.connCounter
}
func (p *grpcConnectionProvider) Close() { func (p *grpcConnectionProvider) Close() {
p.mu.Lock() p.mu.Lock()
defer p.mu.Unlock() defer p.mu.Unlock()

View File

@@ -4,17 +4,24 @@ import "google.golang.org/grpc"
// MockGrpcProvider implements GrpcConnectionProvider for testing. // MockGrpcProvider implements GrpcConnectionProvider for testing.
type MockGrpcProvider struct { type MockGrpcProvider struct {
MockConn *grpc.ClientConn MockConn *grpc.ClientConn
MockHosts []string MockHosts []string
CurrentIndex int
ConnCounter uint64
} }
func (m *MockGrpcProvider) CurrentConn() *grpc.ClientConn { return m.MockConn } func (m *MockGrpcProvider) CurrentConn() *grpc.ClientConn { return m.MockConn }
func (m *MockGrpcProvider) CurrentHost() string { func (m *MockGrpcProvider) CurrentHost() string {
if len(m.MockHosts) > 0 { if len(m.MockHosts) > 0 {
return m.MockHosts[0] return m.MockHosts[m.CurrentIndex]
} }
return "" return ""
} }
func (m *MockGrpcProvider) Hosts() []string { return m.MockHosts } func (m *MockGrpcProvider) Hosts() []string { return m.MockHosts }
func (m *MockGrpcProvider) SwitchHost(int) error { return nil } func (m *MockGrpcProvider) SwitchHost(idx int) error {
func (m *MockGrpcProvider) Close() {} m.CurrentIndex = idx
m.ConnCounter++
return nil
}
func (m *MockGrpcProvider) ConnectionCounter() uint64 { return m.ConnCounter }
func (m *MockGrpcProvider) Close() {}

View File

@@ -9,13 +9,13 @@ import (
// MockRestProvider implements RestConnectionProvider for testing. // MockRestProvider implements RestConnectionProvider for testing.
type MockRestProvider struct { type MockRestProvider struct {
MockClient *http.Client MockClient *http.Client
MockHandler RestHandler MockHandler Handler
MockHosts []string MockHosts []string
HostIndex int HostIndex int
} }
func (m *MockRestProvider) HttpClient() *http.Client { return m.MockClient } func (m *MockRestProvider) HttpClient() *http.Client { return m.MockClient }
func (m *MockRestProvider) RestHandler() RestHandler { return m.MockHandler } func (m *MockRestProvider) Handler() Handler { return m.MockHandler }
func (m *MockRestProvider) CurrentHost() string { func (m *MockRestProvider) CurrentHost() string {
if len(m.MockHosts) > 0 { if len(m.MockHosts) > 0 {
return m.MockHosts[m.HostIndex%len(m.MockHosts)] return m.MockHosts[m.HostIndex%len(m.MockHosts)]
@@ -25,25 +25,22 @@ func (m *MockRestProvider) CurrentHost() string {
func (m *MockRestProvider) Hosts() []string { return m.MockHosts } func (m *MockRestProvider) Hosts() []string { return m.MockHosts }
func (m *MockRestProvider) SwitchHost(index int) error { m.HostIndex = index; return nil } func (m *MockRestProvider) SwitchHost(index int) error { m.HostIndex = index; return nil }
// MockRestHandler implements RestHandler for testing. // MockHandler implements Handler for testing.
type MockRestHandler struct { type MockHandler struct {
MockHost string MockHost string
MockClient *http.Client
} }
func (m *MockRestHandler) Get(_ context.Context, _ string, _ any) error { return nil } func (m *MockHandler) Get(_ context.Context, _ string, _ any) error { return nil }
func (m *MockRestHandler) GetStatusCode(_ context.Context, _ string) (int, error) { func (m *MockHandler) GetStatusCode(_ context.Context, _ string) (int, error) {
return http.StatusOK, nil return http.StatusOK, nil
} }
func (m *MockRestHandler) GetSSZ(_ context.Context, _ string) ([]byte, http.Header, error) { func (m *MockHandler) GetSSZ(_ context.Context, _ string) ([]byte, http.Header, error) {
return nil, nil, nil return nil, nil, nil
} }
func (m *MockRestHandler) Post(_ context.Context, _ string, _ map[string]string, _ *bytes.Buffer, _ any) error { func (m *MockHandler) Post(_ context.Context, _ string, _ map[string]string, _ *bytes.Buffer, _ any) error {
return nil return nil
} }
func (m *MockRestHandler) PostSSZ(_ context.Context, _ string, _ map[string]string, _ *bytes.Buffer) ([]byte, http.Header, error) { func (m *MockHandler) PostSSZ(_ context.Context, _ string, _ map[string]string, _ *bytes.Buffer) ([]byte, http.Header, error) {
return nil, nil, nil return nil, nil, nil
} }
func (m *MockRestHandler) HttpClient() *http.Client { return m.MockClient } func (m *MockHandler) Host() string { return m.MockHost }
func (m *MockRestHandler) Host() string { return m.MockHost }
func (m *MockRestHandler) SwitchHost(host string) { m.MockHost = host }

View File

@@ -17,8 +17,8 @@ import (
type RestConnectionProvider interface { type RestConnectionProvider interface {
// HttpClient returns the configured HTTP client with headers, timeout, and optional tracing. // HttpClient returns the configured HTTP client with headers, timeout, and optional tracing.
HttpClient() *http.Client HttpClient() *http.Client
// RestHandler returns the REST handler for making API requests. // Handler returns the REST handler for making API requests.
RestHandler() RestHandler Handler() Handler
// CurrentHost returns the current REST API endpoint URL. // CurrentHost returns the current REST API endpoint URL.
CurrentHost() string CurrentHost() string
// Hosts returns all configured REST API endpoint URLs. // Hosts returns all configured REST API endpoint URLs.
@@ -54,7 +54,7 @@ func WithTracing() RestConnectionProviderOption {
type restConnectionProvider struct { type restConnectionProvider struct {
endpoints []string endpoints []string
httpClient *http.Client httpClient *http.Client
restHandler RestHandler restHandler *handler
currentIndex atomic.Uint64 currentIndex atomic.Uint64
timeout time.Duration timeout time.Duration
headers map[string][]string headers map[string][]string
@@ -96,7 +96,7 @@ func NewRestConnectionProvider(endpoint string, opts ...RestConnectionProviderOp
} }
// Create the REST handler with the HTTP client and initial host // Create the REST handler with the HTTP client and initial host
p.restHandler = newRestHandler(*p.httpClient, endpoints[0]) p.restHandler = newHandler(*p.httpClient, endpoints[0])
log.WithFields(logrus.Fields{ log.WithFields(logrus.Fields{
"endpoints": endpoints, "endpoints": endpoints,
@@ -124,7 +124,7 @@ func (p *restConnectionProvider) HttpClient() *http.Client {
return p.httpClient return p.httpClient
} }
func (p *restConnectionProvider) RestHandler() RestHandler { func (p *restConnectionProvider) Handler() Handler {
return p.restHandler return p.restHandler
} }

View File

@@ -21,32 +21,35 @@ import (
type reqOption func(*http.Request) type reqOption func(*http.Request)
// RestHandler defines the interface for making REST API requests. // Handler defines the interface for making REST API requests.
type RestHandler interface { type Handler interface {
Get(ctx context.Context, endpoint string, resp any) error Get(ctx context.Context, endpoint string, resp any) error
GetStatusCode(ctx context.Context, endpoint string) (int, error) GetStatusCode(ctx context.Context, endpoint string) (int, error)
GetSSZ(ctx context.Context, endpoint string) ([]byte, http.Header, error) GetSSZ(ctx context.Context, endpoint string) ([]byte, http.Header, error)
Post(ctx context.Context, endpoint string, headers map[string]string, data *bytes.Buffer, resp any) error Post(ctx context.Context, endpoint string, headers map[string]string, data *bytes.Buffer, resp any) error
PostSSZ(ctx context.Context, endpoint string, headers map[string]string, data *bytes.Buffer) ([]byte, http.Header, error) PostSSZ(ctx context.Context, endpoint string, headers map[string]string, data *bytes.Buffer) ([]byte, http.Header, error)
HttpClient() *http.Client
Host() string Host() string
SwitchHost(host string)
} }
type restHandler struct { type handler struct {
client http.Client client http.Client
host string host string
reqOverrides []reqOption reqOverrides []reqOption
} }
// newRestHandler returns a RestHandler (internal use) // newHandler returns a *handler for internal use within the rest package.
func newRestHandler(client http.Client, host string) RestHandler { func newHandler(client http.Client, host string) *handler {
return NewRestHandler(client, host) rh := &handler{
client: client,
host: host,
}
rh.appendAcceptOverride()
return rh
} }
// NewRestHandler returns a RestHandler // NewHandler returns a Handler
func NewRestHandler(client http.Client, host string) RestHandler { func NewHandler(client http.Client, host string) Handler {
rh := &restHandler{ rh := &handler{
client: client, client: client,
host: host, host: host,
} }
@@ -57,7 +60,7 @@ func NewRestHandler(client http.Client, host string) RestHandler {
// appendAcceptOverride enables the Accept header to be customized at runtime via an environment variable. // appendAcceptOverride enables the Accept header to be customized at runtime via an environment variable.
// This is specified as an env var because it is a niche option that prysm may use for performance testing or debugging // This is specified as an env var because it is a niche option that prysm may use for performance testing or debugging
// bug which users are unlikely to need. Using an env var keeps the set of user-facing flags cleaner. // bug which users are unlikely to need. Using an env var keeps the set of user-facing flags cleaner.
func (c *restHandler) appendAcceptOverride() { func (c *handler) appendAcceptOverride() {
if accept := os.Getenv(params.EnvNameOverrideAccept); accept != "" { if accept := os.Getenv(params.EnvNameOverrideAccept); accept != "" {
c.reqOverrides = append(c.reqOverrides, func(req *http.Request) { c.reqOverrides = append(c.reqOverrides, func(req *http.Request) {
req.Header.Set("Accept", accept) req.Header.Set("Accept", accept)
@@ -66,18 +69,18 @@ func (c *restHandler) appendAcceptOverride() {
} }
// HttpClient returns the underlying HTTP client of the handler // HttpClient returns the underlying HTTP client of the handler
func (c *restHandler) HttpClient() *http.Client { func (c *handler) HttpClient() *http.Client {
return &c.client return &c.client
} }
// Host returns the underlying HTTP host // Host returns the underlying HTTP host
func (c *restHandler) Host() string { func (c *handler) Host() string {
return c.host return c.host
} }
// Get sends a GET request and decodes the response body as a JSON object into the passed in object. // Get sends a GET request and decodes the response body as a JSON object into the passed in object.
// If an HTTP error is returned, the body is decoded as a DefaultJsonError JSON object and returned as the first return value. // If an HTTP error is returned, the body is decoded as a DefaultJsonError JSON object and returned as the first return value.
func (c *restHandler) Get(ctx context.Context, endpoint string, resp any) error { func (c *handler) Get(ctx context.Context, endpoint string, resp any) error {
url := c.host + endpoint url := c.host + endpoint
req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
if err != nil { if err != nil {
@@ -100,7 +103,7 @@ func (c *restHandler) Get(ctx context.Context, endpoint string, resp any) error
// GetStatusCode sends a GET request and returns only the HTTP status code. // GetStatusCode sends a GET request and returns only the HTTP status code.
// This is useful for endpoints like /eth/v1/node/health that communicate status via HTTP codes // This is useful for endpoints like /eth/v1/node/health that communicate status via HTTP codes
// (200 = ready, 206 = syncing, 503 = unavailable) rather than response bodies. // (200 = ready, 206 = syncing, 503 = unavailable) rather than response bodies.
func (c *restHandler) GetStatusCode(ctx context.Context, endpoint string) (int, error) { func (c *handler) GetStatusCode(ctx context.Context, endpoint string) (int, error) {
url := c.host + endpoint url := c.host + endpoint
req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
if err != nil { if err != nil {
@@ -119,7 +122,7 @@ func (c *restHandler) GetStatusCode(ctx context.Context, endpoint string) (int,
return httpResp.StatusCode, nil return httpResp.StatusCode, nil
} }
func (c *restHandler) GetSSZ(ctx context.Context, endpoint string) ([]byte, http.Header, error) { func (c *handler) GetSSZ(ctx context.Context, endpoint string) ([]byte, http.Header, error) {
url := c.host + endpoint url := c.host + endpoint
req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
if err != nil { if err != nil {
@@ -174,7 +177,7 @@ func (c *restHandler) GetSSZ(ctx context.Context, endpoint string) ([]byte, http
// Post sends a POST request and decodes the response body as a JSON object into the passed in object. // Post sends a POST request and decodes the response body as a JSON object into the passed in object.
// If an HTTP error is returned, the body is decoded as a DefaultJsonError JSON object and returned as the first return value. // If an HTTP error is returned, the body is decoded as a DefaultJsonError JSON object and returned as the first return value.
func (c *restHandler) Post( func (c *handler) Post(
ctx context.Context, ctx context.Context,
apiEndpoint string, apiEndpoint string,
headers map[string]string, headers map[string]string,
@@ -210,7 +213,7 @@ func (c *restHandler) Post(
} }
// PostSSZ sends a POST request and prefers an SSZ (application/octet-stream) response body. // PostSSZ sends a POST request and prefers an SSZ (application/octet-stream) response body.
func (c *restHandler) PostSSZ( func (c *handler) PostSSZ(
ctx context.Context, ctx context.Context,
apiEndpoint string, apiEndpoint string,
headers map[string]string, headers map[string]string,
@@ -311,6 +314,6 @@ func decodeResp(httpResp *http.Response, resp any) error {
return nil return nil
} }
func (c *restHandler) SwitchHost(host string) { func (c *handler) SwitchHost(host string) {
c.host = host c.host = host
} }

View File

@@ -509,17 +509,17 @@ func (s *SignedBlindedBeaconBlockFulu) SigString() string {
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
type ExecutionPayloadBid struct { type ExecutionPayloadBid struct {
ParentBlockHash string `json:"parent_block_hash"` ParentBlockHash string `json:"parent_block_hash"`
ParentBlockRoot string `json:"parent_block_root"` ParentBlockRoot string `json:"parent_block_root"`
BlockHash string `json:"block_hash"` BlockHash string `json:"block_hash"`
PrevRandao string `json:"prev_randao"` PrevRandao string `json:"prev_randao"`
FeeRecipient string `json:"fee_recipient"` FeeRecipient string `json:"fee_recipient"`
GasLimit string `json:"gas_limit"` GasLimit string `json:"gas_limit"`
BuilderIndex string `json:"builder_index"` BuilderIndex string `json:"builder_index"`
Slot string `json:"slot"` Slot string `json:"slot"`
Value string `json:"value"` Value string `json:"value"`
ExecutionPayment string `json:"execution_payment"` ExecutionPayment string `json:"execution_payment"`
BlobKzgCommitmentsRoot string `json:"blob_kzg_commitments_root"` BlobKzgCommitments []string `json:"blob_kzg_commitments"`
} }
type SignedExecutionPayloadBid struct { type SignedExecutionPayloadBid struct {

View File

@@ -2939,18 +2939,22 @@ func SignedExecutionPayloadBidFromConsensus(b *eth.SignedExecutionPayloadBid) *S
} }
func ExecutionPayloadBidFromConsensus(b *eth.ExecutionPayloadBid) *ExecutionPayloadBid { func ExecutionPayloadBidFromConsensus(b *eth.ExecutionPayloadBid) *ExecutionPayloadBid {
blobKzgCommitments := make([]string, len(b.BlobKzgCommitments))
for i := range b.BlobKzgCommitments {
blobKzgCommitments[i] = hexutil.Encode(b.BlobKzgCommitments[i])
}
return &ExecutionPayloadBid{ return &ExecutionPayloadBid{
ParentBlockHash: hexutil.Encode(b.ParentBlockHash), ParentBlockHash: hexutil.Encode(b.ParentBlockHash),
ParentBlockRoot: hexutil.Encode(b.ParentBlockRoot), ParentBlockRoot: hexutil.Encode(b.ParentBlockRoot),
BlockHash: hexutil.Encode(b.BlockHash), BlockHash: hexutil.Encode(b.BlockHash),
PrevRandao: hexutil.Encode(b.PrevRandao), PrevRandao: hexutil.Encode(b.PrevRandao),
FeeRecipient: hexutil.Encode(b.FeeRecipient), FeeRecipient: hexutil.Encode(b.FeeRecipient),
GasLimit: fmt.Sprintf("%d", b.GasLimit), GasLimit: fmt.Sprintf("%d", b.GasLimit),
BuilderIndex: fmt.Sprintf("%d", b.BuilderIndex), BuilderIndex: fmt.Sprintf("%d", b.BuilderIndex),
Slot: fmt.Sprintf("%d", b.Slot), Slot: fmt.Sprintf("%d", b.Slot),
Value: fmt.Sprintf("%d", b.Value), Value: fmt.Sprintf("%d", b.Value),
ExecutionPayment: fmt.Sprintf("%d", b.ExecutionPayment), ExecutionPayment: fmt.Sprintf("%d", b.ExecutionPayment),
BlobKzgCommitmentsRoot: hexutil.Encode(b.BlobKzgCommitmentsRoot), BlobKzgCommitments: blobKzgCommitments,
} }
} }
@@ -3187,22 +3191,30 @@ func (b *ExecutionPayloadBid) ToConsensus() (*eth.ExecutionPayloadBid, error) {
if err != nil { if err != nil {
return nil, server.NewDecodeError(err, "ExecutionPayment") return nil, server.NewDecodeError(err, "ExecutionPayment")
} }
blobKzgCommitmentsRoot, err := bytesutil.DecodeHexWithLength(b.BlobKzgCommitmentsRoot, fieldparams.RootLength) err = slice.VerifyMaxLength(b.BlobKzgCommitments, fieldparams.MaxBlobCommitmentsPerBlock)
if err != nil { if err != nil {
return nil, server.NewDecodeError(err, "BlobKzgCommitmentsRoot") return nil, server.NewDecodeError(err, "BlobKzgCommitments")
}
blobKzgCommitments := make([][]byte, len(b.BlobKzgCommitments))
for i, commitment := range b.BlobKzgCommitments {
kzg, err := bytesutil.DecodeHexWithLength(commitment, fieldparams.BLSPubkeyLength)
if err != nil {
return nil, server.NewDecodeError(err, fmt.Sprintf("BlobKzgCommitments[%d]", i))
}
blobKzgCommitments[i] = kzg
} }
return &eth.ExecutionPayloadBid{ return &eth.ExecutionPayloadBid{
ParentBlockHash: parentBlockHash, ParentBlockHash: parentBlockHash,
ParentBlockRoot: parentBlockRoot, ParentBlockRoot: parentBlockRoot,
BlockHash: blockHash, BlockHash: blockHash,
PrevRandao: prevRandao, PrevRandao: prevRandao,
FeeRecipient: feeRecipient, FeeRecipient: feeRecipient,
GasLimit: gasLimit, GasLimit: gasLimit,
BuilderIndex: primitives.BuilderIndex(builderIndex), BuilderIndex: primitives.BuilderIndex(builderIndex),
Slot: primitives.Slot(slot), Slot: primitives.Slot(slot),
Value: primitives.Gwei(value), Value: primitives.Gwei(value),
ExecutionPayment: primitives.Gwei(executionPayment), ExecutionPayment: primitives.Gwei(executionPayment),
BlobKzgCommitmentsRoot: blobKzgCommitmentsRoot, BlobKzgCommitments: blobKzgCommitments,
}, nil }, nil
} }

View File

@@ -85,6 +85,7 @@ go_library(
"//consensus-types/primitives:go_default_library", "//consensus-types/primitives:go_default_library",
"//crypto/bls:go_default_library", "//crypto/bls:go_default_library",
"//encoding/bytesutil:go_default_library", "//encoding/bytesutil:go_default_library",
"//io/logs:go_default_library",
"//math:go_default_library", "//math:go_default_library",
"//monitoring/tracing:go_default_library", "//monitoring/tracing:go_default_library",
"//monitoring/tracing/trace:go_default_library", "//monitoring/tracing/trace:go_default_library",

View File

@@ -10,6 +10,7 @@ import (
consensus_types "github.com/OffchainLabs/prysm/v7/consensus-types" consensus_types "github.com/OffchainLabs/prysm/v7/consensus-types"
"github.com/OffchainLabs/prysm/v7/consensus-types/interfaces" "github.com/OffchainLabs/prysm/v7/consensus-types/interfaces"
"github.com/OffchainLabs/prysm/v7/encoding/bytesutil" "github.com/OffchainLabs/prysm/v7/encoding/bytesutil"
"github.com/OffchainLabs/prysm/v7/io/logs"
ethpb "github.com/OffchainLabs/prysm/v7/proto/prysm/v1alpha1" ethpb "github.com/OffchainLabs/prysm/v7/proto/prysm/v1alpha1"
"github.com/OffchainLabs/prysm/v7/runtime/version" "github.com/OffchainLabs/prysm/v7/runtime/version"
prysmTime "github.com/OffchainLabs/prysm/v7/time" prysmTime "github.com/OffchainLabs/prysm/v7/time"
@@ -87,36 +88,45 @@ func logStateTransitionData(b interfaces.ReadOnlyBeaconBlock) error {
func logBlockSyncStatus(block interfaces.ReadOnlyBeaconBlock, blockRoot [32]byte, justified, finalized *ethpb.Checkpoint, receivedTime time.Time, genesis time.Time, daWaitedTime time.Duration) error { func logBlockSyncStatus(block interfaces.ReadOnlyBeaconBlock, blockRoot [32]byte, justified, finalized *ethpb.Checkpoint, receivedTime time.Time, genesis time.Time, daWaitedTime time.Duration) error {
startTime, err := slots.StartTime(genesis, block.Slot()) startTime, err := slots.StartTime(genesis, block.Slot())
if err != nil { if err != nil {
return err return errors.Wrap(err, "failed to get slot start time")
} }
level := log.Logger.GetLevel() parentRoot := block.ParentRoot()
blkRoot := fmt.Sprintf("0x%s...", hex.EncodeToString(blockRoot[:])[:8])
finalizedRoot := fmt.Sprintf("0x%s...", hex.EncodeToString(finalized.Root)[:8])
sinceSlotStartTime := prysmTime.Now().Sub(startTime)
lessFields := logrus.Fields{
"slot": block.Slot(),
"block": blkRoot,
"finalizedEpoch": finalized.Epoch,
"finalizedRoot": finalizedRoot,
"epoch": slots.ToEpoch(block.Slot()),
"sinceSlotStartTime": sinceSlotStartTime,
}
moreFields := logrus.Fields{
"slot": block.Slot(),
"slotInEpoch": block.Slot() % params.BeaconConfig().SlotsPerEpoch,
"block": blkRoot,
"epoch": slots.ToEpoch(block.Slot()),
"justifiedEpoch": justified.Epoch,
"justifiedRoot": fmt.Sprintf("0x%s...", hex.EncodeToString(justified.Root)[:8]),
"finalizedEpoch": finalized.Epoch,
"finalizedRoot": finalizedRoot,
"parentRoot": fmt.Sprintf("0x%s...", hex.EncodeToString(parentRoot[:])[:8]),
"version": version.String(block.Version()),
"sinceSlotStartTime": sinceSlotStartTime,
"chainServiceProcessedTime": prysmTime.Now().Sub(receivedTime) - daWaitedTime,
"dataAvailabilityWaitedTime": daWaitedTime,
}
level := logs.PackageVerbosity("beacon-chain/blockchain")
if level >= logrus.DebugLevel { if level >= logrus.DebugLevel {
parentRoot := block.ParentRoot() log.WithFields(moreFields).Info("Synced new block")
lf := logrus.Fields{ return nil
"slot": block.Slot(),
"slotInEpoch": block.Slot() % params.BeaconConfig().SlotsPerEpoch,
"block": fmt.Sprintf("0x%s...", hex.EncodeToString(blockRoot[:])[:8]),
"epoch": slots.ToEpoch(block.Slot()),
"justifiedEpoch": justified.Epoch,
"justifiedRoot": fmt.Sprintf("0x%s...", hex.EncodeToString(justified.Root)[:8]),
"finalizedEpoch": finalized.Epoch,
"finalizedRoot": fmt.Sprintf("0x%s...", hex.EncodeToString(finalized.Root)[:8]),
"parentRoot": fmt.Sprintf("0x%s...", hex.EncodeToString(parentRoot[:])[:8]),
"version": version.String(block.Version()),
"sinceSlotStartTime": prysmTime.Now().Sub(startTime),
"chainServiceProcessedTime": prysmTime.Now().Sub(receivedTime) - daWaitedTime,
"dataAvailabilityWaitedTime": daWaitedTime,
}
log.WithFields(lf).Debug("Synced new block")
} else {
log.WithFields(logrus.Fields{
"slot": block.Slot(),
"block": fmt.Sprintf("0x%s...", hex.EncodeToString(blockRoot[:])[:8]),
"finalizedEpoch": finalized.Epoch,
"finalizedRoot": fmt.Sprintf("0x%s...", hex.EncodeToString(finalized.Root)[:8]),
"epoch": slots.ToEpoch(block.Slot()),
}).Info("Synced new block")
} }
log.WithFields(lessFields).WithField(logs.LogTargetField, logs.LogTargetUser).Info("Synced new block")
log.WithFields(moreFields).WithField(logs.LogTargetField, logs.LogTargetEphemeral).Info("Synced new block")
return nil return nil
} }

View File

@@ -17,27 +17,56 @@ import (
) )
// ProcessExecutionPayloadBid processes a signed execution payload bid in the Gloas fork. // ProcessExecutionPayloadBid processes a signed execution payload bid in the Gloas fork.
// Spec v1.7.0-alpha.0 (pseudocode):
// process_execution_payload_bid(state: BeaconState, block: BeaconBlock):
// //
// signed_bid = block.body.signed_execution_payload_bid // <spec fn="process_execution_payload_bid" fork="gloas" hash="823c9f3a">
// bid = signed_bid.message // def process_execution_payload_bid(state: BeaconState, block: BeaconBlock) -> None:
// builder_index = bid.builder_index // signed_bid = block.body.signed_execution_payload_bid
// amount = bid.value // bid = signed_bid.message
// if builder_index == BUILDER_INDEX_SELF_BUILD: // builder_index = bid.builder_index
// assert amount == 0 // amount = bid.value
// assert signed_bid.signature == G2_POINT_AT_INFINITY //
// else: // # For self-builds, amount must be zero regardless of withdrawal credential prefix
// assert is_active_builder(state, builder_index) // if builder_index == BUILDER_INDEX_SELF_BUILD:
// assert can_builder_cover_bid(state, builder_index, amount) // assert amount == 0
// assert verify_execution_payload_bid_signature(state, signed_bid) // assert signed_bid.signature == bls.G2_POINT_AT_INFINITY
// assert bid.slot == block.slot // else:
// assert bid.parent_block_hash == state.latest_block_hash // # Verify that the builder is active
// assert bid.parent_block_root == block.parent_root // assert is_active_builder(state, builder_index)
// assert bid.prev_randao == get_randao_mix(state, get_current_epoch(state)) // # Verify that the builder has funds to cover the bid
// if amount > 0: // assert can_builder_cover_bid(state, builder_index, amount)
// state.builder_pending_payments[...] = BuilderPendingPayment(weight=0, withdrawal=BuilderPendingWithdrawal(fee_recipient=bid.fee_recipient, amount=amount, builder_index=builder_index)) // # Verify that the bid signature is valid
// state.latest_execution_payload_bid = bid // assert verify_execution_payload_bid_signature(state, signed_bid)
//
// # Verify commitments are under limit
// assert (
// len(bid.blob_kzg_commitments)
// <= get_blob_parameters(get_current_epoch(state)).max_blobs_per_block
// )
//
// # Verify that the bid is for the current slot
// assert bid.slot == block.slot
// # Verify that the bid is for the right parent block
// assert bid.parent_block_hash == state.latest_block_hash
// assert bid.parent_block_root == block.parent_root
// assert bid.prev_randao == get_randao_mix(state, get_current_epoch(state))
//
// # Record the pending payment if there is some payment
// if amount > 0:
// pending_payment = BuilderPendingPayment(
// weight=0,
// withdrawal=BuilderPendingWithdrawal(
// fee_recipient=bid.fee_recipient,
// amount=amount,
// builder_index=builder_index,
// ),
// )
// state.builder_pending_payments[SLOTS_PER_EPOCH + bid.slot % SLOTS_PER_EPOCH] = (
// pending_payment
// )
//
// # Cache the signed execution payload bid
// state.latest_execution_payload_bid = bid
// </spec>
func ProcessExecutionPayloadBid(st state.BeaconState, block interfaces.ReadOnlyBeaconBlock) error { func ProcessExecutionPayloadBid(st state.BeaconState, block interfaces.ReadOnlyBeaconBlock) error {
signedBid, err := block.Body().SignedExecutionPayloadBid() signedBid, err := block.Body().SignedExecutionPayloadBid()
if err != nil { if err != nil {
@@ -86,6 +115,12 @@ func ProcessExecutionPayloadBid(st state.BeaconState, block interfaces.ReadOnlyB
} }
} }
maxBlobsPerBlock := params.BeaconConfig().MaxBlobsPerBlockAtEpoch(slots.ToEpoch(block.Slot()))
commitmentCount := bid.BlobKzgCommitmentCount()
if commitmentCount > uint64(maxBlobsPerBlock) {
return fmt.Errorf("bid has %d blob KZG commitments over max %d", commitmentCount, maxBlobsPerBlock)
}
if err := validateBidConsistency(st, bid, block); err != nil { if err := validateBidConsistency(st, bid, block); err != nil {
return errors.Wrap(err, "bid consistency validation failed") return errors.Wrap(err, "bid consistency validation failed")
} }

View File

@@ -184,6 +184,28 @@ func signBid(t *testing.T, sk common.SecretKey, bid *ethpb.ExecutionPayloadBid,
return out return out
} }
func blobCommitmentsForSlot(slot primitives.Slot, count int) [][]byte {
max := int(params.BeaconConfig().MaxBlobsPerBlockAtEpoch(slots.ToEpoch(slot)))
if count > max {
count = max
}
commitments := make([][]byte, count)
for i := range commitments {
commitments[i] = bytes.Repeat([]byte{0xEE}, 48)
}
return commitments
}
func tooManyBlobCommitmentsForSlot(slot primitives.Slot) [][]byte {
max := int(params.BeaconConfig().MaxBlobsPerBlockAtEpoch(slots.ToEpoch(slot)))
count := max + 1
commitments := make([][]byte, count)
for i := range commitments {
commitments[i] = bytes.Repeat([]byte{0xEE}, 48)
}
return commitments
}
func TestProcessExecutionPayloadBid_SelfBuildSuccess(t *testing.T) { func TestProcessExecutionPayloadBid_SelfBuildSuccess(t *testing.T) {
slot := primitives.Slot(12) slot := primitives.Slot(12)
proposerIdx := primitives.ValidatorIndex(0) proposerIdx := primitives.ValidatorIndex(0)
@@ -194,17 +216,17 @@ func TestProcessExecutionPayloadBid_SelfBuildSuccess(t *testing.T) {
state := buildGloasState(t, slot, proposerIdx, builderIdx, params.BeaconConfig().MinActivationBalance+1000, randao, latestHash, pubKey) state := buildGloasState(t, slot, proposerIdx, builderIdx, params.BeaconConfig().MinActivationBalance+1000, randao, latestHash, pubKey)
bid := &ethpb.ExecutionPayloadBid{ bid := &ethpb.ExecutionPayloadBid{
ParentBlockHash: latestHash[:], ParentBlockHash: latestHash[:],
ParentBlockRoot: bytes.Repeat([]byte{0xCC}, 32), ParentBlockRoot: bytes.Repeat([]byte{0xCC}, 32),
BlockHash: bytes.Repeat([]byte{0xDD}, 32), BlockHash: bytes.Repeat([]byte{0xDD}, 32),
PrevRandao: randao[:], PrevRandao: randao[:],
GasLimit: 1, GasLimit: 1,
BuilderIndex: builderIdx, BuilderIndex: builderIdx,
Slot: slot, Slot: slot,
Value: 0, Value: 0,
ExecutionPayment: 0, ExecutionPayment: 0,
BlobKzgCommitmentsRoot: bytes.Repeat([]byte{0xEE}, 32), BlobKzgCommitments: blobCommitmentsForSlot(slot, 1),
FeeRecipient: bytes.Repeat([]byte{0xFF}, 20), FeeRecipient: bytes.Repeat([]byte{0xFF}, 20),
} }
signed := &ethpb.SignedExecutionPayloadBid{ signed := &ethpb.SignedExecutionPayloadBid{
Message: bid, Message: bid,
@@ -236,16 +258,16 @@ func TestProcessExecutionPayloadBid_SelfBuildNonZeroAmountFails(t *testing.T) {
state := buildGloasState(t, slot, proposerIdx, builderIdx, params.BeaconConfig().MinActivationBalance+1000, randao, latestHash, [48]byte{}) state := buildGloasState(t, slot, proposerIdx, builderIdx, params.BeaconConfig().MinActivationBalance+1000, randao, latestHash, [48]byte{})
bid := &ethpb.ExecutionPayloadBid{ bid := &ethpb.ExecutionPayloadBid{
ParentBlockHash: latestHash[:], ParentBlockHash: latestHash[:],
ParentBlockRoot: bytes.Repeat([]byte{0xAA}, 32), ParentBlockRoot: bytes.Repeat([]byte{0xAA}, 32),
BlockHash: bytes.Repeat([]byte{0xBB}, 32), BlockHash: bytes.Repeat([]byte{0xBB}, 32),
PrevRandao: randao[:], PrevRandao: randao[:],
BuilderIndex: builderIdx, BuilderIndex: builderIdx,
Slot: slot, Slot: slot,
Value: 10, Value: 10,
ExecutionPayment: 0, ExecutionPayment: 0,
BlobKzgCommitmentsRoot: bytes.Repeat([]byte{0xCC}, 32), BlobKzgCommitments: blobCommitmentsForSlot(slot, 1),
FeeRecipient: bytes.Repeat([]byte{0xDD}, 20), FeeRecipient: bytes.Repeat([]byte{0xDD}, 20),
} }
signed := &ethpb.SignedExecutionPayloadBid{ signed := &ethpb.SignedExecutionPayloadBid{
Message: bid, Message: bid,
@@ -280,17 +302,17 @@ func TestProcessExecutionPayloadBid_PendingPaymentAndCacheBid(t *testing.T) {
state := buildGloasState(t, slot, proposerIdx, builderIdx, balance, randao, latestHash, pubKey) state := buildGloasState(t, slot, proposerIdx, builderIdx, balance, randao, latestHash, pubKey)
bid := &ethpb.ExecutionPayloadBid{ bid := &ethpb.ExecutionPayloadBid{
ParentBlockHash: latestHash[:], ParentBlockHash: latestHash[:],
ParentBlockRoot: bytes.Repeat([]byte{0xCC}, 32), ParentBlockRoot: bytes.Repeat([]byte{0xCC}, 32),
BlockHash: bytes.Repeat([]byte{0xDD}, 32), BlockHash: bytes.Repeat([]byte{0xDD}, 32),
PrevRandao: randao[:], PrevRandao: randao[:],
GasLimit: 1, GasLimit: 1,
BuilderIndex: builderIdx, BuilderIndex: builderIdx,
Slot: slot, Slot: slot,
Value: 500_000, Value: 500_000,
ExecutionPayment: 1, ExecutionPayment: 1,
BlobKzgCommitmentsRoot: bytes.Repeat([]byte{0xEE}, 32), BlobKzgCommitments: blobCommitmentsForSlot(slot, 1),
FeeRecipient: bytes.Repeat([]byte{0xFF}, 20), FeeRecipient: bytes.Repeat([]byte{0xFF}, 20),
} }
genesis := bytesutil.ToBytes32(state.GenesisValidatorsRoot()) genesis := bytesutil.ToBytes32(state.GenesisValidatorsRoot())
@@ -341,17 +363,17 @@ func TestProcessExecutionPayloadBid_BuilderNotActive(t *testing.T) {
state = stateIface.(*state_native.BeaconState) state = stateIface.(*state_native.BeaconState)
bid := &ethpb.ExecutionPayloadBid{ bid := &ethpb.ExecutionPayloadBid{
ParentBlockHash: latestHash[:], ParentBlockHash: latestHash[:],
ParentBlockRoot: bytes.Repeat([]byte{0x03}, 32), ParentBlockRoot: bytes.Repeat([]byte{0x03}, 32),
BlockHash: bytes.Repeat([]byte{0x04}, 32), BlockHash: bytes.Repeat([]byte{0x04}, 32),
PrevRandao: randao[:], PrevRandao: randao[:],
GasLimit: 1, GasLimit: 1,
BuilderIndex: builderIdx, BuilderIndex: builderIdx,
Slot: slot, Slot: slot,
Value: 10, Value: 10,
ExecutionPayment: 0, ExecutionPayment: 0,
BlobKzgCommitmentsRoot: bytes.Repeat([]byte{0x05}, 32), BlobKzgCommitments: blobCommitmentsForSlot(slot, 1),
FeeRecipient: bytes.Repeat([]byte{0x06}, 20), FeeRecipient: bytes.Repeat([]byte{0x06}, 20),
} }
genesis := bytesutil.ToBytes32(state.GenesisValidatorsRoot()) genesis := bytesutil.ToBytes32(state.GenesisValidatorsRoot())
sig := signBid(t, sk, bid, state.Fork(), genesis) sig := signBid(t, sk, bid, state.Fork(), genesis)
@@ -394,17 +416,17 @@ func TestProcessExecutionPayloadBid_CannotCoverBid(t *testing.T) {
state = stateIface.(*state_native.BeaconState) state = stateIface.(*state_native.BeaconState)
bid := &ethpb.ExecutionPayloadBid{ bid := &ethpb.ExecutionPayloadBid{
ParentBlockHash: latestHash[:], ParentBlockHash: latestHash[:],
ParentBlockRoot: bytes.Repeat([]byte{0xCC}, 32), ParentBlockRoot: bytes.Repeat([]byte{0xCC}, 32),
BlockHash: bytes.Repeat([]byte{0xDD}, 32), BlockHash: bytes.Repeat([]byte{0xDD}, 32),
PrevRandao: randao[:], PrevRandao: randao[:],
GasLimit: 1, GasLimit: 1,
BuilderIndex: builderIdx, BuilderIndex: builderIdx,
Slot: slot, Slot: slot,
Value: 25, Value: 25,
ExecutionPayment: 0, ExecutionPayment: 0,
BlobKzgCommitmentsRoot: bytes.Repeat([]byte{0xEE}, 32), BlobKzgCommitments: blobCommitmentsForSlot(slot, 1),
FeeRecipient: bytes.Repeat([]byte{0xFF}, 20), FeeRecipient: bytes.Repeat([]byte{0xFF}, 20),
} }
genesis := bytesutil.ToBytes32(state.GenesisValidatorsRoot()) genesis := bytesutil.ToBytes32(state.GenesisValidatorsRoot())
sig := signBid(t, sk, bid, state.Fork(), genesis) sig := signBid(t, sk, bid, state.Fork(), genesis)
@@ -436,17 +458,17 @@ func TestProcessExecutionPayloadBid_InvalidSignature(t *testing.T) {
state := buildGloasState(t, slot, proposerIdx, builderIdx, params.BeaconConfig().MinDepositAmount+1000, randao, latestHash, pubKey) state := buildGloasState(t, slot, proposerIdx, builderIdx, params.BeaconConfig().MinDepositAmount+1000, randao, latestHash, pubKey)
bid := &ethpb.ExecutionPayloadBid{ bid := &ethpb.ExecutionPayloadBid{
ParentBlockHash: latestHash[:], ParentBlockHash: latestHash[:],
ParentBlockRoot: bytes.Repeat([]byte{0xCC}, 32), ParentBlockRoot: bytes.Repeat([]byte{0xCC}, 32),
BlockHash: bytes.Repeat([]byte{0xDD}, 32), BlockHash: bytes.Repeat([]byte{0xDD}, 32),
PrevRandao: randao[:], PrevRandao: randao[:],
GasLimit: 1, GasLimit: 1,
BuilderIndex: builderIdx, BuilderIndex: builderIdx,
Slot: slot, Slot: slot,
Value: 10, Value: 10,
ExecutionPayment: 0, ExecutionPayment: 0,
BlobKzgCommitmentsRoot: bytes.Repeat([]byte{0xEE}, 32), BlobKzgCommitments: blobCommitmentsForSlot(slot, 1),
FeeRecipient: bytes.Repeat([]byte{0xFF}, 20), FeeRecipient: bytes.Repeat([]byte{0xFF}, 20),
} }
// Use an invalid signature. // Use an invalid signature.
invalidSig := [96]byte{1} invalidSig := [96]byte{1}
@@ -463,6 +485,42 @@ func TestProcessExecutionPayloadBid_InvalidSignature(t *testing.T) {
require.ErrorContains(t, "bid signature validation failed", err) require.ErrorContains(t, "bid signature validation failed", err)
} }
func TestProcessExecutionPayloadBid_TooManyBlobCommitments(t *testing.T) {
slot := primitives.Slot(9)
proposerIdx := primitives.ValidatorIndex(0)
builderIdx := params.BeaconConfig().BuilderIndexSelfBuild
randao := [32]byte(bytes.Repeat([]byte{0xAA}, 32))
latestHash := [32]byte(bytes.Repeat([]byte{0xBB}, 32))
pubKey := [48]byte{}
state := buildGloasState(t, slot, proposerIdx, builderIdx, params.BeaconConfig().MinActivationBalance+1000, randao, latestHash, pubKey)
bid := &ethpb.ExecutionPayloadBid{
ParentBlockHash: latestHash[:],
ParentBlockRoot: bytes.Repeat([]byte{0xCC}, 32),
BlockHash: bytes.Repeat([]byte{0xDD}, 32),
PrevRandao: randao[:],
BuilderIndex: builderIdx,
Slot: slot,
BlobKzgCommitments: tooManyBlobCommitmentsForSlot(slot),
FeeRecipient: bytes.Repeat([]byte{0xFF}, 20),
}
signed := &ethpb.SignedExecutionPayloadBid{
Message: bid,
Signature: common.InfiniteSignature[:],
}
block := stubBlock{
slot: slot,
proposer: proposerIdx,
parentRoot: bytesutil.ToBytes32(bid.ParentBlockRoot),
body: stubBlockBody{signedBid: signed},
v: version.Gloas,
}
err := ProcessExecutionPayloadBid(state, block)
require.ErrorContains(t, "blob KZG commitments over max", err)
}
func TestProcessExecutionPayloadBid_SlotMismatch(t *testing.T) { func TestProcessExecutionPayloadBid_SlotMismatch(t *testing.T) {
slot := primitives.Slot(10) slot := primitives.Slot(10)
builderIdx := primitives.BuilderIndex(1) builderIdx := primitives.BuilderIndex(1)
@@ -478,17 +536,17 @@ func TestProcessExecutionPayloadBid_SlotMismatch(t *testing.T) {
state := buildGloasState(t, slot, proposerIdx, builderIdx, params.BeaconConfig().MinDepositAmount+1000, randao, latestHash, pubKey) state := buildGloasState(t, slot, proposerIdx, builderIdx, params.BeaconConfig().MinDepositAmount+1000, randao, latestHash, pubKey)
bid := &ethpb.ExecutionPayloadBid{ bid := &ethpb.ExecutionPayloadBid{
ParentBlockHash: latestHash[:], ParentBlockHash: latestHash[:],
ParentBlockRoot: bytes.Repeat([]byte{0xAA}, 32), ParentBlockRoot: bytes.Repeat([]byte{0xAA}, 32),
BlockHash: bytes.Repeat([]byte{0xBB}, 32), BlockHash: bytes.Repeat([]byte{0xBB}, 32),
PrevRandao: randao[:], PrevRandao: randao[:],
GasLimit: 1, GasLimit: 1,
BuilderIndex: builderIdx, BuilderIndex: builderIdx,
Slot: slot + 1, // mismatch Slot: slot + 1, // mismatch
Value: 1, Value: 1,
ExecutionPayment: 0, ExecutionPayment: 0,
BlobKzgCommitmentsRoot: bytes.Repeat([]byte{0xCC}, 32), BlobKzgCommitments: blobCommitmentsForSlot(slot, 1),
FeeRecipient: bytes.Repeat([]byte{0xDD}, 20), FeeRecipient: bytes.Repeat([]byte{0xDD}, 20),
} }
genesis := bytesutil.ToBytes32(state.GenesisValidatorsRoot()) genesis := bytesutil.ToBytes32(state.GenesisValidatorsRoot())
sig := signBid(t, sk, bid, state.Fork(), genesis) sig := signBid(t, sk, bid, state.Fork(), genesis)
@@ -520,17 +578,17 @@ func TestProcessExecutionPayloadBid_ParentHashMismatch(t *testing.T) {
state := buildGloasState(t, slot, proposerIdx, builderIdx, params.BeaconConfig().MinDepositAmount+1000, randao, latestHash, pubKey) state := buildGloasState(t, slot, proposerIdx, builderIdx, params.BeaconConfig().MinDepositAmount+1000, randao, latestHash, pubKey)
bid := &ethpb.ExecutionPayloadBid{ bid := &ethpb.ExecutionPayloadBid{
ParentBlockHash: bytes.Repeat([]byte{0x11}, 32), // mismatch ParentBlockHash: bytes.Repeat([]byte{0x11}, 32), // mismatch
ParentBlockRoot: bytes.Repeat([]byte{0x22}, 32), ParentBlockRoot: bytes.Repeat([]byte{0x22}, 32),
BlockHash: bytes.Repeat([]byte{0x33}, 32), BlockHash: bytes.Repeat([]byte{0x33}, 32),
PrevRandao: randao[:], PrevRandao: randao[:],
GasLimit: 1, GasLimit: 1,
BuilderIndex: builderIdx, BuilderIndex: builderIdx,
Slot: slot, Slot: slot,
Value: 1, Value: 1,
ExecutionPayment: 0, ExecutionPayment: 0,
BlobKzgCommitmentsRoot: bytes.Repeat([]byte{0x44}, 32), BlobKzgCommitments: blobCommitmentsForSlot(slot, 1),
FeeRecipient: bytes.Repeat([]byte{0x55}, 20), FeeRecipient: bytes.Repeat([]byte{0x55}, 20),
} }
genesis := bytesutil.ToBytes32(state.GenesisValidatorsRoot()) genesis := bytesutil.ToBytes32(state.GenesisValidatorsRoot())
sig := signBid(t, sk, bid, state.Fork(), genesis) sig := signBid(t, sk, bid, state.Fork(), genesis)
@@ -563,17 +621,17 @@ func TestProcessExecutionPayloadBid_ParentRootMismatch(t *testing.T) {
parentRoot := bytes.Repeat([]byte{0x22}, 32) parentRoot := bytes.Repeat([]byte{0x22}, 32)
bid := &ethpb.ExecutionPayloadBid{ bid := &ethpb.ExecutionPayloadBid{
ParentBlockHash: latestHash[:], ParentBlockHash: latestHash[:],
ParentBlockRoot: parentRoot, ParentBlockRoot: parentRoot,
BlockHash: bytes.Repeat([]byte{0x33}, 32), BlockHash: bytes.Repeat([]byte{0x33}, 32),
PrevRandao: randao[:], PrevRandao: randao[:],
GasLimit: 1, GasLimit: 1,
BuilderIndex: builderIdx, BuilderIndex: builderIdx,
Slot: slot, Slot: slot,
Value: 1, Value: 1,
ExecutionPayment: 0, ExecutionPayment: 0,
BlobKzgCommitmentsRoot: bytes.Repeat([]byte{0x44}, 32), BlobKzgCommitments: blobCommitmentsForSlot(slot, 1),
FeeRecipient: bytes.Repeat([]byte{0x55}, 20), FeeRecipient: bytes.Repeat([]byte{0x55}, 20),
} }
genesis := bytesutil.ToBytes32(state.GenesisValidatorsRoot()) genesis := bytesutil.ToBytes32(state.GenesisValidatorsRoot())
sig := signBid(t, sk, bid, state.Fork(), genesis) sig := signBid(t, sk, bid, state.Fork(), genesis)
@@ -605,17 +663,17 @@ func TestProcessExecutionPayloadBid_PrevRandaoMismatch(t *testing.T) {
state := buildGloasState(t, slot, proposerIdx, builderIdx, params.BeaconConfig().MinDepositAmount+1000, randao, latestHash, pubKey) state := buildGloasState(t, slot, proposerIdx, builderIdx, params.BeaconConfig().MinDepositAmount+1000, randao, latestHash, pubKey)
bid := &ethpb.ExecutionPayloadBid{ bid := &ethpb.ExecutionPayloadBid{
ParentBlockHash: latestHash[:], ParentBlockHash: latestHash[:],
ParentBlockRoot: bytes.Repeat([]byte{0x22}, 32), ParentBlockRoot: bytes.Repeat([]byte{0x22}, 32),
BlockHash: bytes.Repeat([]byte{0x33}, 32), BlockHash: bytes.Repeat([]byte{0x33}, 32),
PrevRandao: bytes.Repeat([]byte{0x01}, 32), // mismatch PrevRandao: bytes.Repeat([]byte{0x01}, 32), // mismatch
GasLimit: 1, GasLimit: 1,
BuilderIndex: builderIdx, BuilderIndex: builderIdx,
Slot: slot, Slot: slot,
Value: 1, Value: 1,
ExecutionPayment: 0, ExecutionPayment: 0,
BlobKzgCommitmentsRoot: bytes.Repeat([]byte{0x44}, 32), BlobKzgCommitments: blobCommitmentsForSlot(slot, 1),
FeeRecipient: bytes.Repeat([]byte{0x55}, 20), FeeRecipient: bytes.Repeat([]byte{0x55}, 20),
} }
genesis := bytesutil.ToBytes32(state.GenesisValidatorsRoot()) genesis := bytesutil.ToBytes32(state.GenesisValidatorsRoot())
sig := signBid(t, sk, bid, state.Fork(), genesis) sig := signBid(t, sk, bid, state.Fork(), genesis)

View File

@@ -24,14 +24,21 @@ import (
) )
// ProcessPayloadAttestations validates payload attestations in a block body. // ProcessPayloadAttestations validates payload attestations in a block body.
// Spec v1.7.0-alpha.0 (pseudocode):
// process_payload_attestation(state: BeaconState, payload_attestation: PayloadAttestation):
// //
// data = payload_attestation.data // <spec fn="process_payload_attestation" fork="gloas" hash="f46bf0b0">
// assert data.beacon_block_root == state.latest_block_header.parent_root // def process_payload_attestation(
// assert data.slot + 1 == state.slot // state: BeaconState, payload_attestation: PayloadAttestation
// indexed = get_indexed_payload_attestation(state, data.slot, payload_attestation) // ) -> None:
// assert is_valid_indexed_payload_attestation(state, indexed) // data = payload_attestation.data
//
// # Check that the attestation is for the parent beacon block
// assert data.beacon_block_root == state.latest_block_header.parent_root
// # Check that the attestation is for the previous slot
// assert data.slot + 1 == state.slot
// # Verify signature
// indexed_payload_attestation = get_indexed_payload_attestation(state, payload_attestation)
// assert is_valid_indexed_payload_attestation(state, indexed_payload_attestation)
// </spec>
func ProcessPayloadAttestations(ctx context.Context, st state.BeaconState, body interfaces.ReadOnlyBeaconBlockBody) error { func ProcessPayloadAttestations(ctx context.Context, st state.BeaconState, body interfaces.ReadOnlyBeaconBlockBody) error {
atts, err := body.PayloadAttestations() atts, err := body.PayloadAttestations()
if err != nil { if err != nil {
@@ -90,17 +97,24 @@ func indexedPayloadAttestation(ctx context.Context, st state.ReadOnlyBeaconState
} }
// payloadCommittee returns the payload timeliness committee for a given slot for the state. // payloadCommittee returns the payload timeliness committee for a given slot for the state.
// Spec v1.7.0-alpha.0 (pseudocode):
// get_ptc(state: BeaconState, slot: Slot) -> Vector[ValidatorIndex, PTC_SIZE]:
// //
// epoch = compute_epoch_at_slot(slot) // <spec fn="get_ptc" fork="gloas" hash="ae15f761">
// seed = hash(get_seed(state, epoch, DOMAIN_PTC_ATTESTER) + uint_to_bytes(slot)) // def get_ptc(state: BeaconState, slot: Slot) -> Vector[ValidatorIndex, PTC_SIZE]:
// indices = [] // """
// committees_per_slot = get_committee_count_per_slot(state, epoch) // Get the payload timeliness committee for the given ``slot``.
// for i in range(committees_per_slot): // """
// committee = get_beacon_committee(state, slot, CommitteeIndex(i)) // epoch = compute_epoch_at_slot(slot)
// indices.extend(committee) // seed = hash(get_seed(state, epoch, DOMAIN_PTC_ATTESTER) + uint_to_bytes(slot))
// return compute_balance_weighted_selection(state, indices, seed, size=PTC_SIZE, shuffle_indices=False) // indices: List[ValidatorIndex] = []
// # Concatenate all committees for this slot in order
// committees_per_slot = get_committee_count_per_slot(state, epoch)
// for i in range(committees_per_slot):
// committee = get_beacon_committee(state, slot, CommitteeIndex(i))
// indices.extend(committee)
// return compute_balance_weighted_selection(
// state, indices, seed, size=PTC_SIZE, shuffle_indices=False
// )
// </spec>
func payloadCommittee(ctx context.Context, st state.ReadOnlyBeaconState, slot primitives.Slot) ([]primitives.ValidatorIndex, error) { func payloadCommittee(ctx context.Context, st state.ReadOnlyBeaconState, slot primitives.Slot) ([]primitives.ValidatorIndex, error) {
epoch := slots.ToEpoch(slot) epoch := slots.ToEpoch(slot)
seed, err := ptcSeed(st, epoch, slot) seed, err := ptcSeed(st, epoch, slot)
@@ -152,17 +166,35 @@ func ptcSeed(st state.ReadOnlyBeaconState, epoch primitives.Epoch, slot primitiv
} }
// selectByBalance selects a balance-weighted subset of input candidates. // selectByBalance selects a balance-weighted subset of input candidates.
// Spec v1.7.0-alpha.0 (pseudocode):
// compute_balance_weighted_selection(state, indices, seed, size, shuffle_indices):
// Note: shuffle_indices is false for PTC.
// //
// total = len(indices); selected = []; i = 0 // <spec fn="compute_balance_weighted_selection" fork="gloas" hash="2c9f1c23">
// while len(selected) < size: // def compute_balance_weighted_selection(
// next = i % total // state: BeaconState,
// if shuffle_indices: next = compute_shuffled_index(next, total, seed) // indices: Sequence[ValidatorIndex],
// if compute_balance_weighted_acceptance(state, indices[next], seed, i): // seed: Bytes32,
// selected.append(indices[next]) // size: uint64,
// i += 1 // shuffle_indices: bool,
// ) -> Sequence[ValidatorIndex]:
// """
// Return ``size`` indices sampled by effective balance, using ``indices``
// as candidates. If ``shuffle_indices`` is ``True``, candidate indices
// are themselves sampled from ``indices`` by shuffling it, otherwise
// ``indices`` is traversed in order.
// """
// total = uint64(len(indices))
// assert total > 0
// selected: List[ValidatorIndex] = []
// i = uint64(0)
// while len(selected) < size:
// next_index = i % total
// if shuffle_indices:
// next_index = compute_shuffled_index(next_index, total, seed)
// candidate_index = indices[next_index]
// if compute_balance_weighted_acceptance(state, candidate_index, seed, i):
// selected.append(candidate_index)
// i += 1
// return selected
// </spec>
func selectByBalanceFill( func selectByBalanceFill(
ctx context.Context, ctx context.Context,
st state.ReadOnlyBeaconState, st state.ReadOnlyBeaconState,
@@ -199,15 +231,22 @@ func selectByBalanceFill(
} }
// acceptByBalance determines if a validator is accepted based on its effective balance. // acceptByBalance determines if a validator is accepted based on its effective balance.
// Spec v1.7.0-alpha.0 (pseudocode):
// compute_balance_weighted_acceptance(state, index, seed, i):
// //
// MAX_RANDOM_VALUE = 2**16 - 1 // <spec fn="compute_balance_weighted_acceptance" fork="gloas" hash="9954dcd0">
// random_bytes = hash(seed + uint_to_bytes(i // 16)) // def compute_balance_weighted_acceptance(
// offset = i % 16 * 2 // state: BeaconState, index: ValidatorIndex, seed: Bytes32, i: uint64
// random_value = bytes_to_uint64(random_bytes[offset:offset+2]) // ) -> bool:
// effective_balance = state.validators[index].effective_balance // """
// return effective_balance * MAX_RANDOM_VALUE >= MAX_EFFECTIVE_BALANCE_ELECTRA * random_value // Return whether to accept the selection of the validator ``index``, with probability
// proportional to its ``effective_balance``, and randomness given by ``seed`` and ``i``.
// """
// MAX_RANDOM_VALUE = 2**16 - 1
// random_bytes = hash(seed + uint_to_bytes(i // 16))
// offset = i % 16 * 2
// random_value = bytes_to_uint64(random_bytes[offset : offset + 2])
// effective_balance = state.validators[index].effective_balance
// return effective_balance * MAX_RANDOM_VALUE >= MAX_EFFECTIVE_BALANCE_ELECTRA * random_value
// </spec>
func acceptByBalance(st state.ReadOnlyBeaconState, idx primitives.ValidatorIndex, seedBuf []byte, hashFunc func([]byte) [32]byte, maxBalance uint64, round uint64) (bool, error) { func acceptByBalance(st state.ReadOnlyBeaconState, idx primitives.ValidatorIndex, seedBuf []byte, hashFunc func([]byte) [32]byte, maxBalance uint64, round uint64) (bool, error) {
// Reuse the seed buffer by overwriting the last 8 bytes with the round counter. // Reuse the seed buffer by overwriting the last 8 bytes with the round counter.
binary.LittleEndian.PutUint64(seedBuf[len(seedBuf)-8:], round/16) binary.LittleEndian.PutUint64(seedBuf[len(seedBuf)-8:], round/16)
@@ -224,16 +263,26 @@ func acceptByBalance(st state.ReadOnlyBeaconState, idx primitives.ValidatorIndex
} }
// validIndexedPayloadAttestation verifies the signature of an indexed payload attestation. // validIndexedPayloadAttestation verifies the signature of an indexed payload attestation.
// Spec v1.7.0-alpha.0 (pseudocode):
// is_valid_indexed_payload_attestation(state: BeaconState, indexed_payload_attestation: IndexedPayloadAttestation) -> bool:
// //
// indices = indexed_payload_attestation.attesting_indices // <spec fn="is_valid_indexed_payload_attestation" fork="gloas" hash="d76e0f89">
// return len(indices) > 0 and indices == sorted(indices) and // def is_valid_indexed_payload_attestation(
// bls.FastAggregateVerify( // state: BeaconState, attestation: IndexedPayloadAttestation
// [state.validators[i].pubkey for i in indices], // ) -> bool:
// compute_signing_root(indexed_payload_attestation.data, get_domain(state, DOMAIN_PTC_ATTESTER, compute_epoch_at_slot(attestation.data.slot)), // """
// indexed_payload_attestation.signature, // Check if ``attestation`` is non-empty, has sorted indices, and has
// ) // a valid aggregate signature.
// """
// # Verify indices are non-empty and sorted
// indices = attestation.attesting_indices
// if len(indices) == 0 or not indices == sorted(indices):
// return False
//
// # Verify aggregate signature
// pubkeys = [state.validators[i].pubkey for i in indices]
// domain = get_domain(state, DOMAIN_PTC_ATTESTER, compute_epoch_at_slot(attestation.data.slot))
// signing_root = compute_signing_root(attestation.data, domain)
// return bls.FastAggregateVerify(pubkeys, signing_root, attestation.signature)
// </spec>
func validIndexedPayloadAttestation(st state.ReadOnlyBeaconState, att *consensus_types.IndexedPayloadAttestation) error { func validIndexedPayloadAttestation(st state.ReadOnlyBeaconState, att *consensus_types.IndexedPayloadAttestation) error {
indices := att.AttestingIndices indices := att.AttestingIndices
if len(indices) == 0 || !slices.IsSorted(indices) { if len(indices) == 0 || !slices.IsSorted(indices) {

View File

@@ -10,17 +10,21 @@ import (
) )
// ProcessBuilderPendingPayments processes the builder pending payments from the previous epoch. // ProcessBuilderPendingPayments processes the builder pending payments from the previous epoch.
// Spec v1.7.0-alpha.0 (pseudocode):
// def process_builder_pending_payments(state: BeaconState) -> None:
// //
// quorum = get_builder_payment_quorum_threshold(state) // <spec fn="process_builder_pending_payments" fork="gloas" hash="10da48dd">
// for payment in state.builder_pending_payments[:SLOTS_PER_EPOCH]: // def process_builder_pending_payments(state: BeaconState) -> None:
// if payment.weight >= quorum: // """
// state.builder_pending_withdrawals.append(payment.withdrawal) // Processes the builder pending payments from the previous epoch.
// """
// quorum = get_builder_payment_quorum_threshold(state)
// for payment in state.builder_pending_payments[:SLOTS_PER_EPOCH]:
// if payment.weight >= quorum:
// state.builder_pending_withdrawals.append(payment.withdrawal)
// //
// old_payments = state.builder_pending_payments[SLOTS_PER_EPOCH:] // old_payments = state.builder_pending_payments[SLOTS_PER_EPOCH:]
// new_payments = [BuilderPendingPayment() for _ in range(SLOTS_PER_EPOCH)] // new_payments = [BuilderPendingPayment() for _ in range(SLOTS_PER_EPOCH)]
// state.builder_pending_payments = old_payments + new_payments // state.builder_pending_payments = old_payments + new_payments
// </spec>
func ProcessBuilderPendingPayments(state state.BeaconState) error { func ProcessBuilderPendingPayments(state state.BeaconState) error {
quorum, err := builderQuorumThreshold(state) quorum, err := builderQuorumThreshold(state)
if err != nil { if err != nil {
@@ -53,12 +57,16 @@ func ProcessBuilderPendingPayments(state state.BeaconState) error {
} }
// builderQuorumThreshold calculates the quorum threshold for builder payments. // builderQuorumThreshold calculates the quorum threshold for builder payments.
// Spec v1.7.0-alpha.0 (pseudocode):
// def get_builder_payment_quorum_threshold(state: BeaconState) -> uint64:
// //
// per_slot_balance = get_total_active_balance(state) // SLOTS_PER_EPOCH // <spec fn="get_builder_payment_quorum_threshold" fork="gloas" hash="a64b7ffb">
// quorum = per_slot_balance * BUILDER_PAYMENT_THRESHOLD_NUMERATOR // def get_builder_payment_quorum_threshold(state: BeaconState) -> uint64:
// return uint64(quorum // BUILDER_PAYMENT_THRESHOLD_DENOMINATOR) // """
// Calculate the quorum threshold for builder payments.
// """
// per_slot_balance = get_total_active_balance(state) // SLOTS_PER_EPOCH
// quorum = per_slot_balance * BUILDER_PAYMENT_THRESHOLD_NUMERATOR
// return uint64(quorum // BUILDER_PAYMENT_THRESHOLD_DENOMINATOR)
// </spec>
func builderQuorumThreshold(state state.ReadOnlyBeaconState) (primitives.Gwei, error) { func builderQuorumThreshold(state state.ReadOnlyBeaconState) (primitives.Gwei, error) {
activeBalance, err := helpers.TotalActiveBalance(state) activeBalance, err := helpers.TotalActiveBalance(state)
if err != nil { if err != nil {

View File

@@ -11,16 +11,20 @@ import (
) )
// RemoveBuilderPendingPayment removes the pending builder payment for the proposal slot. // RemoveBuilderPendingPayment removes the pending builder payment for the proposal slot.
// Spec v1.7.0 (pseudocode):
// //
// <spec fn="process_proposer_slashing" fork="gloas" lines="22-32" hash="4da721ef">
// # [New in Gloas:EIP7732]
// # Remove the BuilderPendingPayment corresponding to
// # this proposal if it is still in the 2-epoch window.
// slot = header_1.slot // slot = header_1.slot
// proposal_epoch = compute_epoch_at_slot(slot) // proposal_epoch = compute_epoch_at_slot(slot)
// if proposal_epoch == get_current_epoch(state): // if proposal_epoch == get_current_epoch(state):
// payment_index = SLOTS_PER_EPOCH + slot % SLOTS_PER_EPOCH // payment_index = SLOTS_PER_EPOCH + slot % SLOTS_PER_EPOCH
// state.builder_pending_payments[payment_index] = BuilderPendingPayment() // state.builder_pending_payments[payment_index] = BuilderPendingPayment()
// elif proposal_epoch == get_previous_epoch(state): // elif proposal_epoch == get_previous_epoch(state):
// payment_index = slot % SLOTS_PER_EPOCH // payment_index = slot % SLOTS_PER_EPOCH
// state.builder_pending_payments[payment_index] = BuilderPendingPayment() // state.builder_pending_payments[payment_index] = BuilderPendingPayment()
// </spec>
func RemoveBuilderPendingPayment(st state.BeaconState, header *eth.BeaconBlockHeader) error { func RemoveBuilderPendingPayment(st state.BeaconState, header *eth.BeaconBlockHeader) error {
proposalEpoch := slots.ToEpoch(header.Slot) proposalEpoch := slots.ToEpoch(header.Slot)
currentEpoch := time.CurrentEpoch(st) currentEpoch := time.CurrentEpoch(st)

View File

@@ -143,10 +143,11 @@ func ProcessSlot(ctx context.Context, state state.BeaconState) (state.BeaconStat
return nil, err return nil, err
} }
// Spec v1.6.1 (pseudocode): // <spec fn="process_slot" fork="gloas" lines="11-13" hash="62b28839">
// # [New in Gloas:EIP7732] // # [New in Gloas:EIP7732]
// # Unset the next payload availability // # Unset the next payload availability
// state.execution_payload_availability[(state.slot + 1) % SLOTS_PER_HISTORICAL_ROOT] = 0b0 // state.execution_payload_availability[(state.slot + 1) % SLOTS_PER_HISTORICAL_ROOT] = 0b0
// </spec>
if state.Version() >= version.Gloas { if state.Version() >= version.Gloas {
index := uint64((state.Slot() + 1) % params.BeaconConfig().SlotsPerHistoricalRoot) index := uint64((state.Slot() + 1) % params.BeaconConfig().SlotsPerHistoricalRoot)
if err := state.UpdateExecutionPayloadAvailabilityAtIndex(index, 0x0); err != nil { if err := state.UpdateExecutionPayloadAvailabilityAtIndex(index, 0x0); err != nil {

View File

@@ -78,7 +78,7 @@ func newGloasState(t *testing.T, slot primitives.Slot, availability []byte) stat
BlockHash: make([]byte, 32), BlockHash: make([]byte, 32),
PrevRandao: make([]byte, 32), PrevRandao: make([]byte, 32),
FeeRecipient: make([]byte, 20), FeeRecipient: make([]byte, 20),
BlobKzgCommitmentsRoot: make([]byte, 32), BlobKzgCommitments: [][]byte{make([]byte, 48)},
}, },
Eth1Data: &ethpb.Eth1Data{ Eth1Data: &ethpb.Eth1Data{
DepositRoot: make([]byte, 32), DepositRoot: make([]byte, 32),

View File

@@ -2,6 +2,7 @@ package kv
import ( import (
"context" "context"
"slices"
"github.com/OffchainLabs/prysm/v7/consensus-types/primitives" "github.com/OffchainLabs/prysm/v7/consensus-types/primitives"
"github.com/OffchainLabs/prysm/v7/encoding/bytesutil" "github.com/OffchainLabs/prysm/v7/encoding/bytesutil"
@@ -33,6 +34,9 @@ func (s *Store) LastArchivedRoot(ctx context.Context) [32]byte {
if err := s.db.View(func(tx *bolt.Tx) error { if err := s.db.View(func(tx *bolt.Tx) error {
bkt := tx.Bucket(stateSlotIndicesBucket) bkt := tx.Bucket(stateSlotIndicesBucket)
_, blockRoot = bkt.Cursor().Last() _, blockRoot = bkt.Cursor().Last()
if len(blockRoot) > 0 {
blockRoot = slices.Clone(blockRoot)
}
return nil return nil
}); err != nil { // This view never returns an error, but we'll handle anyway for sanity. }); err != nil { // This view never returns an error, but we'll handle anyway for sanity.
panic(err) // lint:nopanic -- View never returns an error. panic(err) // lint:nopanic -- View never returns an error.
@@ -51,6 +55,9 @@ func (s *Store) ArchivedPointRoot(ctx context.Context, slot primitives.Slot) [32
if err := s.db.View(func(tx *bolt.Tx) error { if err := s.db.View(func(tx *bolt.Tx) error {
bucket := tx.Bucket(stateSlotIndicesBucket) bucket := tx.Bucket(stateSlotIndicesBucket)
blockRoot = bucket.Get(bytesutil.SlotToBytesBigEndian(slot)) blockRoot = bucket.Get(bytesutil.SlotToBytesBigEndian(slot))
if len(blockRoot) > 0 {
blockRoot = slices.Clone(blockRoot)
}
return nil return nil
}); err != nil { // This view never returns an error, but we'll handle anyway for sanity. }); err != nil { // This view never returns an error, but we'll handle anyway for sanity.
panic(err) // lint:nopanic -- View never returns an error. panic(err) // lint:nopanic -- View never returns an error.

View File

@@ -812,7 +812,10 @@ func (s *Store) FeeRecipientByValidatorID(ctx context.Context, id primitives.Val
var addr []byte var addr []byte
err := s.db.View(func(tx *bolt.Tx) error { err := s.db.View(func(tx *bolt.Tx) error {
bkt := tx.Bucket(feeRecipientBucket) bkt := tx.Bucket(feeRecipientBucket)
addr = bkt.Get(bytesutil.Uint64ToBytesBigEndian(uint64(id))) stored := bkt.Get(bytesutil.Uint64ToBytesBigEndian(uint64(id)))
if len(stored) > 0 {
addr = slices.Clone(stored)
}
// IF the fee recipient is not found in the standard fee recipient bucket, then // IF the fee recipient is not found in the standard fee recipient bucket, then
// check the registration bucket. The fee recipient may be there. // check the registration bucket. The fee recipient may be there.
// This is to resolve imcompatility until we fully migrate to the registration bucket. // This is to resolve imcompatility until we fully migrate to the registration bucket.
@@ -826,7 +829,7 @@ func (s *Store) FeeRecipientByValidatorID(ctx context.Context, id primitives.Val
if err := decode(ctx, enc, reg); err != nil { if err := decode(ctx, enc, reg); err != nil {
return err return err
} }
addr = reg.FeeRecipient addr = slices.Clone(reg.FeeRecipient)
} }
return nil return nil
}) })

View File

@@ -3,6 +3,7 @@ package kv
import ( import (
"context" "context"
"fmt" "fmt"
"slices"
"github.com/OffchainLabs/prysm/v7/monitoring/tracing/trace" "github.com/OffchainLabs/prysm/v7/monitoring/tracing/trace"
"github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common"
@@ -17,7 +18,10 @@ func (s *Store) DepositContractAddress(ctx context.Context) ([]byte, error) {
var addr []byte var addr []byte
if err := s.db.View(func(tx *bolt.Tx) error { if err := s.db.View(func(tx *bolt.Tx) error {
chainInfo := tx.Bucket(chainMetadataBucket) chainInfo := tx.Bucket(chainMetadataBucket)
addr = chainInfo.Get(depositContractAddressKey) stored := chainInfo.Get(depositContractAddressKey)
if len(stored) > 0 {
addr = slices.Clone(stored)
}
return nil return nil
}); err != nil { // This view never returns an error, but we'll handle anyway for sanity. }); err != nil { // This view never returns an error, but we'll handle anyway for sanity.
panic(err) // lint:nopanic -- View never returns an error. panic(err) // lint:nopanic -- View never returns an error.

View File

@@ -199,7 +199,7 @@ func performValidatorStateMigration(ctx context.Context, bar *progressbar.Progre
func stateBucketKeys(stateBucket *bolt.Bucket) ([][]byte, error) { func stateBucketKeys(stateBucket *bolt.Bucket) ([][]byte, error) {
var keys [][]byte var keys [][]byte
if err := stateBucket.ForEach(func(pubKey, v []byte) error { if err := stateBucket.ForEach(func(pubKey, v []byte) error {
keys = append(keys, pubKey) keys = append(keys, bytes.Clone(pubKey))
return nil return nil
}); err != nil { }); err != nil {
return nil, err return nil, err

View File

@@ -2,6 +2,7 @@ package kv
import ( import (
"context" "context"
"slices"
"github.com/OffchainLabs/prysm/v7/beacon-chain/state" "github.com/OffchainLabs/prysm/v7/beacon-chain/state"
"github.com/OffchainLabs/prysm/v7/cmd/beacon-chain/flags" "github.com/OffchainLabs/prysm/v7/cmd/beacon-chain/flags"
@@ -187,20 +188,23 @@ func (s *Store) getDiff(lvl int, slot uint64) (hdiff.HdiffBytes, error) {
return bolt.ErrBucketNotFound return bolt.ErrBucketNotFound
} }
buf := append(key, stateSuffix...) buf := append(key, stateSuffix...)
stateDiff = bucket.Get(buf) rawStateDiff := bucket.Get(buf)
if stateDiff == nil { if len(rawStateDiff) == 0 {
return errors.New("state diff not found") return errors.New("state diff not found")
} }
stateDiff = slices.Clone(rawStateDiff)
buf = append(key, validatorSuffix...) buf = append(key, validatorSuffix...)
validatorDiff = bucket.Get(buf) rawValidatorDiff := bucket.Get(buf)
if validatorDiff == nil { if len(rawValidatorDiff) == 0 {
return errors.New("validator diff not found") return errors.New("validator diff not found")
} }
validatorDiff = slices.Clone(rawValidatorDiff)
buf = append(key, balancesSuffix...) buf = append(key, balancesSuffix...)
balancesDiff = bucket.Get(buf) rawBalancesDiff := bucket.Get(buf)
if balancesDiff == nil { if len(rawBalancesDiff) == 0 {
return errors.New("balances diff not found") return errors.New("balances diff not found")
} }
balancesDiff = slices.Clone(rawBalancesDiff)
return nil return nil
}) })
@@ -224,10 +228,11 @@ func (s *Store) getFullSnapshot(slot uint64) (state.BeaconState, error) {
if bucket == nil { if bucket == nil {
return bolt.ErrBucketNotFound return bolt.ErrBucketNotFound
} }
enc = bucket.Get(key) rawEnc := bucket.Get(key)
if enc == nil { if rawEnc == nil {
return errors.New("state not found") return errors.New("state not found")
} }
enc = slices.Clone(rawEnc)
return nil return nil
}) })

View File

@@ -2,6 +2,7 @@ package kv
import ( import (
"context" "context"
"slices"
"github.com/OffchainLabs/prysm/v7/encoding/bytesutil" "github.com/OffchainLabs/prysm/v7/encoding/bytesutil"
"github.com/OffchainLabs/prysm/v7/monitoring/tracing/trace" "github.com/OffchainLabs/prysm/v7/monitoring/tracing/trace"
@@ -47,7 +48,11 @@ func (s *Store) StateSummary(ctx context.Context, blockRoot [32]byte) (*ethpb.St
} }
var enc []byte var enc []byte
if err := s.db.View(func(tx *bolt.Tx) error { if err := s.db.View(func(tx *bolt.Tx) error {
enc = tx.Bucket(stateSummaryBucket).Get(blockRoot[:]) rawEnc := tx.Bucket(stateSummaryBucket).Get(blockRoot[:])
if len(rawEnc) == 0 {
return nil
}
enc = slices.Clone(rawEnc)
return nil return nil
}); err != nil { }); err != nil {
return nil, err return nil, err

View File

@@ -6,7 +6,6 @@ go_library(
"doc.go", "doc.go",
"errors.go", "errors.go",
"forkchoice.go", "forkchoice.go",
"last_root.go",
"log.go", "log.go",
"metrics.go", "metrics.go",
"node.go", "node.go",
@@ -51,7 +50,6 @@ go_test(
srcs = [ srcs = [
"ffg_update_test.go", "ffg_update_test.go",
"forkchoice_test.go", "forkchoice_test.go",
"last_root_test.go",
"no_vote_test.go", "no_vote_test.go",
"node_test.go", "node_test.go",
"on_tick_test.go", "on_tick_test.go",

View File

@@ -32,7 +32,6 @@ func New() *ForkChoice {
finalizedCheckpoint: &forkchoicetypes.Checkpoint{}, finalizedCheckpoint: &forkchoicetypes.Checkpoint{},
proposerBoostRoot: [32]byte{}, proposerBoostRoot: [32]byte{},
nodeByRoot: make(map[[fieldparams.RootLength]byte]*Node), nodeByRoot: make(map[[fieldparams.RootLength]byte]*Node),
nodeByPayload: make(map[[fieldparams.RootLength]byte]*Node),
slashedIndices: make(map[primitives.ValidatorIndex]bool), slashedIndices: make(map[primitives.ValidatorIndex]bool),
receivedBlocksLastEpoch: [fieldparams.SlotsPerEpoch]primitives.Slot{}, receivedBlocksLastEpoch: [fieldparams.SlotsPerEpoch]primitives.Slot{},
} }

View File

@@ -1,26 +0,0 @@
package doublylinkedtree
import (
"github.com/OffchainLabs/prysm/v7/consensus-types/primitives"
"github.com/OffchainLabs/prysm/v7/time/slots"
)
// LastRoot returns the last canonical block root in the given epoch
func (f *ForkChoice) LastRoot(epoch primitives.Epoch) [32]byte {
head := f.store.headNode
headEpoch := slots.ToEpoch(head.slot)
epochEnd, err := slots.EpochEnd(epoch)
if err != nil {
return [32]byte{}
}
if headEpoch <= epoch {
return head.root
}
for head != nil && head.slot > epochEnd {
head = head.parent
}
if head == nil {
return [32]byte{}
}
return head.root
}

View File

@@ -1,38 +0,0 @@
package doublylinkedtree
import (
"testing"
"github.com/OffchainLabs/prysm/v7/config/params"
"github.com/OffchainLabs/prysm/v7/testing/require"
)
func TestLastRoot(t *testing.T) {
f := setup(0, 0)
ctx := t.Context()
st, root, err := prepareForkchoiceState(ctx, 1, [32]byte{'1'}, params.BeaconConfig().ZeroHash, [32]byte{'1'}, 0, 0)
require.NoError(t, err)
require.NoError(t, f.InsertNode(ctx, st, root))
st, root, err = prepareForkchoiceState(ctx, 2, [32]byte{'2'}, [32]byte{'1'}, [32]byte{'2'}, 0, 0)
require.NoError(t, err)
require.NoError(t, f.InsertNode(ctx, st, root))
st, root, err = prepareForkchoiceState(ctx, 3, [32]byte{'3'}, [32]byte{'1'}, [32]byte{'3'}, 0, 0)
require.NoError(t, err)
require.NoError(t, f.InsertNode(ctx, st, root))
st, root, err = prepareForkchoiceState(ctx, 32, [32]byte{'4'}, [32]byte{'3'}, [32]byte{'4'}, 0, 0)
require.NoError(t, err)
require.NoError(t, f.InsertNode(ctx, st, root))
st, root, err = prepareForkchoiceState(ctx, 33, [32]byte{'5'}, [32]byte{'2'}, [32]byte{'5'}, 0, 0)
require.NoError(t, err)
require.NoError(t, f.InsertNode(ctx, st, root))
st, root, err = prepareForkchoiceState(ctx, 34, [32]byte{'6'}, [32]byte{'5'}, [32]byte{'6'}, 0, 0)
require.NoError(t, err)
require.NoError(t, f.InsertNode(ctx, st, root))
headNode := f.store.nodeByRoot[[32]byte{'6'}]
f.store.headNode = headNode
require.Equal(t, [32]byte{'6'}, f.store.headNode.root)
require.Equal(t, [32]byte{'2'}, f.LastRoot(0))
require.Equal(t, [32]byte{'6'}, f.LastRoot(1))
require.Equal(t, [32]byte{'6'}, f.LastRoot(2))
}

View File

@@ -94,6 +94,5 @@ func (s *Store) removeNodeAndChildren(ctx context.Context, node *Node, invalidRo
s.previousProposerBoostScore = 0 s.previousProposerBoostScore = 0
} }
delete(s.nodeByRoot, node.root) delete(s.nodeByRoot, node.root)
delete(s.nodeByPayload, node.payloadHash)
return invalidRoots, nil return invalidRoots, nil
} }

View File

@@ -113,7 +113,6 @@ func (s *Store) insert(ctx context.Context,
} }
} }
s.nodeByPayload[payloadHash] = n
s.nodeByRoot[root] = n s.nodeByRoot[root] = n
if parent == nil { if parent == nil {
if s.treeRootNode == nil { if s.treeRootNode == nil {
@@ -122,7 +121,6 @@ func (s *Store) insert(ctx context.Context,
s.highestReceivedNode = n s.highestReceivedNode = n
} else { } else {
delete(s.nodeByRoot, root) delete(s.nodeByRoot, root)
delete(s.nodeByPayload, payloadHash)
return nil, errInvalidParentRoot return nil, errInvalidParentRoot
} }
} else { } else {
@@ -191,7 +189,6 @@ func (s *Store) pruneFinalizedNodeByRootMap(ctx context.Context, node, finalized
node.children = nil node.children = nil
delete(s.nodeByRoot, node.root) delete(s.nodeByRoot, node.root)
delete(s.nodeByPayload, node.payloadHash)
return nil return nil
} }
@@ -273,21 +270,6 @@ func (f *ForkChoice) HighestReceivedBlockSlot() primitives.Slot {
return f.store.highestReceivedNode.slot return f.store.highestReceivedNode.slot
} }
// HighestReceivedBlockDelay returns the number of slots that the highest
// received block was late when receiving it. For example, a block was late by 12 slots,
// then this method is expected to return 12.
func (f *ForkChoice) HighestReceivedBlockDelay() primitives.Slot {
n := f.store.highestReceivedNode
if n == nil {
return 0
}
sss, err := slots.SinceSlotStart(n.slot, f.store.genesisTime, n.timestamp)
if err != nil {
return 0
}
return primitives.Slot(uint64(sss/time.Second) / params.BeaconConfig().SecondsPerSlot)
}
// ReceivedBlocksLastEpoch returns the number of blocks received in the last epoch // ReceivedBlocksLastEpoch returns the number of blocks received in the last epoch
func (f *ForkChoice) ReceivedBlocksLastEpoch() (uint64, error) { func (f *ForkChoice) ReceivedBlocksLastEpoch() (uint64, error) {
count := uint64(0) count := uint64(0)

View File

@@ -128,10 +128,9 @@ func TestStore_Insert(t *testing.T) {
// The new node does not have a parent. // The new node does not have a parent.
treeRootNode := &Node{slot: 0, root: indexToHash(0)} treeRootNode := &Node{slot: 0, root: indexToHash(0)}
nodeByRoot := map[[32]byte]*Node{indexToHash(0): treeRootNode} nodeByRoot := map[[32]byte]*Node{indexToHash(0): treeRootNode}
nodeByPayload := map[[32]byte]*Node{indexToHash(0): treeRootNode}
jc := &forkchoicetypes.Checkpoint{Epoch: 0} jc := &forkchoicetypes.Checkpoint{Epoch: 0}
fc := &forkchoicetypes.Checkpoint{Epoch: 0} fc := &forkchoicetypes.Checkpoint{Epoch: 0}
s := &Store{nodeByRoot: nodeByRoot, treeRootNode: treeRootNode, nodeByPayload: nodeByPayload, justifiedCheckpoint: jc, finalizedCheckpoint: fc, highestReceivedNode: &Node{}} s := &Store{nodeByRoot: nodeByRoot, treeRootNode: treeRootNode, justifiedCheckpoint: jc, finalizedCheckpoint: fc, highestReceivedNode: &Node{}}
payloadHash := [32]byte{'a'} payloadHash := [32]byte{'a'}
ctx := t.Context() ctx := t.Context()
_, blk, err := prepareForkchoiceState(ctx, 100, indexToHash(100), indexToHash(0), payloadHash, 1, 1) _, blk, err := prepareForkchoiceState(ctx, 100, indexToHash(100), indexToHash(0), payloadHash, 1, 1)
@@ -238,7 +237,6 @@ func TestStore_Prune_NoDanglingBranch(t *testing.T) {
s.finalizedCheckpoint.Root = indexToHash(1) s.finalizedCheckpoint.Root = indexToHash(1)
require.NoError(t, s.prune(t.Context())) require.NoError(t, s.prune(t.Context()))
require.Equal(t, len(s.nodeByRoot), 1) require.Equal(t, len(s.nodeByRoot), 1)
require.Equal(t, len(s.nodeByPayload), 1)
} }
// This test starts with the following branching diagram // This test starts with the following branching diagram
@@ -319,8 +317,6 @@ func TestStore_PruneMapsNodes(t *testing.T) {
s.finalizedCheckpoint.Root = indexToHash(1) s.finalizedCheckpoint.Root = indexToHash(1)
require.NoError(t, s.prune(t.Context())) require.NoError(t, s.prune(t.Context()))
require.Equal(t, len(s.nodeByRoot), 1) require.Equal(t, len(s.nodeByRoot), 1)
require.Equal(t, len(s.nodeByPayload), 1)
} }
func TestForkChoice_ReceivedBlocksLastEpoch(t *testing.T) { func TestForkChoice_ReceivedBlocksLastEpoch(t *testing.T) {
@@ -339,7 +335,6 @@ func TestForkChoice_ReceivedBlocksLastEpoch(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, uint64(1), count) require.Equal(t, uint64(1), count)
require.Equal(t, primitives.Slot(1), f.HighestReceivedBlockSlot()) require.Equal(t, primitives.Slot(1), f.HighestReceivedBlockSlot())
require.Equal(t, primitives.Slot(0), f.HighestReceivedBlockDelay())
// 64 // 64
// Received block last epoch is 1 // Received block last epoch is 1
@@ -352,7 +347,6 @@ func TestForkChoice_ReceivedBlocksLastEpoch(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, uint64(1), count) require.Equal(t, uint64(1), count)
require.Equal(t, primitives.Slot(64), f.HighestReceivedBlockSlot()) require.Equal(t, primitives.Slot(64), f.HighestReceivedBlockSlot())
require.Equal(t, primitives.Slot(0), f.HighestReceivedBlockDelay())
// 64 65 // 64 65
// Received block last epoch is 2 // Received block last epoch is 2
@@ -365,7 +359,6 @@ func TestForkChoice_ReceivedBlocksLastEpoch(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, uint64(2), count) require.Equal(t, uint64(2), count)
require.Equal(t, primitives.Slot(65), f.HighestReceivedBlockSlot()) require.Equal(t, primitives.Slot(65), f.HighestReceivedBlockSlot())
require.Equal(t, primitives.Slot(1), f.HighestReceivedBlockDelay())
// 64 65 66 // 64 65 66
// Received block last epoch is 3 // Received block last epoch is 3
@@ -717,17 +710,3 @@ func TestStore_CleanupInserting(t *testing.T) {
require.NotNil(t, f.InsertNode(ctx, st, blk)) require.NotNil(t, f.InsertNode(ctx, st, blk))
require.Equal(t, false, f.HasNode(blk.Root())) require.Equal(t, false, f.HasNode(blk.Root()))
} }
func TestStore_HighestReceivedBlockDelay(t *testing.T) {
f := ForkChoice{
store: &Store{
genesisTime: time.Unix(0, 0),
highestReceivedNode: &Node{
slot: 10,
timestamp: time.Unix(int64(((10 + 12) * params.BeaconConfig().SecondsPerSlot)), 0), // 12 slots late
},
},
}
require.Equal(t, primitives.Slot(12), f.HighestReceivedBlockDelay())
}

View File

@@ -36,7 +36,6 @@ type Store struct {
treeRootNode *Node // the root node of the store tree. treeRootNode *Node // the root node of the store tree.
headNode *Node // last head Node headNode *Node // last head Node
nodeByRoot map[[fieldparams.RootLength]byte]*Node // nodes indexed by roots. nodeByRoot map[[fieldparams.RootLength]byte]*Node // nodes indexed by roots.
nodeByPayload map[[fieldparams.RootLength]byte]*Node // nodes indexed by payload Hash
slashedIndices map[primitives.ValidatorIndex]bool // the list of equivocating validator indices slashedIndices map[primitives.ValidatorIndex]bool // the list of equivocating validator indices
originRoot [fieldparams.RootLength]byte // The genesis block root originRoot [fieldparams.RootLength]byte // The genesis block root
genesisTime time.Time genesisTime time.Time

View File

@@ -67,13 +67,11 @@ type FastGetter interface {
HasNode([32]byte) bool HasNode([32]byte) bool
HighestReceivedBlockSlot() primitives.Slot HighestReceivedBlockSlot() primitives.Slot
HighestReceivedBlockRoot() [32]byte HighestReceivedBlockRoot() [32]byte
HighestReceivedBlockDelay() primitives.Slot
IsCanonical(root [32]byte) bool IsCanonical(root [32]byte) bool
IsOptimistic(root [32]byte) (bool, error) IsOptimistic(root [32]byte) (bool, error)
IsViableForCheckpoint(*forkchoicetypes.Checkpoint) (bool, error) IsViableForCheckpoint(*forkchoicetypes.Checkpoint) (bool, error)
JustifiedCheckpoint() *forkchoicetypes.Checkpoint JustifiedCheckpoint() *forkchoicetypes.Checkpoint
JustifiedPayloadBlockHash() [32]byte JustifiedPayloadBlockHash() [32]byte
LastRoot(primitives.Epoch) [32]byte
NodeCount() int NodeCount() int
PreviousJustifiedCheckpoint() *forkchoicetypes.Checkpoint PreviousJustifiedCheckpoint() *forkchoicetypes.Checkpoint
ProposerBoost() [fieldparams.RootLength]byte ProposerBoost() [fieldparams.RootLength]byte

View File

@@ -121,13 +121,6 @@ func (ro *ROForkChoice) HighestReceivedBlockRoot() [32]byte {
return ro.getter.HighestReceivedBlockRoot() return ro.getter.HighestReceivedBlockRoot()
} }
// HighestReceivedBlockDelay delegates to the underlying forkchoice call, under a lock.
func (ro *ROForkChoice) HighestReceivedBlockDelay() primitives.Slot {
ro.l.RLock()
defer ro.l.RUnlock()
return ro.getter.HighestReceivedBlockDelay()
}
// ReceivedBlocksLastEpoch delegates to the underlying forkchoice call, under a lock. // ReceivedBlocksLastEpoch delegates to the underlying forkchoice call, under a lock.
func (ro *ROForkChoice) ReceivedBlocksLastEpoch() (uint64, error) { func (ro *ROForkChoice) ReceivedBlocksLastEpoch() (uint64, error) {
ro.l.RLock() ro.l.RLock()
@@ -163,13 +156,6 @@ func (ro *ROForkChoice) Slot(root [32]byte) (primitives.Slot, error) {
return ro.getter.Slot(root) return ro.getter.Slot(root)
} }
// LastRoot delegates to the underlying forkchoice call, under a lock.
func (ro *ROForkChoice) LastRoot(e primitives.Epoch) [32]byte {
ro.l.RLock()
defer ro.l.RUnlock()
return ro.getter.LastRoot(e)
}
// DependentRoot delegates to the underlying forkchoice call, under a lock. // DependentRoot delegates to the underlying forkchoice call, under a lock.
func (ro *ROForkChoice) DependentRoot(epoch primitives.Epoch) ([32]byte, error) { func (ro *ROForkChoice) DependentRoot(epoch primitives.Epoch) ([32]byte, error) {
ro.l.RLock() ro.l.RLock()

View File

@@ -30,7 +30,6 @@ const (
nodeCountCalled nodeCountCalled
highestReceivedBlockSlotCalled highestReceivedBlockSlotCalled
highestReceivedBlockRootCalled highestReceivedBlockRootCalled
highestReceivedBlockDelayCalled
receivedBlocksLastEpochCalled receivedBlocksLastEpochCalled
weightCalled weightCalled
isOptimisticCalled isOptimisticCalled
@@ -118,11 +117,6 @@ func TestROLocking(t *testing.T) {
call: highestReceivedBlockSlotCalled, call: highestReceivedBlockSlotCalled,
cb: func(g FastGetter) { g.HighestReceivedBlockSlot() }, cb: func(g FastGetter) { g.HighestReceivedBlockSlot() },
}, },
{
name: "highestReceivedBlockDelayCalled",
call: highestReceivedBlockDelayCalled,
cb: func(g FastGetter) { g.HighestReceivedBlockDelay() },
},
{ {
name: "receivedBlocksLastEpochCalled", name: "receivedBlocksLastEpochCalled",
call: receivedBlocksLastEpochCalled, call: receivedBlocksLastEpochCalled,
@@ -148,11 +142,6 @@ func TestROLocking(t *testing.T) {
call: slotCalled, call: slotCalled,
cb: func(g FastGetter) { _, err := g.Slot([32]byte{}); _discard(t, err) }, cb: func(g FastGetter) { _, err := g.Slot([32]byte{}); _discard(t, err) },
}, },
{
name: "lastRootCalled",
call: lastRootCalled,
cb: func(g FastGetter) { g.LastRoot(0) },
},
{ {
name: "targetRootForEpochCalled", name: "targetRootForEpochCalled",
call: targetRootForEpochCalled, call: targetRootForEpochCalled,
@@ -265,11 +254,6 @@ func (ro *mockROForkchoice) HighestReceivedBlockRoot() [32]byte {
return [32]byte{} return [32]byte{}
} }
func (ro *mockROForkchoice) HighestReceivedBlockDelay() primitives.Slot {
ro.calls = append(ro.calls, highestReceivedBlockDelayCalled)
return 0
}
func (ro *mockROForkchoice) ReceivedBlocksLastEpoch() (uint64, error) { func (ro *mockROForkchoice) ReceivedBlocksLastEpoch() (uint64, error) {
ro.calls = append(ro.calls, receivedBlocksLastEpochCalled) ro.calls = append(ro.calls, receivedBlocksLastEpochCalled)
return 0, nil return 0, nil
@@ -295,11 +279,6 @@ func (ro *mockROForkchoice) Slot(_ [32]byte) (primitives.Slot, error) {
return 0, nil return 0, nil
} }
func (ro *mockROForkchoice) LastRoot(_ primitives.Epoch) [32]byte {
ro.calls = append(ro.calls, lastRootCalled)
return [32]byte{}
}
// DependentRoot impoements FastGetter. // DependentRoot impoements FastGetter.
func (ro *mockROForkchoice) DependentRoot(_ primitives.Epoch) ([32]byte, error) { func (ro *mockROForkchoice) DependentRoot(_ primitives.Epoch) ([32]byte, error) {
ro.calls = append(ro.calls, dependentRootCalled) ro.calls = append(ro.calls, dependentRootCalled)

View File

@@ -46,14 +46,20 @@ func (b *BeaconState) BuilderPubkey(builderIndex primitives.BuilderIndex) ([fiel
} }
// IsActiveBuilder returns true if the builder placement is finalized and it has not initiated exit. // IsActiveBuilder returns true if the builder placement is finalized and it has not initiated exit.
// Spec v1.7.0-alpha.0 (pseudocode):
// def is_active_builder(state: BeaconState, builder_index: BuilderIndex) -> bool:
// //
// builder = state.builders[builder_index] // <spec fn="is_active_builder" fork="gloas" hash="1a599fb2">
// return ( // def is_active_builder(state: BeaconState, builder_index: BuilderIndex) -> bool:
// builder.deposit_epoch < state.finalized_checkpoint.epoch // """
// and builder.withdrawable_epoch == FAR_FUTURE_EPOCH // Check if the builder at ``builder_index`` is active for the given ``state``.
// ) // """
// builder = state.builders[builder_index]
// return (
// # Placement in builder list is finalized
// builder.deposit_epoch < state.finalized_checkpoint.epoch
// # Has not initiated exit
// and builder.withdrawable_epoch == FAR_FUTURE_EPOCH
// )
// </spec>
func (b *BeaconState) IsActiveBuilder(builderIndex primitives.BuilderIndex) (bool, error) { func (b *BeaconState) IsActiveBuilder(builderIndex primitives.BuilderIndex) (bool, error) {
if b.version < version.Gloas { if b.version < version.Gloas {
return false, errNotSupported("IsActiveBuilder", b.version) return false, errNotSupported("IsActiveBuilder", b.version)
@@ -72,15 +78,18 @@ func (b *BeaconState) IsActiveBuilder(builderIndex primitives.BuilderIndex) (boo
} }
// CanBuilderCoverBid returns true if the builder has enough balance to cover the given bid amount. // CanBuilderCoverBid returns true if the builder has enough balance to cover the given bid amount.
// Spec v1.7.0-alpha.0 (pseudocode):
// def can_builder_cover_bid(state: BeaconState, builder_index: BuilderIndex, bid_amount: Gwei) -> bool:
// //
// builder_balance = state.builders[builder_index].balance // <spec fn="can_builder_cover_bid" fork="gloas" hash="9e3f2d7c">
// pending_withdrawals_amount = get_pending_balance_to_withdraw_for_builder(state, builder_index) // def can_builder_cover_bid(
// min_balance = MIN_DEPOSIT_AMOUNT + pending_withdrawals_amount // state: BeaconState, builder_index: BuilderIndex, bid_amount: Gwei
// if builder_balance < min_balance: // ) -> bool:
// return False // builder_balance = state.builders[builder_index].balance
// return builder_balance - min_balance >= bid_amount // pending_withdrawals_amount = get_pending_balance_to_withdraw_for_builder(state, builder_index)
// min_balance = MIN_DEPOSIT_AMOUNT + pending_withdrawals_amount
// if builder_balance < min_balance:
// return False
// return builder_balance - min_balance >= bid_amount
// </spec>
func (b *BeaconState) CanBuilderCoverBid(builderIndex primitives.BuilderIndex, bidAmount primitives.Gwei) (bool, error) { func (b *BeaconState) CanBuilderCoverBid(builderIndex primitives.BuilderIndex, bidAmount primitives.Gwei) (bool, error) {
if b.version < version.Gloas { if b.version < version.Gloas {
return false, errNotSupported("CanBuilderCoverBid", b.version) return false, errNotSupported("CanBuilderCoverBid", b.version)

View File

@@ -82,20 +82,20 @@ func (b *BeaconState) SetExecutionPayloadBid(h interfaces.ROExecutionPayloadBid)
parentBlockRoot := h.ParentBlockRoot() parentBlockRoot := h.ParentBlockRoot()
blockHash := h.BlockHash() blockHash := h.BlockHash()
randao := h.PrevRandao() randao := h.PrevRandao()
blobKzgCommitmentsRoot := h.BlobKzgCommitmentsRoot() blobKzgCommitments := h.BlobKzgCommitments()
feeRecipient := h.FeeRecipient() feeRecipient := h.FeeRecipient()
b.latestExecutionPayloadBid = &ethpb.ExecutionPayloadBid{ b.latestExecutionPayloadBid = &ethpb.ExecutionPayloadBid{
ParentBlockHash: parentBlockHash[:], ParentBlockHash: parentBlockHash[:],
ParentBlockRoot: parentBlockRoot[:], ParentBlockRoot: parentBlockRoot[:],
BlockHash: blockHash[:], BlockHash: blockHash[:],
PrevRandao: randao[:], PrevRandao: randao[:],
GasLimit: h.GasLimit(), GasLimit: h.GasLimit(),
BuilderIndex: h.BuilderIndex(), BuilderIndex: h.BuilderIndex(),
Slot: h.Slot(), Slot: h.Slot(),
Value: h.Value(), Value: h.Value(),
ExecutionPayment: h.ExecutionPayment(), ExecutionPayment: h.ExecutionPayment(),
BlobKzgCommitmentsRoot: blobKzgCommitmentsRoot[:], BlobKzgCommitments: blobKzgCommitments,
FeeRecipient: feeRecipient[:], FeeRecipient: feeRecipient[:],
} }
b.markFieldAsDirty(types.LatestExecutionPayloadBid) b.markFieldAsDirty(types.LatestExecutionPayloadBid)

View File

@@ -14,17 +14,17 @@ import (
) )
type testExecutionPayloadBid struct { type testExecutionPayloadBid struct {
parentBlockHash [32]byte parentBlockHash [32]byte
parentBlockRoot [32]byte parentBlockRoot [32]byte
blockHash [32]byte blockHash [32]byte
prevRandao [32]byte prevRandao [32]byte
blobKzgCommitmentsRoot [32]byte blobKzgCommitments [][]byte
feeRecipient [20]byte feeRecipient [20]byte
gasLimit uint64 gasLimit uint64
builderIndex primitives.BuilderIndex builderIndex primitives.BuilderIndex
slot primitives.Slot slot primitives.Slot
value primitives.Gwei value primitives.Gwei
executionPayment primitives.Gwei executionPayment primitives.Gwei
} }
func (t testExecutionPayloadBid) ParentBlockHash() [32]byte { return t.parentBlockHash } func (t testExecutionPayloadBid) ParentBlockHash() [32]byte { return t.parentBlockHash }
@@ -40,9 +40,12 @@ func (t testExecutionPayloadBid) Value() primitives.Gwei { return t.value }
func (t testExecutionPayloadBid) ExecutionPayment() primitives.Gwei { func (t testExecutionPayloadBid) ExecutionPayment() primitives.Gwei {
return t.executionPayment return t.executionPayment
} }
func (t testExecutionPayloadBid) BlobKzgCommitmentsRoot() [32]byte { return t.blobKzgCommitmentsRoot } func (t testExecutionPayloadBid) BlobKzgCommitments() [][]byte { return t.blobKzgCommitments }
func (t testExecutionPayloadBid) FeeRecipient() [20]byte { return t.feeRecipient } func (t testExecutionPayloadBid) BlobKzgCommitmentCount() uint64 {
func (t testExecutionPayloadBid) IsNil() bool { return false } return uint64(len(t.blobKzgCommitments))
}
func (t testExecutionPayloadBid) FeeRecipient() [20]byte { return t.feeRecipient }
func (t testExecutionPayloadBid) IsNil() bool { return false }
func TestSetExecutionPayloadBid(t *testing.T) { func TestSetExecutionPayloadBid(t *testing.T) {
t.Run("previous fork returns expected error", func(t *testing.T) { t.Run("previous fork returns expected error", func(t *testing.T) {
@@ -57,7 +60,7 @@ func TestSetExecutionPayloadBid(t *testing.T) {
parentBlockRoot = [32]byte(bytes.Repeat([]byte{0xCD}, 32)) parentBlockRoot = [32]byte(bytes.Repeat([]byte{0xCD}, 32))
blockHash = [32]byte(bytes.Repeat([]byte{0xEF}, 32)) blockHash = [32]byte(bytes.Repeat([]byte{0xEF}, 32))
prevRandao = [32]byte(bytes.Repeat([]byte{0x11}, 32)) prevRandao = [32]byte(bytes.Repeat([]byte{0x11}, 32))
blobRoot = [32]byte(bytes.Repeat([]byte{0x22}, 32)) blobCommitments = [][]byte{bytes.Repeat([]byte{0x22}, 48)}
feeRecipient [20]byte feeRecipient [20]byte
) )
copy(feeRecipient[:], bytes.Repeat([]byte{0x33}, len(feeRecipient))) copy(feeRecipient[:], bytes.Repeat([]byte{0x33}, len(feeRecipient)))
@@ -66,17 +69,17 @@ func TestSetExecutionPayloadBid(t *testing.T) {
dirtyFields: make(map[types.FieldIndex]bool), dirtyFields: make(map[types.FieldIndex]bool),
} }
bid := testExecutionPayloadBid{ bid := testExecutionPayloadBid{
parentBlockHash: parentBlockHash, parentBlockHash: parentBlockHash,
parentBlockRoot: parentBlockRoot, parentBlockRoot: parentBlockRoot,
blockHash: blockHash, blockHash: blockHash,
prevRandao: prevRandao, prevRandao: prevRandao,
blobKzgCommitmentsRoot: blobRoot, blobKzgCommitments: blobCommitments,
feeRecipient: feeRecipient, feeRecipient: feeRecipient,
gasLimit: 123, gasLimit: 123,
builderIndex: 7, builderIndex: 7,
slot: 9, slot: 9,
value: 11, value: 11,
executionPayment: 22, executionPayment: 22,
} }
require.NoError(t, st.SetExecutionPayloadBid(bid)) require.NoError(t, st.SetExecutionPayloadBid(bid))
@@ -86,7 +89,7 @@ func TestSetExecutionPayloadBid(t *testing.T) {
require.DeepEqual(t, parentBlockRoot[:], st.latestExecutionPayloadBid.ParentBlockRoot) require.DeepEqual(t, parentBlockRoot[:], st.latestExecutionPayloadBid.ParentBlockRoot)
require.DeepEqual(t, blockHash[:], st.latestExecutionPayloadBid.BlockHash) require.DeepEqual(t, blockHash[:], st.latestExecutionPayloadBid.BlockHash)
require.DeepEqual(t, prevRandao[:], st.latestExecutionPayloadBid.PrevRandao) require.DeepEqual(t, prevRandao[:], st.latestExecutionPayloadBid.PrevRandao)
require.DeepEqual(t, blobRoot[:], st.latestExecutionPayloadBid.BlobKzgCommitmentsRoot) require.DeepEqual(t, blobCommitments, st.latestExecutionPayloadBid.BlobKzgCommitments)
require.DeepEqual(t, feeRecipient[:], st.latestExecutionPayloadBid.FeeRecipient) require.DeepEqual(t, feeRecipient[:], st.latestExecutionPayloadBid.FeeRecipient)
require.Equal(t, uint64(123), st.latestExecutionPayloadBid.GasLimit) require.Equal(t, uint64(123), st.latestExecutionPayloadBid.GasLimit)
require.Equal(t, primitives.BuilderIndex(7), st.latestExecutionPayloadBid.BuilderIndex) require.Equal(t, primitives.BuilderIndex(7), st.latestExecutionPayloadBid.BuilderIndex)

View File

@@ -0,0 +1,3 @@
### Fixed
- Fixed a bug where `cmd/beacon-chain/execution` was being ignored by `hack/gen-logs.sh` due to a `.gitignore` rule.

View File

@@ -0,0 +1,3 @@
### Changed
- Fixed the logging issue described in #16314.

View File

@@ -0,0 +1,11 @@
### Ignored
- moved finding healthy node logic to connection provider and other various cleanup on naming.
### Changed
- Improved node fallback logs.
### Fixed
- a potential race condition when switching hosts quickly and reconnecting to same host on an old connection.

View File

@@ -0,0 +1,3 @@
### Changed
- Improved integrations with ethspecify so specrefs can be used throughout the codebase.

View File

@@ -0,0 +1,2 @@
### Ignored
- Remove unused `HighestBlockDelay` method in forkchoice.

View File

@@ -0,0 +1,2 @@
### Ignored
- Remove unused method in forkchoice.

View File

@@ -0,0 +1,2 @@
### Ignored
- Remove unused map in forkchoice.

View File

@@ -0,0 +1,3 @@
### Fixed
- Fixed some database slices that were used outside of a read transaction. See [bbolt README](https://github.com/etcd-io/bbolt/blob/7b38172caf8cde993d187be4b8738fbe9266fde8/README.md?plain=1#L852) for more on this caveat.

View File

@@ -0,0 +1,3 @@
### Changed
- Moved blob KZG commitments into `ExecutionPayloadBid` and removed them from `ExecutionPayloadEnvelope` for Gloas.

View File

@@ -1,5 +1,9 @@
// Code generated by hack/gen-logs.sh; DO NOT EDIT.
// This file is created and regenerated automatically. Anything added here might get removed.
package execution package execution
import "github.com/sirupsen/logrus" import "github.com/sirupsen/logrus"
var log = logrus.WithField("prefix", "execution") // The prefix for logs from this package will be the text after the last slash in the package path.
// If you wish to change this, you should add your desired name in the runtime/logging/logrus-prefixed-formatter/prefix-replacement.go file.
var log = logrus.WithField("package", "cmd/beacon-chain/execution")

View File

@@ -188,8 +188,8 @@ func before(ctx *cli.Context) error {
return errors.Wrap(err, "failed to parse log vmodule") return errors.Wrap(err, "failed to parse log vmodule")
} }
// set the global logging level to allow for the highest verbosity requested // set the global logging level and data
logs.SetLoggingLevel(max(verbosityLevel, maxLevel)) logs.SetLoggingLevelAndData(verbosityLevel, vmodule, maxLevel, ctx.Bool(flags.DisableEphemeralLogFile.Name))
format := ctx.String(cmd.LogFormat.Name) format := ctx.String(cmd.LogFormat.Name)
switch format { switch format {
@@ -210,6 +210,7 @@ func before(ctx *cli.Context) error {
Formatter: formatter, Formatter: formatter,
Writer: os.Stderr, Writer: os.Stderr,
AllowedLevels: logrus.AllLevels[:max(verbosityLevel, maxLevel)+1], AllowedLevels: logrus.AllLevels[:max(verbosityLevel, maxLevel)+1],
Identifier: logs.LogTargetUser,
}) })
case "fluentd": case "fluentd":
f := joonix.NewFormatter() f := joonix.NewFormatter()

View File

@@ -164,8 +164,8 @@ func main() {
return errors.Wrap(err, "failed to parse log vmodule") return errors.Wrap(err, "failed to parse log vmodule")
} }
// set the global logging level to allow for the highest verbosity requested // set the global logging level and data
logs.SetLoggingLevel(max(maxLevel, verbosityLevel)) logs.SetLoggingLevelAndData(verbosityLevel, vmodule, maxLevel, ctx.Bool(flags.DisableEphemeralLogFile.Name))
logFileName := ctx.String(cmd.LogFileName.Name) logFileName := ctx.String(cmd.LogFileName.Name)
@@ -188,6 +188,7 @@ func main() {
Formatter: formatter, Formatter: formatter,
Writer: os.Stderr, Writer: os.Stderr,
AllowedLevels: logrus.AllLevels[:max(verbosityLevel, maxLevel)+1], AllowedLevels: logrus.AllLevels[:max(verbosityLevel, maxLevel)+1],
Identifier: logs.LogTargetUser,
}) })
case "fluentd": case "fluentd":
f := joonix.NewFormatter() f := joonix.NewFormatter()

View File

@@ -671,7 +671,7 @@ func hydrateBeaconBlockBodyGloas() *eth.BeaconBlockBodyGloas {
BlockHash: make([]byte, fieldparams.RootLength), BlockHash: make([]byte, fieldparams.RootLength),
PrevRandao: make([]byte, fieldparams.RootLength), PrevRandao: make([]byte, fieldparams.RootLength),
FeeRecipient: make([]byte, 20), FeeRecipient: make([]byte, 20),
BlobKzgCommitmentsRoot: make([]byte, fieldparams.RootLength), BlobKzgCommitments: [][]byte{make([]byte, fieldparams.BLSPubkeyLength)},
}, },
Signature: make([]byte, fieldparams.BLSSignatureLength), Signature: make([]byte, fieldparams.BLSSignatureLength),
}, },

View File

@@ -5,6 +5,7 @@ import (
consensus_types "github.com/OffchainLabs/prysm/v7/consensus-types" consensus_types "github.com/OffchainLabs/prysm/v7/consensus-types"
"github.com/OffchainLabs/prysm/v7/consensus-types/interfaces" "github.com/OffchainLabs/prysm/v7/consensus-types/interfaces"
"github.com/OffchainLabs/prysm/v7/consensus-types/primitives" "github.com/OffchainLabs/prysm/v7/consensus-types/primitives"
"github.com/OffchainLabs/prysm/v7/encoding/bytesutil"
ethpb "github.com/OffchainLabs/prysm/v7/proto/prysm/v1alpha1" ethpb "github.com/OffchainLabs/prysm/v7/proto/prysm/v1alpha1"
) )
@@ -43,11 +44,16 @@ func (h executionPayloadBidGloas) IsNil() bool {
len(h.payload.ParentBlockRoot) != 32 || len(h.payload.ParentBlockRoot) != 32 ||
len(h.payload.BlockHash) != 32 || len(h.payload.BlockHash) != 32 ||
len(h.payload.PrevRandao) != 32 || len(h.payload.PrevRandao) != 32 ||
len(h.payload.BlobKzgCommitmentsRoot) != 32 ||
len(h.payload.FeeRecipient) != 20 { len(h.payload.FeeRecipient) != 20 {
return true return true
} }
for _, commitment := range h.payload.BlobKzgCommitments {
if len(commitment) != 48 {
return true
}
}
return false return false
} }
@@ -131,9 +137,14 @@ func (h executionPayloadBidGloas) ExecutionPayment() primitives.Gwei {
return primitives.Gwei(h.payload.ExecutionPayment) return primitives.Gwei(h.payload.ExecutionPayment)
} }
// BlobKzgCommitmentsRoot returns the root of the KZG commitments for blobs. // BlobKzgCommitments returns the KZG commitments for blobs.
func (h executionPayloadBidGloas) BlobKzgCommitmentsRoot() [32]byte { func (h executionPayloadBidGloas) BlobKzgCommitments() [][]byte {
return [32]byte(h.payload.BlobKzgCommitmentsRoot) return bytesutil.SafeCopy2dBytes(h.payload.BlobKzgCommitments)
}
// BlobKzgCommitmentCount returns the number of blob KZG commitments.
func (h executionPayloadBidGloas) BlobKzgCommitmentCount() uint64 {
return uint64(len(h.payload.BlobKzgCommitments))
} }
// FeeRecipient returns the execution address that will receive the builder payment. // FeeRecipient returns the execution address that will receive the builder payment.

View File

@@ -15,17 +15,17 @@ import (
func validExecutionPayloadBid() *ethpb.ExecutionPayloadBid { func validExecutionPayloadBid() *ethpb.ExecutionPayloadBid {
return &ethpb.ExecutionPayloadBid{ return &ethpb.ExecutionPayloadBid{
ParentBlockHash: bytes.Repeat([]byte{0x01}, 32), ParentBlockHash: bytes.Repeat([]byte{0x01}, 32),
ParentBlockRoot: bytes.Repeat([]byte{0x02}, 32), ParentBlockRoot: bytes.Repeat([]byte{0x02}, 32),
BlockHash: bytes.Repeat([]byte{0x03}, 32), BlockHash: bytes.Repeat([]byte{0x03}, 32),
PrevRandao: bytes.Repeat([]byte{0x04}, 32), PrevRandao: bytes.Repeat([]byte{0x04}, 32),
GasLimit: 123, GasLimit: 123,
BuilderIndex: 5, BuilderIndex: 5,
Slot: 6, Slot: 6,
Value: 7, Value: 7,
ExecutionPayment: 8, ExecutionPayment: 8,
BlobKzgCommitmentsRoot: bytes.Repeat([]byte{0x05}, 32), BlobKzgCommitments: [][]byte{bytes.Repeat([]byte{0x05}, 48)},
FeeRecipient: bytes.Repeat([]byte{0x06}, 20), FeeRecipient: bytes.Repeat([]byte{0x06}, 20),
} }
} }
@@ -52,8 +52,8 @@ func TestWrappedROExecutionPayloadBid(t *testing.T) {
mutate: func(b *ethpb.ExecutionPayloadBid) { b.PrevRandao = []byte{0x04} }, mutate: func(b *ethpb.ExecutionPayloadBid) { b.PrevRandao = []byte{0x04} },
}, },
{ {
name: "blob kzg commitments root", name: "blob kzg commitments length",
mutate: func(b *ethpb.ExecutionPayloadBid) { b.BlobKzgCommitmentsRoot = []byte{0x05} }, mutate: func(b *ethpb.ExecutionPayloadBid) { b.BlobKzgCommitments = [][]byte{[]byte{0x05}} },
}, },
{ {
name: "fee recipient", name: "fee recipient",
@@ -85,7 +85,8 @@ func TestWrappedROExecutionPayloadBid(t *testing.T) {
assert.DeepEqual(t, [32]byte(bytes.Repeat([]byte{0x02}, 32)), wrapped.ParentBlockRoot()) assert.DeepEqual(t, [32]byte(bytes.Repeat([]byte{0x02}, 32)), wrapped.ParentBlockRoot())
assert.DeepEqual(t, [32]byte(bytes.Repeat([]byte{0x03}, 32)), wrapped.BlockHash()) assert.DeepEqual(t, [32]byte(bytes.Repeat([]byte{0x03}, 32)), wrapped.BlockHash())
assert.DeepEqual(t, [32]byte(bytes.Repeat([]byte{0x04}, 32)), wrapped.PrevRandao()) assert.DeepEqual(t, [32]byte(bytes.Repeat([]byte{0x04}, 32)), wrapped.PrevRandao())
assert.DeepEqual(t, [32]byte(bytes.Repeat([]byte{0x05}, 32)), wrapped.BlobKzgCommitmentsRoot()) assert.DeepEqual(t, [][]byte{bytes.Repeat([]byte{0x05}, 48)}, wrapped.BlobKzgCommitments())
require.Equal(t, uint64(1), wrapped.BlobKzgCommitmentCount())
assert.DeepEqual(t, [20]byte(bytes.Repeat([]byte{0x06}, 20)), wrapped.FeeRecipient()) assert.DeepEqual(t, [20]byte(bytes.Repeat([]byte{0x06}, 20)), wrapped.FeeRecipient())
}) })
} }

View File

@@ -22,7 +22,8 @@ type ROExecutionPayloadBid interface {
Slot() primitives.Slot Slot() primitives.Slot
Value() primitives.Gwei Value() primitives.Gwei
ExecutionPayment() primitives.Gwei ExecutionPayment() primitives.Gwei
BlobKzgCommitmentsRoot() [32]byte BlobKzgCommitments() [][]byte
BlobKzgCommitmentCount() uint64
FeeRecipient() [20]byte FeeRecipient() [20]byte
IsNil() bool IsNil() bool
} }

View File

@@ -31,6 +31,11 @@ EXCLUDED_PATH_PREFIXES=(
".vscode" ".vscode"
) )
# Gitignore overrides: paths that should still be scanned even if ignored by VCS.
GITIGNORE_OVERRIDES=(
"cmd/beacon-chain/execution"
)
# The logrus import path # The logrus import path
LOGRUS_IMPORT="github.com/sirupsen/logrus" LOGRUS_IMPORT="github.com/sirupsen/logrus"
# ---------------------------- # ----------------------------
@@ -70,6 +75,14 @@ rg_args=(
-0 # NUL-delimited output -0 # NUL-delimited output
) )
if [[ ${#GITIGNORE_OVERRIDES[@]} -gt 0 ]]; then
# Disable VCS ignores so overrides are honored.
rg_args+=( --no-ignore-vcs )
for ov in "${GITIGNORE_OVERRIDES[@]}"; do
rg_args+=( --glob "$ov/**" )
done
fi
for ex in "${EXCLUDED_PATH_PREFIXES[@]}"; do for ex in "${EXCLUDED_PATH_PREFIXES[@]}"; do
rg_args+=( --glob "!$ex/**" ) rg_args+=( --glob "!$ex/**" )
done done

View File

@@ -6,20 +6,28 @@ import (
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
) )
type HookIdentifier string
type WriterHook struct { type WriterHook struct {
AllowedLevels []logrus.Level AllowedLevels []logrus.Level
Writer io.Writer Writer io.Writer
Formatter logrus.Formatter Formatter logrus.Formatter
Identifier HookIdentifier
} }
func (hook *WriterHook) Levels() []logrus.Level { func (hook *WriterHook) Levels() []logrus.Level {
if hook.AllowedLevels == nil || len(hook.AllowedLevels) == 0 { if len(hook.AllowedLevels) == 0 {
return logrus.AllLevels return logrus.AllLevels
} }
return hook.AllowedLevels return hook.AllowedLevels
} }
func (hook *WriterHook) Fire(entry *logrus.Entry) error { func (hook *WriterHook) Fire(entry *logrus.Entry) error {
val, ok := entry.Data[LogTargetField]
if ok && val != hook.Identifier {
return nil
}
line, err := hook.Formatter.Format(entry) line, err := hook.Formatter.Format(entry)
if err != nil { if err != nil {
return err return err

View File

@@ -17,11 +17,43 @@ import (
"gopkg.in/natefinch/lumberjack.v2" "gopkg.in/natefinch/lumberjack.v2"
) )
var ephemeralLogFileVerbosity = logrus.DebugLevel var (
userVerbosity = logrus.InfoLevel
vmodule = make(map[string]logrus.Level)
)
// SetLoggingLevel sets the base logging level for logrus. const (
func SetLoggingLevel(lvl logrus.Level) { ephemeralLogFileVerbosity = logrus.DebugLevel
logrus.SetLevel(max(lvl, ephemeralLogFileVerbosity)) LogTargetField = "log_target"
LogTargetEphemeral HookIdentifier = "ephemeral"
LogTargetUser HookIdentifier = "user"
)
// SetLoggingLevelAndData sets the base logging level for logrus.
func SetLoggingLevelAndData(baseVerbosity logrus.Level, vmoduleMap map[string]logrus.Level, maxVmoduleLevel logrus.Level, disableEphemeral bool) {
userVerbosity = baseVerbosity
vmodule = vmoduleMap
globalLevel := max(baseVerbosity, maxVmoduleLevel)
if !disableEphemeral {
globalLevel = max(globalLevel, ephemeralLogFileVerbosity)
}
logrus.SetLevel(globalLevel)
}
// PackageVerbosity returns the verbosity of a given package.
func PackageVerbosity(packagePath string) logrus.Level {
bestLen := 0
bestLevel := userVerbosity
for k, v := range vmodule {
if k == packagePath || strings.HasPrefix(packagePath, k+"/") {
if len(k) > bestLen {
bestLen = len(k)
bestLevel = v
}
}
}
return bestLevel
} }
func addLogWriter(w io.Writer) { func addLogWriter(w io.Writer) {
@@ -68,6 +100,7 @@ func ConfigurePersistentLogging(logFileName string, format string, lvl logrus.Le
Formatter: formatter, Formatter: formatter,
Writer: f, Writer: f,
AllowedLevels: logrus.AllLevels[:max(lvl, maxVmoduleLevel)+1], AllowedLevels: logrus.AllLevels[:max(lvl, maxVmoduleLevel)+1],
Identifier: LogTargetUser,
}) })
logrus.Debug("File logging initialized") logrus.Debug("File logging initialized")
@@ -101,6 +134,7 @@ func ConfigureEphemeralLogFile(datadirPath string, app string) error {
Formatter: formatter, Formatter: formatter,
Writer: debugWriter, Writer: debugWriter,
AllowedLevels: logrus.AllLevels[:ephemeralLogFileVerbosity+1], AllowedLevels: logrus.AllLevels[:ephemeralLogFileVerbosity+1],
Identifier: LogTargetEphemeral,
}) })
logrus.WithField("path", logFilePath).Debug("Ephemeral log file initialized") logrus.WithField("path", logFilePath).Debug("Ephemeral log file initialized")

View File

@@ -1,288 +0,0 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.36.3
// protoc v3.21.7
// source: proto/engine/v1/gloas.proto
package enginev1
import (
reflect "reflect"
sync "sync"
github_com_OffchainLabs_prysm_v6_consensus_types_primitives "github.com/OffchainLabs/prysm/v7/consensus-types/primitives"
_ "github.com/OffchainLabs/prysm/v7/proto/eth/ext"
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
)
const (
// Verify that this generated code is sufficiently up-to-date.
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
// Verify that runtime/protoimpl is sufficiently up-to-date.
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)
type ExecutionPayloadEnvelope struct {
state protoimpl.MessageState `protogen:"open.v1"`
Payload *ExecutionPayloadDeneb `protobuf:"bytes,1,opt,name=payload,proto3" json:"payload,omitempty"`
ExecutionRequests *ExecutionRequests `protobuf:"bytes,2,opt,name=execution_requests,json=executionRequests,proto3" json:"execution_requests,omitempty"`
BuilderIndex github_com_OffchainLabs_prysm_v6_consensus_types_primitives.ValidatorIndex `protobuf:"varint,3,opt,name=builder_index,json=builderIndex,proto3" json:"builder_index,omitempty" cast-type:"github.com/OffchainLabs/prysm/v7/consensus-types/primitives.ValidatorIndex"`
BeaconBlockRoot []byte `protobuf:"bytes,4,opt,name=beacon_block_root,json=beaconBlockRoot,proto3" json:"beacon_block_root,omitempty" ssz-size:"32"`
Slot github_com_OffchainLabs_prysm_v6_consensus_types_primitives.Slot `protobuf:"varint,5,opt,name=slot,proto3" json:"slot,omitempty" cast-type:"github.com/OffchainLabs/prysm/v7/consensus-types/primitives.Slot"`
BlobKzgCommitments [][]byte `protobuf:"bytes,6,rep,name=blob_kzg_commitments,json=blobKzgCommitments,proto3" json:"blob_kzg_commitments,omitempty" ssz-max:"4096" ssz-size:"?,48"`
StateRoot []byte `protobuf:"bytes,7,opt,name=state_root,json=stateRoot,proto3" json:"state_root,omitempty" ssz-size:"32"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *ExecutionPayloadEnvelope) Reset() {
*x = ExecutionPayloadEnvelope{}
mi := &file_proto_engine_v1_gloas_proto_msgTypes[0]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *ExecutionPayloadEnvelope) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*ExecutionPayloadEnvelope) ProtoMessage() {}
func (x *ExecutionPayloadEnvelope) ProtoReflect() protoreflect.Message {
mi := &file_proto_engine_v1_gloas_proto_msgTypes[0]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use ExecutionPayloadEnvelope.ProtoReflect.Descriptor instead.
func (*ExecutionPayloadEnvelope) Descriptor() ([]byte, []int) {
return file_proto_engine_v1_gloas_proto_rawDescGZIP(), []int{0}
}
func (x *ExecutionPayloadEnvelope) GetPayload() *ExecutionPayloadDeneb {
if x != nil {
return x.Payload
}
return nil
}
func (x *ExecutionPayloadEnvelope) GetExecutionRequests() *ExecutionRequests {
if x != nil {
return x.ExecutionRequests
}
return nil
}
func (x *ExecutionPayloadEnvelope) GetBuilderIndex() github_com_OffchainLabs_prysm_v6_consensus_types_primitives.ValidatorIndex {
if x != nil {
return x.BuilderIndex
}
return github_com_OffchainLabs_prysm_v6_consensus_types_primitives.ValidatorIndex(0)
}
func (x *ExecutionPayloadEnvelope) GetBeaconBlockRoot() []byte {
if x != nil {
return x.BeaconBlockRoot
}
return nil
}
func (x *ExecutionPayloadEnvelope) GetSlot() github_com_OffchainLabs_prysm_v6_consensus_types_primitives.Slot {
if x != nil {
return x.Slot
}
return github_com_OffchainLabs_prysm_v6_consensus_types_primitives.Slot(0)
}
func (x *ExecutionPayloadEnvelope) GetBlobKzgCommitments() [][]byte {
if x != nil {
return x.BlobKzgCommitments
}
return nil
}
func (x *ExecutionPayloadEnvelope) GetStateRoot() []byte {
if x != nil {
return x.StateRoot
}
return nil
}
type SignedExecutionPayloadEnvelope struct {
state protoimpl.MessageState `protogen:"open.v1"`
Message *ExecutionPayloadEnvelope `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"`
Signature []byte `protobuf:"bytes,2,opt,name=signature,proto3" json:"signature,omitempty" ssz-size:"96"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *SignedExecutionPayloadEnvelope) Reset() {
*x = SignedExecutionPayloadEnvelope{}
mi := &file_proto_engine_v1_gloas_proto_msgTypes[1]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *SignedExecutionPayloadEnvelope) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*SignedExecutionPayloadEnvelope) ProtoMessage() {}
func (x *SignedExecutionPayloadEnvelope) ProtoReflect() protoreflect.Message {
mi := &file_proto_engine_v1_gloas_proto_msgTypes[1]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use SignedExecutionPayloadEnvelope.ProtoReflect.Descriptor instead.
func (*SignedExecutionPayloadEnvelope) Descriptor() ([]byte, []int) {
return file_proto_engine_v1_gloas_proto_rawDescGZIP(), []int{1}
}
func (x *SignedExecutionPayloadEnvelope) GetMessage() *ExecutionPayloadEnvelope {
if x != nil {
return x.Message
}
return nil
}
func (x *SignedExecutionPayloadEnvelope) GetSignature() []byte {
if x != nil {
return x.Signature
}
return nil
}
var File_proto_engine_v1_gloas_proto protoreflect.FileDescriptor
var file_proto_engine_v1_gloas_proto_rawDesc = []byte{
0x0a, 0x1b, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2f, 0x76,
0x31, 0x2f, 0x67, 0x6c, 0x6f, 0x61, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x65,
0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x76,
0x31, 0x1a, 0x26, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2f,
0x76, 0x31, 0x2f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x67,
0x69, 0x6e, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x70, 0x72, 0x6f, 0x74, 0x6f,
0x2f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x6c, 0x65, 0x63, 0x74,
0x72, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f,
0x65, 0x74, 0x68, 0x2f, 0x65, 0x78, 0x74, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e,
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa3, 0x04, 0x0a, 0x18, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74,
0x69, 0x6f, 0x6e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x45, 0x6e, 0x76, 0x65, 0x6c, 0x6f,
0x70, 0x65, 0x12, 0x43, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20,
0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65,
0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69,
0x6f, 0x6e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x65, 0x6e, 0x65, 0x62, 0x52, 0x07,
0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x54, 0x0a, 0x12, 0x65, 0x78, 0x65, 0x63, 0x75,
0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x02, 0x20,
0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65,
0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69,
0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x52, 0x11, 0x65, 0x78, 0x65, 0x63,
0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x73, 0x0a,
0x0d, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x03,
0x20, 0x01, 0x28, 0x04, 0x42, 0x4e, 0x82, 0xb5, 0x18, 0x4a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62,
0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4f, 0x66, 0x66, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x4c, 0x61, 0x62,
0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x36, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65,
0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69,
0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49,
0x6e, 0x64, 0x65, 0x78, 0x52, 0x0c, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x64,
0x65, 0x78, 0x12, 0x32, 0x0a, 0x11, 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f,
0x63, 0x6b, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a,
0xb5, 0x18, 0x02, 0x33, 0x32, 0x52, 0x0f, 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f,
0x63, 0x6b, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x58, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x05,
0x20, 0x01, 0x28, 0x04, 0x42, 0x44, 0x82, 0xb5, 0x18, 0x40, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62,
0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4f, 0x66, 0x66, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x4c, 0x61, 0x62,
0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x36, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65,
0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69,
0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x52, 0x04, 0x73, 0x6c, 0x6f, 0x74,
0x12, 0x42, 0x0a, 0x14, 0x62, 0x6c, 0x6f, 0x62, 0x5f, 0x6b, 0x7a, 0x67, 0x5f, 0x63, 0x6f, 0x6d,
0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0c, 0x42, 0x10,
0x8a, 0xb5, 0x18, 0x04, 0x3f, 0x2c, 0x34, 0x38, 0x92, 0xb5, 0x18, 0x04, 0x34, 0x30, 0x39, 0x36,
0x52, 0x12, 0x62, 0x6c, 0x6f, 0x62, 0x4b, 0x7a, 0x67, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d,
0x65, 0x6e, 0x74, 0x73, 0x12, 0x25, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x6f,
0x6f, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x33, 0x32,
0x52, 0x09, 0x73, 0x74, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x22, 0x8e, 0x01, 0x0a, 0x1e,
0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x50,
0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x45, 0x6e, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x12, 0x46,
0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
0x2c, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e,
0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61,
0x79, 0x6c, 0x6f, 0x61, 0x64, 0x45, 0x6e, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x52, 0x07, 0x6d,
0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x24, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74,
0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x39,
0x36, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x42, 0x3b, 0x5a, 0x39,
0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4f, 0x66, 0x66, 0x63, 0x68,
0x61, 0x69, 0x6e, 0x4c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x36,
0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2f, 0x76, 0x31,
0x3b, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,
0x33,
}
var (
file_proto_engine_v1_gloas_proto_rawDescOnce sync.Once
file_proto_engine_v1_gloas_proto_rawDescData = file_proto_engine_v1_gloas_proto_rawDesc
)
func file_proto_engine_v1_gloas_proto_rawDescGZIP() []byte {
file_proto_engine_v1_gloas_proto_rawDescOnce.Do(func() {
file_proto_engine_v1_gloas_proto_rawDescData = protoimpl.X.CompressGZIP(file_proto_engine_v1_gloas_proto_rawDescData)
})
return file_proto_engine_v1_gloas_proto_rawDescData
}
var file_proto_engine_v1_gloas_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
var file_proto_engine_v1_gloas_proto_goTypes = []any{
(*ExecutionPayloadEnvelope)(nil), // 0: ethereum.engine.v1.ExecutionPayloadEnvelope
(*SignedExecutionPayloadEnvelope)(nil), // 1: ethereum.engine.v1.SignedExecutionPayloadEnvelope
(*ExecutionPayloadDeneb)(nil), // 2: ethereum.engine.v1.ExecutionPayloadDeneb
(*ExecutionRequests)(nil), // 3: ethereum.engine.v1.ExecutionRequests
}
var file_proto_engine_v1_gloas_proto_depIdxs = []int32{
2, // 0: ethereum.engine.v1.ExecutionPayloadEnvelope.payload:type_name -> ethereum.engine.v1.ExecutionPayloadDeneb
3, // 1: ethereum.engine.v1.ExecutionPayloadEnvelope.execution_requests:type_name -> ethereum.engine.v1.ExecutionRequests
0, // 2: ethereum.engine.v1.SignedExecutionPayloadEnvelope.message:type_name -> ethereum.engine.v1.ExecutionPayloadEnvelope
3, // [3:3] is the sub-list for method output_type
3, // [3:3] is the sub-list for method input_type
3, // [3:3] is the sub-list for extension type_name
3, // [3:3] is the sub-list for extension extendee
0, // [0:3] is the sub-list for field type_name
}
func init() { file_proto_engine_v1_gloas_proto_init() }
func file_proto_engine_v1_gloas_proto_init() {
if File_proto_engine_v1_gloas_proto != nil {
return
}
file_proto_engine_v1_execution_engine_proto_init()
file_proto_engine_v1_electra_proto_init()
type x struct{}
out := protoimpl.TypeBuilder{
File: protoimpl.DescBuilder{
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: file_proto_engine_v1_gloas_proto_rawDesc,
NumEnums: 0,
NumMessages: 2,
NumExtensions: 0,
NumServices: 0,
},
GoTypes: file_proto_engine_v1_gloas_proto_goTypes,
DependencyIndexes: file_proto_engine_v1_gloas_proto_depIdxs,
MessageInfos: file_proto_engine_v1_gloas_proto_msgTypes,
}.Build()
File_proto_engine_v1_gloas_proto = out.File
file_proto_engine_v1_gloas_proto_rawDesc = nil
file_proto_engine_v1_gloas_proto_goTypes = nil
file_proto_engine_v1_gloas_proto_depIdxs = nil
}

View File

@@ -144,15 +144,17 @@ func copySignedExecutionPayloadBid(header *SignedExecutionPayloadBid) *SignedExe
} }
if header.Message != nil { if header.Message != nil {
copied.Message = &ExecutionPayloadBid{ copied.Message = &ExecutionPayloadBid{
ParentBlockHash: bytesutil.SafeCopyBytes(header.Message.ParentBlockHash), ParentBlockHash: bytesutil.SafeCopyBytes(header.Message.ParentBlockHash),
ParentBlockRoot: bytesutil.SafeCopyBytes(header.Message.ParentBlockRoot), ParentBlockRoot: bytesutil.SafeCopyBytes(header.Message.ParentBlockRoot),
BlockHash: bytesutil.SafeCopyBytes(header.Message.BlockHash), BlockHash: bytesutil.SafeCopyBytes(header.Message.BlockHash),
FeeRecipient: bytesutil.SafeCopyBytes(header.Message.FeeRecipient), PrevRandao: bytesutil.SafeCopyBytes(header.Message.PrevRandao),
GasLimit: header.Message.GasLimit, FeeRecipient: bytesutil.SafeCopyBytes(header.Message.FeeRecipient),
BuilderIndex: header.Message.BuilderIndex, GasLimit: header.Message.GasLimit,
Slot: header.Message.Slot, BuilderIndex: header.Message.BuilderIndex,
Value: header.Message.Value, Slot: header.Message.Slot,
BlobKzgCommitmentsRoot: bytesutil.SafeCopyBytes(header.Message.BlobKzgCommitmentsRoot), Value: header.Message.Value,
ExecutionPayment: header.Message.ExecutionPayment,
BlobKzgCommitments: bytesutil.SafeCopy2dBytes(header.Message.BlobKzgCommitments),
} }
} }
return copied return copied

View File

@@ -1215,15 +1215,16 @@ func genSignedExecutionPayloadBidGloas() *v1alpha1.SignedExecutionPayloadBid {
func genExecutionPayloadBidGloas() *v1alpha1.ExecutionPayloadBid { func genExecutionPayloadBidGloas() *v1alpha1.ExecutionPayloadBid {
return &v1alpha1.ExecutionPayloadBid{ return &v1alpha1.ExecutionPayloadBid{
ParentBlockHash: bytes(32), ParentBlockHash: bytes(32),
ParentBlockRoot: bytes(32), ParentBlockRoot: bytes(32),
BlockHash: bytes(32), BlockHash: bytes(32),
FeeRecipient: bytes(20), FeeRecipient: bytes(20),
GasLimit: rand.Uint64(), GasLimit: rand.Uint64(),
BuilderIndex: primitives.BuilderIndex(rand.Uint64()), BuilderIndex: primitives.BuilderIndex(rand.Uint64()),
Slot: primitives.Slot(rand.Uint64()), Slot: primitives.Slot(rand.Uint64()),
Value: primitives.Gwei(rand.Uint64()), Value: primitives.Gwei(rand.Uint64()),
BlobKzgCommitmentsRoot: bytes(32), ExecutionPayment: primitives.Gwei(rand.Uint64()),
BlobKzgCommitments: [][]byte{bytes(48)},
} }
} }

View File

@@ -10,17 +10,17 @@ func (header *ExecutionPayloadBid) Copy() *ExecutionPayloadBid {
return nil return nil
} }
return &ExecutionPayloadBid{ return &ExecutionPayloadBid{
ParentBlockHash: bytesutil.SafeCopyBytes(header.ParentBlockHash), ParentBlockHash: bytesutil.SafeCopyBytes(header.ParentBlockHash),
ParentBlockRoot: bytesutil.SafeCopyBytes(header.ParentBlockRoot), ParentBlockRoot: bytesutil.SafeCopyBytes(header.ParentBlockRoot),
BlockHash: bytesutil.SafeCopyBytes(header.BlockHash), BlockHash: bytesutil.SafeCopyBytes(header.BlockHash),
PrevRandao: bytesutil.SafeCopyBytes(header.PrevRandao), PrevRandao: bytesutil.SafeCopyBytes(header.PrevRandao),
FeeRecipient: bytesutil.SafeCopyBytes(header.FeeRecipient), FeeRecipient: bytesutil.SafeCopyBytes(header.FeeRecipient),
GasLimit: header.GasLimit, GasLimit: header.GasLimit,
BuilderIndex: header.BuilderIndex, BuilderIndex: header.BuilderIndex,
Slot: header.Slot, Slot: header.Slot,
Value: header.Value, Value: header.Value,
ExecutionPayment: header.ExecutionPayment, ExecutionPayment: header.ExecutionPayment,
BlobKzgCommitmentsRoot: bytesutil.SafeCopyBytes(header.BlobKzgCommitmentsRoot), BlobKzgCommitments: bytesutil.SafeCopy2dBytes(header.BlobKzgCommitments),
} }
} }

File diff suppressed because it is too large Load Diff

View File

@@ -33,7 +33,7 @@ option go_package = "github.com/OffchainLabs/prysm/v7/proto/prysm/v1alpha1;eth";
// slot: Slot // slot: Slot
// value: Gwei // value: Gwei
// execution_payment: Gwei // execution_payment: Gwei
// blob_kzg_commitments_root: Root // blob_kzg_commitments: List[KZGCommitment, MAX_BLOB_COMMITMENTS_PER_BLOCK]
message ExecutionPayloadBid { message ExecutionPayloadBid {
bytes parent_block_hash = 1 [ (ethereum.eth.ext.ssz_size) = "32" ]; bytes parent_block_hash = 1 [ (ethereum.eth.ext.ssz_size) = "32" ];
bytes parent_block_root = 2 [ (ethereum.eth.ext.ssz_size) = "32" ]; bytes parent_block_root = 2 [ (ethereum.eth.ext.ssz_size) = "32" ];
@@ -56,7 +56,10 @@ message ExecutionPayloadBid {
(ethereum.eth.ext.cast_type) = (ethereum.eth.ext.cast_type) =
"github.com/OffchainLabs/prysm/v7/consensus-types/primitives.Gwei" "github.com/OffchainLabs/prysm/v7/consensus-types/primitives.Gwei"
]; ];
bytes blob_kzg_commitments_root = 11 [ (ethereum.eth.ext.ssz_size) = "32" ]; repeated bytes blob_kzg_commitments = 11 [
(ethereum.eth.ext.ssz_size) = "?,48",
(ethereum.eth.ext.ssz_max) = "max_blob_commitments.size"
];
} }
// SignedExecutionPayloadBid wraps an execution payload bid with a signature. // SignedExecutionPayloadBid wraps an execution payload bid with a signature.
@@ -366,7 +369,6 @@ message BuilderPendingWithdrawal {
// class DataColumnSidecar(Container): // class DataColumnSidecar(Container):
// index: ColumnIndex // index: ColumnIndex
// column: List[Cell, MAX_BLOB_COMMITMENTS_PER_BLOCK] // column: List[Cell, MAX_BLOB_COMMITMENTS_PER_BLOCK]
// kzg_commitents: List[KZGCommitment, MAX_BLOB_COMMITMENTS_PER_BLOCK]
// kzg_proofs: List[KZGProof, MAX_BLOB_COMMITMENTS_PER_BLOCK] // kzg_proofs: List[KZGProof, MAX_BLOB_COMMITMENTS_PER_BLOCK]
// slot: Slot // slot: Slot
// beacon_block_root: Root // beacon_block_root: Root
@@ -376,10 +378,6 @@ message DataColumnSidecarGloas {
(ethereum.eth.ext.ssz_size) = "?,bytes_per_cell.size", (ethereum.eth.ext.ssz_size) = "?,bytes_per_cell.size",
(ethereum.eth.ext.ssz_max) = "max_blob_commitments.size" (ethereum.eth.ext.ssz_max) = "max_blob_commitments.size"
]; ];
repeated bytes kzg_commitments = 3 [
(ethereum.eth.ext.ssz_size) = "?,48",
(ethereum.eth.ext.ssz_max) = "max_blob_commitments.size"
];
repeated bytes kzg_proofs = 4 [ repeated bytes kzg_proofs = 4 [
(ethereum.eth.ext.ssz_size) = "?,48", (ethereum.eth.ext.ssz_size) = "?,48",
(ethereum.eth.ext.ssz_max) = "max_blob_commitments.size" (ethereum.eth.ext.ssz_max) = "max_blob_commitments.size"
@@ -402,7 +400,6 @@ message DataColumnSidecarGloas {
// builder_index: BuilderIndex // builder_index: BuilderIndex
// beacon_block_root: Root // beacon_block_root: Root
// slot: Slot // slot: Slot
// blob_kzg_commitments: List[KZGCommitment, MAX_BLOB_COMMITMENTS_PER_BLOCK]
// state_root: Root // state_root: Root
message ExecutionPayloadEnvelope { message ExecutionPayloadEnvelope {
ethereum.engine.v1.ExecutionPayloadDeneb payload = 1; ethereum.engine.v1.ExecutionPayloadDeneb payload = 1;
@@ -415,11 +412,7 @@ message ExecutionPayloadEnvelope {
(ethereum.eth.ext.cast_type) = (ethereum.eth.ext.cast_type) =
"github.com/OffchainLabs/prysm/v7/consensus-types/primitives.Slot" "github.com/OffchainLabs/prysm/v7/consensus-types/primitives.Slot"
]; ];
repeated bytes blob_kzg_commitments = 6 [ bytes state_root = 6 [ (ethereum.eth.ext.ssz_size) = "32" ];
(ethereum.eth.ext.ssz_size) = "?,48",
(ethereum.eth.ext.ssz_max) = "max_blob_commitments.size"
];
bytes state_root = 7 [ (ethereum.eth.ext.ssz_size) = "32" ];
} }
// SignedExecutionPayloadEnvelope wraps an execution payload envelope with a signature. // SignedExecutionPayloadEnvelope wraps an execution payload envelope with a signature.

View File

@@ -15,6 +15,7 @@ func (e *ExecutionPayloadBid) MarshalSSZ() ([]byte, error) {
// MarshalSSZTo ssz marshals the ExecutionPayloadBid object to a target array // MarshalSSZTo ssz marshals the ExecutionPayloadBid object to a target array
func (e *ExecutionPayloadBid) MarshalSSZTo(buf []byte) (dst []byte, err error) { func (e *ExecutionPayloadBid) MarshalSSZTo(buf []byte) (dst []byte, err error) {
dst = buf dst = buf
offset := int(192)
// Field (0) 'ParentBlockHash' // Field (0) 'ParentBlockHash'
if size := len(e.ParentBlockHash); size != 32 { if size := len(e.ParentBlockHash); size != 32 {
@@ -66,12 +67,22 @@ func (e *ExecutionPayloadBid) MarshalSSZTo(buf []byte) (dst []byte, err error) {
// Field (9) 'ExecutionPayment' // Field (9) 'ExecutionPayment'
dst = ssz.MarshalUint64(dst, uint64(e.ExecutionPayment)) dst = ssz.MarshalUint64(dst, uint64(e.ExecutionPayment))
// Field (10) 'BlobKzgCommitmentsRoot' // Offset (10) 'BlobKzgCommitments'
if size := len(e.BlobKzgCommitmentsRoot); size != 32 { dst = ssz.WriteOffset(dst, offset)
err = ssz.ErrBytesLengthFn("--.BlobKzgCommitmentsRoot", size, 32) offset += len(e.BlobKzgCommitments) * 48
// Field (10) 'BlobKzgCommitments'
if size := len(e.BlobKzgCommitments); size > 4096 {
err = ssz.ErrListTooBigFn("--.BlobKzgCommitments", size, 4096)
return return
} }
dst = append(dst, e.BlobKzgCommitmentsRoot...) for ii := 0; ii < len(e.BlobKzgCommitments); ii++ {
if size := len(e.BlobKzgCommitments[ii]); size != 48 {
err = ssz.ErrBytesLengthFn("--.BlobKzgCommitments[ii]", size, 48)
return
}
dst = append(dst, e.BlobKzgCommitments[ii]...)
}
return return
} }
@@ -80,10 +91,13 @@ func (e *ExecutionPayloadBid) MarshalSSZTo(buf []byte) (dst []byte, err error) {
func (e *ExecutionPayloadBid) UnmarshalSSZ(buf []byte) error { func (e *ExecutionPayloadBid) UnmarshalSSZ(buf []byte) error {
var err error var err error
size := uint64(len(buf)) size := uint64(len(buf))
if size != 220 { if size < 192 {
return ssz.ErrSize return ssz.ErrSize
} }
tail := buf
var o10 uint64
// Field (0) 'ParentBlockHash' // Field (0) 'ParentBlockHash'
if cap(e.ParentBlockHash) == 0 { if cap(e.ParentBlockHash) == 0 {
e.ParentBlockHash = make([]byte, 0, len(buf[0:32])) e.ParentBlockHash = make([]byte, 0, len(buf[0:32]))
@@ -129,18 +143,40 @@ func (e *ExecutionPayloadBid) UnmarshalSSZ(buf []byte) error {
// Field (9) 'ExecutionPayment' // Field (9) 'ExecutionPayment'
e.ExecutionPayment = github_com_OffchainLabs_prysm_v7_consensus_types_primitives.Gwei(ssz.UnmarshallUint64(buf[180:188])) e.ExecutionPayment = github_com_OffchainLabs_prysm_v7_consensus_types_primitives.Gwei(ssz.UnmarshallUint64(buf[180:188]))
// Field (10) 'BlobKzgCommitmentsRoot' // Offset (10) 'BlobKzgCommitments'
if cap(e.BlobKzgCommitmentsRoot) == 0 { if o10 = ssz.ReadOffset(buf[188:192]); o10 > size {
e.BlobKzgCommitmentsRoot = make([]byte, 0, len(buf[188:220])) return ssz.ErrOffset
} }
e.BlobKzgCommitmentsRoot = append(e.BlobKzgCommitmentsRoot, buf[188:220]...)
if o10 != 192 {
return ssz.ErrInvalidVariableOffset
}
// Field (10) 'BlobKzgCommitments'
{
buf = tail[o10:]
num, err := ssz.DivideInt2(len(buf), 48, 4096)
if err != nil {
return err
}
e.BlobKzgCommitments = make([][]byte, num)
for ii := 0; ii < num; ii++ {
if cap(e.BlobKzgCommitments[ii]) == 0 {
e.BlobKzgCommitments[ii] = make([]byte, 0, len(buf[ii*48:(ii+1)*48]))
}
e.BlobKzgCommitments[ii] = append(e.BlobKzgCommitments[ii], buf[ii*48:(ii+1)*48]...)
}
}
return err return err
} }
// SizeSSZ returns the ssz encoded size in bytes for the ExecutionPayloadBid object // SizeSSZ returns the ssz encoded size in bytes for the ExecutionPayloadBid object
func (e *ExecutionPayloadBid) SizeSSZ() (size int) { func (e *ExecutionPayloadBid) SizeSSZ() (size int) {
size = 220 size = 192
// Field (10) 'BlobKzgCommitments'
size += len(e.BlobKzgCommitments) * 48
return return
} }
@@ -203,12 +239,24 @@ func (e *ExecutionPayloadBid) HashTreeRootWith(hh *ssz.Hasher) (err error) {
// Field (9) 'ExecutionPayment' // Field (9) 'ExecutionPayment'
hh.PutUint64(uint64(e.ExecutionPayment)) hh.PutUint64(uint64(e.ExecutionPayment))
// Field (10) 'BlobKzgCommitmentsRoot' // Field (10) 'BlobKzgCommitments'
if size := len(e.BlobKzgCommitmentsRoot); size != 32 { {
err = ssz.ErrBytesLengthFn("--.BlobKzgCommitmentsRoot", size, 32) if size := len(e.BlobKzgCommitments); size > 4096 {
return err = ssz.ErrListTooBigFn("--.BlobKzgCommitments", size, 4096)
return
}
subIndx := hh.Index()
for _, i := range e.BlobKzgCommitments {
if len(i) != 48 {
err = ssz.ErrBytesLength
return
}
hh.PutBytes(i)
}
numItems := uint64(len(e.BlobKzgCommitments))
hh.MerkleizeWithMixin(subIndx, numItems, 4096)
} }
hh.PutBytes(e.BlobKzgCommitmentsRoot)
hh.Merkleize(indx) hh.Merkleize(indx)
return return
@@ -222,14 +270,14 @@ func (s *SignedExecutionPayloadBid) MarshalSSZ() ([]byte, error) {
// MarshalSSZTo ssz marshals the SignedExecutionPayloadBid object to a target array // MarshalSSZTo ssz marshals the SignedExecutionPayloadBid object to a target array
func (s *SignedExecutionPayloadBid) MarshalSSZTo(buf []byte) (dst []byte, err error) { func (s *SignedExecutionPayloadBid) MarshalSSZTo(buf []byte) (dst []byte, err error) {
dst = buf dst = buf
offset := int(100)
// Field (0) 'Message' // Offset (0) 'Message'
dst = ssz.WriteOffset(dst, offset)
if s.Message == nil { if s.Message == nil {
s.Message = new(ExecutionPayloadBid) s.Message = new(ExecutionPayloadBid)
} }
if dst, err = s.Message.MarshalSSZTo(dst); err != nil { offset += s.Message.SizeSSZ()
return
}
// Field (1) 'Signature' // Field (1) 'Signature'
if size := len(s.Signature); size != 96 { if size := len(s.Signature); size != 96 {
@@ -238,6 +286,11 @@ func (s *SignedExecutionPayloadBid) MarshalSSZTo(buf []byte) (dst []byte, err er
} }
dst = append(dst, s.Signature...) dst = append(dst, s.Signature...)
// Field (0) 'Message'
if dst, err = s.Message.MarshalSSZTo(dst); err != nil {
return
}
return return
} }
@@ -245,30 +298,51 @@ func (s *SignedExecutionPayloadBid) MarshalSSZTo(buf []byte) (dst []byte, err er
func (s *SignedExecutionPayloadBid) UnmarshalSSZ(buf []byte) error { func (s *SignedExecutionPayloadBid) UnmarshalSSZ(buf []byte) error {
var err error var err error
size := uint64(len(buf)) size := uint64(len(buf))
if size != 316 { if size < 100 {
return ssz.ErrSize return ssz.ErrSize
} }
// Field (0) 'Message' tail := buf
if s.Message == nil { var o0 uint64
s.Message = new(ExecutionPayloadBid)
// Offset (0) 'Message'
if o0 = ssz.ReadOffset(buf[0:4]); o0 > size {
return ssz.ErrOffset
} }
if err = s.Message.UnmarshalSSZ(buf[0:220]); err != nil {
return err if o0 != 100 {
return ssz.ErrInvalidVariableOffset
} }
// Field (1) 'Signature' // Field (1) 'Signature'
if cap(s.Signature) == 0 { if cap(s.Signature) == 0 {
s.Signature = make([]byte, 0, len(buf[220:316])) s.Signature = make([]byte, 0, len(buf[4:100]))
} }
s.Signature = append(s.Signature, buf[220:316]...) s.Signature = append(s.Signature, buf[4:100]...)
// Field (0) 'Message'
{
buf = tail[o0:]
if s.Message == nil {
s.Message = new(ExecutionPayloadBid)
}
if err = s.Message.UnmarshalSSZ(buf); err != nil {
return err
}
}
return err return err
} }
// SizeSSZ returns the ssz encoded size in bytes for the SignedExecutionPayloadBid object // SizeSSZ returns the ssz encoded size in bytes for the SignedExecutionPayloadBid object
func (s *SignedExecutionPayloadBid) SizeSSZ() (size int) { func (s *SignedExecutionPayloadBid) SizeSSZ() (size int) {
size = 316 size = 100
// Field (0) 'Message'
if s.Message == nil {
s.Message = new(ExecutionPayloadBid)
}
size += s.Message.SizeSSZ()
return return
} }
@@ -742,7 +816,7 @@ func (b *BeaconBlockBodyGloas) MarshalSSZ() ([]byte, error) {
// MarshalSSZTo ssz marshals the BeaconBlockBodyGloas object to a target array // MarshalSSZTo ssz marshals the BeaconBlockBodyGloas object to a target array
func (b *BeaconBlockBodyGloas) MarshalSSZTo(buf []byte) (dst []byte, err error) { func (b *BeaconBlockBodyGloas) MarshalSSZTo(buf []byte) (dst []byte, err error) {
dst = buf dst = buf
offset := int(704) offset := int(392)
// Field (0) 'RandaoReveal' // Field (0) 'RandaoReveal'
if size := len(b.RandaoReveal); size != 96 { if size := len(b.RandaoReveal); size != 96 {
@@ -804,13 +878,12 @@ func (b *BeaconBlockBodyGloas) MarshalSSZTo(buf []byte) (dst []byte, err error)
dst = ssz.WriteOffset(dst, offset) dst = ssz.WriteOffset(dst, offset)
offset += len(b.BlsToExecutionChanges) * 172 offset += len(b.BlsToExecutionChanges) * 172
// Field (10) 'SignedExecutionPayloadBid' // Offset (10) 'SignedExecutionPayloadBid'
dst = ssz.WriteOffset(dst, offset)
if b.SignedExecutionPayloadBid == nil { if b.SignedExecutionPayloadBid == nil {
b.SignedExecutionPayloadBid = new(SignedExecutionPayloadBid) b.SignedExecutionPayloadBid = new(SignedExecutionPayloadBid)
} }
if dst, err = b.SignedExecutionPayloadBid.MarshalSSZTo(dst); err != nil { offset += b.SignedExecutionPayloadBid.SizeSSZ()
return
}
// Offset (11) 'PayloadAttestations' // Offset (11) 'PayloadAttestations'
dst = ssz.WriteOffset(dst, offset) dst = ssz.WriteOffset(dst, offset)
@@ -896,6 +969,11 @@ func (b *BeaconBlockBodyGloas) MarshalSSZTo(buf []byte) (dst []byte, err error)
} }
} }
// Field (10) 'SignedExecutionPayloadBid'
if dst, err = b.SignedExecutionPayloadBid.MarshalSSZTo(dst); err != nil {
return
}
// Field (11) 'PayloadAttestations' // Field (11) 'PayloadAttestations'
if size := len(b.PayloadAttestations); size > 4 { if size := len(b.PayloadAttestations); size > 4 {
err = ssz.ErrListTooBigFn("--.PayloadAttestations", size, 4) err = ssz.ErrListTooBigFn("--.PayloadAttestations", size, 4)
@@ -914,12 +992,12 @@ func (b *BeaconBlockBodyGloas) MarshalSSZTo(buf []byte) (dst []byte, err error)
func (b *BeaconBlockBodyGloas) UnmarshalSSZ(buf []byte) error { func (b *BeaconBlockBodyGloas) UnmarshalSSZ(buf []byte) error {
var err error var err error
size := uint64(len(buf)) size := uint64(len(buf))
if size < 704 { if size < 392 {
return ssz.ErrSize return ssz.ErrSize
} }
tail := buf tail := buf
var o3, o4, o5, o6, o7, o9, o11 uint64 var o3, o4, o5, o6, o7, o9, o10, o11 uint64
// Field (0) 'RandaoReveal' // Field (0) 'RandaoReveal'
if cap(b.RandaoReveal) == 0 { if cap(b.RandaoReveal) == 0 {
@@ -946,7 +1024,7 @@ func (b *BeaconBlockBodyGloas) UnmarshalSSZ(buf []byte) error {
return ssz.ErrOffset return ssz.ErrOffset
} }
if o3 != 704 { if o3 != 392 {
return ssz.ErrInvalidVariableOffset return ssz.ErrInvalidVariableOffset
} }
@@ -983,16 +1061,13 @@ func (b *BeaconBlockBodyGloas) UnmarshalSSZ(buf []byte) error {
return ssz.ErrOffset return ssz.ErrOffset
} }
// Field (10) 'SignedExecutionPayloadBid' // Offset (10) 'SignedExecutionPayloadBid'
if b.SignedExecutionPayloadBid == nil { if o10 = ssz.ReadOffset(buf[384:388]); o10 > size || o9 > o10 {
b.SignedExecutionPayloadBid = new(SignedExecutionPayloadBid) return ssz.ErrOffset
}
if err = b.SignedExecutionPayloadBid.UnmarshalSSZ(buf[384:700]); err != nil {
return err
} }
// Offset (11) 'PayloadAttestations' // Offset (11) 'PayloadAttestations'
if o11 = ssz.ReadOffset(buf[700:704]); o11 > size || o9 > o11 { if o11 = ssz.ReadOffset(buf[388:392]); o11 > size || o10 > o11 {
return ssz.ErrOffset return ssz.ErrOffset
} }
@@ -1096,7 +1171,7 @@ func (b *BeaconBlockBodyGloas) UnmarshalSSZ(buf []byte) error {
// Field (9) 'BlsToExecutionChanges' // Field (9) 'BlsToExecutionChanges'
{ {
buf = tail[o9:o11] buf = tail[o9:o10]
num, err := ssz.DivideInt2(len(buf), 172, 16) num, err := ssz.DivideInt2(len(buf), 172, 16)
if err != nil { if err != nil {
return err return err
@@ -1112,6 +1187,17 @@ func (b *BeaconBlockBodyGloas) UnmarshalSSZ(buf []byte) error {
} }
} }
// Field (10) 'SignedExecutionPayloadBid'
{
buf = tail[o10:o11]
if b.SignedExecutionPayloadBid == nil {
b.SignedExecutionPayloadBid = new(SignedExecutionPayloadBid)
}
if err = b.SignedExecutionPayloadBid.UnmarshalSSZ(buf); err != nil {
return err
}
}
// Field (11) 'PayloadAttestations' // Field (11) 'PayloadAttestations'
{ {
buf = tail[o11:] buf = tail[o11:]
@@ -1134,7 +1220,7 @@ func (b *BeaconBlockBodyGloas) UnmarshalSSZ(buf []byte) error {
// SizeSSZ returns the ssz encoded size in bytes for the BeaconBlockBodyGloas object // SizeSSZ returns the ssz encoded size in bytes for the BeaconBlockBodyGloas object
func (b *BeaconBlockBodyGloas) SizeSSZ() (size int) { func (b *BeaconBlockBodyGloas) SizeSSZ() (size int) {
size = 704 size = 392
// Field (3) 'ProposerSlashings' // Field (3) 'ProposerSlashings'
size += len(b.ProposerSlashings) * 416 size += len(b.ProposerSlashings) * 416
@@ -1160,6 +1246,12 @@ func (b *BeaconBlockBodyGloas) SizeSSZ() (size int) {
// Field (9) 'BlsToExecutionChanges' // Field (9) 'BlsToExecutionChanges'
size += len(b.BlsToExecutionChanges) * 172 size += len(b.BlsToExecutionChanges) * 172
// Field (10) 'SignedExecutionPayloadBid'
if b.SignedExecutionPayloadBid == nil {
b.SignedExecutionPayloadBid = new(SignedExecutionPayloadBid)
}
size += b.SignedExecutionPayloadBid.SizeSSZ()
// Field (11) 'PayloadAttestations' // Field (11) 'PayloadAttestations'
size += len(b.PayloadAttestations) * 202 size += len(b.PayloadAttestations) * 202
@@ -1437,7 +1529,7 @@ func (b *BeaconStateGloas) MarshalSSZ() ([]byte, error) {
// MarshalSSZTo ssz marshals the BeaconStateGloas object to a target array // MarshalSSZTo ssz marshals the BeaconStateGloas object to a target array
func (b *BeaconStateGloas) MarshalSSZTo(buf []byte) (dst []byte, err error) { func (b *BeaconStateGloas) MarshalSSZTo(buf []byte) (dst []byte, err error) {
dst = buf dst = buf
offset := int(2741333) offset := int(2741117)
// Field (0) 'GenesisTime' // Field (0) 'GenesisTime'
dst = ssz.MarshalUint64(dst, b.GenesisTime) dst = ssz.MarshalUint64(dst, b.GenesisTime)
@@ -1602,13 +1694,12 @@ func (b *BeaconStateGloas) MarshalSSZTo(buf []byte) (dst []byte, err error) {
return return
} }
// Field (24) 'LatestExecutionPayloadBid' // Offset (24) 'LatestExecutionPayloadBid'
dst = ssz.WriteOffset(dst, offset)
if b.LatestExecutionPayloadBid == nil { if b.LatestExecutionPayloadBid == nil {
b.LatestExecutionPayloadBid = new(ExecutionPayloadBid) b.LatestExecutionPayloadBid = new(ExecutionPayloadBid)
} }
if dst, err = b.LatestExecutionPayloadBid.MarshalSSZTo(dst); err != nil { offset += b.LatestExecutionPayloadBid.SizeSSZ()
return
}
// Field (25) 'NextWithdrawalIndex' // Field (25) 'NextWithdrawalIndex'
dst = ssz.MarshalUint64(dst, b.NextWithdrawalIndex) dst = ssz.MarshalUint64(dst, b.NextWithdrawalIndex)
@@ -1766,6 +1857,11 @@ func (b *BeaconStateGloas) MarshalSSZTo(buf []byte) (dst []byte, err error) {
dst = ssz.MarshalUint64(dst, b.InactivityScores[ii]) dst = ssz.MarshalUint64(dst, b.InactivityScores[ii])
} }
// Field (24) 'LatestExecutionPayloadBid'
if dst, err = b.LatestExecutionPayloadBid.MarshalSSZTo(dst); err != nil {
return
}
// Field (27) 'HistoricalSummaries' // Field (27) 'HistoricalSummaries'
if size := len(b.HistoricalSummaries); size > 16777216 { if size := len(b.HistoricalSummaries); size > 16777216 {
err = ssz.ErrListTooBigFn("--.HistoricalSummaries", size, 16777216) err = ssz.ErrListTooBigFn("--.HistoricalSummaries", size, 16777216)
@@ -1850,12 +1946,12 @@ func (b *BeaconStateGloas) MarshalSSZTo(buf []byte) (dst []byte, err error) {
func (b *BeaconStateGloas) UnmarshalSSZ(buf []byte) error { func (b *BeaconStateGloas) UnmarshalSSZ(buf []byte) error {
var err error var err error
size := uint64(len(buf)) size := uint64(len(buf))
if size < 2741333 { if size < 2741117 {
return ssz.ErrSize return ssz.ErrSize
} }
tail := buf tail := buf
var o7, o9, o11, o12, o15, o16, o21, o27, o34, o35, o36, o38, o42, o44 uint64 var o7, o9, o11, o12, o15, o16, o21, o24, o27, o34, o35, o36, o38, o42, o44 uint64
// Field (0) 'GenesisTime' // Field (0) 'GenesisTime'
b.GenesisTime = ssz.UnmarshallUint64(buf[0:8]) b.GenesisTime = ssz.UnmarshallUint64(buf[0:8])
@@ -1908,7 +2004,7 @@ func (b *BeaconStateGloas) UnmarshalSSZ(buf []byte) error {
return ssz.ErrOffset return ssz.ErrOffset
} }
if o7 != 2741333 { if o7 != 2741117 {
return ssz.ErrInvalidVariableOffset return ssz.ErrInvalidVariableOffset
} }
@@ -2014,77 +2110,74 @@ func (b *BeaconStateGloas) UnmarshalSSZ(buf []byte) error {
return err return err
} }
// Field (24) 'LatestExecutionPayloadBid' // Offset (24) 'LatestExecutionPayloadBid'
if b.LatestExecutionPayloadBid == nil { if o24 = ssz.ReadOffset(buf[2736629:2736633]); o24 > size || o21 > o24 {
b.LatestExecutionPayloadBid = new(ExecutionPayloadBid) return ssz.ErrOffset
}
if err = b.LatestExecutionPayloadBid.UnmarshalSSZ(buf[2736629:2736849]); err != nil {
return err
} }
// Field (25) 'NextWithdrawalIndex' // Field (25) 'NextWithdrawalIndex'
b.NextWithdrawalIndex = ssz.UnmarshallUint64(buf[2736849:2736857]) b.NextWithdrawalIndex = ssz.UnmarshallUint64(buf[2736633:2736641])
// Field (26) 'NextWithdrawalValidatorIndex' // Field (26) 'NextWithdrawalValidatorIndex'
b.NextWithdrawalValidatorIndex = github_com_OffchainLabs_prysm_v7_consensus_types_primitives.ValidatorIndex(ssz.UnmarshallUint64(buf[2736857:2736865])) b.NextWithdrawalValidatorIndex = github_com_OffchainLabs_prysm_v7_consensus_types_primitives.ValidatorIndex(ssz.UnmarshallUint64(buf[2736641:2736649]))
// Offset (27) 'HistoricalSummaries' // Offset (27) 'HistoricalSummaries'
if o27 = ssz.ReadOffset(buf[2736865:2736869]); o27 > size || o21 > o27 { if o27 = ssz.ReadOffset(buf[2736649:2736653]); o27 > size || o24 > o27 {
return ssz.ErrOffset return ssz.ErrOffset
} }
// Field (28) 'DepositRequestsStartIndex' // Field (28) 'DepositRequestsStartIndex'
b.DepositRequestsStartIndex = ssz.UnmarshallUint64(buf[2736869:2736877]) b.DepositRequestsStartIndex = ssz.UnmarshallUint64(buf[2736653:2736661])
// Field (29) 'DepositBalanceToConsume' // Field (29) 'DepositBalanceToConsume'
b.DepositBalanceToConsume = github_com_OffchainLabs_prysm_v7_consensus_types_primitives.Gwei(ssz.UnmarshallUint64(buf[2736877:2736885])) b.DepositBalanceToConsume = github_com_OffchainLabs_prysm_v7_consensus_types_primitives.Gwei(ssz.UnmarshallUint64(buf[2736661:2736669]))
// Field (30) 'ExitBalanceToConsume' // Field (30) 'ExitBalanceToConsume'
b.ExitBalanceToConsume = github_com_OffchainLabs_prysm_v7_consensus_types_primitives.Gwei(ssz.UnmarshallUint64(buf[2736885:2736893])) b.ExitBalanceToConsume = github_com_OffchainLabs_prysm_v7_consensus_types_primitives.Gwei(ssz.UnmarshallUint64(buf[2736669:2736677]))
// Field (31) 'EarliestExitEpoch' // Field (31) 'EarliestExitEpoch'
b.EarliestExitEpoch = github_com_OffchainLabs_prysm_v7_consensus_types_primitives.Epoch(ssz.UnmarshallUint64(buf[2736893:2736901])) b.EarliestExitEpoch = github_com_OffchainLabs_prysm_v7_consensus_types_primitives.Epoch(ssz.UnmarshallUint64(buf[2736677:2736685]))
// Field (32) 'ConsolidationBalanceToConsume' // Field (32) 'ConsolidationBalanceToConsume'
b.ConsolidationBalanceToConsume = github_com_OffchainLabs_prysm_v7_consensus_types_primitives.Gwei(ssz.UnmarshallUint64(buf[2736901:2736909])) b.ConsolidationBalanceToConsume = github_com_OffchainLabs_prysm_v7_consensus_types_primitives.Gwei(ssz.UnmarshallUint64(buf[2736685:2736693]))
// Field (33) 'EarliestConsolidationEpoch' // Field (33) 'EarliestConsolidationEpoch'
b.EarliestConsolidationEpoch = github_com_OffchainLabs_prysm_v7_consensus_types_primitives.Epoch(ssz.UnmarshallUint64(buf[2736909:2736917])) b.EarliestConsolidationEpoch = github_com_OffchainLabs_prysm_v7_consensus_types_primitives.Epoch(ssz.UnmarshallUint64(buf[2736693:2736701]))
// Offset (34) 'PendingDeposits' // Offset (34) 'PendingDeposits'
if o34 = ssz.ReadOffset(buf[2736917:2736921]); o34 > size || o27 > o34 { if o34 = ssz.ReadOffset(buf[2736701:2736705]); o34 > size || o27 > o34 {
return ssz.ErrOffset return ssz.ErrOffset
} }
// Offset (35) 'PendingPartialWithdrawals' // Offset (35) 'PendingPartialWithdrawals'
if o35 = ssz.ReadOffset(buf[2736921:2736925]); o35 > size || o34 > o35 { if o35 = ssz.ReadOffset(buf[2736705:2736709]); o35 > size || o34 > o35 {
return ssz.ErrOffset return ssz.ErrOffset
} }
// Offset (36) 'PendingConsolidations' // Offset (36) 'PendingConsolidations'
if o36 = ssz.ReadOffset(buf[2736925:2736929]); o36 > size || o35 > o36 { if o36 = ssz.ReadOffset(buf[2736709:2736713]); o36 > size || o35 > o36 {
return ssz.ErrOffset return ssz.ErrOffset
} }
// Field (37) 'ProposerLookahead' // Field (37) 'ProposerLookahead'
b.ProposerLookahead = ssz.ExtendUint64(b.ProposerLookahead, 64) b.ProposerLookahead = ssz.ExtendUint64(b.ProposerLookahead, 64)
for ii := 0; ii < 64; ii++ { for ii := 0; ii < 64; ii++ {
b.ProposerLookahead[ii] = ssz.UnmarshallUint64(buf[2736929:2737441][ii*8 : (ii+1)*8]) b.ProposerLookahead[ii] = ssz.UnmarshallUint64(buf[2736713:2737225][ii*8 : (ii+1)*8])
} }
// Offset (38) 'Builders' // Offset (38) 'Builders'
if o38 = ssz.ReadOffset(buf[2737441:2737445]); o38 > size || o36 > o38 { if o38 = ssz.ReadOffset(buf[2737225:2737229]); o38 > size || o36 > o38 {
return ssz.ErrOffset return ssz.ErrOffset
} }
// Field (39) 'NextWithdrawalBuilderIndex' // Field (39) 'NextWithdrawalBuilderIndex'
b.NextWithdrawalBuilderIndex = github_com_OffchainLabs_prysm_v7_consensus_types_primitives.BuilderIndex(ssz.UnmarshallUint64(buf[2737445:2737453])) b.NextWithdrawalBuilderIndex = github_com_OffchainLabs_prysm_v7_consensus_types_primitives.BuilderIndex(ssz.UnmarshallUint64(buf[2737229:2737237]))
// Field (40) 'ExecutionPayloadAvailability' // Field (40) 'ExecutionPayloadAvailability'
if cap(b.ExecutionPayloadAvailability) == 0 { if cap(b.ExecutionPayloadAvailability) == 0 {
b.ExecutionPayloadAvailability = make([]byte, 0, len(buf[2737453:2738477])) b.ExecutionPayloadAvailability = make([]byte, 0, len(buf[2737237:2738261]))
} }
b.ExecutionPayloadAvailability = append(b.ExecutionPayloadAvailability, buf[2737453:2738477]...) b.ExecutionPayloadAvailability = append(b.ExecutionPayloadAvailability, buf[2737237:2738261]...)
// Field (41) 'BuilderPendingPayments' // Field (41) 'BuilderPendingPayments'
b.BuilderPendingPayments = make([]*BuilderPendingPayment, 64) b.BuilderPendingPayments = make([]*BuilderPendingPayment, 64)
@@ -2092,24 +2185,24 @@ func (b *BeaconStateGloas) UnmarshalSSZ(buf []byte) error {
if b.BuilderPendingPayments[ii] == nil { if b.BuilderPendingPayments[ii] == nil {
b.BuilderPendingPayments[ii] = new(BuilderPendingPayment) b.BuilderPendingPayments[ii] = new(BuilderPendingPayment)
} }
if err = b.BuilderPendingPayments[ii].UnmarshalSSZ(buf[2738477:2741293][ii*44 : (ii+1)*44]); err != nil { if err = b.BuilderPendingPayments[ii].UnmarshalSSZ(buf[2738261:2741077][ii*44 : (ii+1)*44]); err != nil {
return err return err
} }
} }
// Offset (42) 'BuilderPendingWithdrawals' // Offset (42) 'BuilderPendingWithdrawals'
if o42 = ssz.ReadOffset(buf[2741293:2741297]); o42 > size || o38 > o42 { if o42 = ssz.ReadOffset(buf[2741077:2741081]); o42 > size || o38 > o42 {
return ssz.ErrOffset return ssz.ErrOffset
} }
// Field (43) 'LatestBlockHash' // Field (43) 'LatestBlockHash'
if cap(b.LatestBlockHash) == 0 { if cap(b.LatestBlockHash) == 0 {
b.LatestBlockHash = make([]byte, 0, len(buf[2741297:2741329])) b.LatestBlockHash = make([]byte, 0, len(buf[2741081:2741113]))
} }
b.LatestBlockHash = append(b.LatestBlockHash, buf[2741297:2741329]...) b.LatestBlockHash = append(b.LatestBlockHash, buf[2741081:2741113]...)
// Offset (44) 'PayloadExpectedWithdrawals' // Offset (44) 'PayloadExpectedWithdrawals'
if o44 = ssz.ReadOffset(buf[2741329:2741333]); o44 > size || o42 > o44 { if o44 = ssz.ReadOffset(buf[2741113:2741117]); o44 > size || o42 > o44 {
return ssz.ErrOffset return ssz.ErrOffset
} }
@@ -2204,7 +2297,7 @@ func (b *BeaconStateGloas) UnmarshalSSZ(buf []byte) error {
// Field (21) 'InactivityScores' // Field (21) 'InactivityScores'
{ {
buf = tail[o21:o27] buf = tail[o21:o24]
num, err := ssz.DivideInt2(len(buf), 8, 1099511627776) num, err := ssz.DivideInt2(len(buf), 8, 1099511627776)
if err != nil { if err != nil {
return err return err
@@ -2215,6 +2308,17 @@ func (b *BeaconStateGloas) UnmarshalSSZ(buf []byte) error {
} }
} }
// Field (24) 'LatestExecutionPayloadBid'
{
buf = tail[o24:o27]
if b.LatestExecutionPayloadBid == nil {
b.LatestExecutionPayloadBid = new(ExecutionPayloadBid)
}
if err = b.LatestExecutionPayloadBid.UnmarshalSSZ(buf); err != nil {
return err
}
}
// Field (27) 'HistoricalSummaries' // Field (27) 'HistoricalSummaries'
{ {
buf = tail[o27:o34] buf = tail[o27:o34]
@@ -2345,7 +2449,7 @@ func (b *BeaconStateGloas) UnmarshalSSZ(buf []byte) error {
// SizeSSZ returns the ssz encoded size in bytes for the BeaconStateGloas object // SizeSSZ returns the ssz encoded size in bytes for the BeaconStateGloas object
func (b *BeaconStateGloas) SizeSSZ() (size int) { func (b *BeaconStateGloas) SizeSSZ() (size int) {
size = 2741333 size = 2741117
// Field (7) 'HistoricalRoots' // Field (7) 'HistoricalRoots'
size += len(b.HistoricalRoots) * 32 size += len(b.HistoricalRoots) * 32
@@ -2368,6 +2472,12 @@ func (b *BeaconStateGloas) SizeSSZ() (size int) {
// Field (21) 'InactivityScores' // Field (21) 'InactivityScores'
size += len(b.InactivityScores) * 8 size += len(b.InactivityScores) * 8
// Field (24) 'LatestExecutionPayloadBid'
if b.LatestExecutionPayloadBid == nil {
b.LatestExecutionPayloadBid = new(ExecutionPayloadBid)
}
size += b.LatestExecutionPayloadBid.SizeSSZ()
// Field (27) 'HistoricalSummaries' // Field (27) 'HistoricalSummaries'
size += len(b.HistoricalSummaries) * 64 size += len(b.HistoricalSummaries) * 64
@@ -2981,7 +3091,7 @@ func (d *DataColumnSidecarGloas) MarshalSSZ() ([]byte, error) {
// MarshalSSZTo ssz marshals the DataColumnSidecarGloas object to a target array // MarshalSSZTo ssz marshals the DataColumnSidecarGloas object to a target array
func (d *DataColumnSidecarGloas) MarshalSSZTo(buf []byte) (dst []byte, err error) { func (d *DataColumnSidecarGloas) MarshalSSZTo(buf []byte) (dst []byte, err error) {
dst = buf dst = buf
offset := int(60) offset := int(56)
// Field (0) 'Index' // Field (0) 'Index'
dst = ssz.MarshalUint64(dst, d.Index) dst = ssz.MarshalUint64(dst, d.Index)
@@ -2990,18 +3100,14 @@ func (d *DataColumnSidecarGloas) MarshalSSZTo(buf []byte) (dst []byte, err error
dst = ssz.WriteOffset(dst, offset) dst = ssz.WriteOffset(dst, offset)
offset += len(d.Column) * 2048 offset += len(d.Column) * 2048
// Offset (2) 'KzgCommitments' // Offset (2) 'KzgProofs'
dst = ssz.WriteOffset(dst, offset)
offset += len(d.KzgCommitments) * 48
// Offset (3) 'KzgProofs'
dst = ssz.WriteOffset(dst, offset) dst = ssz.WriteOffset(dst, offset)
offset += len(d.KzgProofs) * 48 offset += len(d.KzgProofs) * 48
// Field (4) 'Slot' // Field (3) 'Slot'
dst = ssz.MarshalUint64(dst, uint64(d.Slot)) dst = ssz.MarshalUint64(dst, uint64(d.Slot))
// Field (5) 'BeaconBlockRoot' // Field (4) 'BeaconBlockRoot'
if size := len(d.BeaconBlockRoot); size != 32 { if size := len(d.BeaconBlockRoot); size != 32 {
err = ssz.ErrBytesLengthFn("--.BeaconBlockRoot", size, 32) err = ssz.ErrBytesLengthFn("--.BeaconBlockRoot", size, 32)
return return
@@ -3021,20 +3127,7 @@ func (d *DataColumnSidecarGloas) MarshalSSZTo(buf []byte) (dst []byte, err error
dst = append(dst, d.Column[ii]...) dst = append(dst, d.Column[ii]...)
} }
// Field (2) 'KzgCommitments' // Field (2) 'KzgProofs'
if size := len(d.KzgCommitments); size > 4096 {
err = ssz.ErrListTooBigFn("--.KzgCommitments", size, 4096)
return
}
for ii := 0; ii < len(d.KzgCommitments); ii++ {
if size := len(d.KzgCommitments[ii]); size != 48 {
err = ssz.ErrBytesLengthFn("--.KzgCommitments[ii]", size, 48)
return
}
dst = append(dst, d.KzgCommitments[ii]...)
}
// Field (3) 'KzgProofs'
if size := len(d.KzgProofs); size > 4096 { if size := len(d.KzgProofs); size > 4096 {
err = ssz.ErrListTooBigFn("--.KzgProofs", size, 4096) err = ssz.ErrListTooBigFn("--.KzgProofs", size, 4096)
return return
@@ -3054,12 +3147,12 @@ func (d *DataColumnSidecarGloas) MarshalSSZTo(buf []byte) (dst []byte, err error
func (d *DataColumnSidecarGloas) UnmarshalSSZ(buf []byte) error { func (d *DataColumnSidecarGloas) UnmarshalSSZ(buf []byte) error {
var err error var err error
size := uint64(len(buf)) size := uint64(len(buf))
if size < 60 { if size < 56 {
return ssz.ErrSize return ssz.ErrSize
} }
tail := buf tail := buf
var o1, o2, o3 uint64 var o1, o2 uint64
// Field (0) 'Index' // Field (0) 'Index'
d.Index = ssz.UnmarshallUint64(buf[0:8]) d.Index = ssz.UnmarshallUint64(buf[0:8])
@@ -3069,28 +3162,23 @@ func (d *DataColumnSidecarGloas) UnmarshalSSZ(buf []byte) error {
return ssz.ErrOffset return ssz.ErrOffset
} }
if o1 != 60 { if o1 != 56 {
return ssz.ErrInvalidVariableOffset return ssz.ErrInvalidVariableOffset
} }
// Offset (2) 'KzgCommitments' // Offset (2) 'KzgProofs'
if o2 = ssz.ReadOffset(buf[12:16]); o2 > size || o1 > o2 { if o2 = ssz.ReadOffset(buf[12:16]); o2 > size || o1 > o2 {
return ssz.ErrOffset return ssz.ErrOffset
} }
// Offset (3) 'KzgProofs' // Field (3) 'Slot'
if o3 = ssz.ReadOffset(buf[16:20]); o3 > size || o2 > o3 { d.Slot = github_com_OffchainLabs_prysm_v7_consensus_types_primitives.Slot(ssz.UnmarshallUint64(buf[16:24]))
return ssz.ErrOffset
}
// Field (4) 'Slot' // Field (4) 'BeaconBlockRoot'
d.Slot = github_com_OffchainLabs_prysm_v7_consensus_types_primitives.Slot(ssz.UnmarshallUint64(buf[20:28]))
// Field (5) 'BeaconBlockRoot'
if cap(d.BeaconBlockRoot) == 0 { if cap(d.BeaconBlockRoot) == 0 {
d.BeaconBlockRoot = make([]byte, 0, len(buf[28:60])) d.BeaconBlockRoot = make([]byte, 0, len(buf[24:56]))
} }
d.BeaconBlockRoot = append(d.BeaconBlockRoot, buf[28:60]...) d.BeaconBlockRoot = append(d.BeaconBlockRoot, buf[24:56]...)
// Field (1) 'Column' // Field (1) 'Column'
{ {
@@ -3108,25 +3196,9 @@ func (d *DataColumnSidecarGloas) UnmarshalSSZ(buf []byte) error {
} }
} }
// Field (2) 'KzgCommitments' // Field (2) 'KzgProofs'
{ {
buf = tail[o2:o3] buf = tail[o2:]
num, err := ssz.DivideInt2(len(buf), 48, 4096)
if err != nil {
return err
}
d.KzgCommitments = make([][]byte, num)
for ii := 0; ii < num; ii++ {
if cap(d.KzgCommitments[ii]) == 0 {
d.KzgCommitments[ii] = make([]byte, 0, len(buf[ii*48:(ii+1)*48]))
}
d.KzgCommitments[ii] = append(d.KzgCommitments[ii], buf[ii*48:(ii+1)*48]...)
}
}
// Field (3) 'KzgProofs'
{
buf = tail[o3:]
num, err := ssz.DivideInt2(len(buf), 48, 4096) num, err := ssz.DivideInt2(len(buf), 48, 4096)
if err != nil { if err != nil {
return err return err
@@ -3144,15 +3216,12 @@ func (d *DataColumnSidecarGloas) UnmarshalSSZ(buf []byte) error {
// SizeSSZ returns the ssz encoded size in bytes for the DataColumnSidecarGloas object // SizeSSZ returns the ssz encoded size in bytes for the DataColumnSidecarGloas object
func (d *DataColumnSidecarGloas) SizeSSZ() (size int) { func (d *DataColumnSidecarGloas) SizeSSZ() (size int) {
size = 60 size = 56
// Field (1) 'Column' // Field (1) 'Column'
size += len(d.Column) * 2048 size += len(d.Column) * 2048
// Field (2) 'KzgCommitments' // Field (2) 'KzgProofs'
size += len(d.KzgCommitments) * 48
// Field (3) 'KzgProofs'
size += len(d.KzgProofs) * 48 size += len(d.KzgProofs) * 48
return return
@@ -3189,26 +3258,7 @@ func (d *DataColumnSidecarGloas) HashTreeRootWith(hh *ssz.Hasher) (err error) {
hh.MerkleizeWithMixin(subIndx, numItems, 4096) hh.MerkleizeWithMixin(subIndx, numItems, 4096)
} }
// Field (2) 'KzgCommitments' // Field (2) 'KzgProofs'
{
if size := len(d.KzgCommitments); size > 4096 {
err = ssz.ErrListTooBigFn("--.KzgCommitments", size, 4096)
return
}
subIndx := hh.Index()
for _, i := range d.KzgCommitments {
if len(i) != 48 {
err = ssz.ErrBytesLength
return
}
hh.PutBytes(i)
}
numItems := uint64(len(d.KzgCommitments))
hh.MerkleizeWithMixin(subIndx, numItems, 4096)
}
// Field (3) 'KzgProofs'
{ {
if size := len(d.KzgProofs); size > 4096 { if size := len(d.KzgProofs); size > 4096 {
err = ssz.ErrListTooBigFn("--.KzgProofs", size, 4096) err = ssz.ErrListTooBigFn("--.KzgProofs", size, 4096)
@@ -3227,10 +3277,10 @@ func (d *DataColumnSidecarGloas) HashTreeRootWith(hh *ssz.Hasher) (err error) {
hh.MerkleizeWithMixin(subIndx, numItems, 4096) hh.MerkleizeWithMixin(subIndx, numItems, 4096)
} }
// Field (4) 'Slot' // Field (3) 'Slot'
hh.PutUint64(uint64(d.Slot)) hh.PutUint64(uint64(d.Slot))
// Field (5) 'BeaconBlockRoot' // Field (4) 'BeaconBlockRoot'
if size := len(d.BeaconBlockRoot); size != 32 { if size := len(d.BeaconBlockRoot); size != 32 {
err = ssz.ErrBytesLengthFn("--.BeaconBlockRoot", size, 32) err = ssz.ErrBytesLengthFn("--.BeaconBlockRoot", size, 32)
return return
@@ -3249,7 +3299,7 @@ func (e *ExecutionPayloadEnvelope) MarshalSSZ() ([]byte, error) {
// MarshalSSZTo ssz marshals the ExecutionPayloadEnvelope object to a target array // MarshalSSZTo ssz marshals the ExecutionPayloadEnvelope object to a target array
func (e *ExecutionPayloadEnvelope) MarshalSSZTo(buf []byte) (dst []byte, err error) { func (e *ExecutionPayloadEnvelope) MarshalSSZTo(buf []byte) (dst []byte, err error) {
dst = buf dst = buf
offset := int(92) offset := int(88)
// Offset (0) 'Payload' // Offset (0) 'Payload'
dst = ssz.WriteOffset(dst, offset) dst = ssz.WriteOffset(dst, offset)
@@ -3278,11 +3328,7 @@ func (e *ExecutionPayloadEnvelope) MarshalSSZTo(buf []byte) (dst []byte, err err
// Field (4) 'Slot' // Field (4) 'Slot'
dst = ssz.MarshalUint64(dst, uint64(e.Slot)) dst = ssz.MarshalUint64(dst, uint64(e.Slot))
// Offset (5) 'BlobKzgCommitments' // Field (5) 'StateRoot'
dst = ssz.WriteOffset(dst, offset)
offset += len(e.BlobKzgCommitments) * 48
// Field (6) 'StateRoot'
if size := len(e.StateRoot); size != 32 { if size := len(e.StateRoot); size != 32 {
err = ssz.ErrBytesLengthFn("--.StateRoot", size, 32) err = ssz.ErrBytesLengthFn("--.StateRoot", size, 32)
return return
@@ -3299,19 +3345,6 @@ func (e *ExecutionPayloadEnvelope) MarshalSSZTo(buf []byte) (dst []byte, err err
return return
} }
// Field (5) 'BlobKzgCommitments'
if size := len(e.BlobKzgCommitments); size > 4096 {
err = ssz.ErrListTooBigFn("--.BlobKzgCommitments", size, 4096)
return
}
for ii := 0; ii < len(e.BlobKzgCommitments); ii++ {
if size := len(e.BlobKzgCommitments[ii]); size != 48 {
err = ssz.ErrBytesLengthFn("--.BlobKzgCommitments[ii]", size, 48)
return
}
dst = append(dst, e.BlobKzgCommitments[ii]...)
}
return return
} }
@@ -3319,19 +3352,19 @@ func (e *ExecutionPayloadEnvelope) MarshalSSZTo(buf []byte) (dst []byte, err err
func (e *ExecutionPayloadEnvelope) UnmarshalSSZ(buf []byte) error { func (e *ExecutionPayloadEnvelope) UnmarshalSSZ(buf []byte) error {
var err error var err error
size := uint64(len(buf)) size := uint64(len(buf))
if size < 92 { if size < 88 {
return ssz.ErrSize return ssz.ErrSize
} }
tail := buf tail := buf
var o0, o1, o5 uint64 var o0, o1 uint64
// Offset (0) 'Payload' // Offset (0) 'Payload'
if o0 = ssz.ReadOffset(buf[0:4]); o0 > size { if o0 = ssz.ReadOffset(buf[0:4]); o0 > size {
return ssz.ErrOffset return ssz.ErrOffset
} }
if o0 != 92 { if o0 != 88 {
return ssz.ErrInvalidVariableOffset return ssz.ErrInvalidVariableOffset
} }
@@ -3352,16 +3385,11 @@ func (e *ExecutionPayloadEnvelope) UnmarshalSSZ(buf []byte) error {
// Field (4) 'Slot' // Field (4) 'Slot'
e.Slot = github_com_OffchainLabs_prysm_v7_consensus_types_primitives.Slot(ssz.UnmarshallUint64(buf[48:56])) e.Slot = github_com_OffchainLabs_prysm_v7_consensus_types_primitives.Slot(ssz.UnmarshallUint64(buf[48:56]))
// Offset (5) 'BlobKzgCommitments' // Field (5) 'StateRoot'
if o5 = ssz.ReadOffset(buf[56:60]); o5 > size || o1 > o5 {
return ssz.ErrOffset
}
// Field (6) 'StateRoot'
if cap(e.StateRoot) == 0 { if cap(e.StateRoot) == 0 {
e.StateRoot = make([]byte, 0, len(buf[60:92])) e.StateRoot = make([]byte, 0, len(buf[56:88]))
} }
e.StateRoot = append(e.StateRoot, buf[60:92]...) e.StateRoot = append(e.StateRoot, buf[56:88]...)
// Field (0) 'Payload' // Field (0) 'Payload'
{ {
@@ -3376,7 +3404,7 @@ func (e *ExecutionPayloadEnvelope) UnmarshalSSZ(buf []byte) error {
// Field (1) 'ExecutionRequests' // Field (1) 'ExecutionRequests'
{ {
buf = tail[o1:o5] buf = tail[o1:]
if e.ExecutionRequests == nil { if e.ExecutionRequests == nil {
e.ExecutionRequests = new(v1.ExecutionRequests) e.ExecutionRequests = new(v1.ExecutionRequests)
} }
@@ -3384,28 +3412,12 @@ func (e *ExecutionPayloadEnvelope) UnmarshalSSZ(buf []byte) error {
return err return err
} }
} }
// Field (5) 'BlobKzgCommitments'
{
buf = tail[o5:]
num, err := ssz.DivideInt2(len(buf), 48, 4096)
if err != nil {
return err
}
e.BlobKzgCommitments = make([][]byte, num)
for ii := 0; ii < num; ii++ {
if cap(e.BlobKzgCommitments[ii]) == 0 {
e.BlobKzgCommitments[ii] = make([]byte, 0, len(buf[ii*48:(ii+1)*48]))
}
e.BlobKzgCommitments[ii] = append(e.BlobKzgCommitments[ii], buf[ii*48:(ii+1)*48]...)
}
}
return err return err
} }
// SizeSSZ returns the ssz encoded size in bytes for the ExecutionPayloadEnvelope object // SizeSSZ returns the ssz encoded size in bytes for the ExecutionPayloadEnvelope object
func (e *ExecutionPayloadEnvelope) SizeSSZ() (size int) { func (e *ExecutionPayloadEnvelope) SizeSSZ() (size int) {
size = 92 size = 88
// Field (0) 'Payload' // Field (0) 'Payload'
if e.Payload == nil { if e.Payload == nil {
@@ -3419,9 +3431,6 @@ func (e *ExecutionPayloadEnvelope) SizeSSZ() (size int) {
} }
size += e.ExecutionRequests.SizeSSZ() size += e.ExecutionRequests.SizeSSZ()
// Field (5) 'BlobKzgCommitments'
size += len(e.BlobKzgCommitments) * 48
return return
} }
@@ -3457,26 +3466,7 @@ func (e *ExecutionPayloadEnvelope) HashTreeRootWith(hh *ssz.Hasher) (err error)
// Field (4) 'Slot' // Field (4) 'Slot'
hh.PutUint64(uint64(e.Slot)) hh.PutUint64(uint64(e.Slot))
// Field (5) 'BlobKzgCommitments' // Field (5) 'StateRoot'
{
if size := len(e.BlobKzgCommitments); size > 4096 {
err = ssz.ErrListTooBigFn("--.BlobKzgCommitments", size, 4096)
return
}
subIndx := hh.Index()
for _, i := range e.BlobKzgCommitments {
if len(i) != 48 {
err = ssz.ErrBytesLength
return
}
hh.PutBytes(i)
}
numItems := uint64(len(e.BlobKzgCommitments))
hh.MerkleizeWithMixin(subIndx, numItems, 4096)
}
// Field (6) 'StateRoot'
if size := len(e.StateRoot); size != 32 { if size := len(e.StateRoot); size != 32 {
err = ssz.ErrBytesLengthFn("--.StateRoot", size, 32) err = ssz.ErrBytesLengthFn("--.StateRoot", size, 32)
return return

View File

@@ -23,17 +23,17 @@ func TestExecutionPayloadBid_Copy(t *testing.T) {
{ {
name: "fully populated bid", name: "fully populated bid",
bid: &ExecutionPayloadBid{ bid: &ExecutionPayloadBid{
ParentBlockHash: []byte("parent_block_hash_32_bytes_long!"), ParentBlockHash: []byte("parent_block_hash_32_bytes_long!"),
ParentBlockRoot: []byte("parent_block_root_32_bytes_long!"), ParentBlockRoot: []byte("parent_block_root_32_bytes_long!"),
BlockHash: []byte("block_hash_32_bytes_are_long!!"), BlockHash: []byte("block_hash_32_bytes_are_long!!"),
PrevRandao: []byte("prev_randao_32_bytes_long!!!"), PrevRandao: []byte("prev_randao_32_bytes_long!!!"),
FeeRecipient: []byte("fee_recipient_20_byt"), FeeRecipient: []byte("fee_recipient_20_byt"),
GasLimit: 15000000, GasLimit: 15000000,
BuilderIndex: primitives.BuilderIndex(42), BuilderIndex: primitives.BuilderIndex(42),
Slot: primitives.Slot(12345), Slot: primitives.Slot(12345),
ExecutionPayment: 5645654, Value: 1000000000000000000,
Value: 1000000000000000000, ExecutionPayment: 5645654,
BlobKzgCommitmentsRoot: []byte("blob_kzg_commitments_32_bytes!!"), BlobKzgCommitments: [][]byte{[]byte("blob_kzg_commitments_48_bytes_longer_than_needed")},
}, },
}, },
} }

View File

@@ -334,7 +334,7 @@ func (f *TextFormatter) printColored(b *bytes.Buffer, entry *logrus.Entry, keys
_, err = fmt.Fprintf(b, "%s %s%s "+messageFormat, colorScheme.TimestampColor(timestamp), level, prefix, message) _, err = fmt.Fprintf(b, "%s %s%s "+messageFormat, colorScheme.TimestampColor(timestamp), level, prefix, message)
} }
for _, k := range keys { for _, k := range keys {
if k != "package" { if k != "package" && k != "log_target" {
v := entry.Data[k] v := entry.Data[k]
format := "%+v" format := "%+v"

View File

@@ -11,17 +11,12 @@ Install `ethspecify` with the following command:
pipx install ethspecify pipx install ethspecify
``` ```
> [!NOTE]
> You can run `ethspecify <cmd>` in the `specrefs` directory or
> `ethspecify <cmd> --path=specrefs` from the project's root directory.
## Maintenance ## Maintenance
When adding support for a new specification version, follow these steps: When adding support for a new specification version, follow these steps:
0. Change directory into the `specrefs` directory.
1. Update the version in `.ethspecify.yml` configuration. 1. Update the version in `.ethspecify.yml` configuration.
2. Run `ethspecify process` to update/populate specrefs. 2. Run `ethspecify` to update/populate specrefs.
3. Run `ethspecify check` to check specrefs. 3. Run `ethspecify check` to check specrefs.
4. If there are errors, use the error message as a guide to fix the issue. If 4. If there are errors, use the error message as a guide to fix the issue. If
there are new specrefs with empty sources, implement/locate each item and there are new specrefs with empty sources, implement/locate each item and

View File

@@ -1,4 +1,4 @@
- name: AGGREGATE_DUE_BPS - name: AGGREGATE_DUE_BPS#phase0
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: AggregateDueBPS\s+primitives.BP search: AggregateDueBPS\s+primitives.BP
@@ -8,7 +8,14 @@
AGGREGATE_DUE_BPS: uint64 = 6667 AGGREGATE_DUE_BPS: uint64 = 6667
</spec> </spec>
- name: ALTAIR_FORK_EPOCH - name: AGGREGATE_DUE_BPS_GLOAS#gloas
sources: []
spec: |
<spec config_var="AGGREGATE_DUE_BPS_GLOAS" fork="gloas" hash="34aa3164">
AGGREGATE_DUE_BPS_GLOAS: uint64 = 5000
</spec>
- name: ALTAIR_FORK_EPOCH#altair
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: AltairForkEpoch\s+primitives.Epoch search: AltairForkEpoch\s+primitives.Epoch
@@ -18,7 +25,7 @@
ALTAIR_FORK_EPOCH: Epoch = 74240 ALTAIR_FORK_EPOCH: Epoch = 74240
</spec> </spec>
- name: ALTAIR_FORK_VERSION - name: ALTAIR_FORK_VERSION#altair
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: AltairForkVersion\s+\[]byte search: AltairForkVersion\s+\[]byte
@@ -28,7 +35,7 @@
ALTAIR_FORK_VERSION: Version = '0x01000000' ALTAIR_FORK_VERSION: Version = '0x01000000'
</spec> </spec>
- name: ATTESTATION_DUE_BPS - name: ATTESTATION_DUE_BPS#phase0
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: AttestationDueBPS\s+primitives.BP search: AttestationDueBPS\s+primitives.BP
@@ -38,7 +45,14 @@
ATTESTATION_DUE_BPS: uint64 = 3333 ATTESTATION_DUE_BPS: uint64 = 3333
</spec> </spec>
- name: ATTESTATION_PROPAGATION_SLOT_RANGE - name: ATTESTATION_DUE_BPS_GLOAS#gloas
sources: []
spec: |
<spec config_var="ATTESTATION_DUE_BPS_GLOAS" fork="gloas" hash="3863c1ef">
ATTESTATION_DUE_BPS_GLOAS: uint64 = 2500
</spec>
- name: ATTESTATION_PROPAGATION_SLOT_RANGE#phase0
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: AttestationPropagationSlotRange\s+primitives.Slot search: AttestationPropagationSlotRange\s+primitives.Slot
@@ -48,7 +62,7 @@
ATTESTATION_PROPAGATION_SLOT_RANGE = 32 ATTESTATION_PROPAGATION_SLOT_RANGE = 32
</spec> </spec>
- name: ATTESTATION_SUBNET_COUNT - name: ATTESTATION_SUBNET_COUNT#phase0
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: AttestationSubnetCount\s+uint64 search: AttestationSubnetCount\s+uint64
@@ -58,7 +72,7 @@
ATTESTATION_SUBNET_COUNT = 64 ATTESTATION_SUBNET_COUNT = 64
</spec> </spec>
- name: ATTESTATION_SUBNET_EXTRA_BITS - name: ATTESTATION_SUBNET_EXTRA_BITS#phase0
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: AttestationSubnetExtraBits\s+uint64 search: AttestationSubnetExtraBits\s+uint64
@@ -68,7 +82,7 @@
ATTESTATION_SUBNET_EXTRA_BITS = 0 ATTESTATION_SUBNET_EXTRA_BITS = 0
</spec> </spec>
- name: ATTESTATION_SUBNET_PREFIX_BITS - name: ATTESTATION_SUBNET_PREFIX_BITS#phase0
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: AttestationSubnetPrefixBits\s+uint64 search: AttestationSubnetPrefixBits\s+uint64
@@ -78,7 +92,7 @@
ATTESTATION_SUBNET_PREFIX_BITS: int = 6 ATTESTATION_SUBNET_PREFIX_BITS: int = 6
</spec> </spec>
- name: BALANCE_PER_ADDITIONAL_CUSTODY_GROUP - name: BALANCE_PER_ADDITIONAL_CUSTODY_GROUP#fulu
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: BalancePerAdditionalCustodyGroup\s+uint64 search: BalancePerAdditionalCustodyGroup\s+uint64
@@ -88,7 +102,7 @@
BALANCE_PER_ADDITIONAL_CUSTODY_GROUP: Gwei = 32000000000 BALANCE_PER_ADDITIONAL_CUSTODY_GROUP: Gwei = 32000000000
</spec> </spec>
- name: BELLATRIX_FORK_EPOCH - name: BELLATRIX_FORK_EPOCH#bellatrix
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: BellatrixForkEpoch\s+primitives.Epoch search: BellatrixForkEpoch\s+primitives.Epoch
@@ -98,7 +112,7 @@
BELLATRIX_FORK_EPOCH: Epoch = 144896 BELLATRIX_FORK_EPOCH: Epoch = 144896
</spec> </spec>
- name: BELLATRIX_FORK_VERSION - name: BELLATRIX_FORK_VERSION#bellatrix
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: BellatrixForkVersion\s+\[]byte search: BellatrixForkVersion\s+\[]byte
@@ -108,7 +122,7 @@
BELLATRIX_FORK_VERSION: Version = '0x02000000' BELLATRIX_FORK_VERSION: Version = '0x02000000'
</spec> </spec>
- name: BLOB_SCHEDULE - name: BLOB_SCHEDULE#fulu
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: BlobSchedule\s+\[]BlobScheduleEntry search: BlobSchedule\s+\[]BlobScheduleEntry
@@ -127,7 +141,7 @@
) )
</spec> </spec>
- name: BLOB_SIDECAR_SUBNET_COUNT - name: BLOB_SIDECAR_SUBNET_COUNT#deneb
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: BlobsidecarSubnetCount\s+uint64 search: BlobsidecarSubnetCount\s+uint64
@@ -137,7 +151,7 @@
BLOB_SIDECAR_SUBNET_COUNT = 6 BLOB_SIDECAR_SUBNET_COUNT = 6
</spec> </spec>
- name: BLOB_SIDECAR_SUBNET_COUNT_ELECTRA - name: BLOB_SIDECAR_SUBNET_COUNT_ELECTRA#electra
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: BlobsidecarSubnetCountElectra\s+uint64 search: BlobsidecarSubnetCountElectra\s+uint64
@@ -147,7 +161,7 @@
BLOB_SIDECAR_SUBNET_COUNT_ELECTRA = 9 BLOB_SIDECAR_SUBNET_COUNT_ELECTRA = 9
</spec> </spec>
- name: CAPELLA_FORK_EPOCH - name: CAPELLA_FORK_EPOCH#capella
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: CapellaForkEpoch\s+primitives.Epoch search: CapellaForkEpoch\s+primitives.Epoch
@@ -157,7 +171,7 @@
CAPELLA_FORK_EPOCH: Epoch = 194048 CAPELLA_FORK_EPOCH: Epoch = 194048
</spec> </spec>
- name: CAPELLA_FORK_VERSION - name: CAPELLA_FORK_VERSION#capella
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: CapellaForkVersion\s+\[]byte search: CapellaForkVersion\s+\[]byte
@@ -167,7 +181,7 @@
CAPELLA_FORK_VERSION: Version = '0x03000000' CAPELLA_FORK_VERSION: Version = '0x03000000'
</spec> </spec>
- name: CHURN_LIMIT_QUOTIENT - name: CHURN_LIMIT_QUOTIENT#phase0
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: ChurnLimitQuotient\s+uint64 search: ChurnLimitQuotient\s+uint64
@@ -177,7 +191,7 @@
CHURN_LIMIT_QUOTIENT: uint64 = 65536 CHURN_LIMIT_QUOTIENT: uint64 = 65536
</spec> </spec>
- name: CONTRIBUTION_DUE_BPS - name: CONTRIBUTION_DUE_BPS#altair
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: ContributionDueBPS\s+primitives.BP search: ContributionDueBPS\s+primitives.BP
@@ -187,7 +201,14 @@
CONTRIBUTION_DUE_BPS: uint64 = 6667 CONTRIBUTION_DUE_BPS: uint64 = 6667
</spec> </spec>
- name: CUSTODY_REQUIREMENT - name: CONTRIBUTION_DUE_BPS_GLOAS#gloas
sources: []
spec: |
<spec config_var="CONTRIBUTION_DUE_BPS_GLOAS" fork="gloas" hash="0ead2ac1">
CONTRIBUTION_DUE_BPS_GLOAS: uint64 = 5000
</spec>
- name: CUSTODY_REQUIREMENT#fulu
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: CustodyRequirement\s+uint64.*yaml:"CUSTODY_REQUIREMENT" search: CustodyRequirement\s+uint64.*yaml:"CUSTODY_REQUIREMENT"
@@ -197,7 +218,7 @@
CUSTODY_REQUIREMENT = 4 CUSTODY_REQUIREMENT = 4
</spec> </spec>
- name: DATA_COLUMN_SIDECAR_SUBNET_COUNT - name: DATA_COLUMN_SIDECAR_SUBNET_COUNT#fulu
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: DataColumnSidecarSubnetCount\s+uint64 search: DataColumnSidecarSubnetCount\s+uint64
@@ -207,7 +228,7 @@
DATA_COLUMN_SIDECAR_SUBNET_COUNT = 128 DATA_COLUMN_SIDECAR_SUBNET_COUNT = 128
</spec> </spec>
- name: DENEB_FORK_EPOCH - name: DENEB_FORK_EPOCH#deneb
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: DenebForkEpoch\s+primitives.Epoch search: DenebForkEpoch\s+primitives.Epoch
@@ -217,7 +238,7 @@
DENEB_FORK_EPOCH: Epoch = 269568 DENEB_FORK_EPOCH: Epoch = 269568
</spec> </spec>
- name: DENEB_FORK_VERSION - name: DENEB_FORK_VERSION#deneb
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: DenebForkVersion\s+\[]byte search: DenebForkVersion\s+\[]byte
@@ -227,7 +248,7 @@
DENEB_FORK_VERSION: Version = '0x04000000' DENEB_FORK_VERSION: Version = '0x04000000'
</spec> </spec>
- name: EJECTION_BALANCE - name: EJECTION_BALANCE#phase0
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: EjectionBalance\s+uint64 search: EjectionBalance\s+uint64
@@ -237,7 +258,7 @@
EJECTION_BALANCE: Gwei = 16000000000 EJECTION_BALANCE: Gwei = 16000000000
</spec> </spec>
- name: ELECTRA_FORK_EPOCH - name: ELECTRA_FORK_EPOCH#electra
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: ElectraForkEpoch\s+primitives.Epoch search: ElectraForkEpoch\s+primitives.Epoch
@@ -247,7 +268,7 @@
ELECTRA_FORK_EPOCH: Epoch = 364032 ELECTRA_FORK_EPOCH: Epoch = 364032
</spec> </spec>
- name: ELECTRA_FORK_VERSION - name: ELECTRA_FORK_VERSION#electra
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: ElectraForkVersion\s+\[]byte search: ElectraForkVersion\s+\[]byte
@@ -257,7 +278,7 @@
ELECTRA_FORK_VERSION: Version = '0x05000000' ELECTRA_FORK_VERSION: Version = '0x05000000'
</spec> </spec>
- name: EPOCHS_PER_SUBNET_SUBSCRIPTION - name: EPOCHS_PER_SUBNET_SUBSCRIPTION#phase0
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: EpochsPerSubnetSubscription\s+uint64 search: EpochsPerSubnetSubscription\s+uint64
@@ -267,7 +288,7 @@
EPOCHS_PER_SUBNET_SUBSCRIPTION = 256 EPOCHS_PER_SUBNET_SUBSCRIPTION = 256
</spec> </spec>
- name: ETH1_FOLLOW_DISTANCE - name: ETH1_FOLLOW_DISTANCE#phase0
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: Eth1FollowDistance\s+uint64 search: Eth1FollowDistance\s+uint64
@@ -277,7 +298,7 @@
ETH1_FOLLOW_DISTANCE: uint64 = 2048 ETH1_FOLLOW_DISTANCE: uint64 = 2048
</spec> </spec>
- name: FULU_FORK_EPOCH - name: FULU_FORK_EPOCH#fulu
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: FuluForkEpoch\s+primitives.Epoch search: FuluForkEpoch\s+primitives.Epoch
@@ -287,7 +308,7 @@
FULU_FORK_EPOCH: Epoch = 411392 FULU_FORK_EPOCH: Epoch = 411392
</spec> </spec>
- name: FULU_FORK_VERSION - name: FULU_FORK_VERSION#fulu
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: FuluForkVersion\s+\[]byte search: FuluForkVersion\s+\[]byte
@@ -297,7 +318,7 @@
FULU_FORK_VERSION: Version = '0x06000000' FULU_FORK_VERSION: Version = '0x06000000'
</spec> </spec>
- name: GENESIS_DELAY - name: GENESIS_DELAY#phase0
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: GenesisDelay\s+uint64 search: GenesisDelay\s+uint64
@@ -307,7 +328,7 @@
GENESIS_DELAY: uint64 = 604800 GENESIS_DELAY: uint64 = 604800
</spec> </spec>
- name: GENESIS_FORK_VERSION - name: GENESIS_FORK_VERSION#phase0
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: GenesisForkVersion\s+\[]byte search: GenesisForkVersion\s+\[]byte
@@ -317,7 +338,21 @@
GENESIS_FORK_VERSION: Version = '0x00000000' GENESIS_FORK_VERSION: Version = '0x00000000'
</spec> </spec>
- name: INACTIVITY_SCORE_BIAS - name: GLOAS_FORK_EPOCH#gloas
sources: []
spec: |
<spec config_var="GLOAS_FORK_EPOCH" fork="gloas" hash="c25152cf">
GLOAS_FORK_EPOCH: Epoch = 18446744073709551615
</spec>
- name: GLOAS_FORK_VERSION#gloas
sources: []
spec: |
<spec config_var="GLOAS_FORK_VERSION" fork="gloas" hash="c1c5c007">
GLOAS_FORK_VERSION: Version = '0x07000000'
</spec>
- name: INACTIVITY_SCORE_BIAS#altair
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: InactivityScoreBias\s+uint64 search: InactivityScoreBias\s+uint64
@@ -327,7 +362,7 @@
INACTIVITY_SCORE_BIAS: uint64 = 4 INACTIVITY_SCORE_BIAS: uint64 = 4
</spec> </spec>
- name: INACTIVITY_SCORE_RECOVERY_RATE - name: INACTIVITY_SCORE_RECOVERY_RATE#altair
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: InactivityScoreRecoveryRate\s+uint64 search: InactivityScoreRecoveryRate\s+uint64
@@ -337,7 +372,7 @@
INACTIVITY_SCORE_RECOVERY_RATE: uint64 = 16 INACTIVITY_SCORE_RECOVERY_RATE: uint64 = 16
</spec> </spec>
- name: MAXIMUM_GOSSIP_CLOCK_DISPARITY - name: MAXIMUM_GOSSIP_CLOCK_DISPARITY#phase0
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: MaximumGossipClockDisparity\s+uint64 search: MaximumGossipClockDisparity\s+uint64
@@ -347,7 +382,7 @@
MAXIMUM_GOSSIP_CLOCK_DISPARITY = 500 MAXIMUM_GOSSIP_CLOCK_DISPARITY = 500
</spec> </spec>
- name: MAX_BLOBS_PER_BLOCK - name: MAX_BLOBS_PER_BLOCK#deneb
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: DeprecatedMaxBlobsPerBlock\s+int search: DeprecatedMaxBlobsPerBlock\s+int
@@ -357,7 +392,7 @@
MAX_BLOBS_PER_BLOCK: uint64 = 6 MAX_BLOBS_PER_BLOCK: uint64 = 6
</spec> </spec>
- name: MAX_BLOBS_PER_BLOCK_ELECTRA - name: MAX_BLOBS_PER_BLOCK_ELECTRA#electra
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: DeprecatedMaxBlobsPerBlockElectra\s+int search: DeprecatedMaxBlobsPerBlockElectra\s+int
@@ -367,7 +402,7 @@
MAX_BLOBS_PER_BLOCK_ELECTRA: uint64 = 9 MAX_BLOBS_PER_BLOCK_ELECTRA: uint64 = 9
</spec> </spec>
- name: MAX_PAYLOAD_SIZE - name: MAX_PAYLOAD_SIZE#phase0
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: MaxPayloadSize\s+uint64 search: MaxPayloadSize\s+uint64
@@ -377,7 +412,7 @@
MAX_PAYLOAD_SIZE = 10485760 MAX_PAYLOAD_SIZE = 10485760
</spec> </spec>
- name: MAX_PER_EPOCH_ACTIVATION_CHURN_LIMIT - name: MAX_PER_EPOCH_ACTIVATION_CHURN_LIMIT#deneb
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: MaxPerEpochActivationChurnLimit\s+uint64 search: MaxPerEpochActivationChurnLimit\s+uint64
@@ -387,7 +422,7 @@
MAX_PER_EPOCH_ACTIVATION_CHURN_LIMIT: uint64 = 8 MAX_PER_EPOCH_ACTIVATION_CHURN_LIMIT: uint64 = 8
</spec> </spec>
- name: MAX_PER_EPOCH_ACTIVATION_EXIT_CHURN_LIMIT - name: MAX_PER_EPOCH_ACTIVATION_EXIT_CHURN_LIMIT#electra
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: MaxPerEpochActivationExitChurnLimit\s+uint64 search: MaxPerEpochActivationExitChurnLimit\s+uint64
@@ -397,7 +432,7 @@
MAX_PER_EPOCH_ACTIVATION_EXIT_CHURN_LIMIT: Gwei = 256000000000 MAX_PER_EPOCH_ACTIVATION_EXIT_CHURN_LIMIT: Gwei = 256000000000
</spec> </spec>
- name: MAX_REQUEST_BLOB_SIDECARS - name: MAX_REQUEST_BLOB_SIDECARS#deneb
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: MaxRequestBlobSidecars\s+uint64 search: MaxRequestBlobSidecars\s+uint64
@@ -407,7 +442,7 @@
MAX_REQUEST_BLOB_SIDECARS = 768 MAX_REQUEST_BLOB_SIDECARS = 768
</spec> </spec>
- name: MAX_REQUEST_BLOB_SIDECARS_ELECTRA - name: MAX_REQUEST_BLOB_SIDECARS_ELECTRA#electra
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: MaxRequestBlobSidecarsElectra\s+uint64 search: MaxRequestBlobSidecarsElectra\s+uint64
@@ -417,7 +452,7 @@
MAX_REQUEST_BLOB_SIDECARS_ELECTRA = 1152 MAX_REQUEST_BLOB_SIDECARS_ELECTRA = 1152
</spec> </spec>
- name: MAX_REQUEST_BLOCKS - name: MAX_REQUEST_BLOCKS#phase0
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: MaxRequestBlocks\s+uint64 search: MaxRequestBlocks\s+uint64
@@ -427,7 +462,7 @@
MAX_REQUEST_BLOCKS = 1024 MAX_REQUEST_BLOCKS = 1024
</spec> </spec>
- name: MAX_REQUEST_BLOCKS_DENEB - name: MAX_REQUEST_BLOCKS_DENEB#deneb
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: MaxRequestBlocksDeneb\s+uint64 search: MaxRequestBlocksDeneb\s+uint64
@@ -437,7 +472,7 @@
MAX_REQUEST_BLOCKS_DENEB = 128 MAX_REQUEST_BLOCKS_DENEB = 128
</spec> </spec>
- name: MAX_REQUEST_DATA_COLUMN_SIDECARS - name: MAX_REQUEST_DATA_COLUMN_SIDECARS#fulu
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: MaxRequestDataColumnSidecars\s+uint64 search: MaxRequestDataColumnSidecars\s+uint64
@@ -447,7 +482,14 @@
MAX_REQUEST_DATA_COLUMN_SIDECARS = 16384 MAX_REQUEST_DATA_COLUMN_SIDECARS = 16384
</spec> </spec>
- name: MESSAGE_DOMAIN_INVALID_SNAPPY - name: MAX_REQUEST_PAYLOADS#gloas
sources: []
spec: |
<spec config_var="MAX_REQUEST_PAYLOADS" fork="gloas" hash="23399ee5">
MAX_REQUEST_PAYLOADS = 128
</spec>
- name: MESSAGE_DOMAIN_INVALID_SNAPPY#phase0
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: MessageDomainInvalidSnappy\s+\[4\]byte search: MessageDomainInvalidSnappy\s+\[4\]byte
@@ -457,7 +499,7 @@
MESSAGE_DOMAIN_INVALID_SNAPPY: DomainType = '0x00000000' MESSAGE_DOMAIN_INVALID_SNAPPY: DomainType = '0x00000000'
</spec> </spec>
- name: MESSAGE_DOMAIN_VALID_SNAPPY - name: MESSAGE_DOMAIN_VALID_SNAPPY#phase0
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: MessageDomainValidSnappy\s+\[4\]byte search: MessageDomainValidSnappy\s+\[4\]byte
@@ -467,7 +509,14 @@
MESSAGE_DOMAIN_VALID_SNAPPY: DomainType = '0x01000000' MESSAGE_DOMAIN_VALID_SNAPPY: DomainType = '0x01000000'
</spec> </spec>
- name: MIN_EPOCHS_FOR_BLOB_SIDECARS_REQUESTS - name: MIN_BUILDER_WITHDRAWABILITY_DELAY#gloas
sources: []
spec: |
<spec config_var="MIN_BUILDER_WITHDRAWABILITY_DELAY" fork="gloas" hash="be7f8473">
MIN_BUILDER_WITHDRAWABILITY_DELAY: uint64 = 64
</spec>
- name: MIN_EPOCHS_FOR_BLOB_SIDECARS_REQUESTS#deneb
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: MinEpochsForBlobsSidecarsRequest\s+primitives.Epoch search: MinEpochsForBlobsSidecarsRequest\s+primitives.Epoch
@@ -477,7 +526,7 @@
MIN_EPOCHS_FOR_BLOB_SIDECARS_REQUESTS = 4096 MIN_EPOCHS_FOR_BLOB_SIDECARS_REQUESTS = 4096
</spec> </spec>
- name: MIN_EPOCHS_FOR_BLOCK_REQUESTS - name: MIN_EPOCHS_FOR_BLOCK_REQUESTS#phase0
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: MinEpochsForBlockRequests\s+uint64 search: MinEpochsForBlockRequests\s+uint64
@@ -487,7 +536,7 @@
MIN_EPOCHS_FOR_BLOCK_REQUESTS = 33024 MIN_EPOCHS_FOR_BLOCK_REQUESTS = 33024
</spec> </spec>
- name: MIN_EPOCHS_FOR_DATA_COLUMN_SIDECARS_REQUESTS - name: MIN_EPOCHS_FOR_DATA_COLUMN_SIDECARS_REQUESTS#fulu
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: MinEpochsForDataColumnSidecarsRequest\s+primitives.Epoch search: MinEpochsForDataColumnSidecarsRequest\s+primitives.Epoch
@@ -497,7 +546,7 @@
MIN_EPOCHS_FOR_DATA_COLUMN_SIDECARS_REQUESTS = 4096 MIN_EPOCHS_FOR_DATA_COLUMN_SIDECARS_REQUESTS = 4096
</spec> </spec>
- name: MIN_GENESIS_ACTIVE_VALIDATOR_COUNT - name: MIN_GENESIS_ACTIVE_VALIDATOR_COUNT#phase0
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: MinGenesisActiveValidatorCount\s+uint64 search: MinGenesisActiveValidatorCount\s+uint64
@@ -507,7 +556,7 @@
MIN_GENESIS_ACTIVE_VALIDATOR_COUNT: uint64 = 16384 MIN_GENESIS_ACTIVE_VALIDATOR_COUNT: uint64 = 16384
</spec> </spec>
- name: MIN_GENESIS_TIME - name: MIN_GENESIS_TIME#phase0
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: MinGenesisTime\s+uint64 search: MinGenesisTime\s+uint64
@@ -517,7 +566,7 @@
MIN_GENESIS_TIME: uint64 = 1606824000 MIN_GENESIS_TIME: uint64 = 1606824000
</spec> </spec>
- name: MIN_PER_EPOCH_CHURN_LIMIT - name: MIN_PER_EPOCH_CHURN_LIMIT#phase0
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: MinPerEpochChurnLimit\s+uint64 search: MinPerEpochChurnLimit\s+uint64
@@ -527,7 +576,7 @@
MIN_PER_EPOCH_CHURN_LIMIT: uint64 = 4 MIN_PER_EPOCH_CHURN_LIMIT: uint64 = 4
</spec> </spec>
- name: MIN_PER_EPOCH_CHURN_LIMIT_ELECTRA - name: MIN_PER_EPOCH_CHURN_LIMIT_ELECTRA#electra
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: MinPerEpochChurnLimitElectra\s+uint64 search: MinPerEpochChurnLimitElectra\s+uint64
@@ -537,7 +586,7 @@
MIN_PER_EPOCH_CHURN_LIMIT_ELECTRA: Gwei = 128000000000 MIN_PER_EPOCH_CHURN_LIMIT_ELECTRA: Gwei = 128000000000
</spec> </spec>
- name: MIN_VALIDATOR_WITHDRAWABILITY_DELAY - name: MIN_VALIDATOR_WITHDRAWABILITY_DELAY#phase0
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: MinValidatorWithdrawabilityDelay\s+primitives.Epoch search: MinValidatorWithdrawabilityDelay\s+primitives.Epoch
@@ -547,7 +596,7 @@
MIN_VALIDATOR_WITHDRAWABILITY_DELAY: uint64 = 256 MIN_VALIDATOR_WITHDRAWABILITY_DELAY: uint64 = 256
</spec> </spec>
- name: NUMBER_OF_CUSTODY_GROUPS - name: NUMBER_OF_CUSTODY_GROUPS#fulu
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: NumberOfCustodyGroups\s+uint64 search: NumberOfCustodyGroups\s+uint64
@@ -557,7 +606,14 @@
NUMBER_OF_CUSTODY_GROUPS = 128 NUMBER_OF_CUSTODY_GROUPS = 128
</spec> </spec>
- name: PROPOSER_REORG_CUTOFF_BPS - name: PAYLOAD_ATTESTATION_DUE_BPS#gloas
sources: []
spec: |
<spec config_var="PAYLOAD_ATTESTATION_DUE_BPS" fork="gloas" hash="17307d0e">
PAYLOAD_ATTESTATION_DUE_BPS: uint64 = 7500
</spec>
- name: PROPOSER_REORG_CUTOFF_BPS#phase0
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: ProposerReorgCutoffBPS\s+primitives.BP search: ProposerReorgCutoffBPS\s+primitives.BP
@@ -567,7 +623,7 @@
PROPOSER_REORG_CUTOFF_BPS: uint64 = 1667 PROPOSER_REORG_CUTOFF_BPS: uint64 = 1667
</spec> </spec>
- name: PROPOSER_SCORE_BOOST - name: PROPOSER_SCORE_BOOST#phase0
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: ProposerScoreBoost\s+uint64 search: ProposerScoreBoost\s+uint64
@@ -577,7 +633,7 @@
PROPOSER_SCORE_BOOST: uint64 = 40 PROPOSER_SCORE_BOOST: uint64 = 40
</spec> </spec>
- name: REORG_HEAD_WEIGHT_THRESHOLD - name: REORG_HEAD_WEIGHT_THRESHOLD#phase0
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: ReorgHeadWeightThreshold\s+uint64 search: ReorgHeadWeightThreshold\s+uint64
@@ -587,7 +643,7 @@
REORG_HEAD_WEIGHT_THRESHOLD: uint64 = 20 REORG_HEAD_WEIGHT_THRESHOLD: uint64 = 20
</spec> </spec>
- name: REORG_MAX_EPOCHS_SINCE_FINALIZATION - name: REORG_MAX_EPOCHS_SINCE_FINALIZATION#phase0
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: ReorgMaxEpochsSinceFinalization\s+primitives.Epoch search: ReorgMaxEpochsSinceFinalization\s+primitives.Epoch
@@ -597,7 +653,7 @@
REORG_MAX_EPOCHS_SINCE_FINALIZATION: Epoch = 2 REORG_MAX_EPOCHS_SINCE_FINALIZATION: Epoch = 2
</spec> </spec>
- name: REORG_PARENT_WEIGHT_THRESHOLD - name: REORG_PARENT_WEIGHT_THRESHOLD#phase0
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: ReorgParentWeightThreshold\s+uint64 search: ReorgParentWeightThreshold\s+uint64
@@ -607,7 +663,7 @@
REORG_PARENT_WEIGHT_THRESHOLD: uint64 = 160 REORG_PARENT_WEIGHT_THRESHOLD: uint64 = 160
</spec> </spec>
- name: SAMPLES_PER_SLOT - name: SAMPLES_PER_SLOT#fulu
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: SamplesPerSlot\s+uint64 search: SamplesPerSlot\s+uint64
@@ -617,7 +673,7 @@
SAMPLES_PER_SLOT = 8 SAMPLES_PER_SLOT = 8
</spec> </spec>
- name: SECONDS_PER_ETH1_BLOCK - name: SECONDS_PER_ETH1_BLOCK#phase0
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: SecondsPerETH1Block\s+uint64 search: SecondsPerETH1Block\s+uint64
@@ -627,7 +683,7 @@
SECONDS_PER_ETH1_BLOCK: uint64 = 14 SECONDS_PER_ETH1_BLOCK: uint64 = 14
</spec> </spec>
- name: SECONDS_PER_SLOT - name: SECONDS_PER_SLOT#phase0
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: SecondsPerSlot\s+uint64 search: SecondsPerSlot\s+uint64
@@ -637,7 +693,7 @@
SECONDS_PER_SLOT: uint64 = 12 SECONDS_PER_SLOT: uint64 = 12
</spec> </spec>
- name: SHARD_COMMITTEE_PERIOD - name: SHARD_COMMITTEE_PERIOD#phase0
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: ShardCommitteePeriod\s+primitives.Epoch search: ShardCommitteePeriod\s+primitives.Epoch
@@ -647,7 +703,7 @@
SHARD_COMMITTEE_PERIOD: uint64 = 256 SHARD_COMMITTEE_PERIOD: uint64 = 256
</spec> </spec>
- name: SLOT_DURATION_MS - name: SLOT_DURATION_MS#phase0
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: SlotDurationMilliseconds\s+uint64 search: SlotDurationMilliseconds\s+uint64
@@ -657,7 +713,7 @@
SLOT_DURATION_MS: uint64 = 12000 SLOT_DURATION_MS: uint64 = 12000
</spec> </spec>
- name: SUBNETS_PER_NODE - name: SUBNETS_PER_NODE#phase0
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: SubnetsPerNode\s+uint64 search: SubnetsPerNode\s+uint64
@@ -667,7 +723,7 @@
SUBNETS_PER_NODE = 2 SUBNETS_PER_NODE = 2
</spec> </spec>
- name: SYNC_MESSAGE_DUE_BPS - name: SYNC_MESSAGE_DUE_BPS#altair
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: SyncMessageDueBPS\s+primitives.BP search: SyncMessageDueBPS\s+primitives.BP
@@ -677,7 +733,14 @@
SYNC_MESSAGE_DUE_BPS: uint64 = 3333 SYNC_MESSAGE_DUE_BPS: uint64 = 3333
</spec> </spec>
- name: TERMINAL_BLOCK_HASH - name: SYNC_MESSAGE_DUE_BPS_GLOAS#gloas
sources: []
spec: |
<spec config_var="SYNC_MESSAGE_DUE_BPS_GLOAS" fork="gloas" hash="47f14d95">
SYNC_MESSAGE_DUE_BPS_GLOAS: uint64 = 2500
</spec>
- name: TERMINAL_BLOCK_HASH#bellatrix
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: TerminalBlockHash\s+common.Hash search: TerminalBlockHash\s+common.Hash
@@ -687,7 +750,7 @@
TERMINAL_BLOCK_HASH: Hash32 = '0x0000000000000000000000000000000000000000000000000000000000000000' TERMINAL_BLOCK_HASH: Hash32 = '0x0000000000000000000000000000000000000000000000000000000000000000'
</spec> </spec>
- name: TERMINAL_BLOCK_HASH_ACTIVATION_EPOCH - name: TERMINAL_BLOCK_HASH_ACTIVATION_EPOCH#bellatrix
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: TerminalBlockHashActivationEpoch\s+primitives.Epoch search: TerminalBlockHashActivationEpoch\s+primitives.Epoch
@@ -697,7 +760,7 @@
TERMINAL_BLOCK_HASH_ACTIVATION_EPOCH = 18446744073709551615 TERMINAL_BLOCK_HASH_ACTIVATION_EPOCH = 18446744073709551615
</spec> </spec>
- name: TERMINAL_TOTAL_DIFFICULTY - name: TERMINAL_TOTAL_DIFFICULTY#bellatrix
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: TerminalTotalDifficulty\s+string search: TerminalTotalDifficulty\s+string
@@ -707,7 +770,7 @@
TERMINAL_TOTAL_DIFFICULTY = 58750000000000000000000 TERMINAL_TOTAL_DIFFICULTY = 58750000000000000000000
</spec> </spec>
- name: VALIDATOR_CUSTODY_REQUIREMENT - name: VALIDATOR_CUSTODY_REQUIREMENT#fulu
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: ValidatorCustodyRequirement\s+uint64 search: ValidatorCustodyRequirement\s+uint64

File diff suppressed because one or more lines are too long

View File

@@ -50,7 +50,7 @@
committee_bits: Bitvector[MAX_COMMITTEES_PER_SLOT] committee_bits: Bitvector[MAX_COMMITTEES_PER_SLOT]
</spec> </spec>
- name: AttestationData - name: AttestationData#phase0
sources: sources:
- file: proto/eth/v1/attestation.proto - file: proto/eth/v1/attestation.proto
search: message AttestationData { search: message AttestationData {
@@ -88,7 +88,7 @@
attestation_2: IndexedAttestation attestation_2: IndexedAttestation
</spec> </spec>
- name: BLSToExecutionChange - name: BLSToExecutionChange#capella
sources: sources:
- file: proto/prysm/v1alpha1/withdrawals.proto - file: proto/prysm/v1alpha1/withdrawals.proto
search: message BLSToExecutionChange { search: message BLSToExecutionChange {
@@ -100,7 +100,7 @@
to_execution_address: ExecutionAddress to_execution_address: ExecutionAddress
</spec> </spec>
- name: BeaconBlock - name: BeaconBlock#phase0
sources: sources:
- file: proto/eth/v1/beacon_block.proto - file: proto/eth/v1/beacon_block.proto
search: message BeaconBlock { search: message BeaconBlock {
@@ -239,7 +239,34 @@
execution_requests: ExecutionRequests execution_requests: ExecutionRequests
</spec> </spec>
- name: BeaconBlockHeader - name: BeaconBlockBody#gloas
sources: []
spec: |
<spec ssz_object="BeaconBlockBody" fork="gloas" hash="7e472a77">
class BeaconBlockBody(Container):
randao_reveal: BLSSignature
eth1_data: Eth1Data
graffiti: Bytes32
proposer_slashings: List[ProposerSlashing, MAX_PROPOSER_SLASHINGS]
attester_slashings: List[AttesterSlashing, MAX_ATTESTER_SLASHINGS_ELECTRA]
attestations: List[Attestation, MAX_ATTESTATIONS_ELECTRA]
deposits: List[Deposit, MAX_DEPOSITS]
voluntary_exits: List[SignedVoluntaryExit, MAX_VOLUNTARY_EXITS]
sync_aggregate: SyncAggregate
# [Modified in Gloas:EIP7732]
# Removed `execution_payload`
bls_to_execution_changes: List[SignedBLSToExecutionChange, MAX_BLS_TO_EXECUTION_CHANGES]
# [Modified in Gloas:EIP7732]
# Removed `blob_kzg_commitments`
# [Modified in Gloas:EIP7732]
# Removed `execution_requests`
# [New in Gloas:EIP7732]
signed_execution_payload_bid: SignedExecutionPayloadBid
# [New in Gloas:EIP7732]
payload_attestations: List[PayloadAttestation, MAX_PAYLOAD_ATTESTATIONS]
</spec>
- name: BeaconBlockHeader#phase0
sources: sources:
- file: proto/eth/v1/beacon_block.proto - file: proto/eth/v1/beacon_block.proto
search: message BeaconBlockHeader { search: message BeaconBlockHeader {
@@ -538,7 +565,69 @@
proposer_lookahead: Vector[ValidatorIndex, (MIN_SEED_LOOKAHEAD + 1) * SLOTS_PER_EPOCH] proposer_lookahead: Vector[ValidatorIndex, (MIN_SEED_LOOKAHEAD + 1) * SLOTS_PER_EPOCH]
</spec> </spec>
- name: BlobIdentifier - name: BeaconState#gloas
sources: []
spec: |
<spec ssz_object="BeaconState" fork="gloas" hash="c33b0db2">
class BeaconState(Container):
genesis_time: uint64
genesis_validators_root: Root
slot: Slot
fork: Fork
latest_block_header: BeaconBlockHeader
block_roots: Vector[Root, SLOTS_PER_HISTORICAL_ROOT]
state_roots: Vector[Root, SLOTS_PER_HISTORICAL_ROOT]
historical_roots: List[Root, HISTORICAL_ROOTS_LIMIT]
eth1_data: Eth1Data
eth1_data_votes: List[Eth1Data, EPOCHS_PER_ETH1_VOTING_PERIOD * SLOTS_PER_EPOCH]
eth1_deposit_index: uint64
validators: List[Validator, VALIDATOR_REGISTRY_LIMIT]
balances: List[Gwei, VALIDATOR_REGISTRY_LIMIT]
randao_mixes: Vector[Bytes32, EPOCHS_PER_HISTORICAL_VECTOR]
slashings: Vector[Gwei, EPOCHS_PER_SLASHINGS_VECTOR]
previous_epoch_participation: List[ParticipationFlags, VALIDATOR_REGISTRY_LIMIT]
current_epoch_participation: List[ParticipationFlags, VALIDATOR_REGISTRY_LIMIT]
justification_bits: Bitvector[JUSTIFICATION_BITS_LENGTH]
previous_justified_checkpoint: Checkpoint
current_justified_checkpoint: Checkpoint
finalized_checkpoint: Checkpoint
inactivity_scores: List[uint64, VALIDATOR_REGISTRY_LIMIT]
current_sync_committee: SyncCommittee
next_sync_committee: SyncCommittee
# [Modified in Gloas:EIP7732]
# Removed `latest_execution_payload_header`
# [New in Gloas:EIP7732]
latest_execution_payload_bid: ExecutionPayloadBid
next_withdrawal_index: WithdrawalIndex
next_withdrawal_validator_index: ValidatorIndex
historical_summaries: List[HistoricalSummary, HISTORICAL_ROOTS_LIMIT]
deposit_requests_start_index: uint64
deposit_balance_to_consume: Gwei
exit_balance_to_consume: Gwei
earliest_exit_epoch: Epoch
consolidation_balance_to_consume: Gwei
earliest_consolidation_epoch: Epoch
pending_deposits: List[PendingDeposit, PENDING_DEPOSITS_LIMIT]
pending_partial_withdrawals: List[PendingPartialWithdrawal, PENDING_PARTIAL_WITHDRAWALS_LIMIT]
pending_consolidations: List[PendingConsolidation, PENDING_CONSOLIDATIONS_LIMIT]
proposer_lookahead: Vector[ValidatorIndex, (MIN_SEED_LOOKAHEAD + 1) * SLOTS_PER_EPOCH]
# [New in Gloas:EIP7732]
builders: List[Builder, BUILDER_REGISTRY_LIMIT]
# [New in Gloas:EIP7732]
next_withdrawal_builder_index: BuilderIndex
# [New in Gloas:EIP7732]
execution_payload_availability: Bitvector[SLOTS_PER_HISTORICAL_ROOT]
# [New in Gloas:EIP7732]
builder_pending_payments: Vector[BuilderPendingPayment, 2 * SLOTS_PER_EPOCH]
# [New in Gloas:EIP7732]
builder_pending_withdrawals: List[BuilderPendingWithdrawal, BUILDER_PENDING_WITHDRAWALS_LIMIT]
# [New in Gloas:EIP7732]
latest_block_hash: Hash32
# [New in Gloas:EIP7732]
payload_expected_withdrawals: List[Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD]
</spec>
- name: BlobIdentifier#deneb
sources: sources:
- file: proto/prysm/v1alpha1/blobs.proto - file: proto/prysm/v1alpha1/blobs.proto
search: message BlobIdentifier { search: message BlobIdentifier {
@@ -549,7 +638,7 @@
index: BlobIndex index: BlobIndex
</spec> </spec>
- name: BlobSidecar - name: BlobSidecar#deneb
sources: sources:
- file: proto/prysm/v1alpha1/beacon_block.proto - file: proto/prysm/v1alpha1/beacon_block.proto
search: message BlobSidecar { search: message BlobSidecar {
@@ -564,7 +653,39 @@
kzg_commitment_inclusion_proof: Vector[Bytes32, KZG_COMMITMENT_INCLUSION_PROOF_DEPTH] kzg_commitment_inclusion_proof: Vector[Bytes32, KZG_COMMITMENT_INCLUSION_PROOF_DEPTH]
</spec> </spec>
- name: Checkpoint - name: Builder#gloas
sources: []
spec: |
<spec ssz_object="Builder" fork="gloas" hash="ae177179">
class Builder(Container):
pubkey: BLSPubkey
version: uint8
execution_address: ExecutionAddress
balance: Gwei
deposit_epoch: Epoch
withdrawable_epoch: Epoch
</spec>
- name: BuilderPendingPayment#gloas
sources: []
spec: |
<spec ssz_object="BuilderPendingPayment" fork="gloas" hash="73cf1649">
class BuilderPendingPayment(Container):
weight: Gwei
withdrawal: BuilderPendingWithdrawal
</spec>
- name: BuilderPendingWithdrawal#gloas
sources: []
spec: |
<spec ssz_object="BuilderPendingWithdrawal" fork="gloas" hash="0579f0ac">
class BuilderPendingWithdrawal(Container):
fee_recipient: ExecutionAddress
amount: Gwei
builder_index: BuilderIndex
</spec>
- name: Checkpoint#phase0
sources: sources:
- file: proto/eth/v1/attestation.proto - file: proto/eth/v1/attestation.proto
search: message Checkpoint { search: message Checkpoint {
@@ -575,7 +696,7 @@
root: Root root: Root
</spec> </spec>
- name: ConsolidationRequest - name: ConsolidationRequest#electra
sources: sources:
- file: proto/engine/v1/electra.proto - file: proto/engine/v1/electra.proto
search: message ConsolidationRequest { search: message ConsolidationRequest {
@@ -587,7 +708,7 @@
target_pubkey: BLSPubkey target_pubkey: BLSPubkey
</spec> </spec>
- name: ContributionAndProof - name: ContributionAndProof#altair
sources: sources:
- file: proto/prysm/v1alpha1/sync_committee.proto - file: proto/prysm/v1alpha1/sync_committee.proto
search: message ContributionAndProof { search: message ContributionAndProof {
@@ -599,7 +720,7 @@
selection_proof: BLSSignature selection_proof: BLSSignature
</spec> </spec>
- name: DataColumnSidecar - name: DataColumnSidecar#fulu
sources: sources:
- file: proto/prysm/v1alpha1/data_columns.proto - file: proto/prysm/v1alpha1/data_columns.proto
search: message DataColumnSidecar { search: message DataColumnSidecar {
@@ -614,7 +735,27 @@
kzg_commitments_inclusion_proof: Vector[Bytes32, KZG_COMMITMENTS_INCLUSION_PROOF_DEPTH] kzg_commitments_inclusion_proof: Vector[Bytes32, KZG_COMMITMENTS_INCLUSION_PROOF_DEPTH]
</spec> </spec>
- name: DataColumnsByRootIdentifier - name: DataColumnSidecar#gloas
sources: []
spec: |
<spec ssz_object="DataColumnSidecar" fork="gloas" hash="332c7cfc">
class DataColumnSidecar(Container):
index: ColumnIndex
column: List[Cell, MAX_BLOB_COMMITMENTS_PER_BLOCK]
# [Modified in Gloas:EIP7732]
# Removed `kzg_commitments`
kzg_proofs: List[KZGProof, MAX_BLOB_COMMITMENTS_PER_BLOCK]
# [Modified in Gloas:EIP7732]
# Removed `signed_block_header`
# [Modified in Gloas:EIP7732]
# Removed `kzg_commitments_inclusion_proof`
# [New in Gloas:EIP7732]
slot: Slot
# [New in Gloas:EIP7732]
beacon_block_root: Root
</spec>
- name: DataColumnsByRootIdentifier#fulu
sources: sources:
- file: proto/prysm/v1alpha1/data_columns.proto - file: proto/prysm/v1alpha1/data_columns.proto
search: message DataColumnsByRootIdentifier { search: message DataColumnsByRootIdentifier {
@@ -625,7 +766,7 @@
columns: List[ColumnIndex, NUMBER_OF_COLUMNS] columns: List[ColumnIndex, NUMBER_OF_COLUMNS]
</spec> </spec>
- name: Deposit - name: Deposit#phase0
sources: sources:
- file: proto/eth/v1/beacon_block.proto - file: proto/eth/v1/beacon_block.proto
search: message Deposit { search: message Deposit {
@@ -636,7 +777,7 @@
data: DepositData data: DepositData
</spec> </spec>
- name: DepositData - name: DepositData#phase0
sources: sources:
- file: proto/prysm/v1alpha1/beacon_core_types.proto - file: proto/prysm/v1alpha1/beacon_core_types.proto
search: message Data { search: message Data {
@@ -649,7 +790,7 @@
signature: BLSSignature signature: BLSSignature
</spec> </spec>
- name: DepositMessage - name: DepositMessage#phase0
sources: sources:
- file: proto/prysm/v1alpha1/beacon_state.proto - file: proto/prysm/v1alpha1/beacon_state.proto
search: message DepositMessage { search: message DepositMessage {
@@ -661,7 +802,7 @@
amount: Gwei amount: Gwei
</spec> </spec>
- name: DepositRequest - name: DepositRequest#electra
sources: sources:
- file: proto/engine/v1/electra.proto - file: proto/engine/v1/electra.proto
search: message DepositRequest { search: message DepositRequest {
@@ -675,7 +816,17 @@
index: uint64 index: uint64
</spec> </spec>
- name: Eth1Data - name: Eth1Block#phase0
sources: []
spec: |
<spec ssz_object="Eth1Block" fork="phase0" hash="0a5c6b45">
class Eth1Block(Container):
timestamp: uint64
deposit_root: Root
deposit_count: uint64
</spec>
- name: Eth1Data#phase0
sources: sources:
- file: proto/prysm/v1alpha1/beacon_core_types.proto - file: proto/prysm/v1alpha1/beacon_core_types.proto
search: message Eth1Data { search: message Eth1Data {
@@ -763,6 +914,37 @@
excess_blob_gas: uint64 excess_blob_gas: uint64
</spec> </spec>
- name: ExecutionPayloadBid#gloas
sources: []
spec: |
<spec ssz_object="ExecutionPayloadBid" fork="gloas" hash="1a7b9dea">
class ExecutionPayloadBid(Container):
parent_block_hash: Hash32
parent_block_root: Root
block_hash: Hash32
prev_randao: Bytes32
fee_recipient: ExecutionAddress
gas_limit: uint64
builder_index: BuilderIndex
slot: Slot
value: Gwei
execution_payment: Gwei
blob_kzg_commitments: List[KZGCommitment, MAX_BLOB_COMMITMENTS_PER_BLOCK]
</spec>
- name: ExecutionPayloadEnvelope#gloas
sources: []
spec: |
<spec ssz_object="ExecutionPayloadEnvelope" fork="gloas" hash="ec5c0233">
class ExecutionPayloadEnvelope(Container):
payload: ExecutionPayload
execution_requests: ExecutionRequests
builder_index: BuilderIndex
beacon_block_root: Root
slot: Slot
state_root: Root
</spec>
- name: ExecutionPayloadHeader#bellatrix - name: ExecutionPayloadHeader#bellatrix
sources: sources:
- file: proto/engine/v1/execution_engine.proto - file: proto/engine/v1/execution_engine.proto
@@ -839,7 +1021,7 @@
excess_blob_gas: uint64 excess_blob_gas: uint64
</spec> </spec>
- name: ExecutionRequests - name: ExecutionRequests#electra
sources: sources:
- file: proto/engine/v1/electra.proto - file: proto/engine/v1/electra.proto
search: message ExecutionRequests { search: message ExecutionRequests {
@@ -854,7 +1036,7 @@
consolidations: List[ConsolidationRequest, MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD] consolidations: List[ConsolidationRequest, MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD]
</spec> </spec>
- name: Fork - name: Fork#phase0
sources: sources:
- file: proto/prysm/v1alpha1/beacon_core_types.proto - file: proto/prysm/v1alpha1/beacon_core_types.proto
search: message Fork { search: message Fork {
@@ -866,7 +1048,16 @@
epoch: Epoch epoch: Epoch
</spec> </spec>
- name: ForkData - name: ForkChoiceNode#gloas
sources: []
spec: |
<spec ssz_object="ForkChoiceNode" fork="gloas" hash="755a4b34">
class ForkChoiceNode(Container):
root: Root
payload_status: PayloadStatus # One of PAYLOAD_STATUS_* values
</spec>
- name: ForkData#phase0
sources: sources:
- file: proto/prysm/v1alpha1/beacon_state.proto - file: proto/prysm/v1alpha1/beacon_state.proto
search: message ForkData { search: message ForkData {
@@ -877,7 +1068,7 @@
genesis_validators_root: Root genesis_validators_root: Root
</spec> </spec>
- name: HistoricalBatch - name: HistoricalBatch#phase0
sources: sources:
- file: proto/prysm/v1alpha1/beacon_state.proto - file: proto/prysm/v1alpha1/beacon_state.proto
search: message HistoricalBatch { search: message HistoricalBatch {
@@ -888,7 +1079,7 @@
state_roots: Vector[Root, SLOTS_PER_HISTORICAL_ROOT] state_roots: Vector[Root, SLOTS_PER_HISTORICAL_ROOT]
</spec> </spec>
- name: HistoricalSummary - name: HistoricalSummary#capella
sources: sources:
- file: proto/prysm/v1alpha1/beacon_core_types.proto - file: proto/prysm/v1alpha1/beacon_core_types.proto
search: message HistoricalSummary { search: message HistoricalSummary {
@@ -924,7 +1115,17 @@
signature: BLSSignature signature: BLSSignature
</spec> </spec>
- name: LightClientBootstrap - name: IndexedPayloadAttestation#gloas
sources: []
spec: |
<spec ssz_object="IndexedPayloadAttestation" fork="gloas" hash="fa4832c8">
class IndexedPayloadAttestation(Container):
attesting_indices: List[ValidatorIndex, PTC_SIZE]
data: PayloadAttestationData
signature: BLSSignature
</spec>
- name: LightClientBootstrap#altair
sources: sources:
- file: proto/prysm/v1alpha1/light_client.proto - file: proto/prysm/v1alpha1/light_client.proto
search: message LightClientBootstrapAltair { search: message LightClientBootstrapAltair {
@@ -938,7 +1139,18 @@
current_sync_committee_branch: CurrentSyncCommitteeBranch current_sync_committee_branch: CurrentSyncCommitteeBranch
</spec> </spec>
- name: LightClientFinalityUpdate - name: LightClientBootstrap#capella
sources: []
spec: |
<spec ssz_object="LightClientBootstrap" fork="capella" hash="85f4f5fe">
class LightClientBootstrap(Container):
# [Modified in Capella]
header: LightClientHeader
current_sync_committee: SyncCommittee
current_sync_committee_branch: CurrentSyncCommitteeBranch
</spec>
- name: LightClientFinalityUpdate#altair
sources: sources:
- file: proto/prysm/v1alpha1/light_client.proto - file: proto/prysm/v1alpha1/light_client.proto
search: message LightClientFinalityUpdateAltair { search: message LightClientFinalityUpdateAltair {
@@ -956,6 +1168,20 @@
signature_slot: Slot signature_slot: Slot
</spec> </spec>
- name: LightClientFinalityUpdate#capella
sources: []
spec: |
<spec ssz_object="LightClientFinalityUpdate" fork="capella" hash="9d2b55dd">
class LightClientFinalityUpdate(Container):
# [Modified in Capella]
attested_header: LightClientHeader
# [Modified in Capella]
finalized_header: LightClientHeader
finality_branch: FinalityBranch
sync_aggregate: SyncAggregate
signature_slot: Slot
</spec>
- name: LightClientHeader#altair - name: LightClientHeader#altair
sources: sources:
- file: proto/prysm/v1alpha1/light_client.proto - file: proto/prysm/v1alpha1/light_client.proto
@@ -980,7 +1206,7 @@
execution_branch: ExecutionBranch execution_branch: ExecutionBranch
</spec> </spec>
- name: LightClientOptimisticUpdate - name: LightClientOptimisticUpdate#altair
sources: sources:
- file: proto/prysm/v1alpha1/light_client.proto - file: proto/prysm/v1alpha1/light_client.proto
search: message LightClientOptimisticUpdateAltair { search: message LightClientOptimisticUpdateAltair {
@@ -995,7 +1221,18 @@
signature_slot: Slot signature_slot: Slot
</spec> </spec>
- name: LightClientUpdate - name: LightClientOptimisticUpdate#capella
sources: []
spec: |
<spec ssz_object="LightClientOptimisticUpdate" fork="capella" hash="bdce7b1d">
class LightClientOptimisticUpdate(Container):
# [Modified in Capella]
attested_header: LightClientHeader
sync_aggregate: SyncAggregate
signature_slot: Slot
</spec>
- name: LightClientUpdate#altair
sources: sources:
- file: proto/prysm/v1alpha1/light_client.proto - file: proto/prysm/v1alpha1/light_client.proto
search: message LightClientUpdateAltair { search: message LightClientUpdateAltair {
@@ -1016,7 +1253,65 @@
signature_slot: Slot signature_slot: Slot
</spec> </spec>
- name: PendingAttestation - name: LightClientUpdate#capella
sources: []
spec: |
<spec ssz_object="LightClientUpdate" fork="capella" hash="8d215165">
class LightClientUpdate(Container):
# [Modified in Capella]
attested_header: LightClientHeader
next_sync_committee: SyncCommittee
next_sync_committee_branch: NextSyncCommitteeBranch
# [Modified in Capella]
finalized_header: LightClientHeader
finality_branch: FinalityBranch
sync_aggregate: SyncAggregate
signature_slot: Slot
</spec>
- name: MatrixEntry#fulu
sources: []
spec: |
<spec ssz_object="MatrixEntry" fork="fulu" hash="0da9cc8e">
class MatrixEntry(Container):
cell: Cell
kzg_proof: KZGProof
column_index: ColumnIndex
row_index: RowIndex
</spec>
- name: PayloadAttestation#gloas
sources: []
spec: |
<spec ssz_object="PayloadAttestation" fork="gloas" hash="c769473d">
class PayloadAttestation(Container):
aggregation_bits: Bitvector[PTC_SIZE]
data: PayloadAttestationData
signature: BLSSignature
</spec>
- name: PayloadAttestationData#gloas
sources: []
spec: |
<spec ssz_object="PayloadAttestationData" fork="gloas" hash="9f1b7f92">
class PayloadAttestationData(Container):
beacon_block_root: Root
slot: Slot
payload_present: boolean
blob_data_available: boolean
</spec>
- name: PayloadAttestationMessage#gloas
sources: []
spec: |
<spec ssz_object="PayloadAttestationMessage" fork="gloas" hash="3707678d">
class PayloadAttestationMessage(Container):
validator_index: ValidatorIndex
data: PayloadAttestationData
signature: BLSSignature
</spec>
- name: PendingAttestation#phase0
sources: sources:
- file: proto/prysm/v1alpha1/beacon_state.proto - file: proto/prysm/v1alpha1/beacon_state.proto
search: message PendingAttestation { search: message PendingAttestation {
@@ -1029,7 +1324,7 @@
proposer_index: ValidatorIndex proposer_index: ValidatorIndex
</spec> </spec>
- name: PendingConsolidation - name: PendingConsolidation#electra
sources: sources:
- file: proto/prysm/v1alpha1/eip_7251.proto - file: proto/prysm/v1alpha1/eip_7251.proto
search: message PendingConsolidation { search: message PendingConsolidation {
@@ -1040,7 +1335,7 @@
target_index: ValidatorIndex target_index: ValidatorIndex
</spec> </spec>
- name: PendingDeposit - name: PendingDeposit#electra
sources: sources:
- file: proto/prysm/v1alpha1/eip_7251.proto - file: proto/prysm/v1alpha1/eip_7251.proto
search: message PendingDeposit { search: message PendingDeposit {
@@ -1054,7 +1349,7 @@
slot: Slot slot: Slot
</spec> </spec>
- name: PendingPartialWithdrawal - name: PendingPartialWithdrawal#electra
sources: sources:
- file: proto/prysm/v1alpha1/eip_7251.proto - file: proto/prysm/v1alpha1/eip_7251.proto
search: message PendingPartialWithdrawal { search: message PendingPartialWithdrawal {
@@ -1066,7 +1361,7 @@
withdrawable_epoch: Epoch withdrawable_epoch: Epoch
</spec> </spec>
- name: PowBlock - name: PowBlock#bellatrix
sources: sources:
- file: proto/prysm/v1alpha1/beacon_state.proto - file: proto/prysm/v1alpha1/beacon_state.proto
search: message PowBlock { search: message PowBlock {
@@ -1078,7 +1373,18 @@
total_difficulty: uint256 total_difficulty: uint256
</spec> </spec>
- name: ProposerSlashing - name: ProposerPreferences#gloas
sources: []
spec: |
<spec ssz_object="ProposerPreferences" fork="gloas" hash="2a38b149">
class ProposerPreferences(Container):
proposal_slot: Slot
validator_index: ValidatorIndex
fee_recipient: ExecutionAddress
gas_limit: uint64
</spec>
- name: ProposerSlashing#phase0
sources: sources:
- file: proto/eth/v1/beacon_block.proto - file: proto/eth/v1/beacon_block.proto
search: message ProposerSlashing { search: message ProposerSlashing {
@@ -1112,7 +1418,7 @@
signature: BLSSignature signature: BLSSignature
</spec> </spec>
- name: SignedBLSToExecutionChange - name: SignedBLSToExecutionChange#capella
sources: sources:
- file: proto/prysm/v1alpha1/withdrawals.proto - file: proto/prysm/v1alpha1/withdrawals.proto
search: message SignedBLSToExecutionChange { search: message SignedBLSToExecutionChange {
@@ -1123,7 +1429,7 @@
signature: BLSSignature signature: BLSSignature
</spec> </spec>
- name: SignedBeaconBlock - name: SignedBeaconBlock#phase0
sources: sources:
- file: proto/prysm/v1alpha1/beacon_block.proto - file: proto/prysm/v1alpha1/beacon_block.proto
search: message SignedBeaconBlock { search: message SignedBeaconBlock {
@@ -1134,7 +1440,7 @@
signature: BLSSignature signature: BLSSignature
</spec> </spec>
- name: SignedBeaconBlockHeader - name: SignedBeaconBlockHeader#phase0
sources: sources:
- file: proto/prysm/v1alpha1/beacon_core_types.proto - file: proto/prysm/v1alpha1/beacon_core_types.proto
search: message SignedBeaconBlockHeader { search: message SignedBeaconBlockHeader {
@@ -1145,7 +1451,7 @@
signature: BLSSignature signature: BLSSignature
</spec> </spec>
- name: SignedContributionAndProof - name: SignedContributionAndProof#altair
sources: sources:
- file: proto/prysm/v1alpha1/sync_committee.proto - file: proto/prysm/v1alpha1/sync_committee.proto
search: message SignedContributionAndProof { search: message SignedContributionAndProof {
@@ -1156,7 +1462,34 @@
signature: BLSSignature signature: BLSSignature
</spec> </spec>
- name: SignedVoluntaryExit - name: SignedExecutionPayloadBid#gloas
sources: []
spec: |
<spec ssz_object="SignedExecutionPayloadBid" fork="gloas" hash="6b344341">
class SignedExecutionPayloadBid(Container):
message: ExecutionPayloadBid
signature: BLSSignature
</spec>
- name: SignedExecutionPayloadEnvelope#gloas
sources: []
spec: |
<spec ssz_object="SignedExecutionPayloadEnvelope" fork="gloas" hash="ab8f3404">
class SignedExecutionPayloadEnvelope(Container):
message: ExecutionPayloadEnvelope
signature: BLSSignature
</spec>
- name: SignedProposerPreferences#gloas
sources: []
spec: |
<spec ssz_object="SignedProposerPreferences" fork="gloas" hash="2142774c">
class SignedProposerPreferences(Container):
message: ProposerPreferences
signature: BLSSignature
</spec>
- name: SignedVoluntaryExit#phase0
sources: sources:
- file: proto/prysm/v1alpha1/beacon_core_types.proto - file: proto/prysm/v1alpha1/beacon_core_types.proto
search: message SignedVoluntaryExit { search: message SignedVoluntaryExit {
@@ -1167,7 +1500,7 @@
signature: BLSSignature signature: BLSSignature
</spec> </spec>
- name: SigningData - name: SigningData#phase0
sources: sources:
- file: proto/prysm/v1alpha1/beacon_state.proto - file: proto/prysm/v1alpha1/beacon_state.proto
search: message SigningData { search: message SigningData {
@@ -1178,7 +1511,7 @@
domain: Domain domain: Domain
</spec> </spec>
- name: SingleAttestation - name: SingleAttestation#electra
sources: sources:
- file: proto/prysm/v1alpha1/attestation.proto - file: proto/prysm/v1alpha1/attestation.proto
search: message SingleAttestation { search: message SingleAttestation {
@@ -1191,7 +1524,7 @@
signature: BLSSignature signature: BLSSignature
</spec> </spec>
- name: SyncAggregate - name: SyncAggregate#altair
sources: sources:
- file: proto/prysm/v1alpha1/beacon_core_types.proto - file: proto/prysm/v1alpha1/beacon_core_types.proto
search: message SyncAggregate { search: message SyncAggregate {
@@ -1202,7 +1535,7 @@
sync_committee_signature: BLSSignature sync_committee_signature: BLSSignature
</spec> </spec>
- name: SyncAggregatorSelectionData - name: SyncAggregatorSelectionData#altair
sources: sources:
- file: proto/prysm/v1alpha1/beacon_state.proto - file: proto/prysm/v1alpha1/beacon_state.proto
search: message SyncAggregatorSelectionData { search: message SyncAggregatorSelectionData {
@@ -1213,7 +1546,7 @@
subcommittee_index: uint64 subcommittee_index: uint64
</spec> </spec>
- name: SyncCommittee - name: SyncCommittee#altair
sources: sources:
- file: proto/prysm/v1alpha1/beacon_core_types.proto - file: proto/prysm/v1alpha1/beacon_core_types.proto
search: message SyncCommittee { search: message SyncCommittee {
@@ -1224,7 +1557,7 @@
aggregate_pubkey: BLSPubkey aggregate_pubkey: BLSPubkey
</spec> </spec>
- name: SyncCommitteeContribution - name: SyncCommitteeContribution#altair
sources: sources:
- file: proto/prysm/v1alpha1/sync_committee.proto - file: proto/prysm/v1alpha1/sync_committee.proto
search: message SyncCommitteeContribution { search: message SyncCommitteeContribution {
@@ -1238,7 +1571,7 @@
signature: BLSSignature signature: BLSSignature
</spec> </spec>
- name: SyncCommitteeMessage - name: SyncCommitteeMessage#altair
sources: sources:
- file: proto/prysm/v1alpha1/sync_committee.proto - file: proto/prysm/v1alpha1/sync_committee.proto
search: message SyncCommitteeMessage { search: message SyncCommitteeMessage {
@@ -1251,7 +1584,7 @@
signature: BLSSignature signature: BLSSignature
</spec> </spec>
- name: Validator - name: Validator#phase0
sources: sources:
- file: proto/prysm/v1alpha1/beacon_core_types.proto - file: proto/prysm/v1alpha1/beacon_core_types.proto
search: message Validator { search: message Validator {
@@ -1268,7 +1601,7 @@
withdrawable_epoch: Epoch withdrawable_epoch: Epoch
</spec> </spec>
- name: VoluntaryExit - name: VoluntaryExit#phase0
sources: sources:
- file: proto/eth/v1/beacon_block.proto - file: proto/eth/v1/beacon_block.proto
search: message VoluntaryExit { search: message VoluntaryExit {
@@ -1279,7 +1612,7 @@
validator_index: ValidatorIndex validator_index: ValidatorIndex
</spec> </spec>
- name: Withdrawal - name: Withdrawal#capella
sources: sources:
- file: proto/engine/v1/execution_engine.proto - file: proto/engine/v1/execution_engine.proto
search: message Withdrawal { search: message Withdrawal {
@@ -1292,7 +1625,7 @@
amount: Gwei amount: Gwei
</spec> </spec>
- name: WithdrawalRequest - name: WithdrawalRequest#electra
sources: sources:
- file: proto/engine/v1/electra.proto - file: proto/engine/v1/electra.proto
search: message WithdrawalRequest { search: message WithdrawalRequest {

View File

@@ -1,4 +1,4 @@
- name: BlobParameters - name: BlobParameters#fulu
sources: [] sources: []
spec: | spec: |
<spec dataclass="BlobParameters" fork="fulu" hash="a4575aa8"> <spec dataclass="BlobParameters" fork="fulu" hash="a4575aa8">
@@ -54,6 +54,20 @@
processed_sweep_withdrawals_count: uint64 processed_sweep_withdrawals_count: uint64
</spec> </spec>
- name: ExpectedWithdrawals#gloas
sources: []
spec: |
<spec dataclass="ExpectedWithdrawals" fork="gloas" hash="b32cc9c9">
class ExpectedWithdrawals(object):
withdrawals: Sequence[Withdrawal]
# [New in Gloas:EIP7732]
processed_builder_withdrawals_count: uint64
processed_partial_withdrawals_count: uint64
# [New in Gloas:EIP7732]
processed_builders_sweep_count: uint64
processed_sweep_withdrawals_count: uint64
</spec>
- name: GetPayloadResponse#bellatrix - name: GetPayloadResponse#bellatrix
sources: sources:
- file: consensus-types/blocks/get_payload.go - file: consensus-types/blocks/get_payload.go
@@ -126,7 +140,7 @@
execution_requests: Sequence[bytes] execution_requests: Sequence[bytes]
</spec> </spec>
- name: LatestMessage - name: LatestMessage#phase0
sources: [] sources: []
spec: | spec: |
<spec dataclass="LatestMessage" fork="phase0" hash="44e832d0"> <spec dataclass="LatestMessage" fork="phase0" hash="44e832d0">
@@ -136,7 +150,18 @@
root: Root root: Root
</spec> </spec>
- name: LightClientStore - name: LatestMessage#gloas
sources: []
spec: |
<spec dataclass="LatestMessage" fork="gloas" hash="a0030894">
@dataclass(eq=True, frozen=True)
class LatestMessage(object):
slot: Slot
root: Root
payload_present: boolean
</spec>
- name: LightClientStore#altair
sources: [] sources: []
spec: | spec: |
<spec dataclass="LightClientStore" fork="altair" hash="24725cec"> <spec dataclass="LightClientStore" fork="altair" hash="24725cec">
@@ -155,6 +180,23 @@
current_max_active_participants: uint64 current_max_active_participants: uint64
</spec> </spec>
- name: LightClientStore#capella
sources: []
spec: |
<spec dataclass="LightClientStore" fork="capella" hash="04b41062">
class LightClientStore(object):
# [Modified in Capella]
finalized_header: LightClientHeader
current_sync_committee: SyncCommittee
next_sync_committee: SyncCommittee
# [Modified in Capella]
best_valid_update: Optional[LightClientUpdate]
# [Modified in Capella]
optimistic_header: LightClientHeader
previous_max_active_participants: uint64
current_max_active_participants: uint64
</spec>
- name: NewPayloadRequest#bellatrix - name: NewPayloadRequest#bellatrix
sources: sources:
- file: beacon-chain/execution/engine_client.go - file: beacon-chain/execution/engine_client.go
@@ -191,7 +233,7 @@
execution_requests: ExecutionRequests execution_requests: ExecutionRequests
</spec> </spec>
- name: OptimisticStore - name: OptimisticStore#bellatrix
sources: [] sources: []
spec: | spec: |
<spec dataclass="OptimisticStore" fork="bellatrix" hash="a2b2182c"> <spec dataclass="OptimisticStore" fork="bellatrix" hash="a2b2182c">
@@ -246,7 +288,7 @@
parent_beacon_block_root: Root parent_beacon_block_root: Root
</spec> </spec>
- name: Store - name: Store#phase0
sources: [] sources: []
spec: | spec: |
<spec dataclass="Store" fork="phase0" hash="abe525d6"> <spec dataclass="Store" fork="phase0" hash="abe525d6">
@@ -266,3 +308,30 @@
latest_messages: Dict[ValidatorIndex, LatestMessage] = field(default_factory=dict) latest_messages: Dict[ValidatorIndex, LatestMessage] = field(default_factory=dict)
unrealized_justifications: Dict[Root, Checkpoint] = field(default_factory=dict) unrealized_justifications: Dict[Root, Checkpoint] = field(default_factory=dict)
</spec> </spec>
- name: Store#gloas
sources: []
spec: |
<spec dataclass="Store" fork="gloas" hash="4dbfec46">
class Store(object):
time: uint64
genesis_time: uint64
justified_checkpoint: Checkpoint
finalized_checkpoint: Checkpoint
unrealized_justified_checkpoint: Checkpoint
unrealized_finalized_checkpoint: Checkpoint
proposer_boost_root: Root
equivocating_indices: Set[ValidatorIndex]
blocks: Dict[Root, BeaconBlock] = field(default_factory=dict)
block_states: Dict[Root, BeaconState] = field(default_factory=dict)
block_timeliness: Dict[Root, Vector[boolean, NUM_BLOCK_TIMELINESS_DEADLINES]] = field(
default_factory=dict
)
checkpoint_states: Dict[Checkpoint, BeaconState] = field(default_factory=dict)
latest_messages: Dict[ValidatorIndex, LatestMessage] = field(default_factory=dict)
unrealized_justifications: Dict[Root, Checkpoint] = field(default_factory=dict)
# [New in Gloas:EIP7732]
execution_payload_states: Dict[Root, BeaconState] = field(default_factory=dict)
# [New in Gloas:EIP7732]
ptc_vote: Dict[Root, Vector[boolean, PTC_SIZE]] = field(default_factory=dict)
</spec>

File diff suppressed because it is too large Load Diff

View File

@@ -1,4 +1,4 @@
- name: BASE_REWARD_FACTOR - name: BASE_REWARD_FACTOR#phase0
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: BaseRewardFactor\s+.*yaml:"BASE_REWARD_FACTOR" search: BaseRewardFactor\s+.*yaml:"BASE_REWARD_FACTOR"
@@ -8,7 +8,21 @@
BASE_REWARD_FACTOR: uint64 = 64 BASE_REWARD_FACTOR: uint64 = 64
</spec> </spec>
- name: BYTES_PER_LOGS_BLOOM - name: BUILDER_PENDING_WITHDRAWALS_LIMIT#gloas
sources: []
spec: |
<spec preset_var="BUILDER_PENDING_WITHDRAWALS_LIMIT" fork="gloas" hash="40b31377">
BUILDER_PENDING_WITHDRAWALS_LIMIT: uint64 = 1048576
</spec>
- name: BUILDER_REGISTRY_LIMIT#gloas
sources: []
spec: |
<spec preset_var="BUILDER_REGISTRY_LIMIT" fork="gloas" hash="e951ff73">
BUILDER_REGISTRY_LIMIT: uint64 = 1099511627776
</spec>
- name: BYTES_PER_LOGS_BLOOM#bellatrix
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: BytesPerLogsBloom\s+.*yaml:"BYTES_PER_LOGS_BLOOM" search: BytesPerLogsBloom\s+.*yaml:"BYTES_PER_LOGS_BLOOM"
@@ -18,7 +32,7 @@
BYTES_PER_LOGS_BLOOM: uint64 = 256 BYTES_PER_LOGS_BLOOM: uint64 = 256
</spec> </spec>
- name: CELLS_PER_EXT_BLOB - name: CELLS_PER_EXT_BLOB#fulu
sources: sources:
- file: beacon-chain/rpc/eth/config/handlers.go - file: beacon-chain/rpc/eth/config/handlers.go
search: data\["CELLS_PER_EXT_BLOB"\] search: data\["CELLS_PER_EXT_BLOB"\]
@@ -28,7 +42,7 @@
CELLS_PER_EXT_BLOB = 128 CELLS_PER_EXT_BLOB = 128
</spec> </spec>
- name: EFFECTIVE_BALANCE_INCREMENT - name: EFFECTIVE_BALANCE_INCREMENT#phase0
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: EffectiveBalanceIncrement\s+.*yaml:"EFFECTIVE_BALANCE_INCREMENT" search: EffectiveBalanceIncrement\s+.*yaml:"EFFECTIVE_BALANCE_INCREMENT"
@@ -38,7 +52,7 @@
EFFECTIVE_BALANCE_INCREMENT: Gwei = 1000000000 EFFECTIVE_BALANCE_INCREMENT: Gwei = 1000000000
</spec> </spec>
- name: EPOCHS_PER_ETH1_VOTING_PERIOD - name: EPOCHS_PER_ETH1_VOTING_PERIOD#phase0
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: EpochsPerEth1VotingPeriod\s+.*yaml:"EPOCHS_PER_ETH1_VOTING_PERIOD" search: EpochsPerEth1VotingPeriod\s+.*yaml:"EPOCHS_PER_ETH1_VOTING_PERIOD"
@@ -48,7 +62,7 @@
EPOCHS_PER_ETH1_VOTING_PERIOD: uint64 = 64 EPOCHS_PER_ETH1_VOTING_PERIOD: uint64 = 64
</spec> </spec>
- name: EPOCHS_PER_HISTORICAL_VECTOR - name: EPOCHS_PER_HISTORICAL_VECTOR#phase0
sources: sources:
- file: config/fieldparams/mainnet.go - file: config/fieldparams/mainnet.go
search: RandaoMixesLength\s*= search: RandaoMixesLength\s*=
@@ -58,7 +72,7 @@
EPOCHS_PER_HISTORICAL_VECTOR: uint64 = 65536 EPOCHS_PER_HISTORICAL_VECTOR: uint64 = 65536
</spec> </spec>
- name: EPOCHS_PER_SLASHINGS_VECTOR - name: EPOCHS_PER_SLASHINGS_VECTOR#phase0
sources: sources:
- file: config/fieldparams/mainnet.go - file: config/fieldparams/mainnet.go
search: SlashingsLength\s*= search: SlashingsLength\s*=
@@ -68,7 +82,7 @@
EPOCHS_PER_SLASHINGS_VECTOR: uint64 = 8192 EPOCHS_PER_SLASHINGS_VECTOR: uint64 = 8192
</spec> </spec>
- name: EPOCHS_PER_SYNC_COMMITTEE_PERIOD - name: EPOCHS_PER_SYNC_COMMITTEE_PERIOD#altair
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: EpochsPerSyncCommitteePeriod\s+.*yaml:"EPOCHS_PER_SYNC_COMMITTEE_PERIOD" search: EpochsPerSyncCommitteePeriod\s+.*yaml:"EPOCHS_PER_SYNC_COMMITTEE_PERIOD"
@@ -78,7 +92,7 @@
EPOCHS_PER_SYNC_COMMITTEE_PERIOD: uint64 = 256 EPOCHS_PER_SYNC_COMMITTEE_PERIOD: uint64 = 256
</spec> </spec>
- name: FIELD_ELEMENTS_PER_BLOB - name: FIELD_ELEMENTS_PER_BLOB#deneb
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: FieldElementsPerBlob\s+.*yaml:"FIELD_ELEMENTS_PER_BLOB" search: FieldElementsPerBlob\s+.*yaml:"FIELD_ELEMENTS_PER_BLOB"
@@ -88,7 +102,7 @@
FIELD_ELEMENTS_PER_BLOB: uint64 = 4096 FIELD_ELEMENTS_PER_BLOB: uint64 = 4096
</spec> </spec>
- name: FIELD_ELEMENTS_PER_CELL - name: FIELD_ELEMENTS_PER_CELL#fulu
sources: sources:
- file: config/fieldparams/mainnet.go - file: config/fieldparams/mainnet.go
search: CellsPerBlob\s*= search: CellsPerBlob\s*=
@@ -98,7 +112,7 @@
FIELD_ELEMENTS_PER_CELL: uint64 = 64 FIELD_ELEMENTS_PER_CELL: uint64 = 64
</spec> </spec>
- name: FIELD_ELEMENTS_PER_EXT_BLOB - name: FIELD_ELEMENTS_PER_EXT_BLOB#fulu
sources: sources:
- file: proto/ssz_proto_library.bzl - file: proto/ssz_proto_library.bzl
search: mainnet\s*=\s*\{[^}]*"field_elements_per_ext_blob\.size".*[^}]*\} search: mainnet\s*=\s*\{[^}]*"field_elements_per_ext_blob\.size".*[^}]*\}
@@ -108,7 +122,7 @@
FIELD_ELEMENTS_PER_EXT_BLOB = 8192 FIELD_ELEMENTS_PER_EXT_BLOB = 8192
</spec> </spec>
- name: HISTORICAL_ROOTS_LIMIT - name: HISTORICAL_ROOTS_LIMIT#phase0
sources: sources:
- file: config/fieldparams/mainnet.go - file: config/fieldparams/mainnet.go
search: HistoricalRootsLength\s*= search: HistoricalRootsLength\s*=
@@ -118,7 +132,7 @@
HISTORICAL_ROOTS_LIMIT: uint64 = 16777216 HISTORICAL_ROOTS_LIMIT: uint64 = 16777216
</spec> </spec>
- name: HYSTERESIS_DOWNWARD_MULTIPLIER - name: HYSTERESIS_DOWNWARD_MULTIPLIER#phase0
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: HysteresisDownwardMultiplier\s+.*yaml:"HYSTERESIS_DOWNWARD_MULTIPLIER" search: HysteresisDownwardMultiplier\s+.*yaml:"HYSTERESIS_DOWNWARD_MULTIPLIER"
@@ -128,7 +142,7 @@
HYSTERESIS_DOWNWARD_MULTIPLIER: uint64 = 1 HYSTERESIS_DOWNWARD_MULTIPLIER: uint64 = 1
</spec> </spec>
- name: HYSTERESIS_QUOTIENT - name: HYSTERESIS_QUOTIENT#phase0
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: HysteresisQuotient\s+.*yaml:"HYSTERESIS_QUOTIENT" search: HysteresisQuotient\s+.*yaml:"HYSTERESIS_QUOTIENT"
@@ -138,7 +152,7 @@
HYSTERESIS_QUOTIENT: uint64 = 4 HYSTERESIS_QUOTIENT: uint64 = 4
</spec> </spec>
- name: HYSTERESIS_UPWARD_MULTIPLIER - name: HYSTERESIS_UPWARD_MULTIPLIER#phase0
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: HysteresisUpwardMultiplier\s+.*yaml:"HYSTERESIS_UPWARD_MULTIPLIER" search: HysteresisUpwardMultiplier\s+.*yaml:"HYSTERESIS_UPWARD_MULTIPLIER"
@@ -148,7 +162,7 @@
HYSTERESIS_UPWARD_MULTIPLIER: uint64 = 5 HYSTERESIS_UPWARD_MULTIPLIER: uint64 = 5
</spec> </spec>
- name: INACTIVITY_PENALTY_QUOTIENT - name: INACTIVITY_PENALTY_QUOTIENT#phase0
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: InactivityPenaltyQuotient\s+.*yaml:"INACTIVITY_PENALTY_QUOTIENT" search: InactivityPenaltyQuotient\s+.*yaml:"INACTIVITY_PENALTY_QUOTIENT"
@@ -158,7 +172,7 @@
INACTIVITY_PENALTY_QUOTIENT: uint64 = 67108864 INACTIVITY_PENALTY_QUOTIENT: uint64 = 67108864
</spec> </spec>
- name: INACTIVITY_PENALTY_QUOTIENT_ALTAIR - name: INACTIVITY_PENALTY_QUOTIENT_ALTAIR#altair
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: InactivityPenaltyQuotientAltair\s+.*yaml:"INACTIVITY_PENALTY_QUOTIENT_ALTAIR" search: InactivityPenaltyQuotientAltair\s+.*yaml:"INACTIVITY_PENALTY_QUOTIENT_ALTAIR"
@@ -168,7 +182,7 @@
INACTIVITY_PENALTY_QUOTIENT_ALTAIR: uint64 = 50331648 INACTIVITY_PENALTY_QUOTIENT_ALTAIR: uint64 = 50331648
</spec> </spec>
- name: INACTIVITY_PENALTY_QUOTIENT_BELLATRIX - name: INACTIVITY_PENALTY_QUOTIENT_BELLATRIX#bellatrix
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: InactivityPenaltyQuotientBellatrix\s+.*yaml:"INACTIVITY_PENALTY_QUOTIENT_BELLATRIX" search: InactivityPenaltyQuotientBellatrix\s+.*yaml:"INACTIVITY_PENALTY_QUOTIENT_BELLATRIX"
@@ -178,7 +192,7 @@
INACTIVITY_PENALTY_QUOTIENT_BELLATRIX: uint64 = 16777216 INACTIVITY_PENALTY_QUOTIENT_BELLATRIX: uint64 = 16777216
</spec> </spec>
- name: KZG_COMMITMENTS_INCLUSION_PROOF_DEPTH - name: KZG_COMMITMENTS_INCLUSION_PROOF_DEPTH#fulu
sources: sources:
- file: proto/ssz_proto_library.bzl - file: proto/ssz_proto_library.bzl
search: mainnet\s*=\s*\{[^}]*"kzg_commitments_inclusion_proof_depth\.size":.*[^}]*\} search: mainnet\s*=\s*\{[^}]*"kzg_commitments_inclusion_proof_depth\.size":.*[^}]*\}
@@ -188,7 +202,7 @@
KZG_COMMITMENTS_INCLUSION_PROOF_DEPTH: uint64 = 4 KZG_COMMITMENTS_INCLUSION_PROOF_DEPTH: uint64 = 4
</spec> </spec>
- name: KZG_COMMITMENT_INCLUSION_PROOF_DEPTH - name: KZG_COMMITMENT_INCLUSION_PROOF_DEPTH#deneb
sources: sources:
- file: config/fieldparams/mainnet.go - file: config/fieldparams/mainnet.go
search: KzgCommitmentInclusionProofDepth\s*= search: KzgCommitmentInclusionProofDepth\s*=
@@ -198,7 +212,7 @@
KZG_COMMITMENT_INCLUSION_PROOF_DEPTH: uint64 = 17 KZG_COMMITMENT_INCLUSION_PROOF_DEPTH: uint64 = 17
</spec> </spec>
- name: MAX_ATTESTATIONS - name: MAX_ATTESTATIONS#phase0
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: MaxAttestations\s+.*yaml:"MAX_ATTESTATIONS" search: MaxAttestations\s+.*yaml:"MAX_ATTESTATIONS"
@@ -208,7 +222,7 @@
MAX_ATTESTATIONS = 128 MAX_ATTESTATIONS = 128
</spec> </spec>
- name: MAX_ATTESTATIONS_ELECTRA - name: MAX_ATTESTATIONS_ELECTRA#electra
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: MaxAttestationsElectra\s+.*yaml:"MAX_ATTESTATIONS_ELECTRA" search: MaxAttestationsElectra\s+.*yaml:"MAX_ATTESTATIONS_ELECTRA"
@@ -218,7 +232,7 @@
MAX_ATTESTATIONS_ELECTRA = 8 MAX_ATTESTATIONS_ELECTRA = 8
</spec> </spec>
- name: MAX_ATTESTER_SLASHINGS - name: MAX_ATTESTER_SLASHINGS#phase0
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: MaxAttesterSlashings\s+.*yaml:"MAX_ATTESTER_SLASHINGS" search: MaxAttesterSlashings\s+.*yaml:"MAX_ATTESTER_SLASHINGS"
@@ -228,7 +242,7 @@
MAX_ATTESTER_SLASHINGS = 2 MAX_ATTESTER_SLASHINGS = 2
</spec> </spec>
- name: MAX_ATTESTER_SLASHINGS_ELECTRA - name: MAX_ATTESTER_SLASHINGS_ELECTRA#electra
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: MaxAttesterSlashingsElectra\s+.*yaml:"MAX_ATTESTER_SLASHINGS_ELECTRA" search: MaxAttesterSlashingsElectra\s+.*yaml:"MAX_ATTESTER_SLASHINGS_ELECTRA"
@@ -238,7 +252,7 @@
MAX_ATTESTER_SLASHINGS_ELECTRA = 1 MAX_ATTESTER_SLASHINGS_ELECTRA = 1
</spec> </spec>
- name: MAX_BLOB_COMMITMENTS_PER_BLOCK - name: MAX_BLOB_COMMITMENTS_PER_BLOCK#deneb
sources: sources:
- file: config/fieldparams/mainnet.go - file: config/fieldparams/mainnet.go
search: MaxBlobCommitmentsPerBlock\s*= search: MaxBlobCommitmentsPerBlock\s*=
@@ -248,7 +262,7 @@
MAX_BLOB_COMMITMENTS_PER_BLOCK: uint64 = 4096 MAX_BLOB_COMMITMENTS_PER_BLOCK: uint64 = 4096
</spec> </spec>
- name: MAX_BLS_TO_EXECUTION_CHANGES - name: MAX_BLS_TO_EXECUTION_CHANGES#capella
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: MaxBlsToExecutionChanges\s+.*yaml:"MAX_BLS_TO_EXECUTION_CHANGES" search: MaxBlsToExecutionChanges\s+.*yaml:"MAX_BLS_TO_EXECUTION_CHANGES"
@@ -258,7 +272,14 @@
MAX_BLS_TO_EXECUTION_CHANGES = 16 MAX_BLS_TO_EXECUTION_CHANGES = 16
</spec> </spec>
- name: MAX_BYTES_PER_TRANSACTION - name: MAX_BUILDERS_PER_WITHDRAWALS_SWEEP#gloas
sources: []
spec: |
<spec preset_var="MAX_BUILDERS_PER_WITHDRAWALS_SWEEP" fork="gloas" hash="1556b314">
MAX_BUILDERS_PER_WITHDRAWALS_SWEEP = 16384
</spec>
- name: MAX_BYTES_PER_TRANSACTION#bellatrix
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: MaxBytesPerTransaction\s+.*yaml:"MAX_BYTES_PER_TRANSACTION" search: MaxBytesPerTransaction\s+.*yaml:"MAX_BYTES_PER_TRANSACTION"
@@ -288,7 +309,7 @@
MAX_COMMITTEES_PER_SLOT: uint64 = 64 MAX_COMMITTEES_PER_SLOT: uint64 = 64
</spec> </spec>
- name: MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD - name: MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD#electra
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: MaxConsolidationsRequestsPerPayload\s+.*yaml:"MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD" search: MaxConsolidationsRequestsPerPayload\s+.*yaml:"MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD"
@@ -298,7 +319,7 @@
MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD: uint64 = 2 MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD: uint64 = 2
</spec> </spec>
- name: MAX_DEPOSITS - name: MAX_DEPOSITS#phase0
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: MaxDeposits\s+.*yaml:"MAX_DEPOSITS" search: MaxDeposits\s+.*yaml:"MAX_DEPOSITS"
@@ -308,7 +329,7 @@
MAX_DEPOSITS = 16 MAX_DEPOSITS = 16
</spec> </spec>
- name: MAX_DEPOSIT_REQUESTS_PER_PAYLOAD - name: MAX_DEPOSIT_REQUESTS_PER_PAYLOAD#electra
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: MaxDepositRequestsPerPayload\s+.*yaml:"MAX_DEPOSIT_REQUESTS_PER_PAYLOAD" search: MaxDepositRequestsPerPayload\s+.*yaml:"MAX_DEPOSIT_REQUESTS_PER_PAYLOAD"
@@ -318,7 +339,7 @@
MAX_DEPOSIT_REQUESTS_PER_PAYLOAD: uint64 = 8192 MAX_DEPOSIT_REQUESTS_PER_PAYLOAD: uint64 = 8192
</spec> </spec>
- name: MAX_EFFECTIVE_BALANCE - name: MAX_EFFECTIVE_BALANCE#phase0
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: MaxEffectiveBalance\s+.*yaml:"MAX_EFFECTIVE_BALANCE" search: MaxEffectiveBalance\s+.*yaml:"MAX_EFFECTIVE_BALANCE"
@@ -328,7 +349,7 @@
MAX_EFFECTIVE_BALANCE: Gwei = 32000000000 MAX_EFFECTIVE_BALANCE: Gwei = 32000000000
</spec> </spec>
- name: MAX_EFFECTIVE_BALANCE_ELECTRA - name: MAX_EFFECTIVE_BALANCE_ELECTRA#electra
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: MaxEffectiveBalanceElectra\s+.*yaml:"MAX_EFFECTIVE_BALANCE_ELECTRA" search: MaxEffectiveBalanceElectra\s+.*yaml:"MAX_EFFECTIVE_BALANCE_ELECTRA"
@@ -338,7 +359,7 @@
MAX_EFFECTIVE_BALANCE_ELECTRA: Gwei = 2048000000000 MAX_EFFECTIVE_BALANCE_ELECTRA: Gwei = 2048000000000
</spec> </spec>
- name: MAX_EXTRA_DATA_BYTES - name: MAX_EXTRA_DATA_BYTES#bellatrix
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: MaxExtraDataBytes\s+.*yaml:"MAX_EXTRA_DATA_BYTES" search: MaxExtraDataBytes\s+.*yaml:"MAX_EXTRA_DATA_BYTES"
@@ -348,7 +369,14 @@
MAX_EXTRA_DATA_BYTES = 32 MAX_EXTRA_DATA_BYTES = 32
</spec> </spec>
- name: MAX_PENDING_DEPOSITS_PER_EPOCH - name: MAX_PAYLOAD_ATTESTATIONS#gloas
sources: []
spec: |
<spec preset_var="MAX_PAYLOAD_ATTESTATIONS" fork="gloas" hash="fc24e7ea">
MAX_PAYLOAD_ATTESTATIONS = 4
</spec>
- name: MAX_PENDING_DEPOSITS_PER_EPOCH#electra
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: MaxPendingDepositsPerEpoch\s+.*yaml:"MAX_PENDING_DEPOSITS_PER_EPOCH" search: MaxPendingDepositsPerEpoch\s+.*yaml:"MAX_PENDING_DEPOSITS_PER_EPOCH"
@@ -358,7 +386,7 @@
MAX_PENDING_DEPOSITS_PER_EPOCH: uint64 = 16 MAX_PENDING_DEPOSITS_PER_EPOCH: uint64 = 16
</spec> </spec>
- name: MAX_PENDING_PARTIALS_PER_WITHDRAWALS_SWEEP - name: MAX_PENDING_PARTIALS_PER_WITHDRAWALS_SWEEP#electra
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: MaxPendingPartialsPerWithdrawalsSweep\s+.*yaml:"MAX_PENDING_PARTIALS_PER_WITHDRAWALS_SWEEP" search: MaxPendingPartialsPerWithdrawalsSweep\s+.*yaml:"MAX_PENDING_PARTIALS_PER_WITHDRAWALS_SWEEP"
@@ -368,7 +396,7 @@
MAX_PENDING_PARTIALS_PER_WITHDRAWALS_SWEEP: uint64 = 8 MAX_PENDING_PARTIALS_PER_WITHDRAWALS_SWEEP: uint64 = 8
</spec> </spec>
- name: MAX_PROPOSER_SLASHINGS - name: MAX_PROPOSER_SLASHINGS#phase0
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: MaxProposerSlashings\s+.*yaml:"MAX_PROPOSER_SLASHINGS" search: MaxProposerSlashings\s+.*yaml:"MAX_PROPOSER_SLASHINGS"
@@ -378,7 +406,7 @@
MAX_PROPOSER_SLASHINGS = 16 MAX_PROPOSER_SLASHINGS = 16
</spec> </spec>
- name: MAX_SEED_LOOKAHEAD - name: MAX_SEED_LOOKAHEAD#phase0
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: MaxSeedLookahead\s+.*yaml:"MAX_SEED_LOOKAHEAD" search: MaxSeedLookahead\s+.*yaml:"MAX_SEED_LOOKAHEAD"
@@ -388,7 +416,7 @@
MAX_SEED_LOOKAHEAD: uint64 = 4 MAX_SEED_LOOKAHEAD: uint64 = 4
</spec> </spec>
- name: MAX_TRANSACTIONS_PER_PAYLOAD - name: MAX_TRANSACTIONS_PER_PAYLOAD#bellatrix
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: MaxTransactionsPerPayload\s+.*yaml:"MAX_TRANSACTIONS_PER_PAYLOAD" search: MaxTransactionsPerPayload\s+.*yaml:"MAX_TRANSACTIONS_PER_PAYLOAD"
@@ -418,7 +446,7 @@
MAX_VALIDATORS_PER_COMMITTEE: uint64 = 2048 MAX_VALIDATORS_PER_COMMITTEE: uint64 = 2048
</spec> </spec>
- name: MAX_VALIDATORS_PER_WITHDRAWALS_SWEEP - name: MAX_VALIDATORS_PER_WITHDRAWALS_SWEEP#capella
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: MaxValidatorsPerWithdrawalsSweep\s+.*yaml:"MAX_VALIDATORS_PER_WITHDRAWALS_SWEEP" search: MaxValidatorsPerWithdrawalsSweep\s+.*yaml:"MAX_VALIDATORS_PER_WITHDRAWALS_SWEEP"
@@ -428,7 +456,7 @@
MAX_VALIDATORS_PER_WITHDRAWALS_SWEEP = 16384 MAX_VALIDATORS_PER_WITHDRAWALS_SWEEP = 16384
</spec> </spec>
- name: MAX_VOLUNTARY_EXITS - name: MAX_VOLUNTARY_EXITS#phase0
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: MaxVoluntaryExits\s+.*yaml:"MAX_VOLUNTARY_EXITS" search: MaxVoluntaryExits\s+.*yaml:"MAX_VOLUNTARY_EXITS"
@@ -438,7 +466,7 @@
MAX_VOLUNTARY_EXITS = 16 MAX_VOLUNTARY_EXITS = 16
</spec> </spec>
- name: MAX_WITHDRAWALS_PER_PAYLOAD - name: MAX_WITHDRAWALS_PER_PAYLOAD#capella
sources: sources:
- file: config/fieldparams/mainnet.go - file: config/fieldparams/mainnet.go
search: MaxWithdrawalsPerPayload\s*= search: MaxWithdrawalsPerPayload\s*=
@@ -448,7 +476,7 @@
MAX_WITHDRAWALS_PER_PAYLOAD: uint64 = 16 MAX_WITHDRAWALS_PER_PAYLOAD: uint64 = 16
</spec> </spec>
- name: MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD - name: MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD#electra
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: MaxWithdrawalRequestsPerPayload\s+.*yaml:"MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD" search: MaxWithdrawalRequestsPerPayload\s+.*yaml:"MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD"
@@ -458,7 +486,7 @@
MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD: uint64 = 16 MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD: uint64 = 16
</spec> </spec>
- name: MIN_ACTIVATION_BALANCE - name: MIN_ACTIVATION_BALANCE#electra
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: MinActivationBalance\s+.*yaml:"MIN_ACTIVATION_BALANCE" search: MinActivationBalance\s+.*yaml:"MIN_ACTIVATION_BALANCE"
@@ -468,7 +496,7 @@
MIN_ACTIVATION_BALANCE: Gwei = 32000000000 MIN_ACTIVATION_BALANCE: Gwei = 32000000000
</spec> </spec>
- name: MIN_ATTESTATION_INCLUSION_DELAY - name: MIN_ATTESTATION_INCLUSION_DELAY#phase0
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: MinAttestationInclusionDelay\s+.*yaml:"MIN_ATTESTATION_INCLUSION_DELAY" search: MinAttestationInclusionDelay\s+.*yaml:"MIN_ATTESTATION_INCLUSION_DELAY"
@@ -478,7 +506,7 @@
MIN_ATTESTATION_INCLUSION_DELAY: uint64 = 1 MIN_ATTESTATION_INCLUSION_DELAY: uint64 = 1
</spec> </spec>
- name: MIN_DEPOSIT_AMOUNT - name: MIN_DEPOSIT_AMOUNT#phase0
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: MinDepositAmount\s+.*yaml:"MIN_DEPOSIT_AMOUNT" search: MinDepositAmount\s+.*yaml:"MIN_DEPOSIT_AMOUNT"
@@ -488,7 +516,7 @@
MIN_DEPOSIT_AMOUNT: Gwei = 1000000000 MIN_DEPOSIT_AMOUNT: Gwei = 1000000000
</spec> </spec>
- name: MIN_EPOCHS_TO_INACTIVITY_PENALTY - name: MIN_EPOCHS_TO_INACTIVITY_PENALTY#phase0
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: MinEpochsToInactivityPenalty\s+.*yaml:"MIN_EPOCHS_TO_INACTIVITY_PENALTY" search: MinEpochsToInactivityPenalty\s+.*yaml:"MIN_EPOCHS_TO_INACTIVITY_PENALTY"
@@ -498,7 +526,7 @@
MIN_EPOCHS_TO_INACTIVITY_PENALTY: uint64 = 4 MIN_EPOCHS_TO_INACTIVITY_PENALTY: uint64 = 4
</spec> </spec>
- name: MIN_SEED_LOOKAHEAD - name: MIN_SEED_LOOKAHEAD#phase0
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: MinSeedLookahead\s+.*yaml:"MIN_SEED_LOOKAHEAD" search: MinSeedLookahead\s+.*yaml:"MIN_SEED_LOOKAHEAD"
@@ -508,7 +536,7 @@
MIN_SEED_LOOKAHEAD: uint64 = 1 MIN_SEED_LOOKAHEAD: uint64 = 1
</spec> </spec>
- name: MIN_SLASHING_PENALTY_QUOTIENT - name: MIN_SLASHING_PENALTY_QUOTIENT#phase0
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: MinSlashingPenaltyQuotient\s+.*yaml:"MIN_SLASHING_PENALTY_QUOTIENT" search: MinSlashingPenaltyQuotient\s+.*yaml:"MIN_SLASHING_PENALTY_QUOTIENT"
@@ -518,7 +546,7 @@
MIN_SLASHING_PENALTY_QUOTIENT: uint64 = 128 MIN_SLASHING_PENALTY_QUOTIENT: uint64 = 128
</spec> </spec>
- name: MIN_SLASHING_PENALTY_QUOTIENT_ALTAIR - name: MIN_SLASHING_PENALTY_QUOTIENT_ALTAIR#altair
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: MinSlashingPenaltyQuotientAltair\s+.*yaml:"MIN_SLASHING_PENALTY_QUOTIENT_ALTAIR" search: MinSlashingPenaltyQuotientAltair\s+.*yaml:"MIN_SLASHING_PENALTY_QUOTIENT_ALTAIR"
@@ -528,7 +556,7 @@
MIN_SLASHING_PENALTY_QUOTIENT_ALTAIR: uint64 = 64 MIN_SLASHING_PENALTY_QUOTIENT_ALTAIR: uint64 = 64
</spec> </spec>
- name: MIN_SLASHING_PENALTY_QUOTIENT_BELLATRIX - name: MIN_SLASHING_PENALTY_QUOTIENT_BELLATRIX#bellatrix
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: MinSlashingPenaltyQuotientBellatrix\s+.*yaml:"MIN_SLASHING_PENALTY_QUOTIENT_BELLATRIX" search: MinSlashingPenaltyQuotientBellatrix\s+.*yaml:"MIN_SLASHING_PENALTY_QUOTIENT_BELLATRIX"
@@ -538,7 +566,7 @@
MIN_SLASHING_PENALTY_QUOTIENT_BELLATRIX: uint64 = 32 MIN_SLASHING_PENALTY_QUOTIENT_BELLATRIX: uint64 = 32
</spec> </spec>
- name: MIN_SLASHING_PENALTY_QUOTIENT_ELECTRA - name: MIN_SLASHING_PENALTY_QUOTIENT_ELECTRA#electra
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: MinSlashingPenaltyQuotientElectra\s+.*yaml:"MIN_SLASHING_PENALTY_QUOTIENT_ELECTRA" search: MinSlashingPenaltyQuotientElectra\s+.*yaml:"MIN_SLASHING_PENALTY_QUOTIENT_ELECTRA"
@@ -548,7 +576,7 @@
MIN_SLASHING_PENALTY_QUOTIENT_ELECTRA: uint64 = 4096 MIN_SLASHING_PENALTY_QUOTIENT_ELECTRA: uint64 = 4096
</spec> </spec>
- name: MIN_SYNC_COMMITTEE_PARTICIPANTS - name: MIN_SYNC_COMMITTEE_PARTICIPANTS#altair
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: MinSyncCommitteeParticipants\s+.*yaml:"MIN_SYNC_COMMITTEE_PARTICIPANTS" search: MinSyncCommitteeParticipants\s+.*yaml:"MIN_SYNC_COMMITTEE_PARTICIPANTS"
@@ -558,7 +586,7 @@
MIN_SYNC_COMMITTEE_PARTICIPANTS = 1 MIN_SYNC_COMMITTEE_PARTICIPANTS = 1
</spec> </spec>
- name: NUMBER_OF_COLUMNS - name: NUMBER_OF_COLUMNS#fulu
sources: sources:
- file: config/fieldparams/mainnet.go - file: config/fieldparams/mainnet.go
search: NumberOfColumns\s*= search: NumberOfColumns\s*=
@@ -568,7 +596,7 @@
NUMBER_OF_COLUMNS: uint64 = 128 NUMBER_OF_COLUMNS: uint64 = 128
</spec> </spec>
- name: PENDING_CONSOLIDATIONS_LIMIT - name: PENDING_CONSOLIDATIONS_LIMIT#electra
sources: sources:
- file: config/fieldparams/mainnet.go - file: config/fieldparams/mainnet.go
search: PendingConsolidationsLimit\s*= search: PendingConsolidationsLimit\s*=
@@ -578,7 +606,7 @@
PENDING_CONSOLIDATIONS_LIMIT: uint64 = 262144 PENDING_CONSOLIDATIONS_LIMIT: uint64 = 262144
</spec> </spec>
- name: PENDING_DEPOSITS_LIMIT - name: PENDING_DEPOSITS_LIMIT#electra
sources: sources:
- file: config/fieldparams/mainnet.go - file: config/fieldparams/mainnet.go
search: PendingDepositsLimit\s*= search: PendingDepositsLimit\s*=
@@ -588,7 +616,7 @@
PENDING_DEPOSITS_LIMIT: uint64 = 134217728 PENDING_DEPOSITS_LIMIT: uint64 = 134217728
</spec> </spec>
- name: PENDING_PARTIAL_WITHDRAWALS_LIMIT - name: PENDING_PARTIAL_WITHDRAWALS_LIMIT#electra
sources: sources:
- file: config/fieldparams/mainnet.go - file: config/fieldparams/mainnet.go
search: PendingPartialWithdrawalsLimit\s*= search: PendingPartialWithdrawalsLimit\s*=
@@ -598,7 +626,7 @@
PENDING_PARTIAL_WITHDRAWALS_LIMIT: uint64 = 134217728 PENDING_PARTIAL_WITHDRAWALS_LIMIT: uint64 = 134217728
</spec> </spec>
- name: PROPORTIONAL_SLASHING_MULTIPLIER - name: PROPORTIONAL_SLASHING_MULTIPLIER#phase0
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: ProportionalSlashingMultiplier\s+.*yaml:"PROPORTIONAL_SLASHING_MULTIPLIER" search: ProportionalSlashingMultiplier\s+.*yaml:"PROPORTIONAL_SLASHING_MULTIPLIER"
@@ -608,7 +636,7 @@
PROPORTIONAL_SLASHING_MULTIPLIER: uint64 = 1 PROPORTIONAL_SLASHING_MULTIPLIER: uint64 = 1
</spec> </spec>
- name: PROPORTIONAL_SLASHING_MULTIPLIER_ALTAIR - name: PROPORTIONAL_SLASHING_MULTIPLIER_ALTAIR#altair
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: ProportionalSlashingMultiplierAltair\s+.*yaml:"PROPORTIONAL_SLASHING_MULTIPLIER_ALTAIR" search: ProportionalSlashingMultiplierAltair\s+.*yaml:"PROPORTIONAL_SLASHING_MULTIPLIER_ALTAIR"
@@ -618,7 +646,7 @@
PROPORTIONAL_SLASHING_MULTIPLIER_ALTAIR: uint64 = 2 PROPORTIONAL_SLASHING_MULTIPLIER_ALTAIR: uint64 = 2
</spec> </spec>
- name: PROPORTIONAL_SLASHING_MULTIPLIER_BELLATRIX - name: PROPORTIONAL_SLASHING_MULTIPLIER_BELLATRIX#bellatrix
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: ProportionalSlashingMultiplierBellatrix\s+.*yaml:"PROPORTIONAL_SLASHING_MULTIPLIER_BELLATRIX" search: ProportionalSlashingMultiplierBellatrix\s+.*yaml:"PROPORTIONAL_SLASHING_MULTIPLIER_BELLATRIX"
@@ -628,7 +656,7 @@
PROPORTIONAL_SLASHING_MULTIPLIER_BELLATRIX: uint64 = 3 PROPORTIONAL_SLASHING_MULTIPLIER_BELLATRIX: uint64 = 3
</spec> </spec>
- name: PROPOSER_REWARD_QUOTIENT - name: PROPOSER_REWARD_QUOTIENT#phase0
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: ProposerRewardQuotient\s+.*yaml:"PROPOSER_REWARD_QUOTIENT" search: ProposerRewardQuotient\s+.*yaml:"PROPOSER_REWARD_QUOTIENT"
@@ -638,7 +666,14 @@
PROPOSER_REWARD_QUOTIENT: uint64 = 8 PROPOSER_REWARD_QUOTIENT: uint64 = 8
</spec> </spec>
- name: SHUFFLE_ROUND_COUNT - name: PTC_SIZE#gloas
sources: []
spec: |
<spec preset_var="PTC_SIZE" fork="gloas" hash="d61c5930">
PTC_SIZE: uint64 = 512
</spec>
- name: SHUFFLE_ROUND_COUNT#phase0
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: ShuffleRoundCount\s+.*yaml:"SHUFFLE_ROUND_COUNT" search: ShuffleRoundCount\s+.*yaml:"SHUFFLE_ROUND_COUNT"
@@ -648,7 +683,7 @@
SHUFFLE_ROUND_COUNT: uint64 = 90 SHUFFLE_ROUND_COUNT: uint64 = 90
</spec> </spec>
- name: SLOTS_PER_EPOCH - name: SLOTS_PER_EPOCH#phase0
sources: sources:
- file: config/fieldparams/mainnet.go - file: config/fieldparams/mainnet.go
search: SlotsPerEpoch\s*= search: SlotsPerEpoch\s*=
@@ -658,7 +693,7 @@
SLOTS_PER_EPOCH: uint64 = 32 SLOTS_PER_EPOCH: uint64 = 32
</spec> </spec>
- name: SLOTS_PER_HISTORICAL_ROOT - name: SLOTS_PER_HISTORICAL_ROOT#phase0
sources: sources:
- file: config/fieldparams/mainnet.go - file: config/fieldparams/mainnet.go
search: BlockRootsLength\s*= search: BlockRootsLength\s*=
@@ -668,7 +703,7 @@
SLOTS_PER_HISTORICAL_ROOT: uint64 = 8192 SLOTS_PER_HISTORICAL_ROOT: uint64 = 8192
</spec> </spec>
- name: SYNC_COMMITTEE_SIZE - name: SYNC_COMMITTEE_SIZE#altair
sources: sources:
- file: config/fieldparams/mainnet.go - file: config/fieldparams/mainnet.go
search: SyncCommitteeLength\s*= search: SyncCommitteeLength\s*=
@@ -678,7 +713,7 @@
SYNC_COMMITTEE_SIZE: uint64 = 512 SYNC_COMMITTEE_SIZE: uint64 = 512
</spec> </spec>
- name: TARGET_COMMITTEE_SIZE - name: TARGET_COMMITTEE_SIZE#phase0
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: TargetCommitteeSize\s+.*yaml:"TARGET_COMMITTEE_SIZE" search: TargetCommitteeSize\s+.*yaml:"TARGET_COMMITTEE_SIZE"
@@ -688,7 +723,7 @@
TARGET_COMMITTEE_SIZE: uint64 = 128 TARGET_COMMITTEE_SIZE: uint64 = 128
</spec> </spec>
- name: UPDATE_TIMEOUT - name: UPDATE_TIMEOUT#altair
sources: sources:
- file: beacon-chain/rpc/eth/config/handlers.go - file: beacon-chain/rpc/eth/config/handlers.go
search: data\["UPDATE_TIMEOUT"\] search: data\["UPDATE_TIMEOUT"\]
@@ -698,7 +733,7 @@
UPDATE_TIMEOUT = 8192 UPDATE_TIMEOUT = 8192
</spec> </spec>
- name: VALIDATOR_REGISTRY_LIMIT - name: VALIDATOR_REGISTRY_LIMIT#phase0
sources: sources:
- file: config/fieldparams/mainnet.go - file: config/fieldparams/mainnet.go
search: ValidatorRegistryLimit\s*= search: ValidatorRegistryLimit\s*=
@@ -708,7 +743,7 @@
VALIDATOR_REGISTRY_LIMIT: uint64 = 1099511627776 VALIDATOR_REGISTRY_LIMIT: uint64 = 1099511627776
</spec> </spec>
- name: WHISTLEBLOWER_REWARD_QUOTIENT - name: WHISTLEBLOWER_REWARD_QUOTIENT#phase0
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: WhistleBlowerRewardQuotient\s+.*yaml:"WHISTLEBLOWER_REWARD_QUOTIENT" search: WhistleBlowerRewardQuotient\s+.*yaml:"WHISTLEBLOWER_REWARD_QUOTIENT"
@@ -718,7 +753,7 @@
WHISTLEBLOWER_REWARD_QUOTIENT: uint64 = 512 WHISTLEBLOWER_REWARD_QUOTIENT: uint64 = 512
</spec> </spec>
- name: WHISTLEBLOWER_REWARD_QUOTIENT_ELECTRA - name: WHISTLEBLOWER_REWARD_QUOTIENT_ELECTRA#electra
sources: sources:
- file: config/params/config.go - file: config/params/config.go
search: WhistleBlowerRewardQuotientElectra\s+.*yaml:"WHISTLEBLOWER_REWARD_QUOTIENT_ELECTRA" search: WhistleBlowerRewardQuotientElectra\s+.*yaml:"WHISTLEBLOWER_REWARD_QUOTIENT_ELECTRA"

View File

@@ -8,7 +8,9 @@ import (
"github.com/OffchainLabs/prysm/v7/beacon-chain/core/gloas" "github.com/OffchainLabs/prysm/v7/beacon-chain/core/gloas"
"github.com/OffchainLabs/prysm/v7/beacon-chain/core/helpers" "github.com/OffchainLabs/prysm/v7/beacon-chain/core/helpers"
"github.com/OffchainLabs/prysm/v7/beacon-chain/state" "github.com/OffchainLabs/prysm/v7/beacon-chain/state"
"github.com/OffchainLabs/prysm/v7/config/params"
"github.com/OffchainLabs/prysm/v7/consensus-types/interfaces" "github.com/OffchainLabs/prysm/v7/consensus-types/interfaces"
"github.com/OffchainLabs/prysm/v7/runtime/version"
"github.com/OffchainLabs/prysm/v7/testing/require" "github.com/OffchainLabs/prysm/v7/testing/require"
"github.com/OffchainLabs/prysm/v7/testing/spectest/utils" "github.com/OffchainLabs/prysm/v7/testing/spectest/utils"
"github.com/OffchainLabs/prysm/v7/testing/util" "github.com/OffchainLabs/prysm/v7/testing/util"
@@ -17,6 +19,9 @@ import (
func runExecutionPayloadBidTest(t *testing.T, config string, fork string, objName string, block blockWithSSZObject, sszToState SSZToState, operationFn BlockOperation) { func runExecutionPayloadBidTest(t *testing.T, config string, fork string, objName string, block blockWithSSZObject, sszToState SSZToState, operationFn BlockOperation) {
require.NoError(t, utils.SetConfig(t, config)) require.NoError(t, utils.SetConfig(t, config))
cfg := params.BeaconConfig()
params.SetGenesisFork(t, cfg, version.Fulu)
testFolders, testsFolderPath := utils.TestFolders(t, config, fork, "operations/"+objName+"/pyspec_tests") testFolders, testsFolderPath := utils.TestFolders(t, config, fork, "operations/"+objName+"/pyspec_tests")
if len(testFolders) == 0 { if len(testFolders) == 0 {
t.Fatalf("No test folders found for %s/%s/%s", config, fork, "operations/"+objName+"/pyspec_tests") t.Fatalf("No test folders found for %s/%s/%s", config, fork, "operations/"+objName+"/pyspec_tests")

View File

@@ -1568,8 +1568,8 @@ func HydrateExecutionPayloadBid(b *ethpb.ExecutionPayloadBid) *ethpb.ExecutionPa
if b.FeeRecipient == nil { if b.FeeRecipient == nil {
b.FeeRecipient = make([]byte, fieldparams.FeeRecipientLength) b.FeeRecipient = make([]byte, fieldparams.FeeRecipientLength)
} }
if b.BlobKzgCommitmentsRoot == nil { if b.BlobKzgCommitments == nil {
b.BlobKzgCommitmentsRoot = make([]byte, fieldparams.RootLength) b.BlobKzgCommitments = make([][]byte, 0)
} }
return b return b
} }
@@ -1636,21 +1636,22 @@ func GenerateTestSignedExecutionPayloadBid(slot primitives.Slot) *ethpb.SignedEx
blockHash := bytesutil.PadTo([]byte{0x03}, fieldparams.RootLength) blockHash := bytesutil.PadTo([]byte{0x03}, fieldparams.RootLength)
prevRandao := bytesutil.PadTo([]byte{0x04}, fieldparams.RootLength) prevRandao := bytesutil.PadTo([]byte{0x04}, fieldparams.RootLength)
feeRecipient := bytesutil.PadTo([]byte{0x05}, fieldparams.FeeRecipientLength) feeRecipient := bytesutil.PadTo([]byte{0x05}, fieldparams.FeeRecipientLength)
blobKzgRoot := bytesutil.PadTo([]byte{0x06}, fieldparams.RootLength) blobKzgCommitment := bytesutil.PadTo([]byte{0x06}, fieldparams.BLSPubkeyLength)
signature := bytesutil.PadTo([]byte{0x07}, fieldparams.BLSSignatureLength) signature := bytesutil.PadTo([]byte{0x07}, fieldparams.BLSSignatureLength)
return &ethpb.SignedExecutionPayloadBid{ return &ethpb.SignedExecutionPayloadBid{
Message: &ethpb.ExecutionPayloadBid{ Message: &ethpb.ExecutionPayloadBid{
Slot: slot, Slot: slot,
BuilderIndex: 1, BuilderIndex: 1,
ParentBlockHash: parentBlockHash, ParentBlockHash: parentBlockHash,
ParentBlockRoot: parentBlockRoot, ParentBlockRoot: parentBlockRoot,
BlockHash: blockHash, BlockHash: blockHash,
GasLimit: 30000000, GasLimit: 30000000,
PrevRandao: prevRandao, PrevRandao: prevRandao,
FeeRecipient: feeRecipient, FeeRecipient: feeRecipient,
Value: 1000000, Value: 1000000,
BlobKzgCommitmentsRoot: blobKzgRoot, ExecutionPayment: 2000000,
BlobKzgCommitments: [][]byte{blobKzgCommitment},
}, },
Signature: signature, Signature: signature,
} }

View File

@@ -413,6 +413,7 @@ func TestGenerateTestSignedExecutionPayloadBid(t *testing.T) {
require.Equal(t, primitives.BuilderIndex(1), bid.Message.BuilderIndex) require.Equal(t, primitives.BuilderIndex(1), bid.Message.BuilderIndex)
require.Equal(t, uint64(30000000), bid.Message.GasLimit) require.Equal(t, uint64(30000000), bid.Message.GasLimit)
require.Equal(t, primitives.Gwei(1000000), bid.Message.Value) require.Equal(t, primitives.Gwei(1000000), bid.Message.Value)
require.Equal(t, primitives.Gwei(2000000), bid.Message.ExecutionPayment)
// Verify fields are populated // Verify fields are populated
require.NotNil(t, bid.Message.ParentBlockHash) require.NotNil(t, bid.Message.ParentBlockHash)
@@ -420,7 +421,8 @@ func TestGenerateTestSignedExecutionPayloadBid(t *testing.T) {
require.NotNil(t, bid.Message.BlockHash) require.NotNil(t, bid.Message.BlockHash)
require.NotNil(t, bid.Message.PrevRandao) require.NotNil(t, bid.Message.PrevRandao)
require.NotNil(t, bid.Message.FeeRecipient) require.NotNil(t, bid.Message.FeeRecipient)
require.NotNil(t, bid.Message.BlobKzgCommitmentsRoot) require.NotNil(t, bid.Message.BlobKzgCommitments)
require.Equal(t, 1, len(bid.Message.BlobKzgCommitments))
// Verify HashTreeRoot works // Verify HashTreeRoot works
_, err := bid.HashTreeRoot() _, err := bid.HashTreeRoot()

View File

@@ -559,12 +559,12 @@ func NewBeaconStateGloas(options ...func(state *ethpb.BeaconStateGloas) error) (
}, },
ProposerLookahead: make([]uint64, 64), ProposerLookahead: make([]uint64, 64),
LatestExecutionPayloadBid: &ethpb.ExecutionPayloadBid{ LatestExecutionPayloadBid: &ethpb.ExecutionPayloadBid{
ParentBlockHash: make([]byte, 32), ParentBlockHash: make([]byte, 32),
ParentBlockRoot: make([]byte, 32), ParentBlockRoot: make([]byte, 32),
BlockHash: make([]byte, 32), BlockHash: make([]byte, 32),
PrevRandao: make([]byte, 32), PrevRandao: make([]byte, 32),
FeeRecipient: make([]byte, 20), FeeRecipient: make([]byte, 20),
BlobKzgCommitmentsRoot: make([]byte, 32), BlobKzgCommitments: [][]byte{make([]byte, 48)},
}, },
Builders: make([]*ethpb.Builder, 0), Builders: make([]*ethpb.Builder, 0),
ExecutionPayloadAvailability: make([]byte, 1024), ExecutionPayloadAvailability: make([]byte, 1024),

View File

@@ -283,16 +283,18 @@ func (mr *MockValidatorClientMockRecorder) ProposeExit(ctx, in any) *gomock.Call
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ProposeExit", reflect.TypeOf((*MockValidatorClient)(nil).ProposeExit), ctx, in) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ProposeExit", reflect.TypeOf((*MockValidatorClient)(nil).ProposeExit), ctx, in)
} }
// SwitchHost mocks base method. // EnsureReady mocks base method.
func (m *MockValidatorClient) SwitchHost(host string) { func (m *MockValidatorClient) EnsureReady(ctx context.Context) bool {
m.ctrl.T.Helper() m.ctrl.T.Helper()
m.ctrl.Call(m, "SwitchHost", host) ret := m.ctrl.Call(m, "EnsureReady", ctx)
ret0, _ := ret[0].(bool)
return ret0
} }
// SwitchHost indicates an expected call of SwitchHost. // EnsureReady indicates an expected call of EnsureReady.
func (mr *MockValidatorClientMockRecorder) SwitchHost(host any) *gomock.Call { func (mr *MockValidatorClientMockRecorder) EnsureReady(ctx any) *gomock.Call {
mr.mock.ctrl.T.Helper() mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SwitchHost", reflect.TypeOf((*MockValidatorClient)(nil).SwitchHost), host) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EnsureReady", reflect.TypeOf((*MockValidatorClient)(nil).EnsureReady), ctx)
} }
// StartEventStream mocks base method. // StartEventStream mocks base method.

View File

@@ -128,18 +128,18 @@ func (mr *MockValidatorMockRecorder) EventsChan() *gomock.Call {
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EventsChan", reflect.TypeOf((*MockValidator)(nil).EventsChan)) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EventsChan", reflect.TypeOf((*MockValidator)(nil).EventsChan))
} }
// FindHealthyHost mocks base method. // EnsureReady mocks base method.
func (m *MockValidator) FindHealthyHost(arg0 context.Context) bool { func (m *MockValidator) EnsureReady(arg0 context.Context) bool {
m.ctrl.T.Helper() m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "FindHealthyHost", arg0) ret := m.ctrl.Call(m, "EnsureReady", arg0)
ret0, _ := ret[0].(bool) ret0, _ := ret[0].(bool)
return ret0 return ret0
} }
// FindHealthyHost indicates an expected call of FindHealthyHost. // EnsureReady indicates an expected call of EnsureReady.
func (mr *MockValidatorMockRecorder) FindHealthyHost(arg0 any) *gomock.Call { func (mr *MockValidatorMockRecorder) EnsureReady(arg0 any) *gomock.Call {
mr.mock.ctrl.T.Helper() mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FindHealthyHost", reflect.TypeOf((*MockValidator)(nil).FindHealthyHost), arg0) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EnsureReady", reflect.TypeOf((*MockValidator)(nil).EnsureReady), arg0)
} }
// GenesisTime mocks base method. // GenesisTime mocks base method.

View File

@@ -122,7 +122,6 @@ go_test(
embed = [":go_default_library"], embed = [":go_default_library"],
deps = [ deps = [
"//api/grpc:go_default_library", "//api/grpc:go_default_library",
"//api/rest:go_default_library",
"//api/server/structs:go_default_library", "//api/server/structs:go_default_library",
"//async/event:go_default_library", "//async/event:go_default_library",
"//beacon-chain/core/signing:go_default_library", "//beacon-chain/core/signing:go_default_library",

View File

@@ -42,6 +42,7 @@ go_library(
"//api:go_default_library", "//api:go_default_library",
"//api/apiutil:go_default_library", "//api/apiutil:go_default_library",
"//api/client/event:go_default_library", "//api/client/event:go_default_library",
"//api/fallback:go_default_library",
"//api/rest:go_default_library", "//api/rest:go_default_library",
"//api/server/structs:go_default_library", "//api/server/structs:go_default_library",
"//beacon-chain/core/helpers:go_default_library", "//beacon-chain/core/helpers:go_default_library",

View File

@@ -26,7 +26,7 @@ func (c *beaconApiValidatorClient) attestationData(
query := apiutil.BuildURL("/eth/v1/validator/attestation_data", params) query := apiutil.BuildURL("/eth/v1/validator/attestation_data", params)
produceAttestationDataResponseJson := structs.GetAttestationDataResponse{} produceAttestationDataResponseJson := structs.GetAttestationDataResponse{}
if err := c.jsonRestHandler.Get(ctx, query, &produceAttestationDataResponseJson); err != nil { if err := c.handler.Get(ctx, query, &produceAttestationDataResponseJson); err != nil {
return nil, err return nil, err
} }

View File

@@ -28,10 +28,10 @@ func TestGetAttestationData_ValidAttestation(t *testing.T) {
ctrl := gomock.NewController(t) ctrl := gomock.NewController(t)
defer ctrl.Finish() defer ctrl.Finish()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
produceAttestationDataResponseJson := structs.GetAttestationDataResponse{} produceAttestationDataResponseJson := structs.GetAttestationDataResponse{}
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
fmt.Sprintf("/eth/v1/validator/attestation_data?committee_index=%d&slot=%d", expectedCommitteeIndex, expectedSlot), fmt.Sprintf("/eth/v1/validator/attestation_data?committee_index=%d&slot=%d", expectedCommitteeIndex, expectedSlot),
&produceAttestationDataResponseJson, &produceAttestationDataResponseJson,
@@ -56,7 +56,7 @@ func TestGetAttestationData_ValidAttestation(t *testing.T) {
}, },
).Times(1) ).Times(1)
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
resp, err := validatorClient.attestationData(ctx, primitives.Slot(expectedSlot), primitives.CommitteeIndex(expectedCommitteeIndex)) resp, err := validatorClient.attestationData(ctx, primitives.Slot(expectedSlot), primitives.CommitteeIndex(expectedCommitteeIndex))
assert.NoError(t, err) assert.NoError(t, err)
@@ -180,8 +180,8 @@ func TestGetAttestationData_InvalidData(t *testing.T) {
defer ctrl.Finish() defer ctrl.Finish()
produceAttestationDataResponseJson := structs.GetAttestationDataResponse{} produceAttestationDataResponseJson := structs.GetAttestationDataResponse{}
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
"/eth/v1/validator/attestation_data?committee_index=2&slot=1", "/eth/v1/validator/attestation_data?committee_index=2&slot=1",
&produceAttestationDataResponseJson, &produceAttestationDataResponseJson,
@@ -192,7 +192,7 @@ func TestGetAttestationData_InvalidData(t *testing.T) {
testCase.generateData(), testCase.generateData(),
).Times(1) ).Times(1)
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
_, err := validatorClient.attestationData(ctx, 1, 2) _, err := validatorClient.attestationData(ctx, 1, 2)
assert.ErrorContains(t, testCase.expectedErrorMessage, err) assert.ErrorContains(t, testCase.expectedErrorMessage, err)
}) })
@@ -208,9 +208,9 @@ func TestGetAttestationData_JsonResponseError(t *testing.T) {
ctrl := gomock.NewController(t) ctrl := gomock.NewController(t)
defer ctrl.Finish() defer ctrl.Finish()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
produceAttestationDataResponseJson := structs.GetAttestationDataResponse{} produceAttestationDataResponseJson := structs.GetAttestationDataResponse{}
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
fmt.Sprintf("/eth/v1/validator/attestation_data?committee_index=%d&slot=%d", committeeIndex, slot), fmt.Sprintf("/eth/v1/validator/attestation_data?committee_index=%d&slot=%d", committeeIndex, slot),
&produceAttestationDataResponseJson, &produceAttestationDataResponseJson,
@@ -218,7 +218,7 @@ func TestGetAttestationData_JsonResponseError(t *testing.T) {
errors.New("some specific json response error"), errors.New("some specific json response error"),
).Times(1) ).Times(1)
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
_, err := validatorClient.attestationData(ctx, slot, committeeIndex) _, err := validatorClient.attestationData(ctx, slot, committeeIndex)
assert.ErrorContains(t, "some specific json response error", err) assert.ErrorContains(t, "some specific json response error", err)
} }

View File

@@ -18,13 +18,13 @@ import (
type beaconApiChainClient struct { type beaconApiChainClient struct {
fallbackClient iface.ChainClient fallbackClient iface.ChainClient
jsonRestHandler rest.RestHandler handler rest.Handler
stateValidatorsProvider StateValidatorsProvider stateValidatorsProvider StateValidatorsProvider
} }
func (c beaconApiChainClient) headBlockHeaders(ctx context.Context) (*structs.GetBlockHeaderResponse, error) { func (c beaconApiChainClient) headBlockHeaders(ctx context.Context) (*structs.GetBlockHeaderResponse, error) {
blockHeader := structs.GetBlockHeaderResponse{} blockHeader := structs.GetBlockHeaderResponse{}
err := c.jsonRestHandler.Get(ctx, "/eth/v1/beacon/headers/head", &blockHeader) err := c.handler.Get(ctx, "/eth/v1/beacon/headers/head", &blockHeader)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -44,7 +44,7 @@ func (c beaconApiChainClient) ChainHead(ctx context.Context, _ *empty.Empty) (*e
const endpoint = "/eth/v1/beacon/states/head/finality_checkpoints" const endpoint = "/eth/v1/beacon/states/head/finality_checkpoints"
finalityCheckpoints := structs.GetFinalityCheckpointsResponse{} finalityCheckpoints := structs.GetFinalityCheckpointsResponse{}
if err := c.jsonRestHandler.Get(ctx, endpoint, &finalityCheckpoints); err != nil { if err := c.handler.Get(ctx, endpoint, &finalityCheckpoints); err != nil {
return nil, err return nil, err
} }
@@ -328,10 +328,10 @@ func (c beaconApiChainClient) ValidatorParticipation(ctx context.Context, in *et
return nil, errors.New("beaconApiChainClient.ValidatorParticipation is not implemented. To use a fallback client, pass a fallback client as the last argument of NewBeaconApiChainClientWithFallback.") return nil, errors.New("beaconApiChainClient.ValidatorParticipation is not implemented. To use a fallback client, pass a fallback client as the last argument of NewBeaconApiChainClientWithFallback.")
} }
func NewBeaconApiChainClientWithFallback(jsonRestHandler rest.RestHandler, fallbackClient iface.ChainClient) iface.ChainClient { func NewBeaconApiChainClientWithFallback(handler rest.Handler, fallbackClient iface.ChainClient) iface.ChainClient {
return &beaconApiChainClient{ return &beaconApiChainClient{
jsonRestHandler: jsonRestHandler, handler: handler,
fallbackClient: fallbackClient, fallbackClient: fallbackClient,
stateValidatorsProvider: beaconApiStateValidatorsProvider{jsonRestHandler: jsonRestHandler}, stateValidatorsProvider: beaconApiStateValidatorsProvider{handler: handler},
} }
} }

View File

@@ -115,12 +115,12 @@ func TestListValidators(t *testing.T) {
nil, nil,
) )
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Get(gomock.Any(), blockHeaderEndpoint, gomock.Any()).Return(errors.New("bar error")) handler.EXPECT().Get(gomock.Any(), blockHeaderEndpoint, gomock.Any()).Return(errors.New("bar error"))
beaconChainClient := beaconApiChainClient{ beaconChainClient := beaconApiChainClient{
stateValidatorsProvider: stateValidatorsProvider, stateValidatorsProvider: stateValidatorsProvider,
jsonRestHandler: jsonRestHandler, handler: handler,
} }
_, err := beaconChainClient.Validators(ctx, &ethpb.ListValidatorsRequest{ _, err := beaconChainClient.Validators(ctx, &ethpb.ListValidatorsRequest{
QueryFilter: nil, QueryFilter: nil,
@@ -188,8 +188,8 @@ func TestListValidators(t *testing.T) {
nil, nil,
) )
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Get(gomock.Any(), blockHeaderEndpoint, gomock.Any()).Return( handler.EXPECT().Get(gomock.Any(), blockHeaderEndpoint, gomock.Any()).Return(
nil, nil,
).SetArg( ).SetArg(
2, 2,
@@ -198,7 +198,7 @@ func TestListValidators(t *testing.T) {
beaconChainClient := beaconApiChainClient{ beaconChainClient := beaconApiChainClient{
stateValidatorsProvider: stateValidatorsProvider, stateValidatorsProvider: stateValidatorsProvider,
jsonRestHandler: jsonRestHandler, handler: handler,
} }
_, err := beaconChainClient.Validators(ctx, &ethpb.ListValidatorsRequest{ _, err := beaconChainClient.Validators(ctx, &ethpb.ListValidatorsRequest{
QueryFilter: nil, QueryFilter: nil,
@@ -740,15 +740,15 @@ func TestGetChainHead(t *testing.T) {
ctx := t.Context() ctx := t.Context()
finalityCheckpointsResponse := structs.GetFinalityCheckpointsResponse{} finalityCheckpointsResponse := structs.GetFinalityCheckpointsResponse{}
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Get(gomock.Any(), finalityCheckpointsEndpoint, &finalityCheckpointsResponse).Return( handler.EXPECT().Get(gomock.Any(), finalityCheckpointsEndpoint, &finalityCheckpointsResponse).Return(
testCase.finalityCheckpointsError, testCase.finalityCheckpointsError,
).SetArg( ).SetArg(
2, 2,
testCase.generateFinalityCheckpointsResponse(), testCase.generateFinalityCheckpointsResponse(),
) )
beaconChainClient := beaconApiChainClient{jsonRestHandler: jsonRestHandler} beaconChainClient := beaconApiChainClient{handler: handler}
_, err := beaconChainClient.ChainHead(ctx, &emptypb.Empty{}) _, err := beaconChainClient.ChainHead(ctx, &emptypb.Empty{})
assert.ErrorContains(t, testCase.expectedError, err) assert.ErrorContains(t, testCase.expectedError, err)
}) })
@@ -837,10 +837,10 @@ func TestGetChainHead(t *testing.T) {
defer ctrl.Finish() defer ctrl.Finish()
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
finalityCheckpointsResponse := structs.GetFinalityCheckpointsResponse{} finalityCheckpointsResponse := structs.GetFinalityCheckpointsResponse{}
jsonRestHandler.EXPECT().Get(gomock.Any(), finalityCheckpointsEndpoint, &finalityCheckpointsResponse).Return( handler.EXPECT().Get(gomock.Any(), finalityCheckpointsEndpoint, &finalityCheckpointsResponse).Return(
nil, nil,
).SetArg( ).SetArg(
2, 2,
@@ -848,14 +848,14 @@ func TestGetChainHead(t *testing.T) {
) )
headBlockHeadersResponse := structs.GetBlockHeaderResponse{} headBlockHeadersResponse := structs.GetBlockHeaderResponse{}
jsonRestHandler.EXPECT().Get(gomock.Any(), headBlockHeadersEndpoint, &headBlockHeadersResponse).Return( handler.EXPECT().Get(gomock.Any(), headBlockHeadersEndpoint, &headBlockHeadersResponse).Return(
testCase.headBlockHeadersError, testCase.headBlockHeadersError,
).SetArg( ).SetArg(
2, 2,
testCase.generateHeadBlockHeadersResponse(), testCase.generateHeadBlockHeadersResponse(),
) )
beaconChainClient := beaconApiChainClient{jsonRestHandler: jsonRestHandler} beaconChainClient := beaconApiChainClient{handler: handler}
_, err := beaconChainClient.ChainHead(ctx, &emptypb.Empty{}) _, err := beaconChainClient.ChainHead(ctx, &emptypb.Empty{})
assert.ErrorContains(t, testCase.expectedError, err) assert.ErrorContains(t, testCase.expectedError, err)
}) })
@@ -867,10 +867,10 @@ func TestGetChainHead(t *testing.T) {
defer ctrl.Finish() defer ctrl.Finish()
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
finalityCheckpointsResponse := structs.GetFinalityCheckpointsResponse{} finalityCheckpointsResponse := structs.GetFinalityCheckpointsResponse{}
jsonRestHandler.EXPECT().Get(gomock.Any(), finalityCheckpointsEndpoint, &finalityCheckpointsResponse).Return( handler.EXPECT().Get(gomock.Any(), finalityCheckpointsEndpoint, &finalityCheckpointsResponse).Return(
nil, nil,
).SetArg( ).SetArg(
2, 2,
@@ -878,7 +878,7 @@ func TestGetChainHead(t *testing.T) {
) )
headBlockHeadersResponse := structs.GetBlockHeaderResponse{} headBlockHeadersResponse := structs.GetBlockHeaderResponse{}
jsonRestHandler.EXPECT().Get(gomock.Any(), headBlockHeadersEndpoint, &headBlockHeadersResponse).Return( handler.EXPECT().Get(gomock.Any(), headBlockHeadersEndpoint, &headBlockHeadersResponse).Return(
nil, nil,
).SetArg( ).SetArg(
2, 2,
@@ -909,7 +909,7 @@ func TestGetChainHead(t *testing.T) {
HeadEpoch: slots.ToEpoch(8), HeadEpoch: slots.ToEpoch(8),
} }
beaconChainClient := beaconApiChainClient{jsonRestHandler: jsonRestHandler} beaconChainClient := beaconApiChainClient{handler: handler}
chainHead, err := beaconChainClient.ChainHead(ctx, &emptypb.Empty{}) chainHead, err := beaconChainClient.ChainHead(ctx, &emptypb.Empty{})
require.NoError(t, err) require.NoError(t, err)
assert.DeepEqual(t, expectedChainHead, chainHead) assert.DeepEqual(t, expectedChainHead, chainHead)

View File

@@ -29,7 +29,7 @@ func (c *beaconApiValidatorClient) fork(ctx context.Context) (*structs.GetStateF
stateForkResponseJson := &structs.GetStateForkResponse{} stateForkResponseJson := &structs.GetStateForkResponse{}
if err := c.jsonRestHandler.Get(ctx, endpoint, stateForkResponseJson); err != nil { if err := c.handler.Get(ctx, endpoint, stateForkResponseJson); err != nil {
return nil, err return nil, err
} }
@@ -41,7 +41,7 @@ func (c *beaconApiValidatorClient) headers(ctx context.Context) (*structs.GetBlo
blockHeadersResponseJson := &structs.GetBlockHeadersResponse{} blockHeadersResponseJson := &structs.GetBlockHeadersResponse{}
if err := c.jsonRestHandler.Get(ctx, endpoint, blockHeadersResponseJson); err != nil { if err := c.handler.Get(ctx, endpoint, blockHeadersResponseJson); err != nil {
return nil, err return nil, err
} }
@@ -59,7 +59,7 @@ func (c *beaconApiValidatorClient) liveness(ctx context.Context, epoch primitive
return nil, errors.Wrapf(err, "failed to marshal validator indexes") return nil, errors.Wrapf(err, "failed to marshal validator indexes")
} }
if err = c.jsonRestHandler.Post(ctx, url, nil, bytes.NewBuffer(marshalledJsonValidatorIndexes), livenessResponseJson); err != nil { if err = c.handler.Post(ctx, url, nil, bytes.NewBuffer(marshalledJsonValidatorIndexes), livenessResponseJson); err != nil {
return nil, err return nil, err
} }
@@ -71,7 +71,7 @@ func (c *beaconApiValidatorClient) syncing(ctx context.Context) (*structs.SyncSt
syncingResponseJson := &structs.SyncStatusResponse{} syncingResponseJson := &structs.SyncStatusResponse{}
if err := c.jsonRestHandler.Get(ctx, endpoint, syncingResponseJson); err != nil { if err := c.handler.Get(ctx, endpoint, syncingResponseJson); err != nil {
return nil, err return nil, err
} }

View File

@@ -20,7 +20,7 @@ func TestGetFork_Nominal(t *testing.T) {
defer ctrl.Finish() defer ctrl.Finish()
stateForkResponseJson := structs.GetStateForkResponse{} stateForkResponseJson := structs.GetStateForkResponse{}
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
expected := structs.GetStateForkResponse{ expected := structs.GetStateForkResponse{
Data: &structs.Fork{ Data: &structs.Fork{
@@ -32,7 +32,7 @@ func TestGetFork_Nominal(t *testing.T) {
ctx := t.Context() ctx := t.Context()
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
forkEndpoint, forkEndpoint,
&stateForkResponseJson, &stateForkResponseJson,
@@ -44,7 +44,7 @@ func TestGetFork_Nominal(t *testing.T) {
).Times(1) ).Times(1)
validatorClient := beaconApiValidatorClient{ validatorClient := beaconApiValidatorClient{
jsonRestHandler: jsonRestHandler, handler: handler,
} }
fork, err := validatorClient.fork(ctx) fork, err := validatorClient.fork(ctx)
@@ -56,11 +56,11 @@ func TestGetFork_Invalid(t *testing.T) {
ctrl := gomock.NewController(t) ctrl := gomock.NewController(t)
defer ctrl.Finish() defer ctrl.Finish()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
ctx := t.Context() ctx := t.Context()
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
forkEndpoint, forkEndpoint,
gomock.Any(), gomock.Any(),
@@ -69,7 +69,7 @@ func TestGetFork_Invalid(t *testing.T) {
).Times(1) ).Times(1)
validatorClient := beaconApiValidatorClient{ validatorClient := beaconApiValidatorClient{
jsonRestHandler: jsonRestHandler, handler: handler,
} }
_, err := validatorClient.fork(ctx) _, err := validatorClient.fork(ctx)
@@ -83,7 +83,7 @@ func TestGetHeaders_Nominal(t *testing.T) {
defer ctrl.Finish() defer ctrl.Finish()
blockHeadersResponseJson := structs.GetBlockHeadersResponse{} blockHeadersResponseJson := structs.GetBlockHeadersResponse{}
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
expected := structs.GetBlockHeadersResponse{ expected := structs.GetBlockHeadersResponse{
Data: []*structs.SignedBeaconBlockHeaderContainer{ Data: []*structs.SignedBeaconBlockHeaderContainer{
@@ -99,7 +99,7 @@ func TestGetHeaders_Nominal(t *testing.T) {
ctx := t.Context() ctx := t.Context()
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
headersEndpoint, headersEndpoint,
&blockHeadersResponseJson, &blockHeadersResponseJson,
@@ -111,7 +111,7 @@ func TestGetHeaders_Nominal(t *testing.T) {
).Times(1) ).Times(1)
validatorClient := beaconApiValidatorClient{ validatorClient := beaconApiValidatorClient{
jsonRestHandler: jsonRestHandler, handler: handler,
} }
headers, err := validatorClient.headers(ctx) headers, err := validatorClient.headers(ctx)
@@ -123,11 +123,11 @@ func TestGetHeaders_Invalid(t *testing.T) {
ctrl := gomock.NewController(t) ctrl := gomock.NewController(t)
defer ctrl.Finish() defer ctrl.Finish()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
ctx := t.Context() ctx := t.Context()
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
headersEndpoint, headersEndpoint,
gomock.Any(), gomock.Any(),
@@ -136,7 +136,7 @@ func TestGetHeaders_Invalid(t *testing.T) {
).Times(1) ).Times(1)
validatorClient := beaconApiValidatorClient{ validatorClient := beaconApiValidatorClient{
jsonRestHandler: jsonRestHandler, handler: handler,
} }
_, err := validatorClient.headers(ctx) _, err := validatorClient.headers(ctx)
@@ -170,8 +170,8 @@ func TestGetLiveness_Nominal(t *testing.T) {
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Post( handler.EXPECT().Post(
gomock.Any(), gomock.Any(),
livenessEndpoint, livenessEndpoint,
nil, nil,
@@ -184,7 +184,7 @@ func TestGetLiveness_Nominal(t *testing.T) {
nil, nil,
).Times(1) ).Times(1)
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
liveness, err := validatorClient.liveness(ctx, 42, indexes) liveness, err := validatorClient.liveness(ctx, 42, indexes)
require.NoError(t, err) require.NoError(t, err)
@@ -197,8 +197,8 @@ func TestGetLiveness_Invalid(t *testing.T) {
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Post( handler.EXPECT().Post(
gomock.Any(), gomock.Any(),
livenessEndpoint, livenessEndpoint,
nil, nil,
@@ -208,7 +208,7 @@ func TestGetLiveness_Invalid(t *testing.T) {
errors.New("custom error"), errors.New("custom error"),
).Times(1) ).Times(1)
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
_, err := validatorClient.liveness(ctx, 42, nil) _, err := validatorClient.liveness(ctx, 42, nil)
require.ErrorContains(t, "custom error", err) require.ErrorContains(t, "custom error", err)
@@ -237,7 +237,7 @@ func TestGetIsSyncing_Nominal(t *testing.T) {
defer ctrl.Finish() defer ctrl.Finish()
syncingResponseJson := structs.SyncStatusResponse{} syncingResponseJson := structs.SyncStatusResponse{}
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
expected := structs.SyncStatusResponse{ expected := structs.SyncStatusResponse{
Data: &structs.SyncStatusResponseData{ Data: &structs.SyncStatusResponseData{
@@ -247,7 +247,7 @@ func TestGetIsSyncing_Nominal(t *testing.T) {
ctx := t.Context() ctx := t.Context()
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
syncingEndpoint, syncingEndpoint,
&syncingResponseJson, &syncingResponseJson,
@@ -259,7 +259,7 @@ func TestGetIsSyncing_Nominal(t *testing.T) {
).Times(1) ).Times(1)
validatorClient := beaconApiValidatorClient{ validatorClient := beaconApiValidatorClient{
jsonRestHandler: jsonRestHandler, handler: handler,
} }
isSyncing, err := validatorClient.isSyncing(ctx) isSyncing, err := validatorClient.isSyncing(ctx)
@@ -274,11 +274,11 @@ func TestGetIsSyncing_Invalid(t *testing.T) {
defer ctrl.Finish() defer ctrl.Finish()
syncingResponseJson := structs.SyncStatusResponse{} syncingResponseJson := structs.SyncStatusResponse{}
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
ctx := t.Context() ctx := t.Context()
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
syncingEndpoint, syncingEndpoint,
&syncingResponseJson, &syncingResponseJson,
@@ -287,7 +287,7 @@ func TestGetIsSyncing_Invalid(t *testing.T) {
).Times(1) ).Times(1)
validatorClient := beaconApiValidatorClient{ validatorClient := beaconApiValidatorClient{
jsonRestHandler: jsonRestHandler, handler: handler,
} }
isSyncing, err := validatorClient.isSyncing(ctx) isSyncing, err := validatorClient.isSyncing(ctx)

View File

@@ -21,13 +21,13 @@ var (
type beaconApiNodeClient struct { type beaconApiNodeClient struct {
fallbackClient iface.NodeClient fallbackClient iface.NodeClient
jsonRestHandler rest.RestHandler handler rest.Handler
genesisProvider GenesisProvider genesisProvider GenesisProvider
} }
func (c *beaconApiNodeClient) SyncStatus(ctx context.Context, _ *empty.Empty) (*ethpb.SyncStatus, error) { func (c *beaconApiNodeClient) SyncStatus(ctx context.Context, _ *empty.Empty) (*ethpb.SyncStatus, error) {
syncingResponse := structs.SyncStatusResponse{} syncingResponse := structs.SyncStatusResponse{}
if err := c.jsonRestHandler.Get(ctx, "/eth/v1/node/syncing", &syncingResponse); err != nil { if err := c.handler.Get(ctx, "/eth/v1/node/syncing", &syncingResponse); err != nil {
return nil, err return nil, err
} }
@@ -57,7 +57,7 @@ func (c *beaconApiNodeClient) Genesis(ctx context.Context, _ *empty.Empty) (*eth
} }
depositContractJson := structs.GetDepositContractResponse{} depositContractJson := structs.GetDepositContractResponse{}
if err = c.jsonRestHandler.Get(ctx, "/eth/v1/config/deposit_contract", &depositContractJson); err != nil { if err = c.handler.Get(ctx, "/eth/v1/config/deposit_contract", &depositContractJson); err != nil {
return nil, err return nil, err
} }
@@ -81,7 +81,7 @@ func (c *beaconApiNodeClient) Genesis(ctx context.Context, _ *empty.Empty) (*eth
func (c *beaconApiNodeClient) Version(ctx context.Context, _ *empty.Empty) (*ethpb.Version, error) { func (c *beaconApiNodeClient) Version(ctx context.Context, _ *empty.Empty) (*ethpb.Version, error) {
var versionResponse structs.GetVersionResponse var versionResponse structs.GetVersionResponse
if err := c.jsonRestHandler.Get(ctx, "/eth/v1/node/version", &versionResponse); err != nil { if err := c.handler.Get(ctx, "/eth/v1/node/version", &versionResponse); err != nil {
return nil, err return nil, err
} }
@@ -106,9 +106,9 @@ func (c *beaconApiNodeClient) Peers(ctx context.Context, in *empty.Empty) (*ethp
// IsReady returns true only if the node is fully synced (200 OK). // IsReady returns true only if the node is fully synced (200 OK).
// A 206 Partial Content response indicates the node is syncing and not ready. // A 206 Partial Content response indicates the node is syncing and not ready.
func (c *beaconApiNodeClient) IsReady(ctx context.Context) bool { func (c *beaconApiNodeClient) IsReady(ctx context.Context) bool {
statusCode, err := c.jsonRestHandler.GetStatusCode(ctx, "/eth/v1/node/health") statusCode, err := c.handler.GetStatusCode(ctx, "/eth/v1/node/health")
if err != nil { if err != nil {
log.WithError(err).Error("failed to get health of node") log.WithError(err).WithField("url", c.handler.Host()).Error("failed to get health of node")
return false return false
} }
// Only 200 OK means the node is fully synced and ready. // Only 200 OK means the node is fully synced and ready.
@@ -116,11 +116,11 @@ func (c *beaconApiNodeClient) IsReady(ctx context.Context) bool {
return statusCode == http.StatusOK return statusCode == http.StatusOK
} }
func NewNodeClientWithFallback(jsonRestHandler rest.RestHandler, fallbackClient iface.NodeClient) iface.NodeClient { func NewNodeClientWithFallback(handler rest.Handler, fallbackClient iface.NodeClient) iface.NodeClient {
b := &beaconApiNodeClient{ b := &beaconApiNodeClient{
jsonRestHandler: jsonRestHandler, handler: handler,
fallbackClient: fallbackClient, fallbackClient: fallbackClient,
genesisProvider: &beaconApiGenesisProvider{jsonRestHandler: jsonRestHandler}, genesisProvider: &beaconApiGenesisProvider{handler: handler},
} }
return b return b
} }

View File

@@ -120,10 +120,10 @@ func TestGetGenesis(t *testing.T) {
) )
depositContractJson := structs.GetDepositContractResponse{} depositContractJson := structs.GetDepositContractResponse{}
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
if testCase.queriesDepositContract { if testCase.queriesDepositContract {
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
"/eth/v1/config/deposit_contract", "/eth/v1/config/deposit_contract",
&depositContractJson, &depositContractJson,
@@ -137,7 +137,7 @@ func TestGetGenesis(t *testing.T) {
nodeClient := &beaconApiNodeClient{ nodeClient := &beaconApiNodeClient{
genesisProvider: genesisProvider, genesisProvider: genesisProvider,
jsonRestHandler: jsonRestHandler, handler: handler,
} }
response, err := nodeClient.Genesis(ctx, &emptypb.Empty{}) response, err := nodeClient.Genesis(ctx, &emptypb.Empty{})
@@ -201,8 +201,8 @@ func TestGetSyncStatus(t *testing.T) {
ctx := t.Context() ctx := t.Context()
syncingResponse := structs.SyncStatusResponse{} syncingResponse := structs.SyncStatusResponse{}
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
syncingEndpoint, syncingEndpoint,
&syncingResponse, &syncingResponse,
@@ -213,7 +213,7 @@ func TestGetSyncStatus(t *testing.T) {
testCase.restEndpointResponse, testCase.restEndpointResponse,
) )
nodeClient := &beaconApiNodeClient{jsonRestHandler: jsonRestHandler} nodeClient := &beaconApiNodeClient{handler: handler}
syncStatus, err := nodeClient.SyncStatus(ctx, &emptypb.Empty{}) syncStatus, err := nodeClient.SyncStatus(ctx, &emptypb.Empty{})
if testCase.expectedResponse == nil { if testCase.expectedResponse == nil {
@@ -265,8 +265,8 @@ func TestGetVersion(t *testing.T) {
ctx := t.Context() ctx := t.Context()
var versionResponse structs.GetVersionResponse var versionResponse structs.GetVersionResponse
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
versionEndpoint, versionEndpoint,
&versionResponse, &versionResponse,
@@ -277,7 +277,7 @@ func TestGetVersion(t *testing.T) {
testCase.restEndpointResponse, testCase.restEndpointResponse,
) )
nodeClient := &beaconApiNodeClient{jsonRestHandler: jsonRestHandler} nodeClient := &beaconApiNodeClient{handler: handler}
version, err := nodeClient.Version(ctx, &emptypb.Empty{}) version, err := nodeClient.Version(ctx, &emptypb.Empty{})
if testCase.expectedResponse == nil { if testCase.expectedResponse == nil {
@@ -331,13 +331,14 @@ func TestIsReady(t *testing.T) {
defer ctrl.Finish() defer ctrl.Finish()
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().GetStatusCode( handler.EXPECT().GetStatusCode(
gomock.Any(), gomock.Any(),
healthEndpoint, healthEndpoint,
).Return(tc.statusCode, tc.err) ).Return(tc.statusCode, tc.err)
handler.EXPECT().Host().Return("http://localhost:3500").AnyTimes()
nodeClient := &beaconApiNodeClient{jsonRestHandler: jsonRestHandler} nodeClient := &beaconApiNodeClient{handler: handler}
result := nodeClient.IsReady(ctx) result := nodeClient.IsReady(ctx)
assert.Equal(t, tc.expectedResult, result) assert.Equal(t, tc.expectedResult, result)

View File

@@ -6,6 +6,7 @@ import (
"time" "time"
"github.com/OffchainLabs/prysm/v7/api/client/event" "github.com/OffchainLabs/prysm/v7/api/client/event"
"github.com/OffchainLabs/prysm/v7/api/fallback"
"github.com/OffchainLabs/prysm/v7/api/rest" "github.com/OffchainLabs/prysm/v7/api/rest"
"github.com/OffchainLabs/prysm/v7/consensus-types/primitives" "github.com/OffchainLabs/prysm/v7/consensus-types/primitives"
"github.com/OffchainLabs/prysm/v7/encoding/bytesutil" "github.com/OffchainLabs/prysm/v7/encoding/bytesutil"
@@ -23,22 +24,28 @@ type beaconApiValidatorClient struct {
genesisProvider GenesisProvider genesisProvider GenesisProvider
dutiesProvider dutiesProvider dutiesProvider dutiesProvider
stateValidatorsProvider StateValidatorsProvider stateValidatorsProvider StateValidatorsProvider
jsonRestHandler rest.RestHandler restProvider rest.RestConnectionProvider
handler rest.Handler
nodeClient *beaconApiNodeClient
beaconBlockConverter BeaconBlockConverter beaconBlockConverter BeaconBlockConverter
prysmChainClient iface.PrysmChainClient prysmChainClient iface.PrysmChainClient
isEventStreamRunning bool isEventStreamRunning bool
} }
func NewBeaconApiValidatorClient(jsonRestHandler rest.RestHandler, opts ...ValidatorClientOpt) iface.ValidatorClient { func NewBeaconApiValidatorClient(provider rest.RestConnectionProvider, opts ...ValidatorClientOpt) iface.ValidatorClient {
handler := provider.Handler()
nc := &beaconApiNodeClient{handler: handler}
c := &beaconApiValidatorClient{ c := &beaconApiValidatorClient{
genesisProvider: &beaconApiGenesisProvider{jsonRestHandler: jsonRestHandler}, genesisProvider: &beaconApiGenesisProvider{handler: handler},
dutiesProvider: beaconApiDutiesProvider{jsonRestHandler: jsonRestHandler}, dutiesProvider: beaconApiDutiesProvider{handler: handler},
stateValidatorsProvider: beaconApiStateValidatorsProvider{jsonRestHandler: jsonRestHandler}, stateValidatorsProvider: beaconApiStateValidatorsProvider{handler: handler},
jsonRestHandler: jsonRestHandler, restProvider: provider,
handler: handler,
nodeClient: nc,
beaconBlockConverter: beaconApiBeaconBlockConverter{}, beaconBlockConverter: beaconApiBeaconBlockConverter{},
prysmChainClient: prysmChainClient{ prysmChainClient: prysmChainClient{
nodeClient: &beaconApiNodeClient{jsonRestHandler: jsonRestHandler}, nodeClient: nc,
jsonRestHandler: jsonRestHandler, handler: handler,
}, },
isEventStreamRunning: false, isEventStreamRunning: false,
} }
@@ -280,8 +287,8 @@ func (c *beaconApiValidatorClient) WaitForChainStart(ctx context.Context, _ *emp
} }
func (c *beaconApiValidatorClient) StartEventStream(ctx context.Context, topics []string, eventsChannel chan<- *event.Event) { func (c *beaconApiValidatorClient) StartEventStream(ctx context.Context, topics []string, eventsChannel chan<- *event.Event) {
client := &http.Client{} // event stream should not be subject to the same settings as other api calls, so we won't use c.jsonRestHandler.HttpClient() client := &http.Client{} // event stream should not be subject to the same settings as other api calls
eventStream, err := event.NewEventStream(ctx, client, c.jsonRestHandler.Host(), topics) eventStream, err := event.NewEventStream(ctx, client, c.handler.Host(), topics)
if err != nil { if err != nil {
eventsChannel <- &event.Event{ eventsChannel <- &event.Event{
EventType: event.EventError, EventType: event.EventError,
@@ -329,9 +336,9 @@ func wrapInMetrics[Resp any](action string, f func() (Resp, error)) (Resp, error
} }
func (c *beaconApiValidatorClient) Host() string { func (c *beaconApiValidatorClient) Host() string {
return c.jsonRestHandler.Host() return c.handler.Host()
} }
func (c *beaconApiValidatorClient) SwitchHost(host string) { func (c *beaconApiValidatorClient) EnsureReady(ctx context.Context) bool {
c.jsonRestHandler.SwitchHost(host) return fallback.EnsureReady(ctx, c.restProvider, c.nodeClient)
} }

View File

@@ -31,9 +31,9 @@ func TestBeaconApiValidatorClient_GetAttestationDataValid(t *testing.T) {
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
produceAttestationDataResponseJson := structs.GetAttestationDataResponse{} produceAttestationDataResponseJson := structs.GetAttestationDataResponse{}
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
fmt.Sprintf("/eth/v1/validator/attestation_data?committee_index=%d&slot=%d", committeeIndex, slot), fmt.Sprintf("/eth/v1/validator/attestation_data?committee_index=%d&slot=%d", committeeIndex, slot),
&produceAttestationDataResponseJson, &produceAttestationDataResponseJson,
@@ -44,7 +44,7 @@ func TestBeaconApiValidatorClient_GetAttestationDataValid(t *testing.T) {
generateValidAttestation(uint64(slot), uint64(committeeIndex)), generateValidAttestation(uint64(slot), uint64(committeeIndex)),
).Times(2) ).Times(2)
validatorClient := beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := beaconApiValidatorClient{handler: handler}
expectedResp, expectedErr := validatorClient.attestationData(ctx, slot, committeeIndex) expectedResp, expectedErr := validatorClient.attestationData(ctx, slot, committeeIndex)
resp, err := validatorClient.AttestationData( resp, err := validatorClient.AttestationData(
@@ -65,9 +65,9 @@ func TestBeaconApiValidatorClient_GetAttestationDataError(t *testing.T) {
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
produceAttestationDataResponseJson := structs.GetAttestationDataResponse{} produceAttestationDataResponseJson := structs.GetAttestationDataResponse{}
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
fmt.Sprintf("/eth/v1/validator/attestation_data?committee_index=%d&slot=%d", committeeIndex, slot), fmt.Sprintf("/eth/v1/validator/attestation_data?committee_index=%d&slot=%d", committeeIndex, slot),
&produceAttestationDataResponseJson, &produceAttestationDataResponseJson,
@@ -78,7 +78,7 @@ func TestBeaconApiValidatorClient_GetAttestationDataError(t *testing.T) {
generateValidAttestation(uint64(slot), uint64(committeeIndex)), generateValidAttestation(uint64(slot), uint64(committeeIndex)),
).Times(2) ).Times(2)
validatorClient := beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := beaconApiValidatorClient{handler: handler}
expectedResp, expectedErr := validatorClient.attestationData(ctx, slot, committeeIndex) expectedResp, expectedErr := validatorClient.attestationData(ctx, slot, committeeIndex)
resp, err := validatorClient.AttestationData( resp, err := validatorClient.AttestationData(
@@ -139,8 +139,8 @@ func TestBeaconApiValidatorClient_ProposeBeaconBlockValid(t *testing.T) {
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().PostSSZ( handler.EXPECT().PostSSZ(
gomock.Any(), gomock.Any(),
"/eth/v2/beacon/blocks", "/eth/v2/beacon/blocks",
gomock.Any(), gomock.Any(),
@@ -149,7 +149,7 @@ func TestBeaconApiValidatorClient_ProposeBeaconBlockValid(t *testing.T) {
nil, nil, nil, nil, nil, nil,
).Times(1) ).Times(1)
validatorClient := beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := beaconApiValidatorClient{handler: handler}
expectedResp, expectedErr := validatorClient.proposeBeaconBlock( expectedResp, expectedErr := validatorClient.proposeBeaconBlock(
ctx, ctx,
&ethpb.GenericSignedBeaconBlock{ &ethpb.GenericSignedBeaconBlock{
@@ -166,8 +166,8 @@ func TestBeaconApiValidatorClient_ProposeBeaconBlockError_ThenPass(t *testing.T)
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().PostSSZ( handler.EXPECT().PostSSZ(
gomock.Any(), gomock.Any(),
"/eth/v2/beacon/blocks", "/eth/v2/beacon/blocks",
gomock.Any(), gomock.Any(),
@@ -179,7 +179,7 @@ func TestBeaconApiValidatorClient_ProposeBeaconBlockError_ThenPass(t *testing.T)
}, },
).Times(1) ).Times(1)
jsonRestHandler.EXPECT().Post( handler.EXPECT().Post(
gomock.Any(), gomock.Any(),
"/eth/v2/beacon/blocks", "/eth/v2/beacon/blocks",
gomock.Any(), gomock.Any(),
@@ -189,7 +189,7 @@ func TestBeaconApiValidatorClient_ProposeBeaconBlockError_ThenPass(t *testing.T)
nil, nil,
).Times(1) ).Times(1)
validatorClient := beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := beaconApiValidatorClient{handler: handler}
expectedResp, expectedErr := validatorClient.proposeBeaconBlock( expectedResp, expectedErr := validatorClient.proposeBeaconBlock(
ctx, ctx,
&ethpb.GenericSignedBeaconBlock{ &ethpb.GenericSignedBeaconBlock{
@@ -308,10 +308,10 @@ func TestBeaconApiValidatorClient_ProposeBeaconBlockAllTypes(t *testing.T) {
defer ctrl.Finish() defer ctrl.Finish()
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
if !tt.wantErr { if !tt.wantErr {
jsonRestHandler.EXPECT().PostSSZ( handler.EXPECT().PostSSZ(
gomock.Any(), gomock.Any(),
tt.expectedPath, tt.expectedPath,
gomock.Any(), gomock.Any(),
@@ -319,7 +319,7 @@ func TestBeaconApiValidatorClient_ProposeBeaconBlockAllTypes(t *testing.T) {
).Return(nil, nil, nil).Times(1) ).Return(nil, nil, nil).Times(1)
} }
validatorClient := beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := beaconApiValidatorClient{handler: handler}
resp, err := validatorClient.proposeBeaconBlock(ctx, tt.block) resp, err := validatorClient.proposeBeaconBlock(ctx, tt.block)
if tt.wantErr { if tt.wantErr {
@@ -366,9 +366,9 @@ func TestBeaconApiValidatorClient_ProposeBeaconBlockHTTPErrors(t *testing.T) {
defer ctrl.Finish() defer ctrl.Finish()
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().PostSSZ( handler.EXPECT().PostSSZ(
gomock.Any(), gomock.Any(),
"/eth/v2/beacon/blocks", "/eth/v2/beacon/blocks",
gomock.Any(), gomock.Any(),
@@ -377,7 +377,7 @@ func TestBeaconApiValidatorClient_ProposeBeaconBlockHTTPErrors(t *testing.T) {
if tt.expectJSON { if tt.expectJSON {
// When SSZ fails, it falls back to JSON // When SSZ fails, it falls back to JSON
jsonRestHandler.EXPECT().Post( handler.EXPECT().Post(
gomock.Any(), gomock.Any(),
"/eth/v2/beacon/blocks", "/eth/v2/beacon/blocks",
gomock.Any(), gomock.Any(),
@@ -386,7 +386,7 @@ func TestBeaconApiValidatorClient_ProposeBeaconBlockHTTPErrors(t *testing.T) {
).Return(tt.sszError).Times(1) ).Return(tt.sszError).Times(1)
} }
validatorClient := beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := beaconApiValidatorClient{handler: handler}
_, err := validatorClient.proposeBeaconBlock( _, err := validatorClient.proposeBeaconBlock(
ctx, ctx,
&ethpb.GenericSignedBeaconBlock{ &ethpb.GenericSignedBeaconBlock{
@@ -507,10 +507,10 @@ func TestBeaconApiValidatorClient_ProposeBeaconBlockJSONFallback(t *testing.T) {
defer ctrl.Finish() defer ctrl.Finish()
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
// SSZ call fails with 406 to trigger JSON fallback // SSZ call fails with 406 to trigger JSON fallback
jsonRestHandler.EXPECT().PostSSZ( handler.EXPECT().PostSSZ(
gomock.Any(), gomock.Any(),
tt.expectedPath, tt.expectedPath,
gomock.Any(), gomock.Any(),
@@ -521,7 +521,7 @@ func TestBeaconApiValidatorClient_ProposeBeaconBlockJSONFallback(t *testing.T) {
}).Times(1) }).Times(1)
// JSON fallback // JSON fallback
jsonRestHandler.EXPECT().Post( handler.EXPECT().Post(
gomock.Any(), gomock.Any(),
tt.expectedPath, tt.expectedPath,
gomock.Any(), gomock.Any(),
@@ -529,7 +529,7 @@ func TestBeaconApiValidatorClient_ProposeBeaconBlockJSONFallback(t *testing.T) {
gomock.Any(), gomock.Any(),
).Return(tt.jsonError).Times(1) ).Return(tt.jsonError).Times(1)
validatorClient := beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := beaconApiValidatorClient{handler: handler}
resp, err := validatorClient.proposeBeaconBlock(ctx, tt.block) resp, err := validatorClient.proposeBeaconBlock(ctx, tt.block)
if tt.wantErr { if tt.wantErr {
@@ -547,29 +547,12 @@ func TestBeaconApiValidatorClient_Host(t *testing.T) {
ctrl := gomock.NewController(t) ctrl := gomock.NewController(t)
defer ctrl.Finish() defer ctrl.Finish()
hosts := []string{"http://localhost:8080", "http://localhost:8081"} handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler.EXPECT().Host().Return("http://localhost:8080").Times(1)
jsonRestHandler.EXPECT().SwitchHost(
hosts[0],
).Times(1)
jsonRestHandler.EXPECT().Host().Return(
hosts[0],
).Times(1)
validatorClient := beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := beaconApiValidatorClient{handler: handler}
validatorClient.SwitchHost(hosts[0])
host := validatorClient.Host() host := validatorClient.Host()
require.Equal(t, hosts[0], host) require.Equal(t, "http://localhost:8080", host)
jsonRestHandler.EXPECT().SwitchHost(
hosts[1],
).Times(1)
jsonRestHandler.EXPECT().Host().Return(
hosts[1],
).Times(1)
validatorClient.SwitchHost(hosts[1])
host = validatorClient.Host()
require.Equal(t, hosts[1], host)
} }
// Helper functions for generating test blocks for newer consensus versions // Helper functions for generating test blocks for newer consensus versions

View File

@@ -20,7 +20,7 @@ func (c *beaconApiValidatorClient) aggregatedSelection(ctx context.Context, sele
} }
var resp aggregatedSelectionResponse var resp aggregatedSelectionResponse
err = c.jsonRestHandler.Post(ctx, "/eth/v1/validator/beacon_committee_selections", nil, bytes.NewBuffer(body), &resp) err = c.handler.Post(ctx, "/eth/v1/validator/beacon_committee_selections", nil, bytes.NewBuffer(body), &resp)
if err != nil { if err != nil {
return nil, errors.Wrap(err, "error calling post endpoint") return nil, errors.Wrap(err, "error calling post endpoint")
} }

View File

@@ -89,13 +89,13 @@ func TestGetAggregatedSelections(t *testing.T) {
for _, test := range testcases { for _, test := range testcases {
t.Run(test.name, func(t *testing.T) { t.Run(test.name, func(t *testing.T) {
ctrl := gomock.NewController(t) ctrl := gomock.NewController(t)
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
reqBody, err := json.Marshal(test.req) reqBody, err := json.Marshal(test.req)
require.NoError(t, err) require.NoError(t, err)
ctx := t.Context() ctx := t.Context()
jsonRestHandler.EXPECT().Post( handler.EXPECT().Post(
gomock.Any(), gomock.Any(),
"/eth/v1/validator/beacon_committee_selections", "/eth/v1/validator/beacon_committee_selections",
nil, nil,
@@ -108,7 +108,7 @@ func TestGetAggregatedSelections(t *testing.T) {
test.endpointError, test.endpointError,
).Times(1) ).Times(1)
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
res, err := validatorClient.AggregatedSelections(ctx, test.req) res, err := validatorClient.AggregatedSelections(ctx, test.req)
if test.expectedErrorMessage != "" { if test.expectedErrorMessage != "" {
require.ErrorContains(t, test.expectedErrorMessage, err) require.ErrorContains(t, test.expectedErrorMessage, err)

View File

@@ -288,12 +288,12 @@ func TestCheckDoppelGanger_Nominal(t *testing.T) {
ctrl := gomock.NewController(t) ctrl := gomock.NewController(t)
defer ctrl.Finish() defer ctrl.Finish()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
if testCase.getSyncingOutput != nil { if testCase.getSyncingOutput != nil {
syncingResponseJson := structs.SyncStatusResponse{} syncingResponseJson := structs.SyncStatusResponse{}
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
syncingEndpoint, syncingEndpoint,
&syncingResponseJson, &syncingResponseJson,
@@ -308,7 +308,7 @@ func TestCheckDoppelGanger_Nominal(t *testing.T) {
if testCase.getForkOutput != nil { if testCase.getForkOutput != nil {
stateForkResponseJson := structs.GetStateForkResponse{} stateForkResponseJson := structs.GetStateForkResponse{}
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
forkEndpoint, forkEndpoint,
&stateForkResponseJson, &stateForkResponseJson,
@@ -323,7 +323,7 @@ func TestCheckDoppelGanger_Nominal(t *testing.T) {
if testCase.getHeadersOutput != nil { if testCase.getHeadersOutput != nil {
blockHeadersResponseJson := structs.GetBlockHeadersResponse{} blockHeadersResponseJson := structs.GetBlockHeadersResponse{}
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
headersEndpoint, headersEndpoint,
&blockHeadersResponseJson, &blockHeadersResponseJson,
@@ -342,7 +342,7 @@ func TestCheckDoppelGanger_Nominal(t *testing.T) {
marshalledIndexes, err := json.Marshal(iface.inputStringIndexes) marshalledIndexes, err := json.Marshal(iface.inputStringIndexes)
require.NoError(t, err) require.NoError(t, err)
jsonRestHandler.EXPECT().Post( handler.EXPECT().Post(
gomock.Any(), gomock.Any(),
iface.inputUrl, iface.inputUrl,
nil, nil,
@@ -372,7 +372,7 @@ func TestCheckDoppelGanger_Nominal(t *testing.T) {
} }
validatorClient := beaconApiValidatorClient{ validatorClient := beaconApiValidatorClient{
jsonRestHandler: jsonRestHandler, handler: handler,
stateValidatorsProvider: stateValidatorsProvider, stateValidatorsProvider: stateValidatorsProvider,
} }
@@ -722,12 +722,12 @@ func TestCheckDoppelGanger_Errors(t *testing.T) {
ctrl := gomock.NewController(t) ctrl := gomock.NewController(t)
defer ctrl.Finish() defer ctrl.Finish()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
if testCase.getSyncingOutput != nil { if testCase.getSyncingOutput != nil {
syncingResponseJson := structs.SyncStatusResponse{} syncingResponseJson := structs.SyncStatusResponse{}
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
syncingEndpoint, syncingEndpoint,
&syncingResponseJson, &syncingResponseJson,
@@ -742,7 +742,7 @@ func TestCheckDoppelGanger_Errors(t *testing.T) {
if testCase.getForkOutput != nil { if testCase.getForkOutput != nil {
stateForkResponseJson := structs.GetStateForkResponse{} stateForkResponseJson := structs.GetStateForkResponse{}
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
forkEndpoint, forkEndpoint,
&stateForkResponseJson, &stateForkResponseJson,
@@ -757,7 +757,7 @@ func TestCheckDoppelGanger_Errors(t *testing.T) {
if testCase.getHeadersOutput != nil { if testCase.getHeadersOutput != nil {
blockHeadersResponseJson := structs.GetBlockHeadersResponse{} blockHeadersResponseJson := structs.GetBlockHeadersResponse{}
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
headersEndpoint, headersEndpoint,
&blockHeadersResponseJson, &blockHeadersResponseJson,
@@ -790,7 +790,7 @@ func TestCheckDoppelGanger_Errors(t *testing.T) {
marshalledIndexes, err := json.Marshal(iface.inputStringIndexes) marshalledIndexes, err := json.Marshal(iface.inputStringIndexes)
require.NoError(t, err) require.NoError(t, err)
jsonRestHandler.EXPECT().Post( handler.EXPECT().Post(
gomock.Any(), gomock.Any(),
iface.inputUrl, iface.inputUrl,
nil, nil,
@@ -806,7 +806,7 @@ func TestCheckDoppelGanger_Errors(t *testing.T) {
} }
validatorClient := beaconApiValidatorClient{ validatorClient := beaconApiValidatorClient{
jsonRestHandler: jsonRestHandler, handler: handler,
stateValidatorsProvider: stateValidatorsProvider, stateValidatorsProvider: stateValidatorsProvider,
} }

View File

@@ -28,7 +28,7 @@ type dutiesProvider interface {
} }
type beaconApiDutiesProvider struct { type beaconApiDutiesProvider struct {
jsonRestHandler rest.RestHandler handler rest.Handler
} }
type attesterDuty struct { type attesterDuty struct {
@@ -279,7 +279,7 @@ func (c beaconApiDutiesProvider) Committees(ctx context.Context, epoch primitive
committeesRequest := apiutil.BuildURL("/eth/v1/beacon/states/head/committees", committeeParams) committeesRequest := apiutil.BuildURL("/eth/v1/beacon/states/head/committees", committeeParams)
var stateCommittees structs.GetCommitteesResponse var stateCommittees structs.GetCommitteesResponse
if err := c.jsonRestHandler.Get(ctx, committeesRequest, &stateCommittees); err != nil { if err := c.handler.Get(ctx, committeesRequest, &stateCommittees); err != nil {
return nil, err return nil, err
} }
@@ -309,7 +309,7 @@ func (c beaconApiDutiesProvider) AttesterDuties(ctx context.Context, epoch primi
} }
attesterDuties := &structs.GetAttesterDutiesResponse{} attesterDuties := &structs.GetAttesterDutiesResponse{}
if err = c.jsonRestHandler.Post( if err = c.handler.Post(
ctx, ctx,
fmt.Sprintf("/eth/v1/validator/duties/attester/%d", epoch), fmt.Sprintf("/eth/v1/validator/duties/attester/%d", epoch),
nil, nil,
@@ -331,7 +331,7 @@ func (c beaconApiDutiesProvider) AttesterDuties(ctx context.Context, epoch primi
// ProposerDuties retrieves the proposer duties for the given epoch // ProposerDuties retrieves the proposer duties for the given epoch
func (c beaconApiDutiesProvider) ProposerDuties(ctx context.Context, epoch primitives.Epoch) (*structs.GetProposerDutiesResponse, error) { func (c beaconApiDutiesProvider) ProposerDuties(ctx context.Context, epoch primitives.Epoch) (*structs.GetProposerDutiesResponse, error) {
proposerDuties := &structs.GetProposerDutiesResponse{} proposerDuties := &structs.GetProposerDutiesResponse{}
if err := c.jsonRestHandler.Get(ctx, fmt.Sprintf("/eth/v1/validator/duties/proposer/%d", epoch), proposerDuties); err != nil { if err := c.handler.Get(ctx, fmt.Sprintf("/eth/v1/validator/duties/proposer/%d", epoch), proposerDuties); err != nil {
return nil, err return nil, err
} }
@@ -361,7 +361,7 @@ func (c beaconApiDutiesProvider) SyncDuties(ctx context.Context, epoch primitive
} }
syncDuties := structs.GetSyncCommitteeDutiesResponse{} syncDuties := structs.GetSyncCommitteeDutiesResponse{}
if err = c.jsonRestHandler.Post( if err = c.handler.Post(
ctx, ctx,
fmt.Sprintf("/eth/v1/validator/duties/sync/%d", epoch), fmt.Sprintf("/eth/v1/validator/duties/sync/%d", epoch),
nil, nil,

Some files were not shown because too many files have changed in this diff Show More