mirror of
https://github.com/OffchainLabs/prysm.git
synced 2026-02-05 02:25:08 -05:00
Compare commits
2 Commits
feat/proce
...
develop
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fab687d96d | ||
|
|
cf94ccbf72 |
@@ -2,24 +2,38 @@ version: v1.7.0-alpha.1
|
|||||||
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
|
||||||
@@ -175,7 +181,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 +232,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 +254,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 +286,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 +381,36 @@ 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_balance_after_withdrawals#capella
|
|
||||||
- get_builder_from_deposit#gloas
|
- 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_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
|
||||||
- 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
|
|
||||||
- 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
|
||||||
8
.github/workflows/check-specrefs.yml
vendored
8
.github/workflows/check-specrefs.yml
vendored
@@ -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
|
||||||
|
|||||||
19
api/fallback/BUILD.bazel
Normal file
19
api/fallback/BUILD.bazel
Normal 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
66
api/fallback/fallback.go
Normal 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
|
||||||
|
}
|
||||||
94
api/fallback/fallback_test.go
Normal file
94
api/fallback/fallback_test.go
Normal 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)
|
||||||
|
}
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
// Code generated by hack/gen-logs.sh; DO NOT EDIT.
|
// Code generated by hack/gen-logs.sh; DO NOT EDIT.
|
||||||
// This file is created and regenerated automatically. Anything added here might get removed.
|
// This file is created and regenerated automatically. Anything added here might get removed.
|
||||||
package blocks
|
package fallback
|
||||||
|
|
||||||
import "github.com/sirupsen/logrus"
|
import "github.com/sirupsen/logrus"
|
||||||
|
|
||||||
// The prefix for logs from this package will be the text after the last slash in the package path.
|
// 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.
|
// 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", "consensus-types/blocks")
|
var log = logrus.WithField("package", "api/fallback")
|
||||||
@@ -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()
|
||||||
|
|||||||
@@ -6,15 +6,22 @@ import "google.golang.org/grpc"
|
|||||||
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 {
|
||||||
|
m.CurrentIndex = idx
|
||||||
|
m.ConnCounter++
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
func (m *MockGrpcProvider) ConnectionCounter() uint64 { return m.ConnCounter }
|
||||||
func (m *MockGrpcProvider) Close() {}
|
func (m *MockGrpcProvider) Close() {}
|
||||||
|
|||||||
@@ -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 }
|
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -110,7 +110,7 @@ func VerifyCellKZGProofBatch(commitmentsBytes []Bytes48, cellIndices []uint64, c
|
|||||||
ckzgCells := make([]ckzg4844.Cell, len(cells))
|
ckzgCells := make([]ckzg4844.Cell, len(cells))
|
||||||
|
|
||||||
for i := range cells {
|
for i := range cells {
|
||||||
ckzgCells[i] = ckzg4844.Cell(cells[i])
|
copy(ckzgCells[i][:], cells[i][:])
|
||||||
}
|
}
|
||||||
return ckzg4844.VerifyCellKZGProofBatch(commitmentsBytes, cellIndices, ckzgCells, proofsBytes)
|
return ckzg4844.VerifyCellKZGProofBatch(commitmentsBytes, cellIndices, ckzgCells, proofsBytes)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -89,7 +89,7 @@ func (mb *mockBroadcaster) BroadcastLightClientFinalityUpdate(_ context.Context,
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (mb *mockBroadcaster) BroadcastDataColumnSidecars(_ context.Context, _ []blocks.VerifiedRODataColumn, _ []blocks.PartialDataColumn) error {
|
func (mb *mockBroadcaster) BroadcastDataColumnSidecars(_ context.Context, _ []blocks.VerifiedRODataColumn) error {
|
||||||
mb.broadcastCalled = true
|
mb.broadcastCalled = true
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,27 +17,50 @@ 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):
|
|
||||||
//
|
//
|
||||||
|
// <spec fn="process_execution_payload_bid" fork="gloas" hash="6dc696bb">
|
||||||
|
// def process_execution_payload_bid(state: BeaconState, block: BeaconBlock) -> None:
|
||||||
// signed_bid = block.body.signed_execution_payload_bid
|
// signed_bid = block.body.signed_execution_payload_bid
|
||||||
// bid = signed_bid.message
|
// bid = signed_bid.message
|
||||||
// builder_index = bid.builder_index
|
// builder_index = bid.builder_index
|
||||||
// amount = bid.value
|
// amount = bid.value
|
||||||
|
//
|
||||||
|
// # For self-builds, amount must be zero regardless of withdrawal credential prefix
|
||||||
// if builder_index == BUILDER_INDEX_SELF_BUILD:
|
// if builder_index == BUILDER_INDEX_SELF_BUILD:
|
||||||
// assert amount == 0
|
// assert amount == 0
|
||||||
// assert signed_bid.signature == G2_POINT_AT_INFINITY
|
// assert signed_bid.signature == bls.G2_POINT_AT_INFINITY
|
||||||
// else:
|
// else:
|
||||||
|
// # Verify that the builder is active
|
||||||
// assert is_active_builder(state, builder_index)
|
// assert is_active_builder(state, builder_index)
|
||||||
|
// # Verify that the builder has funds to cover the bid
|
||||||
// assert can_builder_cover_bid(state, builder_index, amount)
|
// assert can_builder_cover_bid(state, builder_index, amount)
|
||||||
|
// # Verify that the bid signature is valid
|
||||||
// assert verify_execution_payload_bid_signature(state, signed_bid)
|
// assert verify_execution_payload_bid_signature(state, signed_bid)
|
||||||
|
//
|
||||||
|
// # Verify that the bid is for the current slot
|
||||||
// assert bid.slot == block.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_hash == state.latest_block_hash
|
||||||
// assert bid.parent_block_root == block.parent_root
|
// assert bid.parent_block_root == block.parent_root
|
||||||
// assert bid.prev_randao == get_randao_mix(state, get_current_epoch(state))
|
// assert bid.prev_randao == get_randao_mix(state, get_current_epoch(state))
|
||||||
|
//
|
||||||
|
// # Record the pending payment if there is some payment
|
||||||
// if amount > 0:
|
// if amount > 0:
|
||||||
// state.builder_pending_payments[...] = BuilderPendingPayment(weight=0, withdrawal=BuilderPendingWithdrawal(fee_recipient=bid.fee_recipient, amount=amount, builder_index=builder_index))
|
// 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
|
// 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 {
|
||||||
|
|||||||
@@ -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):
|
|
||||||
//
|
//
|
||||||
|
// <spec fn="process_payload_attestation" fork="gloas" hash="f46bf0b0">
|
||||||
|
// def process_payload_attestation(
|
||||||
|
// state: BeaconState, payload_attestation: PayloadAttestation
|
||||||
|
// ) -> None:
|
||||||
// data = payload_attestation.data
|
// 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
|
// 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
|
// assert data.slot + 1 == state.slot
|
||||||
// indexed = get_indexed_payload_attestation(state, data.slot, payload_attestation)
|
// # Verify signature
|
||||||
// assert is_valid_indexed_payload_attestation(state, indexed)
|
// 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]:
|
|
||||||
//
|
//
|
||||||
|
// <spec fn="get_ptc" fork="gloas" hash="ae15f761">
|
||||||
|
// def get_ptc(state: BeaconState, slot: Slot) -> Vector[ValidatorIndex, PTC_SIZE]:
|
||||||
|
// """
|
||||||
|
// Get the payload timeliness committee for the given ``slot``.
|
||||||
|
// """
|
||||||
// epoch = compute_epoch_at_slot(slot)
|
// epoch = compute_epoch_at_slot(slot)
|
||||||
// seed = hash(get_seed(state, epoch, DOMAIN_PTC_ATTESTER) + uint_to_bytes(slot))
|
// seed = hash(get_seed(state, epoch, DOMAIN_PTC_ATTESTER) + uint_to_bytes(slot))
|
||||||
// indices = []
|
// indices: List[ValidatorIndex] = []
|
||||||
|
// # Concatenate all committees for this slot in order
|
||||||
// committees_per_slot = get_committee_count_per_slot(state, epoch)
|
// committees_per_slot = get_committee_count_per_slot(state, epoch)
|
||||||
// for i in range(committees_per_slot):
|
// for i in range(committees_per_slot):
|
||||||
// committee = get_beacon_committee(state, slot, CommitteeIndex(i))
|
// committee = get_beacon_committee(state, slot, CommitteeIndex(i))
|
||||||
// indices.extend(committee)
|
// indices.extend(committee)
|
||||||
// return compute_balance_weighted_selection(state, indices, seed, size=PTC_SIZE, shuffle_indices=False)
|
// 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">
|
||||||
|
// def compute_balance_weighted_selection(
|
||||||
|
// state: BeaconState,
|
||||||
|
// indices: Sequence[ValidatorIndex],
|
||||||
|
// seed: Bytes32,
|
||||||
|
// size: uint64,
|
||||||
|
// 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:
|
// while len(selected) < size:
|
||||||
// next = i % total
|
// next_index = i % total
|
||||||
// if shuffle_indices: next = compute_shuffled_index(next, total, seed)
|
// if shuffle_indices:
|
||||||
// if compute_balance_weighted_acceptance(state, indices[next], seed, i):
|
// next_index = compute_shuffled_index(next_index, total, seed)
|
||||||
// selected.append(indices[next])
|
// candidate_index = indices[next_index]
|
||||||
|
// if compute_balance_weighted_acceptance(state, candidate_index, seed, i):
|
||||||
|
// selected.append(candidate_index)
|
||||||
// i += 1
|
// 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):
|
|
||||||
//
|
//
|
||||||
|
// <spec fn="compute_balance_weighted_acceptance" fork="gloas" hash="9954dcd0">
|
||||||
|
// def compute_balance_weighted_acceptance(
|
||||||
|
// state: BeaconState, index: ValidatorIndex, seed: Bytes32, i: uint64
|
||||||
|
// ) -> bool:
|
||||||
|
// """
|
||||||
|
// 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
|
// MAX_RANDOM_VALUE = 2**16 - 1
|
||||||
// random_bytes = hash(seed + uint_to_bytes(i // 16))
|
// random_bytes = hash(seed + uint_to_bytes(i // 16))
|
||||||
// offset = i % 16 * 2
|
// offset = i % 16 * 2
|
||||||
// random_value = bytes_to_uint64(random_bytes[offset:offset+2])
|
// random_value = bytes_to_uint64(random_bytes[offset : offset + 2])
|
||||||
// effective_balance = state.validators[index].effective_balance
|
// effective_balance = state.validators[index].effective_balance
|
||||||
// return effective_balance * MAX_RANDOM_VALUE >= MAX_EFFECTIVE_BALANCE_ELECTRA * random_value
|
// 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:
|
|
||||||
//
|
//
|
||||||
|
// <spec fn="is_valid_indexed_payload_attestation" fork="gloas" hash="cf1e65b5">
|
||||||
|
// def is_valid_indexed_payload_attestation(
|
||||||
|
// state: BeaconState, indexed_payload_attestation: IndexedPayloadAttestation
|
||||||
|
// ) -> bool:
|
||||||
|
// """
|
||||||
|
// Check if ``indexed_payload_attestation`` is non-empty, has sorted indices, and has
|
||||||
|
// a valid aggregate signature.
|
||||||
|
// """
|
||||||
|
// # Verify indices are non-empty and sorted
|
||||||
// indices = indexed_payload_attestation.attesting_indices
|
// indices = indexed_payload_attestation.attesting_indices
|
||||||
// return len(indices) > 0 and indices == sorted(indices) and
|
// if len(indices) == 0 or not indices == sorted(indices):
|
||||||
// bls.FastAggregateVerify(
|
// return False
|
||||||
// [state.validators[i].pubkey for i in indices],
|
//
|
||||||
// compute_signing_root(indexed_payload_attestation.data, get_domain(state, DOMAIN_PTC_ATTESTER, compute_epoch_at_slot(attestation.data.slot)),
|
// # Verify aggregate signature
|
||||||
// indexed_payload_attestation.signature,
|
// pubkeys = [state.validators[i].pubkey for i in indices]
|
||||||
// )
|
// domain = get_domain(state, DOMAIN_PTC_ATTESTER, None)
|
||||||
|
// signing_root = compute_signing_root(indexed_payload_attestation.data, domain)
|
||||||
|
// return bls.FastAggregateVerify(pubkeys, signing_root, indexed_payload_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) {
|
||||||
|
|||||||
@@ -10,9 +10,12 @@ 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:
|
|
||||||
//
|
//
|
||||||
|
// <spec fn="process_builder_pending_payments" fork="gloas" hash="10da48dd">
|
||||||
|
// def process_builder_pending_payments(state: BeaconState) -> None:
|
||||||
|
// """
|
||||||
|
// Processes the builder pending payments from the previous epoch.
|
||||||
|
// """
|
||||||
// quorum = get_builder_payment_quorum_threshold(state)
|
// quorum = get_builder_payment_quorum_threshold(state)
|
||||||
// for payment in state.builder_pending_payments[:SLOTS_PER_EPOCH]:
|
// for payment in state.builder_pending_payments[:SLOTS_PER_EPOCH]:
|
||||||
// if payment.weight >= quorum:
|
// if payment.weight >= quorum:
|
||||||
@@ -21,6 +24,7 @@ import (
|
|||||||
// 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:
|
|
||||||
//
|
//
|
||||||
|
// <spec fn="get_builder_payment_quorum_threshold" fork="gloas" hash="a64b7ffb">
|
||||||
|
// def get_builder_payment_quorum_threshold(state: BeaconState) -> uint64:
|
||||||
|
// """
|
||||||
|
// Calculate the quorum threshold for builder payments.
|
||||||
|
// """
|
||||||
// per_slot_balance = get_total_active_balance(state) // SLOTS_PER_EPOCH
|
// per_slot_balance = get_total_active_balance(state) // SLOTS_PER_EPOCH
|
||||||
// quorum = per_slot_balance * BUILDER_PAYMENT_THRESHOLD_NUMERATOR
|
// quorum = per_slot_balance * BUILDER_PAYMENT_THRESHOLD_NUMERATOR
|
||||||
// return uint64(quorum // BUILDER_PAYMENT_THRESHOLD_DENOMINATOR)
|
// 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 {
|
||||||
|
|||||||
@@ -11,8 +11,11 @@ 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):
|
||||||
@@ -21,6 +24,7 @@ import (
|
|||||||
// 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)
|
||||||
|
|||||||
@@ -33,7 +33,6 @@ go_library(
|
|||||||
"@com_github_pkg_errors//:go_default_library",
|
"@com_github_pkg_errors//:go_default_library",
|
||||||
"@com_github_prometheus_client_golang//prometheus:go_default_library",
|
"@com_github_prometheus_client_golang//prometheus:go_default_library",
|
||||||
"@com_github_prometheus_client_golang//prometheus/promauto:go_default_library",
|
"@com_github_prometheus_client_golang//prometheus/promauto:go_default_library",
|
||||||
"@com_github_prysmaticlabs_go_bitfield//:go_default_library",
|
|
||||||
"@org_golang_x_sync//errgroup:go_default_library",
|
"@org_golang_x_sync//errgroup:go_default_library",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,15 +1,11 @@
|
|||||||
package peerdas
|
package peerdas
|
||||||
|
|
||||||
import (
|
import (
|
||||||
stderrors "errors"
|
|
||||||
"iter"
|
|
||||||
|
|
||||||
"github.com/OffchainLabs/prysm/v7/beacon-chain/blockchain/kzg"
|
"github.com/OffchainLabs/prysm/v7/beacon-chain/blockchain/kzg"
|
||||||
fieldparams "github.com/OffchainLabs/prysm/v7/config/fieldparams"
|
fieldparams "github.com/OffchainLabs/prysm/v7/config/fieldparams"
|
||||||
"github.com/OffchainLabs/prysm/v7/config/params"
|
"github.com/OffchainLabs/prysm/v7/config/params"
|
||||||
"github.com/OffchainLabs/prysm/v7/consensus-types/blocks"
|
"github.com/OffchainLabs/prysm/v7/consensus-types/blocks"
|
||||||
"github.com/OffchainLabs/prysm/v7/container/trie"
|
"github.com/OffchainLabs/prysm/v7/container/trie"
|
||||||
ethpb "github.com/OffchainLabs/prysm/v7/proto/prysm/v1alpha1"
|
|
||||||
"github.com/ethereum/go-ethereum/p2p/enr"
|
"github.com/ethereum/go-ethereum/p2p/enr"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
)
|
)
|
||||||
@@ -20,7 +16,6 @@ var (
|
|||||||
ErrIndexTooLarge = errors.New("column index is larger than the specified columns count")
|
ErrIndexTooLarge = errors.New("column index is larger than the specified columns count")
|
||||||
ErrNoKzgCommitments = errors.New("no KZG commitments found")
|
ErrNoKzgCommitments = errors.New("no KZG commitments found")
|
||||||
ErrMismatchLength = errors.New("mismatch in the length of the column, commitments or proofs")
|
ErrMismatchLength = errors.New("mismatch in the length of the column, commitments or proofs")
|
||||||
ErrEmptySegment = errors.New("empty segment in batch")
|
|
||||||
ErrInvalidKZGProof = errors.New("invalid KZG proof")
|
ErrInvalidKZGProof = errors.New("invalid KZG proof")
|
||||||
ErrBadRootLength = errors.New("bad root length")
|
ErrBadRootLength = errors.New("bad root length")
|
||||||
ErrInvalidInclusionProof = errors.New("invalid inclusion proof")
|
ErrInvalidInclusionProof = errors.New("invalid inclusion proof")
|
||||||
@@ -62,127 +57,62 @@ func VerifyDataColumnSidecar(sidecar blocks.RODataColumn) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// CellProofBundleSegment is returned when a batch fails. The caller can call
|
// VerifyDataColumnsSidecarKZGProofs verifies if the KZG proofs are correct.
|
||||||
// the `.Verify` method to verify just this segment.
|
|
||||||
type CellProofBundleSegment struct {
|
|
||||||
indices []uint64
|
|
||||||
commitments []kzg.Bytes48
|
|
||||||
cells []kzg.Cell
|
|
||||||
proofs []kzg.Bytes48
|
|
||||||
}
|
|
||||||
|
|
||||||
// Verify verifies this segment without batching.
|
|
||||||
func (s CellProofBundleSegment) Verify() error {
|
|
||||||
if len(s.cells) == 0 {
|
|
||||||
return ErrEmptySegment
|
|
||||||
}
|
|
||||||
verified, err := kzg.VerifyCellKZGProofBatch(s.commitments, s.indices, s.cells, s.proofs)
|
|
||||||
if err != nil {
|
|
||||||
return stderrors.Join(err, ErrInvalidKZGProof)
|
|
||||||
}
|
|
||||||
if !verified {
|
|
||||||
return ErrInvalidKZGProof
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func VerifyDataColumnsCellsKZGProofs(sizeHint int, cellProofsIter iter.Seq[blocks.CellProofBundle]) error {
|
|
||||||
// ignore the failed segment list since we are just passing in one segment.
|
|
||||||
_, err := BatchVerifyDataColumnsCellsKZGProofs(sizeHint, []iter.Seq[blocks.CellProofBundle]{cellProofsIter})
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// BatchVerifyDataColumnsCellsKZGProofs verifies if the KZG proofs are correct.
|
|
||||||
// Note: We are slightly deviating from the specification here:
|
// Note: We are slightly deviating from the specification here:
|
||||||
// The specification verifies the KZG proofs for each sidecar separately,
|
// The specification verifies the KZG proofs for each sidecar separately,
|
||||||
// while we are verifying all the KZG proofs from multiple sidecars in a batch.
|
// while we are verifying all the KZG proofs from multiple sidecars in a batch.
|
||||||
// This is done to improve performance since the internal KZG library is way more
|
// This is done to improve performance since the internal KZG library is way more
|
||||||
// efficient when verifying in batch. If the batch fails, the failed segments
|
// efficient when verifying in batch.
|
||||||
// are returned to the caller so that they may try segment by segment without
|
|
||||||
// batching. On success the failed segment list is empty.
|
|
||||||
//
|
|
||||||
// https://github.com/ethereum/consensus-specs/blob/master/specs/fulu/p2p-interface.md#verify_data_column_sidecar_kzg_proofs
|
// https://github.com/ethereum/consensus-specs/blob/master/specs/fulu/p2p-interface.md#verify_data_column_sidecar_kzg_proofs
|
||||||
func BatchVerifyDataColumnsCellsKZGProofs(sizeHint int, cellProofsIters []iter.Seq[blocks.CellProofBundle]) ( /* failed segment list */ []CellProofBundleSegment, error) {
|
func VerifyDataColumnsSidecarKZGProofs(sidecars []blocks.RODataColumn) error {
|
||||||
commitments := make([]kzg.Bytes48, 0, sizeHint)
|
// Compute the total count.
|
||||||
indices := make([]uint64, 0, sizeHint)
|
count := 0
|
||||||
cells := make([]kzg.Cell, 0, sizeHint)
|
for _, sidecar := range sidecars {
|
||||||
proofs := make([]kzg.Bytes48, 0, sizeHint)
|
count += len(sidecar.Column)
|
||||||
|
}
|
||||||
|
|
||||||
var anySegmentEmpty bool
|
commitments := make([]kzg.Bytes48, 0, count)
|
||||||
var segments []CellProofBundleSegment
|
indices := make([]uint64, 0, count)
|
||||||
for _, cellProofsIter := range cellProofsIters {
|
cells := make([]kzg.Cell, 0, count)
|
||||||
startIdx := len(cells)
|
proofs := make([]kzg.Bytes48, 0, count)
|
||||||
for bundle := range cellProofsIter {
|
|
||||||
|
for _, sidecar := range sidecars {
|
||||||
|
for i := range sidecar.Column {
|
||||||
var (
|
var (
|
||||||
commitment kzg.Bytes48
|
commitment kzg.Bytes48
|
||||||
cell kzg.Cell
|
cell kzg.Cell
|
||||||
proof kzg.Bytes48
|
proof kzg.Bytes48
|
||||||
)
|
)
|
||||||
|
|
||||||
if len(bundle.Commitment) != len(commitment) ||
|
commitmentBytes := sidecar.KzgCommitments[i]
|
||||||
len(bundle.Cell) != len(cell) ||
|
cellBytes := sidecar.Column[i]
|
||||||
len(bundle.Proof) != len(proof) {
|
proofBytes := sidecar.KzgProofs[i]
|
||||||
return nil, ErrMismatchLength
|
|
||||||
|
if len(commitmentBytes) != len(commitment) ||
|
||||||
|
len(cellBytes) != len(cell) ||
|
||||||
|
len(proofBytes) != len(proof) {
|
||||||
|
return ErrMismatchLength
|
||||||
}
|
}
|
||||||
|
|
||||||
copy(commitment[:], bundle.Commitment)
|
copy(commitment[:], commitmentBytes)
|
||||||
copy(cell[:], bundle.Cell)
|
copy(cell[:], cellBytes)
|
||||||
copy(proof[:], bundle.Proof)
|
copy(proof[:], proofBytes)
|
||||||
|
|
||||||
commitments = append(commitments, commitment)
|
commitments = append(commitments, commitment)
|
||||||
indices = append(indices, bundle.ColumnIndex)
|
indices = append(indices, sidecar.Index)
|
||||||
cells = append(cells, cell)
|
cells = append(cells, cell)
|
||||||
proofs = append(proofs, proof)
|
proofs = append(proofs, proof)
|
||||||
}
|
}
|
||||||
if len(cells[startIdx:]) == 0 {
|
|
||||||
anySegmentEmpty = true
|
|
||||||
}
|
|
||||||
segments = append(segments, CellProofBundleSegment{
|
|
||||||
indices: indices[startIdx:],
|
|
||||||
commitments: commitments[startIdx:],
|
|
||||||
cells: cells[startIdx:],
|
|
||||||
proofs: proofs[startIdx:],
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
if anySegmentEmpty {
|
|
||||||
return segments, ErrEmptySegment
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Batch verify that the cells match the corresponding commitments and proofs.
|
// Batch verify that the cells match the corresponding commitments and proofs.
|
||||||
verified, err := kzg.VerifyCellKZGProofBatch(commitments, indices, cells, proofs)
|
verified, err := kzg.VerifyCellKZGProofBatch(commitments, indices, cells, proofs)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return segments, stderrors.Join(err, ErrInvalidKZGProof)
|
return errors.Wrap(err, "verify cell KZG proof batch")
|
||||||
}
|
}
|
||||||
|
|
||||||
if !verified {
|
if !verified {
|
||||||
return segments, ErrInvalidKZGProof
|
return ErrInvalidKZGProof
|
||||||
}
|
|
||||||
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// verifyKzgCommitmentsInclusionProof is the shared implementation for inclusion proof verification.
|
|
||||||
func verifyKzgCommitmentsInclusionProof(bodyRoot []byte, kzgCommitments [][]byte, inclusionProof [][]byte) error {
|
|
||||||
if len(bodyRoot) != fieldparams.RootLength {
|
|
||||||
return ErrBadRootLength
|
|
||||||
}
|
|
||||||
|
|
||||||
leaves := blocks.LeavesFromCommitments(kzgCommitments)
|
|
||||||
|
|
||||||
sparse, err := trie.GenerateTrieFromItems(leaves, fieldparams.LogMaxBlobCommitments)
|
|
||||||
if err != nil {
|
|
||||||
return errors.Wrap(err, "generate trie from items")
|
|
||||||
}
|
|
||||||
|
|
||||||
hashTreeRoot, err := sparse.HashTreeRoot()
|
|
||||||
if err != nil {
|
|
||||||
return errors.Wrap(err, "hash tree root")
|
|
||||||
}
|
|
||||||
|
|
||||||
verified := trie.VerifyMerkleProof(bodyRoot, hashTreeRoot[:], kzgPosition, inclusionProof)
|
|
||||||
if !verified {
|
|
||||||
return ErrInvalidInclusionProof
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
@@ -194,23 +124,30 @@ func VerifyDataColumnSidecarInclusionProof(sidecar blocks.RODataColumn) error {
|
|||||||
if sidecar.SignedBlockHeader == nil || sidecar.SignedBlockHeader.Header == nil {
|
if sidecar.SignedBlockHeader == nil || sidecar.SignedBlockHeader.Header == nil {
|
||||||
return ErrNilBlockHeader
|
return ErrNilBlockHeader
|
||||||
}
|
}
|
||||||
return verifyKzgCommitmentsInclusionProof(
|
|
||||||
sidecar.SignedBlockHeader.Header.BodyRoot,
|
|
||||||
sidecar.KzgCommitments,
|
|
||||||
sidecar.KzgCommitmentsInclusionProof,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
// VerifyPartialDataColumnHeaderInclusionProof verifies if the KZG commitments are included in the beacon block.
|
root := sidecar.SignedBlockHeader.Header.BodyRoot
|
||||||
func VerifyPartialDataColumnHeaderInclusionProof(header *ethpb.PartialDataColumnHeader) error {
|
if len(root) != fieldparams.RootLength {
|
||||||
if header.SignedBlockHeader == nil || header.SignedBlockHeader.Header == nil {
|
return ErrBadRootLength
|
||||||
return ErrNilBlockHeader
|
|
||||||
}
|
}
|
||||||
return verifyKzgCommitmentsInclusionProof(
|
|
||||||
header.SignedBlockHeader.Header.BodyRoot,
|
leaves := blocks.LeavesFromCommitments(sidecar.KzgCommitments)
|
||||||
header.KzgCommitments,
|
|
||||||
header.KzgCommitmentsInclusionProof,
|
sparse, err := trie.GenerateTrieFromItems(leaves, fieldparams.LogMaxBlobCommitments)
|
||||||
)
|
if err != nil {
|
||||||
|
return errors.Wrap(err, "generate trie from items")
|
||||||
|
}
|
||||||
|
|
||||||
|
hashTreeRoot, err := sparse.HashTreeRoot()
|
||||||
|
if err != nil {
|
||||||
|
return errors.Wrap(err, "hash tree root")
|
||||||
|
}
|
||||||
|
|
||||||
|
verified := trie.VerifyMerkleProof(root, hashTreeRoot[:], kzgPosition, sidecar.KzgCommitmentsInclusionProof)
|
||||||
|
if !verified {
|
||||||
|
return ErrInvalidInclusionProof
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ComputeSubnetForDataColumnSidecar computes the subnet for a data column sidecar.
|
// ComputeSubnetForDataColumnSidecar computes the subnet for a data column sidecar.
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ package peerdas_test
|
|||||||
import (
|
import (
|
||||||
"crypto/rand"
|
"crypto/rand"
|
||||||
"fmt"
|
"fmt"
|
||||||
"iter"
|
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/OffchainLabs/prysm/v7/beacon-chain/blockchain/kzg"
|
"github.com/OffchainLabs/prysm/v7/beacon-chain/blockchain/kzg"
|
||||||
@@ -73,7 +72,7 @@ func TestVerifyDataColumnSidecarKZGProofs(t *testing.T) {
|
|||||||
sidecars := generateRandomSidecars(t, seed, blobCount)
|
sidecars := generateRandomSidecars(t, seed, blobCount)
|
||||||
sidecars[0].Column[0] = sidecars[0].Column[0][:len(sidecars[0].Column[0])-1] // Remove one byte to create size mismatch
|
sidecars[0].Column[0] = sidecars[0].Column[0][:len(sidecars[0].Column[0])-1] // Remove one byte to create size mismatch
|
||||||
|
|
||||||
err := peerdas.VerifyDataColumnsCellsKZGProofs(0, blocks.RODataColumnsToCellProofBundles(sidecars))
|
err := peerdas.VerifyDataColumnsSidecarKZGProofs(sidecars)
|
||||||
require.ErrorIs(t, err, peerdas.ErrMismatchLength)
|
require.ErrorIs(t, err, peerdas.ErrMismatchLength)
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -81,15 +80,14 @@ func TestVerifyDataColumnSidecarKZGProofs(t *testing.T) {
|
|||||||
sidecars := generateRandomSidecars(t, seed, blobCount)
|
sidecars := generateRandomSidecars(t, seed, blobCount)
|
||||||
sidecars[0].Column[0][0]++ // It is OK to overflow
|
sidecars[0].Column[0][0]++ // It is OK to overflow
|
||||||
|
|
||||||
err := peerdas.VerifyDataColumnsCellsKZGProofs(0, blocks.RODataColumnsToCellProofBundles(sidecars))
|
err := peerdas.VerifyDataColumnsSidecarKZGProofs(sidecars)
|
||||||
require.ErrorIs(t, err, peerdas.ErrInvalidKZGProof)
|
require.ErrorIs(t, err, peerdas.ErrInvalidKZGProof)
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("nominal", func(t *testing.T) {
|
t.Run("nominal", func(t *testing.T) {
|
||||||
sidecars := generateRandomSidecars(t, seed, blobCount)
|
sidecars := generateRandomSidecars(t, seed, blobCount)
|
||||||
failedSegments, err := peerdas.BatchVerifyDataColumnsCellsKZGProofs(blobCount, []iter.Seq[blocks.CellProofBundle]{blocks.RODataColumnsToCellProofBundles(sidecars)})
|
err := peerdas.VerifyDataColumnsSidecarKZGProofs(sidecars)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, 0, len(failedSegments))
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -275,7 +273,7 @@ func BenchmarkVerifyDataColumnSidecarKZGProofs_SameCommitments_NoBatch(b *testin
|
|||||||
for _, sidecar := range sidecars {
|
for _, sidecar := range sidecars {
|
||||||
sidecars := []blocks.RODataColumn{sidecar}
|
sidecars := []blocks.RODataColumn{sidecar}
|
||||||
b.StartTimer()
|
b.StartTimer()
|
||||||
err := peerdas.VerifyDataColumnsCellsKZGProofs(0, blocks.RODataColumnsToCellProofBundles(sidecars))
|
err := peerdas.VerifyDataColumnsSidecarKZGProofs(sidecars)
|
||||||
b.StopTimer()
|
b.StopTimer()
|
||||||
require.NoError(b, err)
|
require.NoError(b, err)
|
||||||
}
|
}
|
||||||
@@ -310,7 +308,7 @@ func BenchmarkVerifyDataColumnSidecarKZGProofs_DiffCommitments_Batch(b *testing.
|
|||||||
}
|
}
|
||||||
|
|
||||||
b.StartTimer()
|
b.StartTimer()
|
||||||
err := peerdas.VerifyDataColumnsCellsKZGProofs(0, blocks.RODataColumnsToCellProofBundles(allSidecars))
|
err := peerdas.VerifyDataColumnsSidecarKZGProofs(allSidecars)
|
||||||
b.StopTimer()
|
b.StopTimer()
|
||||||
require.NoError(b, err)
|
require.NoError(b, err)
|
||||||
}
|
}
|
||||||
@@ -343,7 +341,7 @@ func BenchmarkVerifyDataColumnSidecarKZGProofs_DiffCommitments_Batch4(b *testing
|
|||||||
|
|
||||||
for _, sidecars := range allSidecars {
|
for _, sidecars := range allSidecars {
|
||||||
b.StartTimer()
|
b.StartTimer()
|
||||||
err := peerdas.VerifyDataColumnsCellsKZGProofs(len(allSidecars), blocks.RODataColumnsToCellProofBundles(sidecars))
|
err := peerdas.VerifyDataColumnsSidecarKZGProofs(sidecars)
|
||||||
b.StopTimer()
|
b.StopTimer()
|
||||||
require.NoError(b, err)
|
require.NoError(b, err)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/OffchainLabs/go-bitfield"
|
|
||||||
"github.com/OffchainLabs/prysm/v7/beacon-chain/blockchain/kzg"
|
"github.com/OffchainLabs/prysm/v7/beacon-chain/blockchain/kzg"
|
||||||
fieldparams "github.com/OffchainLabs/prysm/v7/config/fieldparams"
|
fieldparams "github.com/OffchainLabs/prysm/v7/config/fieldparams"
|
||||||
"github.com/OffchainLabs/prysm/v7/config/params"
|
"github.com/OffchainLabs/prysm/v7/config/params"
|
||||||
@@ -340,8 +339,7 @@ func ComputeCellsAndProofsFromFlat(blobs [][]byte, cellProofs [][]byte) ([][]kzg
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ComputeCellsAndProofsFromStructured computes the cells and proofs from blobs and cell proofs.
|
// ComputeCellsAndProofsFromStructured computes the cells and proofs from blobs and cell proofs.
|
||||||
// commitmentCount is required to return the correct sized bitlist even if we see a nil slice of blobsAndProofs.
|
func ComputeCellsAndProofsFromStructured(blobsAndProofs []*pb.BlobAndProofV2) ([][]kzg.Cell, [][]kzg.Proof, error) {
|
||||||
func ComputeCellsAndProofsFromStructured(commitmentCount uint64, blobsAndProofs []*pb.BlobAndProofV2) (bitfield.Bitlist /* parts included */, [][]kzg.Cell, [][]kzg.Proof, error) {
|
|
||||||
start := time.Now()
|
start := time.Now()
|
||||||
defer func() {
|
defer func() {
|
||||||
cellsAndProofsFromStructuredComputationTime.Observe(float64(time.Since(start).Milliseconds()))
|
cellsAndProofsFromStructuredComputationTime.Observe(float64(time.Since(start).Milliseconds()))
|
||||||
@@ -349,24 +347,14 @@ func ComputeCellsAndProofsFromStructured(commitmentCount uint64, blobsAndProofs
|
|||||||
|
|
||||||
var wg errgroup.Group
|
var wg errgroup.Group
|
||||||
|
|
||||||
var blobsPresent int
|
cellsPerBlob := make([][]kzg.Cell, len(blobsAndProofs))
|
||||||
for _, blobAndProof := range blobsAndProofs {
|
proofsPerBlob := make([][]kzg.Proof, len(blobsAndProofs))
|
||||||
if blobAndProof != nil {
|
|
||||||
blobsPresent++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
cellsPerBlob := make([][]kzg.Cell, blobsPresent)
|
|
||||||
proofsPerBlob := make([][]kzg.Proof, blobsPresent)
|
|
||||||
included := bitfield.NewBitlist(commitmentCount)
|
|
||||||
|
|
||||||
var j int
|
|
||||||
for i, blobAndProof := range blobsAndProofs {
|
for i, blobAndProof := range blobsAndProofs {
|
||||||
if blobAndProof == nil {
|
if blobAndProof == nil {
|
||||||
continue
|
return nil, nil, ErrNilBlobAndProof
|
||||||
}
|
}
|
||||||
included.SetBitAt(uint64(i), true)
|
|
||||||
|
|
||||||
compactIndex := j
|
|
||||||
wg.Go(func() error {
|
wg.Go(func() error {
|
||||||
var kzgBlob kzg.Blob
|
var kzgBlob kzg.Blob
|
||||||
if copy(kzgBlob[:], blobAndProof.Blob) != len(kzgBlob) {
|
if copy(kzgBlob[:], blobAndProof.Blob) != len(kzgBlob) {
|
||||||
@@ -393,18 +381,17 @@ func ComputeCellsAndProofsFromStructured(commitmentCount uint64, blobsAndProofs
|
|||||||
kzgProofs = append(kzgProofs, kzgProof)
|
kzgProofs = append(kzgProofs, kzgProof)
|
||||||
}
|
}
|
||||||
|
|
||||||
cellsPerBlob[compactIndex] = cells
|
cellsPerBlob[i] = cells
|
||||||
proofsPerBlob[compactIndex] = kzgProofs
|
proofsPerBlob[i] = kzgProofs
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
j++
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := wg.Wait(); err != nil {
|
if err := wg.Wait(); err != nil {
|
||||||
return nil, nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return included, cellsPerBlob, proofsPerBlob, nil
|
return cellsPerBlob, proofsPerBlob, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ReconstructBlobs reconstructs blobs from data column sidecars without computing KZG proofs or creating sidecars.
|
// ReconstructBlobs reconstructs blobs from data column sidecars without computing KZG proofs or creating sidecars.
|
||||||
|
|||||||
@@ -479,9 +479,8 @@ func TestComputeCellsAndProofsFromFlat(t *testing.T) {
|
|||||||
|
|
||||||
func TestComputeCellsAndProofsFromStructured(t *testing.T) {
|
func TestComputeCellsAndProofsFromStructured(t *testing.T) {
|
||||||
t.Run("nil blob and proof", func(t *testing.T) {
|
t.Run("nil blob and proof", func(t *testing.T) {
|
||||||
included, _, _, err := peerdas.ComputeCellsAndProofsFromStructured(0, []*pb.BlobAndProofV2{nil})
|
_, _, err := peerdas.ComputeCellsAndProofsFromStructured([]*pb.BlobAndProofV2{nil})
|
||||||
require.NoError(t, err)
|
require.ErrorIs(t, err, peerdas.ErrNilBlobAndProof)
|
||||||
require.Equal(t, uint64(0), included.Count())
|
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("nominal", func(t *testing.T) {
|
t.Run("nominal", func(t *testing.T) {
|
||||||
@@ -534,8 +533,7 @@ func TestComputeCellsAndProofsFromStructured(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
// Test ComputeCellsAndProofs
|
// Test ComputeCellsAndProofs
|
||||||
included, actualCellsPerBlob, actualProofsPerBlob, err := peerdas.ComputeCellsAndProofsFromStructured(uint64(len(blobsAndProofs)), blobsAndProofs)
|
actualCellsPerBlob, actualProofsPerBlob, err := peerdas.ComputeCellsAndProofsFromStructured(blobsAndProofs)
|
||||||
require.Equal(t, included.Count(), uint64(len(actualCellsPerBlob)))
|
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, blobCount, len(actualCellsPerBlob))
|
require.Equal(t, blobCount, len(actualCellsPerBlob))
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ package peerdas
|
|||||||
import (
|
import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/OffchainLabs/go-bitfield"
|
|
||||||
"github.com/OffchainLabs/prysm/v7/beacon-chain/blockchain/kzg"
|
"github.com/OffchainLabs/prysm/v7/beacon-chain/blockchain/kzg"
|
||||||
beaconState "github.com/OffchainLabs/prysm/v7/beacon-chain/state"
|
beaconState "github.com/OffchainLabs/prysm/v7/beacon-chain/state"
|
||||||
fieldparams "github.com/OffchainLabs/prysm/v7/config/fieldparams"
|
fieldparams "github.com/OffchainLabs/prysm/v7/config/fieldparams"
|
||||||
@@ -24,13 +23,11 @@ var (
|
|||||||
var (
|
var (
|
||||||
_ ConstructionPopulator = (*BlockReconstructionSource)(nil)
|
_ ConstructionPopulator = (*BlockReconstructionSource)(nil)
|
||||||
_ ConstructionPopulator = (*SidecarReconstructionSource)(nil)
|
_ ConstructionPopulator = (*SidecarReconstructionSource)(nil)
|
||||||
_ ConstructionPopulator = (*PartialDataColumnHeaderReconstructionSource)(nil)
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
BlockType = "BeaconBlock"
|
BlockType = "BeaconBlock"
|
||||||
SidecarType = "DataColumnSidecar"
|
SidecarType = "DataColumnSidecar"
|
||||||
PartialDataColumnHeaderType = "PartialDataColumnHeader"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type (
|
type (
|
||||||
@@ -57,10 +54,6 @@ type (
|
|||||||
blocks.VerifiedRODataColumn
|
blocks.VerifiedRODataColumn
|
||||||
}
|
}
|
||||||
|
|
||||||
PartialDataColumnHeaderReconstructionSource struct {
|
|
||||||
*ethpb.PartialDataColumnHeader
|
|
||||||
}
|
|
||||||
|
|
||||||
blockInfo struct {
|
blockInfo struct {
|
||||||
signedBlockHeader *ethpb.SignedBeaconBlockHeader
|
signedBlockHeader *ethpb.SignedBeaconBlockHeader
|
||||||
kzgCommitments [][]byte
|
kzgCommitments [][]byte
|
||||||
@@ -78,11 +71,6 @@ func PopulateFromSidecar(sidecar blocks.VerifiedRODataColumn) *SidecarReconstruc
|
|||||||
return &SidecarReconstructionSource{VerifiedRODataColumn: sidecar}
|
return &SidecarReconstructionSource{VerifiedRODataColumn: sidecar}
|
||||||
}
|
}
|
||||||
|
|
||||||
// PopulateFromPartialHeader creates a PartialDataColumnHeaderReconstructionSource from a partial header
|
|
||||||
func PopulateFromPartialHeader(header *ethpb.PartialDataColumnHeader) *PartialDataColumnHeaderReconstructionSource {
|
|
||||||
return &PartialDataColumnHeaderReconstructionSource{PartialDataColumnHeader: header}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ValidatorsCustodyRequirement returns the number of custody groups regarding the validator indices attached to the beacon node.
|
// ValidatorsCustodyRequirement returns the number of custody groups regarding the validator indices attached to the beacon node.
|
||||||
// https://github.com/ethereum/consensus-specs/blob/master/specs/fulu/validator.md#validator-custody
|
// https://github.com/ethereum/consensus-specs/blob/master/specs/fulu/validator.md#validator-custody
|
||||||
func ValidatorsCustodyRequirement(state beaconState.ReadOnlyBeaconState, validatorsIndex map[primitives.ValidatorIndex]bool) (uint64, error) {
|
func ValidatorsCustodyRequirement(state beaconState.ReadOnlyBeaconState, validatorsIndex map[primitives.ValidatorIndex]bool) (uint64, error) {
|
||||||
@@ -155,40 +143,6 @@ func DataColumnSidecars(cellsPerBlob [][]kzg.Cell, proofsPerBlob [][]kzg.Proof,
|
|||||||
return roSidecars, nil
|
return roSidecars, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func PartialColumns(included bitfield.Bitlist, cellsPerBlob [][]kzg.Cell, proofsPerBlob [][]kzg.Proof, src ConstructionPopulator) ([]blocks.PartialDataColumn, error) {
|
|
||||||
start := time.Now()
|
|
||||||
const numberOfColumns = uint64(fieldparams.NumberOfColumns)
|
|
||||||
cells, proofs, err := rotateRowsToCols(cellsPerBlob, proofsPerBlob, numberOfColumns)
|
|
||||||
if err != nil {
|
|
||||||
return nil, errors.Wrap(err, "rotate cells and proofs")
|
|
||||||
}
|
|
||||||
info, err := src.extract()
|
|
||||||
if err != nil {
|
|
||||||
return nil, errors.Wrap(err, "extract block info")
|
|
||||||
}
|
|
||||||
|
|
||||||
dataColumns := make([]blocks.PartialDataColumn, 0, numberOfColumns)
|
|
||||||
for idx := range numberOfColumns {
|
|
||||||
dc, err := blocks.NewPartialDataColumn(info.signedBlockHeader, idx, info.kzgCommitments, info.kzgInclusionProof)
|
|
||||||
if err != nil {
|
|
||||||
return nil, errors.Wrap(err, "new ro data column")
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := range len(info.kzgCommitments) {
|
|
||||||
if !included.BitAt(uint64(i)) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
dc.ExtendFromVerfifiedCell(uint64(i), cells[idx][0], proofs[idx][0])
|
|
||||||
cells[idx] = cells[idx][1:]
|
|
||||||
proofs[idx] = proofs[idx][1:]
|
|
||||||
}
|
|
||||||
dataColumns = append(dataColumns, dc)
|
|
||||||
}
|
|
||||||
|
|
||||||
dataColumnComputationTime.Observe(float64(time.Since(start).Milliseconds()))
|
|
||||||
return dataColumns, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Slot returns the slot of the source
|
// Slot returns the slot of the source
|
||||||
func (s *BlockReconstructionSource) Slot() primitives.Slot {
|
func (s *BlockReconstructionSource) Slot() primitives.Slot {
|
||||||
return s.Block().Slot()
|
return s.Block().Slot()
|
||||||
@@ -300,43 +254,3 @@ func (s *SidecarReconstructionSource) extract() (*blockInfo, error) {
|
|||||||
|
|
||||||
return info, nil
|
return info, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Slot returns the slot from the partial data column header
|
|
||||||
func (p *PartialDataColumnHeaderReconstructionSource) Slot() primitives.Slot {
|
|
||||||
return p.SignedBlockHeader.Header.Slot
|
|
||||||
}
|
|
||||||
|
|
||||||
// Root returns the block root computed from the header
|
|
||||||
func (p *PartialDataColumnHeaderReconstructionSource) Root() [fieldparams.RootLength]byte {
|
|
||||||
root, err := p.SignedBlockHeader.Header.HashTreeRoot()
|
|
||||||
if err != nil {
|
|
||||||
return [fieldparams.RootLength]byte{}
|
|
||||||
}
|
|
||||||
return root
|
|
||||||
}
|
|
||||||
|
|
||||||
// ProposerIndex returns the proposer index from the header
|
|
||||||
func (p *PartialDataColumnHeaderReconstructionSource) ProposerIndex() primitives.ValidatorIndex {
|
|
||||||
return p.SignedBlockHeader.Header.ProposerIndex
|
|
||||||
}
|
|
||||||
|
|
||||||
// Commitments returns the KZG commitments from the header
|
|
||||||
func (p *PartialDataColumnHeaderReconstructionSource) Commitments() ([][]byte, error) {
|
|
||||||
return p.KzgCommitments, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Type returns the type of the source
|
|
||||||
func (p *PartialDataColumnHeaderReconstructionSource) Type() string {
|
|
||||||
return PartialDataColumnHeaderType
|
|
||||||
}
|
|
||||||
|
|
||||||
// extract extracts the block information from the partial header
|
|
||||||
func (p *PartialDataColumnHeaderReconstructionSource) extract() (*blockInfo, error) {
|
|
||||||
info := &blockInfo{
|
|
||||||
signedBlockHeader: p.SignedBlockHeader,
|
|
||||||
kzgCommitments: p.KzgCommitments,
|
|
||||||
kzgInclusionProof: p.KzgCommitmentsInclusionProof,
|
|
||||||
}
|
|
||||||
|
|
||||||
return info, nil
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -267,31 +267,4 @@ func TestReconstructionSource(t *testing.T) {
|
|||||||
|
|
||||||
require.Equal(t, peerdas.SidecarType, src.Type())
|
require.Equal(t, peerdas.SidecarType, src.Type())
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("from partial header", func(t *testing.T) {
|
|
||||||
referenceSidecar := sidecars[0]
|
|
||||||
partialHeader := ðpb.PartialDataColumnHeader{
|
|
||||||
SignedBlockHeader: referenceSidecar.SignedBlockHeader,
|
|
||||||
KzgCommitments: referenceSidecar.KzgCommitments,
|
|
||||||
KzgCommitmentsInclusionProof: referenceSidecar.KzgCommitmentsInclusionProof,
|
|
||||||
}
|
|
||||||
|
|
||||||
src := peerdas.PopulateFromPartialHeader(partialHeader)
|
|
||||||
require.Equal(t, referenceSidecar.SignedBlockHeader.Header.Slot, src.Slot())
|
|
||||||
|
|
||||||
// Compute expected root
|
|
||||||
expectedRoot, err := referenceSidecar.SignedBlockHeader.Header.HashTreeRoot()
|
|
||||||
require.NoError(t, err)
|
|
||||||
require.Equal(t, expectedRoot, src.Root())
|
|
||||||
|
|
||||||
require.Equal(t, referenceSidecar.SignedBlockHeader.Header.ProposerIndex, src.ProposerIndex())
|
|
||||||
|
|
||||||
commitments, err := src.Commitments()
|
|
||||||
require.NoError(t, err)
|
|
||||||
require.Equal(t, 2, len(commitments))
|
|
||||||
require.DeepEqual(t, commitment1, commitments[0])
|
|
||||||
require.DeepEqual(t, commitment2, commitments[1])
|
|
||||||
|
|
||||||
require.Equal(t, peerdas.PartialDataColumnHeaderType, src.Type())
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -73,7 +73,6 @@ go_library(
|
|||||||
"@com_github_pkg_errors//:go_default_library",
|
"@com_github_pkg_errors//:go_default_library",
|
||||||
"@com_github_prometheus_client_golang//prometheus:go_default_library",
|
"@com_github_prometheus_client_golang//prometheus:go_default_library",
|
||||||
"@com_github_prometheus_client_golang//prometheus/promauto:go_default_library",
|
"@com_github_prometheus_client_golang//prometheus/promauto:go_default_library",
|
||||||
"@com_github_prysmaticlabs_go_bitfield//:go_default_library",
|
|
||||||
"@com_github_sirupsen_logrus//:go_default_library",
|
"@com_github_sirupsen_logrus//:go_default_library",
|
||||||
"@io_k8s_client_go//tools/cache:go_default_library",
|
"@io_k8s_client_go//tools/cache:go_default_library",
|
||||||
"@org_golang_google_protobuf//proto:go_default_library",
|
"@org_golang_google_protobuf//proto:go_default_library",
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/OffchainLabs/go-bitfield"
|
|
||||||
"github.com/OffchainLabs/prysm/v7/beacon-chain/blockchain/kzg"
|
"github.com/OffchainLabs/prysm/v7/beacon-chain/blockchain/kzg"
|
||||||
"github.com/OffchainLabs/prysm/v7/beacon-chain/core/peerdas"
|
"github.com/OffchainLabs/prysm/v7/beacon-chain/core/peerdas"
|
||||||
"github.com/OffchainLabs/prysm/v7/beacon-chain/execution/types"
|
"github.com/OffchainLabs/prysm/v7/beacon-chain/execution/types"
|
||||||
@@ -59,7 +58,6 @@ var (
|
|||||||
fuluEngineEndpoints = []string{
|
fuluEngineEndpoints = []string{
|
||||||
GetPayloadMethodV5,
|
GetPayloadMethodV5,
|
||||||
GetBlobsV2,
|
GetBlobsV2,
|
||||||
GetBlobsV3,
|
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -101,8 +99,6 @@ const (
|
|||||||
GetBlobsV1 = "engine_getBlobsV1"
|
GetBlobsV1 = "engine_getBlobsV1"
|
||||||
// GetBlobsV2 request string for JSON-RPC.
|
// GetBlobsV2 request string for JSON-RPC.
|
||||||
GetBlobsV2 = "engine_getBlobsV2"
|
GetBlobsV2 = "engine_getBlobsV2"
|
||||||
// GetBlobsV3 request string for JSON-RPC.
|
|
||||||
GetBlobsV3 = "engine_getBlobsV3"
|
|
||||||
// Defines the seconds before timing out engine endpoints with non-block execution semantics.
|
// Defines the seconds before timing out engine endpoints with non-block execution semantics.
|
||||||
defaultEngineTimeout = time.Second
|
defaultEngineTimeout = time.Second
|
||||||
)
|
)
|
||||||
@@ -126,7 +122,7 @@ type Reconstructor interface {
|
|||||||
ctx context.Context, blindedBlocks []interfaces.ReadOnlySignedBeaconBlock,
|
ctx context.Context, blindedBlocks []interfaces.ReadOnlySignedBeaconBlock,
|
||||||
) ([]interfaces.SignedBeaconBlock, error)
|
) ([]interfaces.SignedBeaconBlock, error)
|
||||||
ReconstructBlobSidecars(ctx context.Context, block interfaces.ReadOnlySignedBeaconBlock, blockRoot [fieldparams.RootLength]byte, hi func(uint64) bool) ([]blocks.VerifiedROBlob, error)
|
ReconstructBlobSidecars(ctx context.Context, block interfaces.ReadOnlySignedBeaconBlock, blockRoot [fieldparams.RootLength]byte, hi func(uint64) bool) ([]blocks.VerifiedROBlob, error)
|
||||||
ConstructDataColumnSidecars(ctx context.Context, populator peerdas.ConstructionPopulator) ([]blocks.VerifiedRODataColumn, []blocks.PartialDataColumn, error)
|
ConstructDataColumnSidecars(ctx context.Context, populator peerdas.ConstructionPopulator) ([]blocks.VerifiedRODataColumn, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// EngineCaller defines a client that can interact with an Ethereum
|
// EngineCaller defines a client that can interact with an Ethereum
|
||||||
@@ -557,22 +553,6 @@ func (s *Service) GetBlobsV2(ctx context.Context, versionedHashes []common.Hash)
|
|||||||
return result, handleRPCError(err)
|
return result, handleRPCError(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Service) GetBlobsV3(ctx context.Context, versionedHashes []common.Hash) ([]*pb.BlobAndProofV2, error) {
|
|
||||||
ctx, span := trace.StartSpan(ctx, "powchain.engine-api-client.GetBlobsV3")
|
|
||||||
defer span.End()
|
|
||||||
start := time.Now()
|
|
||||||
|
|
||||||
if !s.capabilityCache.has(GetBlobsV3) {
|
|
||||||
return nil, errors.New(fmt.Sprintf("%s is not supported", GetBlobsV3))
|
|
||||||
}
|
|
||||||
|
|
||||||
getBlobsV3RequestsTotal.Inc()
|
|
||||||
result := make([]*pb.BlobAndProofV2, len(versionedHashes))
|
|
||||||
err := s.rpcClient.CallContext(ctx, &result, GetBlobsV3, versionedHashes)
|
|
||||||
getBlobsV3Latency.Observe(time.Since(start).Seconds())
|
|
||||||
return result, handleRPCError(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ReconstructFullBlock takes in a blinded beacon block and reconstructs
|
// ReconstructFullBlock takes in a blinded beacon block and reconstructs
|
||||||
// a beacon block with a full execution payload via the engine API.
|
// a beacon block with a full execution payload via the engine API.
|
||||||
func (s *Service) ReconstructFullBlock(
|
func (s *Service) ReconstructFullBlock(
|
||||||
@@ -683,47 +663,40 @@ func (s *Service) ReconstructBlobSidecars(ctx context.Context, block interfaces.
|
|||||||
return verifiedBlobs, nil
|
return verifiedBlobs, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Service) ConstructDataColumnSidecars(ctx context.Context, populator peerdas.ConstructionPopulator) ([]blocks.VerifiedRODataColumn, []blocks.PartialDataColumn, error) {
|
func (s *Service) ConstructDataColumnSidecars(ctx context.Context, populator peerdas.ConstructionPopulator) ([]blocks.VerifiedRODataColumn, error) {
|
||||||
root := populator.Root()
|
root := populator.Root()
|
||||||
|
|
||||||
// Fetch cells and proofs from the execution client using the KZG commitments from the sidecar.
|
// Fetch cells and proofs from the execution client using the KZG commitments from the sidecar.
|
||||||
commitments, err := populator.Commitments()
|
commitments, err := populator.Commitments()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, wrapWithBlockRoot(err, root, "commitments")
|
return nil, wrapWithBlockRoot(err, root, "commitments")
|
||||||
}
|
}
|
||||||
|
|
||||||
included, cellsPerBlob, proofsPerBlob, err := s.fetchCellsAndProofsFromExecution(ctx, commitments)
|
cellsPerBlob, proofsPerBlob, err := s.fetchCellsAndProofsFromExecution(ctx, commitments)
|
||||||
log.Info("Received cells and proofs from execution client", "included", included, "cells count", len(cellsPerBlob), "err", err)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, wrapWithBlockRoot(err, root, "fetch cells and proofs from execution client")
|
return nil, wrapWithBlockRoot(err, root, "fetch cells and proofs from execution client")
|
||||||
}
|
}
|
||||||
|
|
||||||
partialColumns, err := peerdas.PartialColumns(included, cellsPerBlob, proofsPerBlob, populator)
|
// Return early if nothing is returned from the EL.
|
||||||
haveAllBlobs := included.Count() == uint64(len(commitments))
|
if len(cellsPerBlob) == 0 {
|
||||||
log.Info("Constructed partial columns", "haveAllBlobs", haveAllBlobs)
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
if haveAllBlobs {
|
|
||||||
// Construct data column sidears from the signed block and cells and proofs.
|
// Construct data column sidears from the signed block and cells and proofs.
|
||||||
roSidecars, err := peerdas.DataColumnSidecars(cellsPerBlob, proofsPerBlob, populator)
|
roSidecars, err := peerdas.DataColumnSidecars(cellsPerBlob, proofsPerBlob, populator)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, wrapWithBlockRoot(err, populator.Root(), "data column sidcars from column sidecar")
|
return nil, wrapWithBlockRoot(err, populator.Root(), "data column sidcars from column sidecar")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Upgrade the sidecars to verified sidecars.
|
// Upgrade the sidecars to verified sidecars.
|
||||||
// We trust the execution layer we are connected to, so we can upgrade the sidecar into a verified one.
|
// We trust the execution layer we are connected to, so we can upgrade the sidecar into a verified one.
|
||||||
verifiedROSidecars := upgradeSidecarsToVerifiedSidecars(roSidecars)
|
verifiedROSidecars := upgradeSidecarsToVerifiedSidecars(roSidecars)
|
||||||
|
|
||||||
return verifiedROSidecars, partialColumns, nil
|
return verifiedROSidecars, nil
|
||||||
}
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, wrapWithBlockRoot(err, populator.Root(), "partial columns from column sidecar")
|
|
||||||
}
|
|
||||||
return nil, partialColumns, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// fetchCellsAndProofsFromExecution fetches cells and proofs from the execution client (using engine_getBlobsV2 execution API method)
|
// fetchCellsAndProofsFromExecution fetches cells and proofs from the execution client (using engine_getBlobsV2 execution API method)
|
||||||
func (s *Service) fetchCellsAndProofsFromExecution(ctx context.Context, kzgCommitments [][]byte) (bitfield.Bitlist /* included parts */, [][]kzg.Cell, [][]kzg.Proof, error) {
|
func (s *Service) fetchCellsAndProofsFromExecution(ctx context.Context, kzgCommitments [][]byte) ([][]kzg.Cell, [][]kzg.Proof, error) {
|
||||||
// Collect KZG hashes for all blobs.
|
// Collect KZG hashes for all blobs.
|
||||||
versionedHashes := make([]common.Hash, 0, len(kzgCommitments))
|
versionedHashes := make([]common.Hash, 0, len(kzgCommitments))
|
||||||
for _, commitment := range kzgCommitments {
|
for _, commitment := range kzgCommitments {
|
||||||
@@ -731,34 +704,24 @@ func (s *Service) fetchCellsAndProofsFromExecution(ctx context.Context, kzgCommi
|
|||||||
versionedHashes = append(versionedHashes, versionedHash)
|
versionedHashes = append(versionedHashes, versionedHash)
|
||||||
}
|
}
|
||||||
|
|
||||||
var blobAndProofs []*pb.BlobAndProofV2
|
|
||||||
|
|
||||||
// Fetch all blobsAndCellsProofs from the execution client.
|
// Fetch all blobsAndCellsProofs from the execution client.
|
||||||
var err error
|
blobAndProofV2s, err := s.GetBlobsV2(ctx, versionedHashes)
|
||||||
useV3 := s.capabilityCache.has(GetBlobsV3)
|
if err != nil {
|
||||||
if useV3 {
|
return nil, nil, errors.Wrapf(err, "get blobs V2")
|
||||||
// v3 can return a partial response. V2 is all or nothing
|
|
||||||
blobAndProofs, err = s.GetBlobsV3(ctx, versionedHashes)
|
|
||||||
} else {
|
|
||||||
blobAndProofs, err = s.GetBlobsV2(ctx, versionedHashes)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if err != nil {
|
// Return early if nothing is returned from the EL.
|
||||||
return nil, nil, nil, errors.Wrapf(err, "get blobs V2/3")
|
if len(blobAndProofV2s) == 0 {
|
||||||
|
return nil, nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Compute cells and proofs from the blobs and cell proofs.
|
// Compute cells and proofs from the blobs and cell proofs.
|
||||||
included, cellsPerBlob, proofsPerBlob, err := peerdas.ComputeCellsAndProofsFromStructured(uint64(len(kzgCommitments)), blobAndProofs)
|
cellsPerBlob, proofsPerBlob, err := peerdas.ComputeCellsAndProofsFromStructured(blobAndProofV2s)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, nil, errors.Wrap(err, "compute cells and proofs")
|
return nil, nil, errors.Wrap(err, "compute cells and proofs")
|
||||||
}
|
|
||||||
if included.Count() == uint64(len(kzgCommitments)) {
|
|
||||||
getBlobsV3CompleteResponsesTotal.Inc()
|
|
||||||
} else if included.Count() > 0 {
|
|
||||||
getBlobsV3PartialResponsesTotal.Inc()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return included, cellsPerBlob, proofsPerBlob, nil
|
return cellsPerBlob, proofsPerBlob, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// upgradeSidecarsToVerifiedSidecars upgrades a list of data column sidecars into verified data column sidecars.
|
// upgradeSidecarsToVerifiedSidecars upgrades a list of data column sidecars into verified data column sidecars.
|
||||||
|
|||||||
@@ -2587,7 +2587,7 @@ func TestConstructDataColumnSidecars(t *testing.T) {
|
|||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
|
|
||||||
t.Run("GetBlobsV2 is not supported", func(t *testing.T) {
|
t.Run("GetBlobsV2 is not supported", func(t *testing.T) {
|
||||||
_, _, err := client.ConstructDataColumnSidecars(ctx, peerdas.PopulateFromBlock(roBlock))
|
_, err := client.ConstructDataColumnSidecars(ctx, peerdas.PopulateFromBlock(roBlock))
|
||||||
require.ErrorContains(t, "engine_getBlobsV2 is not supported", err)
|
require.ErrorContains(t, "engine_getBlobsV2 is not supported", err)
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -2598,7 +2598,7 @@ func TestConstructDataColumnSidecars(t *testing.T) {
|
|||||||
rpcClient, client := setupRpcClientV2(t, srv.URL, client)
|
rpcClient, client := setupRpcClientV2(t, srv.URL, client)
|
||||||
defer rpcClient.Close()
|
defer rpcClient.Close()
|
||||||
|
|
||||||
dataColumns, _, err := client.ConstructDataColumnSidecars(ctx, peerdas.PopulateFromBlock(roBlock))
|
dataColumns, err := client.ConstructDataColumnSidecars(ctx, peerdas.PopulateFromBlock(roBlock))
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, 0, len(dataColumns))
|
require.Equal(t, 0, len(dataColumns))
|
||||||
})
|
})
|
||||||
@@ -2611,7 +2611,7 @@ func TestConstructDataColumnSidecars(t *testing.T) {
|
|||||||
rpcClient, client := setupRpcClientV2(t, srv.URL, client)
|
rpcClient, client := setupRpcClientV2(t, srv.URL, client)
|
||||||
defer rpcClient.Close()
|
defer rpcClient.Close()
|
||||||
|
|
||||||
dataColumns, _, err := client.ConstructDataColumnSidecars(ctx, peerdas.PopulateFromBlock(roBlock))
|
dataColumns, err := client.ConstructDataColumnSidecars(ctx, peerdas.PopulateFromBlock(roBlock))
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, 128, len(dataColumns))
|
require.Equal(t, 128, len(dataColumns))
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -34,25 +34,6 @@ var (
|
|||||||
Buckets: []float64{25, 50, 100, 200, 500, 1000, 2000, 4000},
|
Buckets: []float64{25, 50, 100, 200, 500, 1000, 2000, 4000},
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
getBlobsV3RequestsTotal = promauto.NewCounter(prometheus.CounterOpts{
|
|
||||||
Name: "beacon_engine_getBlobsV3_requests_total",
|
|
||||||
Help: "Total number of engine_getBlobsV3 requests sent",
|
|
||||||
})
|
|
||||||
getBlobsV3CompleteResponsesTotal = promauto.NewCounter(prometheus.CounterOpts{
|
|
||||||
Name: "beacon_engine_getBlobsV3_complete_responses_total",
|
|
||||||
Help: "Total number of complete engine_getBlobsV3 successful responses received",
|
|
||||||
})
|
|
||||||
getBlobsV3PartialResponsesTotal = promauto.NewCounter(prometheus.CounterOpts{
|
|
||||||
Name: "beacon_engine_getBlobsV3_partial_responses_total",
|
|
||||||
Help: "Total number of engine_getBlobsV3 partial responses received",
|
|
||||||
})
|
|
||||||
getBlobsV3Latency = promauto.NewHistogram(
|
|
||||||
prometheus.HistogramOpts{
|
|
||||||
Name: "beacon_engine_getBlobsV3_request_duration_seconds",
|
|
||||||
Help: "Duration of engine_getBlobsV3 requests in seconds",
|
|
||||||
Buckets: []float64{0.025, 0.05, 0.1, 0.2, 0.5, 1, 2, 4},
|
|
||||||
},
|
|
||||||
)
|
|
||||||
errParseCount = promauto.NewCounter(prometheus.CounterOpts{
|
errParseCount = promauto.NewCounter(prometheus.CounterOpts{
|
||||||
Name: "execution_parse_error_count",
|
Name: "execution_parse_error_count",
|
||||||
Help: "The number of errors that occurred while parsing execution payload",
|
Help: "The number of errors that occurred while parsing execution payload",
|
||||||
|
|||||||
@@ -118,8 +118,8 @@ func (e *EngineClient) ReconstructBlobSidecars(context.Context, interfaces.ReadO
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ConstructDataColumnSidecars is a mock implementation of the ConstructDataColumnSidecars method.
|
// ConstructDataColumnSidecars is a mock implementation of the ConstructDataColumnSidecars method.
|
||||||
func (e *EngineClient) ConstructDataColumnSidecars(context.Context, peerdas.ConstructionPopulator) ([]blocks.VerifiedRODataColumn, []blocks.PartialDataColumn, error) {
|
func (e *EngineClient) ConstructDataColumnSidecars(context.Context, peerdas.ConstructionPopulator) ([]blocks.VerifiedRODataColumn, error) {
|
||||||
return e.DataColumnSidecars, nil, e.ErrorDataColumnSidecars
|
return e.DataColumnSidecars, e.ErrorDataColumnSidecars
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetTerminalBlockHash --
|
// GetTerminalBlockHash --
|
||||||
|
|||||||
@@ -678,7 +678,6 @@ func (b *BeaconNode) registerP2P(cliCtx *cli.Context) error {
|
|||||||
DB: b.db,
|
DB: b.db,
|
||||||
StateGen: b.stateGen,
|
StateGen: b.stateGen,
|
||||||
ClockWaiter: b.ClockWaiter,
|
ClockWaiter: b.ClockWaiter,
|
||||||
PartialDataColumns: b.cliCtx.Bool(flags.PartialDataColumns.Name),
|
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|||||||
@@ -52,7 +52,6 @@ go_library(
|
|||||||
"//beacon-chain/db:go_default_library",
|
"//beacon-chain/db:go_default_library",
|
||||||
"//beacon-chain/db/kv:go_default_library",
|
"//beacon-chain/db/kv:go_default_library",
|
||||||
"//beacon-chain/p2p/encoder:go_default_library",
|
"//beacon-chain/p2p/encoder:go_default_library",
|
||||||
"//beacon-chain/p2p/partialdatacolumnbroadcaster:go_default_library",
|
|
||||||
"//beacon-chain/p2p/peers:go_default_library",
|
"//beacon-chain/p2p/peers:go_default_library",
|
||||||
"//beacon-chain/p2p/peers/peerdata:go_default_library",
|
"//beacon-chain/p2p/peers/peerdata:go_default_library",
|
||||||
"//beacon-chain/p2p/peers/scorers:go_default_library",
|
"//beacon-chain/p2p/peers/scorers:go_default_library",
|
||||||
|
|||||||
@@ -343,7 +343,7 @@ func (s *Service) BroadcastLightClientFinalityUpdate(ctx context.Context, update
|
|||||||
// there is at least one peer in each needed subnet. If not, it will attempt to find one before broadcasting.
|
// there is at least one peer in each needed subnet. If not, it will attempt to find one before broadcasting.
|
||||||
// This function is non-blocking. It stops trying to broadcast a given sidecar when more than one slot has passed, or the context is
|
// This function is non-blocking. It stops trying to broadcast a given sidecar when more than one slot has passed, or the context is
|
||||||
// cancelled (whichever comes first).
|
// cancelled (whichever comes first).
|
||||||
func (s *Service) BroadcastDataColumnSidecars(ctx context.Context, sidecars []blocks.VerifiedRODataColumn, partialColumns []blocks.PartialDataColumn) error {
|
func (s *Service) BroadcastDataColumnSidecars(ctx context.Context, sidecars []blocks.VerifiedRODataColumn) error {
|
||||||
// Increase the number of broadcast attempts.
|
// Increase the number of broadcast attempts.
|
||||||
dataColumnSidecarBroadcastAttempts.Add(float64(len(sidecars)))
|
dataColumnSidecarBroadcastAttempts.Add(float64(len(sidecars)))
|
||||||
|
|
||||||
@@ -353,15 +353,16 @@ func (s *Service) BroadcastDataColumnSidecars(ctx context.Context, sidecars []bl
|
|||||||
return errors.Wrap(err, "current fork digest")
|
return errors.Wrap(err, "current fork digest")
|
||||||
}
|
}
|
||||||
|
|
||||||
go s.broadcastDataColumnSidecars(ctx, forkDigest, sidecars, partialColumns)
|
go s.broadcastDataColumnSidecars(ctx, forkDigest, sidecars)
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// broadcastDataColumnSidecars broadcasts multiple data column sidecars to the p2p network, after ensuring
|
// broadcastDataColumnSidecars broadcasts multiple data column sidecars to the p2p network.
|
||||||
// there is at least one peer in each needed subnet. If not, it will attempt to find one before broadcasting.
|
// For sidecars with available peers, it uses batch publishing.
|
||||||
// It returns when all broadcasts are complete, or the context is cancelled (whichever comes first).
|
// For sidecars without peers, it finds peers first and then publishes individually.
|
||||||
func (s *Service) broadcastDataColumnSidecars(ctx context.Context, forkDigest [fieldparams.VersionLength]byte, sidecars []blocks.VerifiedRODataColumn, partialColumns []blocks.PartialDataColumn) {
|
// Both paths run in parallel. It returns when all broadcasts are complete, or the context is cancelled.
|
||||||
|
func (s *Service) broadcastDataColumnSidecars(ctx context.Context, forkDigest [fieldparams.VersionLength]byte, sidecars []blocks.VerifiedRODataColumn) {
|
||||||
type rootAndIndex struct {
|
type rootAndIndex struct {
|
||||||
root [fieldparams.RootLength]byte
|
root [fieldparams.RootLength]byte
|
||||||
index uint64
|
index uint64
|
||||||
@@ -371,8 +372,8 @@ func (s *Service) broadcastDataColumnSidecars(ctx context.Context, forkDigest [f
|
|||||||
logLevel := logrus.GetLevel()
|
logLevel := logrus.GetLevel()
|
||||||
slotPerRoot := make(map[[fieldparams.RootLength]byte]primitives.Slot, 1)
|
slotPerRoot := make(map[[fieldparams.RootLength]byte]primitives.Slot, 1)
|
||||||
|
|
||||||
topicFunc := func(dcIndex uint64) (topic string, wrappedSubIdx uint64, subnet uint64) {
|
topicFunc := func(sidecar blocks.VerifiedRODataColumn) (topic string, wrappedSubIdx uint64, subnet uint64) {
|
||||||
subnet = peerdas.ComputeSubnetForDataColumnSidecar(dcIndex)
|
subnet = peerdas.ComputeSubnetForDataColumnSidecar(sidecar.Index)
|
||||||
topic = dataColumnSubnetToTopic(subnet, forkDigest)
|
topic = dataColumnSubnetToTopic(subnet, forkDigest)
|
||||||
wrappedSubIdx = subnet + dataColumnSubnetVal
|
wrappedSubIdx = subnet + dataColumnSubnetVal
|
||||||
return
|
return
|
||||||
@@ -385,7 +386,7 @@ func (s *Service) broadcastDataColumnSidecars(ctx context.Context, forkDigest [f
|
|||||||
for _, sidecar := range sidecars {
|
for _, sidecar := range sidecars {
|
||||||
slotPerRoot[sidecar.BlockRoot()] = sidecar.Slot()
|
slotPerRoot[sidecar.BlockRoot()] = sidecar.Slot()
|
||||||
|
|
||||||
topic, wrappedSubIdx, _ := topicFunc(sidecar.Index)
|
topic, wrappedSubIdx, _ := topicFunc(sidecar)
|
||||||
// Check if we have a peer for this subnet (use RLock for read-only check).
|
// Check if we have a peer for this subnet (use RLock for read-only check).
|
||||||
mu := s.subnetLocker(wrappedSubIdx)
|
mu := s.subnetLocker(wrappedSubIdx)
|
||||||
mu.RLock()
|
mu.RLock()
|
||||||
@@ -410,7 +411,7 @@ func (s *Service) broadcastDataColumnSidecars(ctx context.Context, forkDigest [f
|
|||||||
ctx := trace.NewContext(s.ctx, span)
|
ctx := trace.NewContext(s.ctx, span)
|
||||||
defer span.End()
|
defer span.End()
|
||||||
|
|
||||||
topic, _, _ := topicFunc(sidecar.Index)
|
topic, _, _ := topicFunc(sidecar)
|
||||||
|
|
||||||
if err := s.batchObject(ctx, &messageBatch, sidecar, topic); err != nil {
|
if err := s.batchObject(ctx, &messageBatch, sidecar, topic); err != nil {
|
||||||
tracing.AnnotateError(span, err)
|
tracing.AnnotateError(span, err)
|
||||||
@@ -418,10 +419,6 @@ func (s *Service) broadcastDataColumnSidecars(ctx context.Context, forkDigest [f
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Increase the number of successful broadcasts.
|
|
||||||
dataColumnSidecarBroadcasts.Inc()
|
|
||||||
|
|
||||||
// Record the timing for log purposes.
|
|
||||||
if logLevel >= logrus.DebugLevel {
|
if logLevel >= logrus.DebugLevel {
|
||||||
root := sidecar.BlockRoot()
|
root := sidecar.BlockRoot()
|
||||||
timings.Store(rootAndIndex{root: root, index: sidecar.Index}, time.Now())
|
timings.Store(rootAndIndex{root: root, index: sidecar.Index}, time.Now())
|
||||||
@@ -436,7 +433,7 @@ func (s *Service) broadcastDataColumnSidecars(ctx context.Context, forkDigest [f
|
|||||||
ctx := trace.NewContext(s.ctx, span)
|
ctx := trace.NewContext(s.ctx, span)
|
||||||
defer span.End()
|
defer span.End()
|
||||||
|
|
||||||
topic, wrappedSubIdx, subnet := topicFunc(sidecar.Index)
|
topic, wrappedSubIdx, subnet := topicFunc(sidecar)
|
||||||
|
|
||||||
// Find peers for this sidecar's subnet.
|
// Find peers for this sidecar's subnet.
|
||||||
if err := s.findPeersIfNeeded(ctx, wrappedSubIdx, DataColumnSubnetTopicFormat, forkDigest, subnet); err != nil {
|
if err := s.findPeersIfNeeded(ctx, wrappedSubIdx, DataColumnSubnetTopicFormat, forkDigest, subnet); err != nil {
|
||||||
@@ -461,32 +458,6 @@ func (s *Service) broadcastDataColumnSidecars(ctx context.Context, forkDigest [f
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
if s.partialColumnBroadcaster != nil {
|
|
||||||
// Note: There is not batch publish for partial columns.
|
|
||||||
for _, partialColumn := range partialColumns {
|
|
||||||
individualWg.Go(func() {
|
|
||||||
_, span := trace.StartSpan(ctx, "p2p.broadcastPartialDataColumn")
|
|
||||||
ctx := trace.NewContext(s.ctx, span)
|
|
||||||
defer span.End()
|
|
||||||
|
|
||||||
topic, wrappedSubIdx, subnet := topicFunc(partialColumn.Index)
|
|
||||||
|
|
||||||
// Find peers for this sidecar's subnet.
|
|
||||||
if err := s.findPeersIfNeeded(ctx, wrappedSubIdx, DataColumnSubnetTopicFormat, forkDigest, subnet); err != nil {
|
|
||||||
tracing.AnnotateError(span, err)
|
|
||||||
log.WithError(err).Error("Cannot find peers if needed")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
fullTopicStr := topic + s.Encoding().ProtocolSuffix()
|
|
||||||
if err := s.partialColumnBroadcaster.Publish(fullTopicStr, partialColumn); err != nil {
|
|
||||||
tracing.AnnotateError(span, err)
|
|
||||||
log.WithError(err).Error("Cannot partial broadcast data column sidecar")
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Wait for batch to be populated, then publish.
|
// Wait for batch to be populated, then publish.
|
||||||
batchWg.Wait()
|
batchWg.Wait()
|
||||||
if len(sidecarsWithPeers) > 0 {
|
if len(sidecarsWithPeers) > 0 {
|
||||||
|
|||||||
@@ -803,7 +803,7 @@ func TestService_BroadcastDataColumn(t *testing.T) {
|
|||||||
}, 5*time.Second, 10*time.Millisecond, "libp2p mesh did not establish")
|
}, 5*time.Second, 10*time.Millisecond, "libp2p mesh did not establish")
|
||||||
|
|
||||||
// Broadcast to peers and wait.
|
// Broadcast to peers and wait.
|
||||||
err = service.BroadcastDataColumnSidecars(ctx, []blocks.VerifiedRODataColumn{verifiedRoSidecar}, nil)
|
err = service.BroadcastDataColumnSidecars(ctx, []blocks.VerifiedRODataColumn{verifiedRoSidecar})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
// Receive the message.
|
// Receive the message.
|
||||||
@@ -867,7 +867,7 @@ func (*rpcOrderTracer) DeliverMessage(*pubsub.Message) {}
|
|||||||
func (*rpcOrderTracer) RejectMessage(*pubsub.Message, string) {}
|
func (*rpcOrderTracer) RejectMessage(*pubsub.Message, string) {}
|
||||||
func (*rpcOrderTracer) DuplicateMessage(*pubsub.Message) {}
|
func (*rpcOrderTracer) DuplicateMessage(*pubsub.Message) {}
|
||||||
func (*rpcOrderTracer) ThrottlePeer(peer.ID) {}
|
func (*rpcOrderTracer) ThrottlePeer(peer.ID) {}
|
||||||
func (*rpcOrderTracer) RecvRPC(*pubsub.RPC, peer.ID) {}
|
func (*rpcOrderTracer) RecvRPC(*pubsub.RPC) {}
|
||||||
func (*rpcOrderTracer) DropRPC(*pubsub.RPC, peer.ID) {}
|
func (*rpcOrderTracer) DropRPC(*pubsub.RPC, peer.ID) {}
|
||||||
func (*rpcOrderTracer) UndeliverableMessage(*pubsub.Message) {}
|
func (*rpcOrderTracer) UndeliverableMessage(*pubsub.Message) {}
|
||||||
|
|
||||||
@@ -969,7 +969,7 @@ func TestService_BroadcastDataColumnRoundRobin(t *testing.T) {
|
|||||||
time.Sleep(100 * time.Millisecond)
|
time.Sleep(100 * time.Millisecond)
|
||||||
|
|
||||||
// Broadcast all sidecars.
|
// Broadcast all sidecars.
|
||||||
err = service.BroadcastDataColumnSidecars(ctx, verifiedRoSidecars, nil)
|
err = service.BroadcastDataColumnSidecars(ctx, verifiedRoSidecars)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
// Give some time for messages to be sent.
|
// Give some time for messages to be sent.
|
||||||
time.Sleep(100 * time.Millisecond)
|
time.Sleep(100 * time.Millisecond)
|
||||||
|
|||||||
@@ -26,7 +26,6 @@ const (
|
|||||||
// Config for the p2p service. These parameters are set from application level flags
|
// Config for the p2p service. These parameters are set from application level flags
|
||||||
// to initialize the p2p service.
|
// to initialize the p2p service.
|
||||||
type Config struct {
|
type Config struct {
|
||||||
PartialDataColumns bool
|
|
||||||
NoDiscovery bool
|
NoDiscovery bool
|
||||||
EnableUPnP bool
|
EnableUPnP bool
|
||||||
StaticPeerID bool
|
StaticPeerID bool
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
|
|
||||||
"github.com/OffchainLabs/prysm/v7/beacon-chain/p2p/encoder"
|
"github.com/OffchainLabs/prysm/v7/beacon-chain/p2p/encoder"
|
||||||
"github.com/OffchainLabs/prysm/v7/beacon-chain/p2p/partialdatacolumnbroadcaster"
|
|
||||||
"github.com/OffchainLabs/prysm/v7/beacon-chain/p2p/peers"
|
"github.com/OffchainLabs/prysm/v7/beacon-chain/p2p/peers"
|
||||||
fieldparams "github.com/OffchainLabs/prysm/v7/config/fieldparams"
|
fieldparams "github.com/OffchainLabs/prysm/v7/config/fieldparams"
|
||||||
"github.com/OffchainLabs/prysm/v7/consensus-types/blocks"
|
"github.com/OffchainLabs/prysm/v7/consensus-types/blocks"
|
||||||
@@ -29,7 +28,6 @@ type (
|
|||||||
Broadcaster
|
Broadcaster
|
||||||
SetStreamHandler
|
SetStreamHandler
|
||||||
PubSubProvider
|
PubSubProvider
|
||||||
PartialColumnBroadcasterProvider
|
|
||||||
PubSubTopicUser
|
PubSubTopicUser
|
||||||
SenderEncoder
|
SenderEncoder
|
||||||
PeerManager
|
PeerManager
|
||||||
@@ -54,7 +52,7 @@ type (
|
|||||||
BroadcastBlob(ctx context.Context, subnet uint64, blob *ethpb.BlobSidecar) error
|
BroadcastBlob(ctx context.Context, subnet uint64, blob *ethpb.BlobSidecar) error
|
||||||
BroadcastLightClientOptimisticUpdate(ctx context.Context, update interfaces.LightClientOptimisticUpdate) error
|
BroadcastLightClientOptimisticUpdate(ctx context.Context, update interfaces.LightClientOptimisticUpdate) error
|
||||||
BroadcastLightClientFinalityUpdate(ctx context.Context, update interfaces.LightClientFinalityUpdate) error
|
BroadcastLightClientFinalityUpdate(ctx context.Context, update interfaces.LightClientFinalityUpdate) error
|
||||||
BroadcastDataColumnSidecars(ctx context.Context, sidecars []blocks.VerifiedRODataColumn, partialColumns []blocks.PartialDataColumn) error
|
BroadcastDataColumnSidecars(ctx context.Context, sidecars []blocks.VerifiedRODataColumn) error
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetStreamHandler configures p2p to handle streams of a certain topic ID.
|
// SetStreamHandler configures p2p to handle streams of a certain topic ID.
|
||||||
@@ -94,11 +92,6 @@ type (
|
|||||||
PubSub() *pubsub.PubSub
|
PubSub() *pubsub.PubSub
|
||||||
}
|
}
|
||||||
|
|
||||||
// PubSubProvider provides the p2p pubsub protocol.
|
|
||||||
PartialColumnBroadcasterProvider interface {
|
|
||||||
PartialColumnBroadcaster() *partialdatacolumnbroadcaster.PartialColumnBroadcaster
|
|
||||||
}
|
|
||||||
|
|
||||||
// PeerManager abstracts some peer management methods from libp2p.
|
// PeerManager abstracts some peer management methods from libp2p.
|
||||||
PeerManager interface {
|
PeerManager interface {
|
||||||
Disconnect(peer.ID) error
|
Disconnect(peer.ID) error
|
||||||
|
|||||||
@@ -157,11 +157,6 @@ var (
|
|||||||
Help: "The number of publish messages received via rpc for a particular topic",
|
Help: "The number of publish messages received via rpc for a particular topic",
|
||||||
},
|
},
|
||||||
[]string{"topic"})
|
[]string{"topic"})
|
||||||
pubsubRPCPubRecvSize = promauto.NewCounterVec(prometheus.CounterOpts{
|
|
||||||
Name: "p2p_pubsub_rpc_recv_pub_size_total",
|
|
||||||
Help: "The total size of publish messages received via rpc for a particular topic",
|
|
||||||
},
|
|
||||||
[]string{"topic", "is_partial"})
|
|
||||||
pubsubRPCDrop = promauto.NewCounterVec(prometheus.CounterOpts{
|
pubsubRPCDrop = promauto.NewCounterVec(prometheus.CounterOpts{
|
||||||
Name: "p2p_pubsub_rpc_drop_total",
|
Name: "p2p_pubsub_rpc_drop_total",
|
||||||
Help: "The number of messages dropped via rpc for a particular control message",
|
Help: "The number of messages dropped via rpc for a particular control message",
|
||||||
@@ -176,11 +171,6 @@ var (
|
|||||||
Help: "The number of publish messages dropped via rpc for a particular topic",
|
Help: "The number of publish messages dropped via rpc for a particular topic",
|
||||||
},
|
},
|
||||||
[]string{"topic"})
|
[]string{"topic"})
|
||||||
pubsubRPCPubDropSize = promauto.NewCounterVec(prometheus.CounterOpts{
|
|
||||||
Name: "p2p_pubsub_rpc_drop_pub_size_total",
|
|
||||||
Help: "The total size of publish messages dropped via rpc for a particular topic",
|
|
||||||
},
|
|
||||||
[]string{"topic", "is_partial"})
|
|
||||||
pubsubRPCSent = promauto.NewCounterVec(prometheus.CounterOpts{
|
pubsubRPCSent = promauto.NewCounterVec(prometheus.CounterOpts{
|
||||||
Name: "p2p_pubsub_rpc_sent_total",
|
Name: "p2p_pubsub_rpc_sent_total",
|
||||||
Help: "The number of messages sent via rpc for a particular control message",
|
Help: "The number of messages sent via rpc for a particular control message",
|
||||||
@@ -195,16 +185,6 @@ var (
|
|||||||
Help: "The number of publish messages sent via rpc for a particular topic",
|
Help: "The number of publish messages sent via rpc for a particular topic",
|
||||||
},
|
},
|
||||||
[]string{"topic"})
|
[]string{"topic"})
|
||||||
pubsubRPCPubSentSize = promauto.NewCounterVec(prometheus.CounterOpts{
|
|
||||||
Name: "gossipsub_pubsub_rpc_sent_pub_size_total",
|
|
||||||
Help: "The total size of publish messages sent via rpc for a particular topic",
|
|
||||||
},
|
|
||||||
[]string{"topic", "is_partial"})
|
|
||||||
pubsubMeshPeers = promauto.NewGaugeVec(prometheus.GaugeOpts{
|
|
||||||
Name: "gossipsub_mesh_peers",
|
|
||||||
Help: "The number of capable peers in mesh",
|
|
||||||
},
|
|
||||||
[]string{"topic", "supports_partial"})
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func (s *Service) updateMetrics() {
|
func (s *Service) updateMetrics() {
|
||||||
|
|||||||
@@ -1,28 +0,0 @@
|
|||||||
load("@prysm//tools/go:def.bzl", "go_library")
|
|
||||||
|
|
||||||
go_library(
|
|
||||||
name = "go_default_library",
|
|
||||||
srcs = [
|
|
||||||
"log.go",
|
|
||||||
"metrics.go",
|
|
||||||
"partial.go",
|
|
||||||
],
|
|
||||||
importpath = "github.com/OffchainLabs/prysm/v7/beacon-chain/p2p/partialdatacolumnbroadcaster",
|
|
||||||
visibility = ["//visibility:public"],
|
|
||||||
deps = [
|
|
||||||
"//config/params:go_default_library",
|
|
||||||
"//consensus-types/blocks:go_default_library",
|
|
||||||
"//internal/logrusadapter:go_default_library",
|
|
||||||
"//proto/prysm/v1alpha1:go_default_library",
|
|
||||||
"@com_github_libp2p_go_libp2p//core/peer:go_default_library",
|
|
||||||
"@com_github_libp2p_go_libp2p_pubsub//:go_default_library",
|
|
||||||
"@com_github_libp2p_go_libp2p_pubsub//partialmessages:go_default_library",
|
|
||||||
"@com_github_libp2p_go_libp2p_pubsub//partialmessages/bitmap:go_default_library",
|
|
||||||
"@com_github_libp2p_go_libp2p_pubsub//pb:go_default_library",
|
|
||||||
"@com_github_pkg_errors//:go_default_library",
|
|
||||||
"@com_github_prometheus_client_golang//prometheus:go_default_library",
|
|
||||||
"@com_github_prometheus_client_golang//prometheus/promauto:go_default_library",
|
|
||||||
"@com_github_prysmaticlabs_go_bitfield//:go_default_library",
|
|
||||||
"@com_github_sirupsen_logrus//:go_default_library",
|
|
||||||
],
|
|
||||||
)
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
load("@prysm//tools/go:def.bzl", "go_test")
|
|
||||||
|
|
||||||
go_test(
|
|
||||||
name = "go_default_test",
|
|
||||||
size = "medium",
|
|
||||||
srcs = ["two_node_test.go"],
|
|
||||||
deps = [
|
|
||||||
"//beacon-chain/core/peerdas:go_default_library",
|
|
||||||
"//beacon-chain/p2p:go_default_library",
|
|
||||||
"//beacon-chain/p2p/encoder:go_default_library",
|
|
||||||
"//beacon-chain/p2p/partialdatacolumnbroadcaster:go_default_library",
|
|
||||||
"//config/fieldparams:go_default_library",
|
|
||||||
"//config/params:go_default_library",
|
|
||||||
"//consensus-types/blocks:go_default_library",
|
|
||||||
"//proto/prysm/v1alpha1:go_default_library",
|
|
||||||
"//testing/assert:go_default_library",
|
|
||||||
"//testing/require:go_default_library",
|
|
||||||
"//testing/util:go_default_library",
|
|
||||||
"@com_github_libp2p_go_libp2p//core/peer:go_default_library",
|
|
||||||
"@com_github_libp2p_go_libp2p//x/simlibp2p:go_default_library",
|
|
||||||
"@com_github_libp2p_go_libp2p_pubsub//:go_default_library",
|
|
||||||
"@com_github_marcopolo_simnet//:go_default_library",
|
|
||||||
"@com_github_sirupsen_logrus//:go_default_library",
|
|
||||||
],
|
|
||||||
)
|
|
||||||
@@ -1,239 +0,0 @@
|
|||||||
package integrationtest
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"crypto/rand"
|
|
||||||
"fmt"
|
|
||||||
"testing"
|
|
||||||
"testing/synctest"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/OffchainLabs/prysm/v7/beacon-chain/core/peerdas"
|
|
||||||
"github.com/OffchainLabs/prysm/v7/beacon-chain/p2p"
|
|
||||||
"github.com/OffchainLabs/prysm/v7/beacon-chain/p2p/encoder"
|
|
||||||
"github.com/OffchainLabs/prysm/v7/beacon-chain/p2p/partialdatacolumnbroadcaster"
|
|
||||||
fieldparams "github.com/OffchainLabs/prysm/v7/config/fieldparams"
|
|
||||||
"github.com/OffchainLabs/prysm/v7/config/params"
|
|
||||||
"github.com/OffchainLabs/prysm/v7/consensus-types/blocks"
|
|
||||||
ethpb "github.com/OffchainLabs/prysm/v7/proto/prysm/v1alpha1"
|
|
||||||
"github.com/OffchainLabs/prysm/v7/testing/assert"
|
|
||||||
"github.com/OffchainLabs/prysm/v7/testing/require"
|
|
||||||
"github.com/OffchainLabs/prysm/v7/testing/util"
|
|
||||||
pubsub "github.com/libp2p/go-libp2p-pubsub"
|
|
||||||
"github.com/libp2p/go-libp2p/core/peer"
|
|
||||||
simlibp2p "github.com/libp2p/go-libp2p/x/simlibp2p"
|
|
||||||
"github.com/marcopolo/simnet"
|
|
||||||
"github.com/sirupsen/logrus"
|
|
||||||
)
|
|
||||||
|
|
||||||
// TestTwoNodePartialColumnExchange tests that two nodes can exchange partial columns
|
|
||||||
// and reconstruct the complete column. Node 1 has cells 0-2, Node 2 has cells 3-5.
|
|
||||||
// After exchange, both should have all cells.
|
|
||||||
func TestTwoNodePartialColumnExchange(t *testing.T) {
|
|
||||||
synctest.Test(t, func(t *testing.T) {
|
|
||||||
// Create a simulated libp2p network
|
|
||||||
latency := time.Millisecond * 10
|
|
||||||
network, meta, err := simlibp2p.SimpleLibp2pNetwork([]simlibp2p.NodeLinkSettingsAndCount{
|
|
||||||
{LinkSettings: simnet.NodeBiDiLinkSettings{
|
|
||||||
Downlink: simnet.LinkSettings{BitsPerSecond: 20 * simlibp2p.OneMbps, Latency: latency / 2},
|
|
||||||
Uplink: simnet.LinkSettings{BitsPerSecond: 20 * simlibp2p.OneMbps, Latency: latency / 2},
|
|
||||||
}, Count: 2},
|
|
||||||
}, simlibp2p.NetworkSettings{UseBlankHost: true})
|
|
||||||
require.NoError(t, err)
|
|
||||||
require.NoError(t, network.Start())
|
|
||||||
defer func() {
|
|
||||||
require.NoError(t, network.Close())
|
|
||||||
}()
|
|
||||||
defer func() {
|
|
||||||
for _, node := range meta.Nodes {
|
|
||||||
err := node.Close()
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
|
|
||||||
h1 := meta.Nodes[0]
|
|
||||||
h2 := meta.Nodes[1]
|
|
||||||
|
|
||||||
logger := logrus.New()
|
|
||||||
logger.SetLevel(logrus.DebugLevel)
|
|
||||||
broadcaster1 := partialdatacolumnbroadcaster.NewBroadcaster(logger)
|
|
||||||
broadcaster2 := partialdatacolumnbroadcaster.NewBroadcaster(logger)
|
|
||||||
|
|
||||||
opts1 := broadcaster1.AppendPubSubOpts([]pubsub.Option{
|
|
||||||
pubsub.WithMessageSigning(false),
|
|
||||||
pubsub.WithStrictSignatureVerification(false),
|
|
||||||
})
|
|
||||||
opts2 := broadcaster2.AppendPubSubOpts([]pubsub.Option{
|
|
||||||
pubsub.WithMessageSigning(false),
|
|
||||||
pubsub.WithStrictSignatureVerification(false),
|
|
||||||
})
|
|
||||||
|
|
||||||
ctx, cancel := context.WithCancel(context.Background())
|
|
||||||
defer cancel()
|
|
||||||
ps1, err := pubsub.NewGossipSub(ctx, h1, opts1...)
|
|
||||||
require.NoError(t, err)
|
|
||||||
ps2, err := pubsub.NewGossipSub(ctx, h2, opts2...)
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
go broadcaster1.Start()
|
|
||||||
go broadcaster2.Start()
|
|
||||||
defer func() {
|
|
||||||
broadcaster1.Stop()
|
|
||||||
broadcaster2.Stop()
|
|
||||||
}()
|
|
||||||
|
|
||||||
// Generate Test Data
|
|
||||||
var blockRoot [fieldparams.RootLength]byte
|
|
||||||
copy(blockRoot[:], []byte("test-block-root"))
|
|
||||||
|
|
||||||
numCells := 6
|
|
||||||
commitments := make([][]byte, numCells)
|
|
||||||
cells := make([][]byte, numCells)
|
|
||||||
proofs := make([][]byte, numCells)
|
|
||||||
|
|
||||||
for i := range numCells {
|
|
||||||
commitments[i] = make([]byte, 48)
|
|
||||||
|
|
||||||
cells[i] = make([]byte, 2048)
|
|
||||||
_, err := rand.Read(cells[i])
|
|
||||||
require.NoError(t, err)
|
|
||||||
proofs[i] = make([]byte, 48)
|
|
||||||
_ = fmt.Appendf(proofs[i][:0], "proof %d", i)
|
|
||||||
}
|
|
||||||
|
|
||||||
roDC, _ := util.CreateTestVerifiedRoDataColumnSidecars(t, []util.DataColumnParam{
|
|
||||||
{
|
|
||||||
BodyRoot: blockRoot[:],
|
|
||||||
KzgCommitments: commitments,
|
|
||||||
Column: cells,
|
|
||||||
KzgProofs: proofs,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
|
|
||||||
pc1, err := blocks.NewPartialDataColumn(roDC[0].DataColumnSidecar.SignedBlockHeader, roDC[0].Index, roDC[0].KzgCommitments, roDC[0].KzgCommitmentsInclusionProof)
|
|
||||||
require.NoError(t, err)
|
|
||||||
pc2, err := blocks.NewPartialDataColumn(roDC[0].DataColumnSidecar.SignedBlockHeader, roDC[0].Index, roDC[0].KzgCommitments, roDC[0].KzgCommitmentsInclusionProof)
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
// Split data
|
|
||||||
for i := range numCells {
|
|
||||||
if i%2 == 0 {
|
|
||||||
pc1.ExtendFromVerfifiedCell(uint64(i), roDC[0].Column[i], roDC[0].KzgProofs[i])
|
|
||||||
} else {
|
|
||||||
pc2.ExtendFromVerfifiedCell(uint64(i), roDC[0].Column[i], roDC[0].KzgProofs[i])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Setup Topic and Subscriptions
|
|
||||||
digest := params.ForkDigest(0)
|
|
||||||
columnIndex := uint64(12)
|
|
||||||
subnet := peerdas.ComputeSubnetForDataColumnSidecar(columnIndex)
|
|
||||||
topicStr := fmt.Sprintf(p2p.DataColumnSubnetTopicFormat, digest, subnet) +
|
|
||||||
encoder.SszNetworkEncoder{}.ProtocolSuffix()
|
|
||||||
|
|
||||||
time.Sleep(100 * time.Millisecond)
|
|
||||||
|
|
||||||
topic1, err := ps1.Join(topicStr, pubsub.RequestPartialMessages())
|
|
||||||
require.NoError(t, err)
|
|
||||||
topic2, err := ps2.Join(topicStr, pubsub.RequestPartialMessages())
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
// Header validator that verifies the inclusion proof
|
|
||||||
headerValidator := func(header *ethpb.PartialDataColumnHeader) (reject bool, err error) {
|
|
||||||
if header == nil {
|
|
||||||
return false, fmt.Errorf("nil header")
|
|
||||||
}
|
|
||||||
if header.SignedBlockHeader == nil || header.SignedBlockHeader.Header == nil {
|
|
||||||
return true, fmt.Errorf("nil signed block header")
|
|
||||||
}
|
|
||||||
if len(header.KzgCommitments) == 0 {
|
|
||||||
return true, fmt.Errorf("empty kzg commitments")
|
|
||||||
}
|
|
||||||
// Verify inclusion proof
|
|
||||||
if err := peerdas.VerifyPartialDataColumnHeaderInclusionProof(header); err != nil {
|
|
||||||
return true, fmt.Errorf("invalid inclusion proof: %w", err)
|
|
||||||
}
|
|
||||||
t.Log("Header validation passed")
|
|
||||||
return false, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
cellValidator := func(_ []blocks.CellProofBundle) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
node1Complete := make(chan blocks.VerifiedRODataColumn, 1)
|
|
||||||
node2Complete := make(chan blocks.VerifiedRODataColumn, 1)
|
|
||||||
|
|
||||||
handler1 := func(topic string, col blocks.VerifiedRODataColumn) {
|
|
||||||
t.Logf("Node 1: Completed! Column has %d cells", len(col.Column))
|
|
||||||
node1Complete <- col
|
|
||||||
}
|
|
||||||
|
|
||||||
handler2 := func(topic string, col blocks.VerifiedRODataColumn) {
|
|
||||||
t.Logf("Node 2: Completed! Column has %d cells", len(col.Column))
|
|
||||||
node2Complete <- col
|
|
||||||
}
|
|
||||||
|
|
||||||
// Connect hosts
|
|
||||||
err = h1.Connect(context.Background(), peer.AddrInfo{
|
|
||||||
ID: h2.ID(),
|
|
||||||
Addrs: h2.Addrs(),
|
|
||||||
})
|
|
||||||
require.NoError(t, err)
|
|
||||||
time.Sleep(300 * time.Millisecond)
|
|
||||||
|
|
||||||
// Subscribe to regular GossipSub (critical for partial message RPC exchange!)
|
|
||||||
sub1, err := topic1.Subscribe()
|
|
||||||
require.NoError(t, err)
|
|
||||||
defer sub1.Cancel()
|
|
||||||
|
|
||||||
sub2, err := topic2.Subscribe()
|
|
||||||
require.NoError(t, err)
|
|
||||||
defer sub2.Cancel()
|
|
||||||
|
|
||||||
err = broadcaster1.Subscribe(topic1, headerValidator, cellValidator, handler1)
|
|
||||||
require.NoError(t, err)
|
|
||||||
err = broadcaster2.Subscribe(topic2, headerValidator, cellValidator, handler2)
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
// Wait for mesh to form
|
|
||||||
time.Sleep(2 * time.Second)
|
|
||||||
|
|
||||||
// Publish
|
|
||||||
t.Log("Publishing from Node 1")
|
|
||||||
err = broadcaster1.Publish(topicStr, pc1)
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
time.Sleep(200 * time.Millisecond)
|
|
||||||
|
|
||||||
t.Log("Publishing from Node 2")
|
|
||||||
err = broadcaster2.Publish(topicStr, pc2)
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
// Wait for Completion
|
|
||||||
timeout := time.After(10 * time.Second)
|
|
||||||
var col1, col2 blocks.VerifiedRODataColumn
|
|
||||||
receivedCount := 0
|
|
||||||
|
|
||||||
for receivedCount < 2 {
|
|
||||||
select {
|
|
||||||
case col1 = <-node1Complete:
|
|
||||||
t.Log("Node 1 completed reconstruction")
|
|
||||||
receivedCount++
|
|
||||||
case col2 = <-node2Complete:
|
|
||||||
t.Log("Node 2 completed reconstruction")
|
|
||||||
receivedCount++
|
|
||||||
case <-timeout:
|
|
||||||
t.Fatalf("Timeout: Only %d/2 nodes completed", receivedCount)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Verify both columns have all cells
|
|
||||||
assert.Equal(t, numCells, len(col1.Column), "Node 1 should have all cells")
|
|
||||||
assert.Equal(t, numCells, len(col2.Column), "Node 2 should have all cells")
|
|
||||||
assert.DeepSSZEqual(t, cells, col1.Column, "Node 1 cell mismatch")
|
|
||||||
assert.DeepSSZEqual(t, cells, col2.Column, "Node 2 cell mismatch")
|
|
||||||
})
|
|
||||||
}
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
// Code generated by hack/gen-logs.sh; DO NOT EDIT.
|
|
||||||
// This file is created and regenerated automatically. Anything added here might get removed.
|
|
||||||
package partialdatacolumnbroadcaster
|
|
||||||
|
|
||||||
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", "beacon-chain/p2p/partialdatacolumnbroadcaster")
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
package partialdatacolumnbroadcaster
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
|
||||||
"github.com/prometheus/client_golang/prometheus/promauto"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
partialMessageUsefulCellsTotal = promauto.NewCounterVec(prometheus.CounterOpts{
|
|
||||||
Name: "beacon_partial_message_useful_cells_total",
|
|
||||||
Help: "Number of useful cells received via a partial message",
|
|
||||||
}, []string{"column_index"})
|
|
||||||
|
|
||||||
partialMessageCellsReceivedTotal = promauto.NewCounterVec(prometheus.CounterOpts{
|
|
||||||
Name: "beacon_partial_message_cells_received_total",
|
|
||||||
Help: "Number of total cells received via a partial message",
|
|
||||||
}, []string{"column_index"})
|
|
||||||
)
|
|
||||||
@@ -1,557 +0,0 @@
|
|||||||
package partialdatacolumnbroadcaster
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"log/slog"
|
|
||||||
"regexp"
|
|
||||||
"strconv"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/OffchainLabs/go-bitfield"
|
|
||||||
"github.com/OffchainLabs/prysm/v7/config/params"
|
|
||||||
"github.com/OffchainLabs/prysm/v7/consensus-types/blocks"
|
|
||||||
"github.com/OffchainLabs/prysm/v7/internal/logrusadapter"
|
|
||||||
ethpb "github.com/OffchainLabs/prysm/v7/proto/prysm/v1alpha1"
|
|
||||||
pubsub "github.com/libp2p/go-libp2p-pubsub"
|
|
||||||
"github.com/libp2p/go-libp2p-pubsub/partialmessages"
|
|
||||||
"github.com/libp2p/go-libp2p-pubsub/partialmessages/bitmap"
|
|
||||||
pubsub_pb "github.com/libp2p/go-libp2p-pubsub/pb"
|
|
||||||
"github.com/libp2p/go-libp2p/core/peer"
|
|
||||||
"github.com/pkg/errors"
|
|
||||||
"github.com/sirupsen/logrus"
|
|
||||||
)
|
|
||||||
|
|
||||||
// TODOs:
|
|
||||||
// different eager push strategies:
|
|
||||||
// - no eager push
|
|
||||||
// - full column eager push
|
|
||||||
// - With debouncing - some factor of RTT
|
|
||||||
// - eager push missing cells
|
|
||||||
|
|
||||||
const TTLInSlots = 3
|
|
||||||
const maxConcurrentValidators = 128
|
|
||||||
|
|
||||||
var dataColumnTopicRegex = regexp.MustCompile(`data_column_sidecar_(\d+)`)
|
|
||||||
|
|
||||||
func extractColumnIndexFromTopic(topic string) (uint64, error) {
|
|
||||||
matches := dataColumnTopicRegex.FindStringSubmatch(topic)
|
|
||||||
if len(matches) < 2 {
|
|
||||||
return 0, errors.New("could not extract column index from topic")
|
|
||||||
}
|
|
||||||
return strconv.ParseUint(matches[1], 10, 64)
|
|
||||||
}
|
|
||||||
|
|
||||||
// HeaderValidator validates a PartialDataColumnHeader.
|
|
||||||
// Returns (reject, err) where:
|
|
||||||
// - reject=true, err!=nil: REJECT - peer should be penalized
|
|
||||||
// - reject=false, err!=nil: IGNORE - don't penalize, just ignore
|
|
||||||
// - reject=false, err=nil: valid header
|
|
||||||
type HeaderValidator func(header *ethpb.PartialDataColumnHeader) (reject bool, err error)
|
|
||||||
type HeaderHandler func(header *ethpb.PartialDataColumnHeader)
|
|
||||||
type ColumnValidator func(cells []blocks.CellProofBundle) error
|
|
||||||
|
|
||||||
type PartialColumnBroadcaster struct {
|
|
||||||
logger *logrus.Logger
|
|
||||||
|
|
||||||
ps *pubsub.PubSub
|
|
||||||
stop chan struct{}
|
|
||||||
|
|
||||||
// map topic -> headerValidators
|
|
||||||
headerValidators map[string]HeaderValidator
|
|
||||||
// map topic -> Validator
|
|
||||||
validators map[string]ColumnValidator
|
|
||||||
|
|
||||||
// map topic -> handler
|
|
||||||
handlers map[string]SubHandler
|
|
||||||
|
|
||||||
// map topic -> headerHandler
|
|
||||||
headerHandlers map[string]HeaderHandler
|
|
||||||
|
|
||||||
// map topic -> *pubsub.Topic
|
|
||||||
topics map[string]*pubsub.Topic
|
|
||||||
|
|
||||||
concurrentValidatorSemaphore chan struct{}
|
|
||||||
|
|
||||||
// map topic -> map[groupID]PartialColumn
|
|
||||||
partialMsgStore map[string]map[string]*blocks.PartialDataColumn
|
|
||||||
|
|
||||||
groupTTL map[string]int8
|
|
||||||
|
|
||||||
// validHeaderCache caches validated headers by group ID (works across topics)
|
|
||||||
validHeaderCache map[string]*ethpb.PartialDataColumnHeader
|
|
||||||
|
|
||||||
incomingReq chan request
|
|
||||||
}
|
|
||||||
|
|
||||||
type requestKind uint8
|
|
||||||
|
|
||||||
const (
|
|
||||||
requestKindPublish requestKind = iota
|
|
||||||
requestKindSubscribe
|
|
||||||
requestKindUnsubscribe
|
|
||||||
requestKindHandleIncomingRPC
|
|
||||||
requestKindCellsValidated
|
|
||||||
)
|
|
||||||
|
|
||||||
type request struct {
|
|
||||||
kind requestKind
|
|
||||||
response chan error
|
|
||||||
sub subscribe
|
|
||||||
unsub unsubscribe
|
|
||||||
publish publish
|
|
||||||
incomingRPC rpcWithFrom
|
|
||||||
cellsValidated *cellsValidated
|
|
||||||
}
|
|
||||||
|
|
||||||
type publish struct {
|
|
||||||
topic string
|
|
||||||
c blocks.PartialDataColumn
|
|
||||||
}
|
|
||||||
|
|
||||||
type subscribe struct {
|
|
||||||
t *pubsub.Topic
|
|
||||||
headerValidator HeaderValidator
|
|
||||||
validator ColumnValidator
|
|
||||||
handler SubHandler
|
|
||||||
headerHandler HeaderHandler
|
|
||||||
}
|
|
||||||
|
|
||||||
type unsubscribe struct {
|
|
||||||
topic string
|
|
||||||
}
|
|
||||||
|
|
||||||
type rpcWithFrom struct {
|
|
||||||
*pubsub_pb.PartialMessagesExtension
|
|
||||||
from peer.ID
|
|
||||||
}
|
|
||||||
|
|
||||||
type cellsValidated struct {
|
|
||||||
validationTook time.Duration
|
|
||||||
topic string
|
|
||||||
group []byte
|
|
||||||
cellIndices []uint64
|
|
||||||
cells []blocks.CellProofBundle
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewBroadcaster(logger *logrus.Logger) *PartialColumnBroadcaster {
|
|
||||||
return &PartialColumnBroadcaster{
|
|
||||||
validators: make(map[string]ColumnValidator),
|
|
||||||
headerValidators: make(map[string]HeaderValidator),
|
|
||||||
handlers: make(map[string]SubHandler),
|
|
||||||
headerHandlers: make(map[string]HeaderHandler),
|
|
||||||
topics: make(map[string]*pubsub.Topic),
|
|
||||||
partialMsgStore: make(map[string]map[string]*blocks.PartialDataColumn),
|
|
||||||
groupTTL: make(map[string]int8),
|
|
||||||
validHeaderCache: make(map[string]*ethpb.PartialDataColumnHeader),
|
|
||||||
// GossipSub sends the messages to this channel. The buffer should be
|
|
||||||
// big enough to avoid dropping messages. We don't want to block the gossipsub event loop for this.
|
|
||||||
incomingReq: make(chan request, 128*16),
|
|
||||||
logger: logger,
|
|
||||||
|
|
||||||
concurrentValidatorSemaphore: make(chan struct{}, maxConcurrentValidators),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// AppendPubSubOpts adds the necessary pubsub options to enable partial messages.
|
|
||||||
func (p *PartialColumnBroadcaster) AppendPubSubOpts(opts []pubsub.Option) []pubsub.Option {
|
|
||||||
slogger := slog.New(logrusadapter.Handler{Logger: p.logger})
|
|
||||||
opts = append(opts,
|
|
||||||
pubsub.WithPartialMessagesExtension(&partialmessages.PartialMessagesExtension{
|
|
||||||
Logger: slogger,
|
|
||||||
MergePartsMetadata: func(topic string, left, right partialmessages.PartsMetadata) partialmessages.PartsMetadata {
|
|
||||||
if len(left) == 0 {
|
|
||||||
return right
|
|
||||||
}
|
|
||||||
merged, err := bitfield.Bitlist(left).Or(bitfield.Bitlist(right))
|
|
||||||
if err != nil {
|
|
||||||
p.logger.Warn("Failed to merge bitfields", "err", err, "left", left, "right", right)
|
|
||||||
return left
|
|
||||||
}
|
|
||||||
return partialmessages.PartsMetadata(merged)
|
|
||||||
},
|
|
||||||
ValidateRPC: func(from peer.ID, rpc *pubsub_pb.PartialMessagesExtension) error {
|
|
||||||
// TODO. Add some basic and fast sanity checks
|
|
||||||
return nil
|
|
||||||
},
|
|
||||||
OnIncomingRPC: func(from peer.ID, rpc *pubsub_pb.PartialMessagesExtension) error {
|
|
||||||
select {
|
|
||||||
case p.incomingReq <- request{
|
|
||||||
kind: requestKindHandleIncomingRPC,
|
|
||||||
incomingRPC: rpcWithFrom{rpc, from},
|
|
||||||
}:
|
|
||||||
default:
|
|
||||||
p.logger.Warn("Dropping incoming partial RPC", "rpc", rpc)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
},
|
|
||||||
}),
|
|
||||||
func(ps *pubsub.PubSub) error {
|
|
||||||
p.ps = ps
|
|
||||||
return nil
|
|
||||||
},
|
|
||||||
)
|
|
||||||
return opts
|
|
||||||
}
|
|
||||||
|
|
||||||
// Start starts the event loop of the PartialColumnBroadcaster. Should be called
|
|
||||||
// within a goroutine (go p.Start())
|
|
||||||
func (p *PartialColumnBroadcaster) Start() {
|
|
||||||
if p.stop != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
p.stop = make(chan struct{})
|
|
||||||
p.loop()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *PartialColumnBroadcaster) loop() {
|
|
||||||
cleanup := time.NewTicker(time.Second * time.Duration(params.BeaconConfig().SecondsPerSlot))
|
|
||||||
defer cleanup.Stop()
|
|
||||||
for {
|
|
||||||
select {
|
|
||||||
case <-p.stop:
|
|
||||||
return
|
|
||||||
case <-cleanup.C:
|
|
||||||
for groupID, ttl := range p.groupTTL {
|
|
||||||
if ttl > 0 {
|
|
||||||
p.groupTTL[groupID] = ttl - 1
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
delete(p.groupTTL, groupID)
|
|
||||||
delete(p.validHeaderCache, groupID)
|
|
||||||
for topic, msgStore := range p.partialMsgStore {
|
|
||||||
delete(msgStore, groupID)
|
|
||||||
if len(msgStore) == 0 {
|
|
||||||
delete(p.partialMsgStore, topic)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case req := <-p.incomingReq:
|
|
||||||
switch req.kind {
|
|
||||||
case requestKindPublish:
|
|
||||||
req.response <- p.publish(req.publish.topic, req.publish.c)
|
|
||||||
case requestKindSubscribe:
|
|
||||||
req.response <- p.subscribe(req.sub.t, req.sub.headerValidator, req.sub.validator, req.sub.handler, req.sub.headerHandler)
|
|
||||||
case requestKindUnsubscribe:
|
|
||||||
req.response <- p.unsubscribe(req.unsub.topic)
|
|
||||||
case requestKindHandleIncomingRPC:
|
|
||||||
err := p.handleIncomingRPC(req.incomingRPC)
|
|
||||||
if err != nil {
|
|
||||||
p.logger.Error("Failed to handle incoming partial RPC", "err", err)
|
|
||||||
}
|
|
||||||
case requestKindCellsValidated:
|
|
||||||
err := p.handleCellsValidated(req.cellsValidated)
|
|
||||||
if err != nil {
|
|
||||||
p.logger.Error("Failed to handle cells validated", "err", err)
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
p.logger.Error("Unknown request kind", "kind", req.kind)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *PartialColumnBroadcaster) getDataColumn(topic string, group []byte) *blocks.PartialDataColumn {
|
|
||||||
topicStore, ok := p.partialMsgStore[topic]
|
|
||||||
if !ok {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
msg, ok := topicStore[string(group)]
|
|
||||||
if !ok {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return msg
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *PartialColumnBroadcaster) handleIncomingRPC(rpcWithFrom rpcWithFrom) error {
|
|
||||||
if p.ps == nil {
|
|
||||||
return errors.New("pubsub not initialized")
|
|
||||||
}
|
|
||||||
|
|
||||||
hasMessage := len(rpcWithFrom.PartialMessage) > 0
|
|
||||||
|
|
||||||
var message ethpb.PartialDataColumnSidecar
|
|
||||||
if hasMessage {
|
|
||||||
err := message.UnmarshalSSZ(rpcWithFrom.PartialMessage)
|
|
||||||
if err != nil {
|
|
||||||
return errors.Wrap(err, "failed to unmarshal partial message data")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
topicID := rpcWithFrom.GetTopicID()
|
|
||||||
groupID := rpcWithFrom.GroupID
|
|
||||||
ourDataColumn := p.getDataColumn(topicID, groupID)
|
|
||||||
var shouldRepublish bool
|
|
||||||
|
|
||||||
if ourDataColumn == nil && hasMessage {
|
|
||||||
var header *ethpb.PartialDataColumnHeader
|
|
||||||
// Check cache first for this group
|
|
||||||
if cachedHeader, ok := p.validHeaderCache[string(groupID)]; ok {
|
|
||||||
header = cachedHeader
|
|
||||||
} else {
|
|
||||||
// We haven't seen this group before. Check if we have a valid header.
|
|
||||||
if len(message.Header) == 0 {
|
|
||||||
p.logger.Debug("No partial column found and no header in message, ignoring")
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
header = message.Header[0]
|
|
||||||
headerValidator, ok := p.headerValidators[topicID]
|
|
||||||
if !ok || headerValidator == nil {
|
|
||||||
p.logger.Debug("No header validator registered for topic")
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
reject, err := headerValidator(header)
|
|
||||||
if err != nil {
|
|
||||||
p.logger.Debug("Header validation failed", "err", err, "reject", reject)
|
|
||||||
if reject {
|
|
||||||
// REJECT case: penalize the peer
|
|
||||||
_ = p.ps.PeerFeedback(topicID, rpcWithFrom.from, pubsub.PeerFeedbackInvalidMessage)
|
|
||||||
}
|
|
||||||
// Both REJECT and IGNORE: don't process further
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
// Cache the valid header
|
|
||||||
p.validHeaderCache[string(groupID)] = header
|
|
||||||
|
|
||||||
headerHandler, ok := p.headerHandlers[topicID]
|
|
||||||
if !ok || headerHandler == nil {
|
|
||||||
p.logger.Debug("No header handler registered for topic")
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
headerHandler(header)
|
|
||||||
}
|
|
||||||
|
|
||||||
columnIndex, err := extractColumnIndexFromTopic(topicID)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
newColumn, err := blocks.NewPartialDataColumn(
|
|
||||||
header.SignedBlockHeader,
|
|
||||||
columnIndex,
|
|
||||||
header.KzgCommitments,
|
|
||||||
header.KzgCommitmentsInclusionProof,
|
|
||||||
)
|
|
||||||
if err != nil {
|
|
||||||
p.logger.WithError(err).WithFields(logrus.Fields{
|
|
||||||
"topic": topicID,
|
|
||||||
"columnIndex": columnIndex,
|
|
||||||
"numCommitments": len(header.KzgCommitments),
|
|
||||||
}).Error("Failed to create partial data column from header")
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Save to store
|
|
||||||
topicStore, ok := p.partialMsgStore[topicID]
|
|
||||||
if !ok {
|
|
||||||
topicStore = make(map[string]*blocks.PartialDataColumn)
|
|
||||||
p.partialMsgStore[topicID] = topicStore
|
|
||||||
}
|
|
||||||
topicStore[string(newColumn.GroupID())] = &newColumn
|
|
||||||
p.groupTTL[string(newColumn.GroupID())] = TTLInSlots
|
|
||||||
|
|
||||||
ourDataColumn = &newColumn
|
|
||||||
shouldRepublish = true
|
|
||||||
}
|
|
||||||
|
|
||||||
if ourDataColumn == nil {
|
|
||||||
// We don't have a partial column for this. Can happen if we got cells
|
|
||||||
// without a header.
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
logger := p.logger.WithFields(logrus.Fields{
|
|
||||||
"from": rpcWithFrom.from,
|
|
||||||
"topic": topicID,
|
|
||||||
"group": groupID,
|
|
||||||
})
|
|
||||||
|
|
||||||
validator, validatorOK := p.validators[topicID]
|
|
||||||
if len(rpcWithFrom.PartialMessage) > 0 && validatorOK {
|
|
||||||
// TODO: is there any penalty we want to consider for giving us data we didn't request?
|
|
||||||
// Note that we need to be careful around race conditions and eager data.
|
|
||||||
// Also note that protobufs by design allow extra data that we don't parse.
|
|
||||||
// Marco's thoughts. No, we don't need to do anything else here.
|
|
||||||
cellIndices, cellsToVerify, err := ourDataColumn.CellsToVerifyFromPartialMessage(&message)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
// Track cells received via partial message
|
|
||||||
if len(cellIndices) > 0 {
|
|
||||||
columnIndexStr := strconv.FormatUint(ourDataColumn.Index, 10)
|
|
||||||
partialMessageCellsReceivedTotal.WithLabelValues(columnIndexStr).Add(float64(len(cellIndices)))
|
|
||||||
}
|
|
||||||
if len(cellsToVerify) > 0 {
|
|
||||||
p.concurrentValidatorSemaphore <- struct{}{}
|
|
||||||
go func() {
|
|
||||||
defer func() {
|
|
||||||
<-p.concurrentValidatorSemaphore
|
|
||||||
}()
|
|
||||||
start := time.Now()
|
|
||||||
err := validator(cellsToVerify)
|
|
||||||
if err != nil {
|
|
||||||
logger.Error("failed to validate cells", "err", err)
|
|
||||||
_ = p.ps.PeerFeedback(topicID, rpcWithFrom.from, pubsub.PeerFeedbackInvalidMessage)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
_ = p.ps.PeerFeedback(topicID, rpcWithFrom.from, pubsub.PeerFeedbackUsefulMessage)
|
|
||||||
p.incomingReq <- request{
|
|
||||||
kind: requestKindCellsValidated,
|
|
||||||
cellsValidated: &cellsValidated{
|
|
||||||
validationTook: time.Since(start),
|
|
||||||
topic: topicID,
|
|
||||||
group: groupID,
|
|
||||||
cells: cellsToVerify,
|
|
||||||
cellIndices: cellIndices,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
peerHas := bitmap.Bitmap(rpcWithFrom.PartsMetadata)
|
|
||||||
iHave := bitmap.Bitmap(ourDataColumn.PartsMetadata())
|
|
||||||
if !shouldRepublish && len(peerHas) > 0 && !bytes.Equal(peerHas, iHave) {
|
|
||||||
// Either we have something they don't or vice versa
|
|
||||||
shouldRepublish = true
|
|
||||||
logger.Debug("republishing due to parts metadata difference")
|
|
||||||
}
|
|
||||||
|
|
||||||
if shouldRepublish {
|
|
||||||
err := p.ps.PublishPartialMessage(topicID, ourDataColumn, partialmessages.PublishOptions{})
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *PartialColumnBroadcaster) handleCellsValidated(cells *cellsValidated) error {
|
|
||||||
ourDataColumn := p.getDataColumn(cells.topic, cells.group)
|
|
||||||
if ourDataColumn == nil {
|
|
||||||
return errors.New("data column not found for verified cells")
|
|
||||||
}
|
|
||||||
extended := ourDataColumn.ExtendFromVerfifiedCells(cells.cellIndices, cells.cells)
|
|
||||||
p.logger.Debug("Extended partial message", "duration", cells.validationTook, "extended", extended)
|
|
||||||
|
|
||||||
columnIndexStr := strconv.FormatUint(ourDataColumn.Index, 10)
|
|
||||||
if extended {
|
|
||||||
// Track useful cells (cells that extended our data)
|
|
||||||
partialMessageUsefulCellsTotal.WithLabelValues(columnIndexStr).Add(float64(len(cells.cells)))
|
|
||||||
|
|
||||||
// TODO: we could use the heuristic here that if this data was
|
|
||||||
// useful to us, it's likely useful to our peers and we should
|
|
||||||
// republish eagerly
|
|
||||||
|
|
||||||
if col, ok := ourDataColumn.Complete(p.logger); ok {
|
|
||||||
p.logger.Info("Completed partial column", "topic", cells.topic, "group", cells.group)
|
|
||||||
handler, handlerOK := p.handlers[cells.topic]
|
|
||||||
|
|
||||||
if handlerOK {
|
|
||||||
go handler(cells.topic, col)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
p.logger.Info("Extended partial column", "topic", cells.topic, "group", cells.group)
|
|
||||||
}
|
|
||||||
|
|
||||||
err := p.ps.PublishPartialMessage(cells.topic, ourDataColumn, partialmessages.PublishOptions{})
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *PartialColumnBroadcaster) Stop() {
|
|
||||||
if p.stop != nil {
|
|
||||||
close(p.stop)
|
|
||||||
p.stop = nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Publish publishes the partial column.
|
|
||||||
func (p *PartialColumnBroadcaster) Publish(topic string, c blocks.PartialDataColumn) error {
|
|
||||||
if p.ps == nil {
|
|
||||||
return errors.New("pubsub not initialized")
|
|
||||||
}
|
|
||||||
respCh := make(chan error)
|
|
||||||
p.incomingReq <- request{
|
|
||||||
kind: requestKindPublish,
|
|
||||||
response: respCh,
|
|
||||||
publish: publish{
|
|
||||||
topic: topic,
|
|
||||||
c: c,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
return <-respCh
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *PartialColumnBroadcaster) publish(topic string, c blocks.PartialDataColumn) error {
|
|
||||||
topicStore, ok := p.partialMsgStore[topic]
|
|
||||||
if !ok {
|
|
||||||
topicStore = make(map[string]*blocks.PartialDataColumn)
|
|
||||||
p.partialMsgStore[topic] = topicStore
|
|
||||||
}
|
|
||||||
topicStore[string(c.GroupID())] = &c
|
|
||||||
p.groupTTL[string(c.GroupID())] = TTLInSlots
|
|
||||||
|
|
||||||
return p.ps.PublishPartialMessage(topic, &c, partialmessages.PublishOptions{})
|
|
||||||
}
|
|
||||||
|
|
||||||
type SubHandler func(topic string, col blocks.VerifiedRODataColumn)
|
|
||||||
|
|
||||||
func (p *PartialColumnBroadcaster) Subscribe(t *pubsub.Topic, headerValidator HeaderValidator, validator ColumnValidator, handler SubHandler, headerHandler HeaderHandler) error {
|
|
||||||
respCh := make(chan error)
|
|
||||||
p.incomingReq <- request{
|
|
||||||
kind: requestKindSubscribe,
|
|
||||||
sub: subscribe{
|
|
||||||
t: t,
|
|
||||||
headerValidator: headerValidator,
|
|
||||||
validator: validator,
|
|
||||||
handler: handler,
|
|
||||||
headerHandler: headerHandler,
|
|
||||||
},
|
|
||||||
response: respCh,
|
|
||||||
}
|
|
||||||
return <-respCh
|
|
||||||
}
|
|
||||||
func (p *PartialColumnBroadcaster) subscribe(t *pubsub.Topic, headerValidator HeaderValidator, validator ColumnValidator, handler SubHandler, headerHandler HeaderHandler) error {
|
|
||||||
topic := t.String()
|
|
||||||
if _, ok := p.topics[topic]; ok {
|
|
||||||
return errors.New("already subscribed")
|
|
||||||
}
|
|
||||||
|
|
||||||
p.topics[topic] = t
|
|
||||||
p.headerValidators[topic] = headerValidator
|
|
||||||
p.validators[topic] = validator
|
|
||||||
p.handlers[topic] = handler
|
|
||||||
p.headerHandlers[topic] = headerHandler
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *PartialColumnBroadcaster) Unsubscribe(topic string) error {
|
|
||||||
respCh := make(chan error)
|
|
||||||
p.incomingReq <- request{
|
|
||||||
kind: requestKindUnsubscribe,
|
|
||||||
unsub: unsubscribe{
|
|
||||||
topic: topic,
|
|
||||||
},
|
|
||||||
response: respCh,
|
|
||||||
}
|
|
||||||
return <-respCh
|
|
||||||
}
|
|
||||||
func (p *PartialColumnBroadcaster) unsubscribe(topic string) error {
|
|
||||||
t, ok := p.topics[topic]
|
|
||||||
if !ok {
|
|
||||||
return errors.New("topic not found")
|
|
||||||
}
|
|
||||||
delete(p.topics, topic)
|
|
||||||
delete(p.partialMsgStore, topic)
|
|
||||||
delete(p.headerValidators, topic)
|
|
||||||
delete(p.validators, topic)
|
|
||||||
delete(p.handlers, topic)
|
|
||||||
delete(p.headerHandlers, topic)
|
|
||||||
return t.Close()
|
|
||||||
}
|
|
||||||
@@ -58,7 +58,7 @@ func TestPeerExplicitAdd(t *testing.T) {
|
|||||||
|
|
||||||
resAddress, err := p.Address(id)
|
resAddress, err := p.Address(id)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
assert.Equal(t, address.Equal(resAddress), true, "Unexpected address")
|
assert.Equal(t, address, resAddress, "Unexpected address")
|
||||||
|
|
||||||
resDirection, err := p.Direction(id)
|
resDirection, err := p.Direction(id)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
@@ -72,7 +72,7 @@ func TestPeerExplicitAdd(t *testing.T) {
|
|||||||
|
|
||||||
resAddress2, err := p.Address(id)
|
resAddress2, err := p.Address(id)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
assert.Equal(t, address2.Equal(resAddress2), true, "Unexpected address")
|
assert.Equal(t, address2, resAddress2, "Unexpected address")
|
||||||
|
|
||||||
resDirection2, err := p.Direction(id)
|
resDirection2, err := p.Direction(id)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|||||||
@@ -170,7 +170,7 @@ func (s *Service) pubsubOptions() []pubsub.Option {
|
|||||||
pubsub.WithPeerScore(peerScoringParams(s.cfg.IPColocationWhitelist)),
|
pubsub.WithPeerScore(peerScoringParams(s.cfg.IPColocationWhitelist)),
|
||||||
pubsub.WithPeerScoreInspect(s.peerInspector, time.Minute),
|
pubsub.WithPeerScoreInspect(s.peerInspector, time.Minute),
|
||||||
pubsub.WithGossipSubParams(pubsubGossipParam()),
|
pubsub.WithGossipSubParams(pubsubGossipParam()),
|
||||||
pubsub.WithRawTracer(&gossipTracer{host: s.host}),
|
pubsub.WithRawTracer(gossipTracer{host: s.host}),
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(s.cfg.StaticPeers) > 0 {
|
if len(s.cfg.StaticPeers) > 0 {
|
||||||
@@ -181,9 +181,6 @@ func (s *Service) pubsubOptions() []pubsub.Option {
|
|||||||
}
|
}
|
||||||
psOpts = append(psOpts, pubsub.WithDirectPeers(directPeersAddrInfos))
|
psOpts = append(psOpts, pubsub.WithDirectPeers(directPeersAddrInfos))
|
||||||
}
|
}
|
||||||
if s.partialColumnBroadcaster != nil {
|
|
||||||
psOpts = s.partialColumnBroadcaster.AppendPubSubOpts(psOpts)
|
|
||||||
}
|
|
||||||
|
|
||||||
return psOpts
|
return psOpts
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
package p2p
|
package p2p
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"sync"
|
|
||||||
|
|
||||||
pubsub "github.com/libp2p/go-libp2p-pubsub"
|
pubsub "github.com/libp2p/go-libp2p-pubsub"
|
||||||
"github.com/libp2p/go-libp2p/core/host"
|
"github.com/libp2p/go-libp2p/core/host"
|
||||||
"github.com/libp2p/go-libp2p/core/peer"
|
"github.com/libp2p/go-libp2p/core/peer"
|
||||||
@@ -10,7 +8,7 @@ import (
|
|||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
)
|
)
|
||||||
|
|
||||||
var _ = pubsub.RawTracer(&gossipTracer{})
|
var _ = pubsub.RawTracer(gossipTracer{})
|
||||||
|
|
||||||
// Initializes the values for the pubsub rpc action.
|
// Initializes the values for the pubsub rpc action.
|
||||||
type action int
|
type action int
|
||||||
@@ -25,146 +23,85 @@ const (
|
|||||||
// and broadcasted through gossipsub.
|
// and broadcasted through gossipsub.
|
||||||
type gossipTracer struct {
|
type gossipTracer struct {
|
||||||
host host.Host
|
host host.Host
|
||||||
|
|
||||||
mu sync.Mutex
|
|
||||||
// map topic -> Set(peerID). Peer is in set if it supports partial messages.
|
|
||||||
partialMessagePeers map[string]map[peer.ID]struct{}
|
|
||||||
// map topic -> Set(peerID). Peer is in set if in the mesh.
|
|
||||||
meshPeers map[string]map[peer.ID]struct{}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// AddPeer .
|
// AddPeer .
|
||||||
func (g *gossipTracer) AddPeer(p peer.ID, proto protocol.ID) {
|
func (g gossipTracer) AddPeer(p peer.ID, proto protocol.ID) {
|
||||||
// no-op
|
// no-op
|
||||||
}
|
}
|
||||||
|
|
||||||
// RemovePeer .
|
// RemovePeer .
|
||||||
func (g *gossipTracer) RemovePeer(p peer.ID) {
|
func (g gossipTracer) RemovePeer(p peer.ID) {
|
||||||
g.mu.Lock()
|
// no-op
|
||||||
defer g.mu.Unlock()
|
|
||||||
for _, peers := range g.partialMessagePeers {
|
|
||||||
delete(peers, p)
|
|
||||||
}
|
|
||||||
for topic, peers := range g.meshPeers {
|
|
||||||
if _, ok := peers[p]; ok {
|
|
||||||
delete(peers, p)
|
|
||||||
g.updateMeshPeersMetric(topic)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Join .
|
// Join .
|
||||||
func (g *gossipTracer) Join(topic string) {
|
func (g gossipTracer) Join(topic string) {
|
||||||
pubsubTopicsActive.WithLabelValues(topic).Set(1)
|
pubsubTopicsActive.WithLabelValues(topic).Set(1)
|
||||||
g.mu.Lock()
|
|
||||||
defer g.mu.Unlock()
|
|
||||||
if g.partialMessagePeers == nil {
|
|
||||||
g.partialMessagePeers = make(map[string]map[peer.ID]struct{})
|
|
||||||
}
|
|
||||||
if g.partialMessagePeers[topic] == nil {
|
|
||||||
g.partialMessagePeers[topic] = make(map[peer.ID]struct{})
|
|
||||||
}
|
|
||||||
|
|
||||||
if g.meshPeers == nil {
|
|
||||||
g.meshPeers = make(map[string]map[peer.ID]struct{})
|
|
||||||
}
|
|
||||||
if g.meshPeers[topic] == nil {
|
|
||||||
g.meshPeers[topic] = make(map[peer.ID]struct{})
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Leave .
|
// Leave .
|
||||||
func (g *gossipTracer) Leave(topic string) {
|
func (g gossipTracer) Leave(topic string) {
|
||||||
pubsubTopicsActive.WithLabelValues(topic).Set(0)
|
pubsubTopicsActive.WithLabelValues(topic).Set(0)
|
||||||
g.mu.Lock()
|
|
||||||
defer g.mu.Unlock()
|
|
||||||
delete(g.partialMessagePeers, topic)
|
|
||||||
delete(g.meshPeers, topic)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Graft .
|
// Graft .
|
||||||
func (g *gossipTracer) Graft(p peer.ID, topic string) {
|
func (g gossipTracer) Graft(p peer.ID, topic string) {
|
||||||
pubsubTopicsGraft.WithLabelValues(topic).Inc()
|
pubsubTopicsGraft.WithLabelValues(topic).Inc()
|
||||||
g.mu.Lock()
|
|
||||||
defer g.mu.Unlock()
|
|
||||||
if m, ok := g.meshPeers[topic]; ok {
|
|
||||||
m[p] = struct{}{}
|
|
||||||
}
|
|
||||||
g.updateMeshPeersMetric(topic)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Prune .
|
// Prune .
|
||||||
func (g *gossipTracer) Prune(p peer.ID, topic string) {
|
func (g gossipTracer) Prune(p peer.ID, topic string) {
|
||||||
pubsubTopicsPrune.WithLabelValues(topic).Inc()
|
pubsubTopicsPrune.WithLabelValues(topic).Inc()
|
||||||
g.mu.Lock()
|
|
||||||
defer g.mu.Unlock()
|
|
||||||
if m, ok := g.meshPeers[topic]; ok {
|
|
||||||
delete(m, p)
|
|
||||||
}
|
|
||||||
g.updateMeshPeersMetric(topic)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ValidateMessage .
|
// ValidateMessage .
|
||||||
func (g *gossipTracer) ValidateMessage(msg *pubsub.Message) {
|
func (g gossipTracer) ValidateMessage(msg *pubsub.Message) {
|
||||||
pubsubMessageValidate.WithLabelValues(*msg.Topic).Inc()
|
pubsubMessageValidate.WithLabelValues(*msg.Topic).Inc()
|
||||||
}
|
}
|
||||||
|
|
||||||
// DeliverMessage .
|
// DeliverMessage .
|
||||||
func (g *gossipTracer) DeliverMessage(msg *pubsub.Message) {
|
func (g gossipTracer) DeliverMessage(msg *pubsub.Message) {
|
||||||
pubsubMessageDeliver.WithLabelValues(*msg.Topic).Inc()
|
pubsubMessageDeliver.WithLabelValues(*msg.Topic).Inc()
|
||||||
}
|
}
|
||||||
|
|
||||||
// RejectMessage .
|
// RejectMessage .
|
||||||
func (g *gossipTracer) RejectMessage(msg *pubsub.Message, reason string) {
|
func (g gossipTracer) RejectMessage(msg *pubsub.Message, reason string) {
|
||||||
pubsubMessageReject.WithLabelValues(*msg.Topic, reason).Inc()
|
pubsubMessageReject.WithLabelValues(*msg.Topic, reason).Inc()
|
||||||
}
|
}
|
||||||
|
|
||||||
// DuplicateMessage .
|
// DuplicateMessage .
|
||||||
func (g *gossipTracer) DuplicateMessage(msg *pubsub.Message) {
|
func (g gossipTracer) DuplicateMessage(msg *pubsub.Message) {
|
||||||
pubsubMessageDuplicate.WithLabelValues(*msg.Topic).Inc()
|
pubsubMessageDuplicate.WithLabelValues(*msg.Topic).Inc()
|
||||||
}
|
}
|
||||||
|
|
||||||
// UndeliverableMessage .
|
// UndeliverableMessage .
|
||||||
func (g *gossipTracer) UndeliverableMessage(msg *pubsub.Message) {
|
func (g gossipTracer) UndeliverableMessage(msg *pubsub.Message) {
|
||||||
pubsubMessageUndeliverable.WithLabelValues(*msg.Topic).Inc()
|
pubsubMessageUndeliverable.WithLabelValues(*msg.Topic).Inc()
|
||||||
}
|
}
|
||||||
|
|
||||||
// ThrottlePeer .
|
// ThrottlePeer .
|
||||||
func (g *gossipTracer) ThrottlePeer(p peer.ID) {
|
func (g gossipTracer) ThrottlePeer(p peer.ID) {
|
||||||
agent := agentFromPid(p, g.host.Peerstore())
|
agent := agentFromPid(p, g.host.Peerstore())
|
||||||
pubsubPeerThrottle.WithLabelValues(agent).Inc()
|
pubsubPeerThrottle.WithLabelValues(agent).Inc()
|
||||||
}
|
}
|
||||||
|
|
||||||
// RecvRPC .
|
// RecvRPC .
|
||||||
func (g *gossipTracer) RecvRPC(rpc *pubsub.RPC, from peer.ID) {
|
func (g gossipTracer) RecvRPC(rpc *pubsub.RPC) {
|
||||||
g.setMetricFromRPC(recv, pubsubRPCSubRecv, pubsubRPCPubRecv, pubsubRPCPubRecvSize, pubsubRPCRecv, rpc)
|
g.setMetricFromRPC(recv, pubsubRPCSubRecv, pubsubRPCPubRecv, pubsubRPCRecv, rpc)
|
||||||
|
|
||||||
g.mu.Lock()
|
|
||||||
defer g.mu.Unlock()
|
|
||||||
for _, sub := range rpc.Subscriptions {
|
|
||||||
m, ok := g.partialMessagePeers[sub.GetTopicid()]
|
|
||||||
if !ok {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if sub.GetSubscribe() && sub.GetRequestsPartial() {
|
|
||||||
m[from] = struct{}{}
|
|
||||||
} else {
|
|
||||||
delete(m, from)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// SendRPC .
|
// SendRPC .
|
||||||
func (g *gossipTracer) SendRPC(rpc *pubsub.RPC, p peer.ID) {
|
func (g gossipTracer) SendRPC(rpc *pubsub.RPC, p peer.ID) {
|
||||||
g.setMetricFromRPC(send, pubsubRPCSubSent, pubsubRPCPubSent, pubsubRPCPubSentSize, pubsubRPCSent, rpc)
|
g.setMetricFromRPC(send, pubsubRPCSubSent, pubsubRPCPubSent, pubsubRPCSent, rpc)
|
||||||
}
|
}
|
||||||
|
|
||||||
// DropRPC .
|
// DropRPC .
|
||||||
func (g *gossipTracer) DropRPC(rpc *pubsub.RPC, p peer.ID) {
|
func (g gossipTracer) DropRPC(rpc *pubsub.RPC, p peer.ID) {
|
||||||
g.setMetricFromRPC(drop, pubsubRPCSubDrop, pubsubRPCPubDrop, pubsubRPCPubDropSize, pubsubRPCDrop, rpc)
|
g.setMetricFromRPC(drop, pubsubRPCSubDrop, pubsubRPCPubDrop, pubsubRPCDrop, rpc)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *gossipTracer) setMetricFromRPC(act action, subCtr prometheus.Counter, pubCtr, pubSizeCtr, ctrlCtr *prometheus.CounterVec, rpc *pubsub.RPC) {
|
func (g gossipTracer) setMetricFromRPC(act action, subCtr prometheus.Counter, pubCtr, ctrlCtr *prometheus.CounterVec, rpc *pubsub.RPC) {
|
||||||
subCtr.Add(float64(len(rpc.Subscriptions)))
|
subCtr.Add(float64(len(rpc.Subscriptions)))
|
||||||
if rpc.Control != nil {
|
if rpc.Control != nil {
|
||||||
ctrlCtr.WithLabelValues("graft").Add(float64(len(rpc.Control.Graft)))
|
ctrlCtr.WithLabelValues("graft").Add(float64(len(rpc.Control.Graft)))
|
||||||
@@ -173,41 +110,12 @@ func (g *gossipTracer) setMetricFromRPC(act action, subCtr prometheus.Counter, p
|
|||||||
ctrlCtr.WithLabelValues("iwant").Add(float64(len(rpc.Control.Iwant)))
|
ctrlCtr.WithLabelValues("iwant").Add(float64(len(rpc.Control.Iwant)))
|
||||||
ctrlCtr.WithLabelValues("idontwant").Add(float64(len(rpc.Control.Idontwant)))
|
ctrlCtr.WithLabelValues("idontwant").Add(float64(len(rpc.Control.Idontwant)))
|
||||||
}
|
}
|
||||||
|
for _, msg := range rpc.Publish {
|
||||||
// For incoming messages from pubsub, we do not record metrics for them as these values
|
// For incoming messages from pubsub, we do not record metrics for them as these values
|
||||||
// could be junk.
|
// could be junk.
|
||||||
if act == recv {
|
if act == recv {
|
||||||
return
|
continue
|
||||||
}
|
}
|
||||||
for _, msg := range rpc.Publish {
|
pubCtr.WithLabelValues(*msg.Topic).Inc()
|
||||||
pubCtr.WithLabelValues(msg.GetTopic()).Inc()
|
|
||||||
pubSizeCtr.WithLabelValues(msg.GetTopic(), "false").Add(float64(msg.Size()))
|
|
||||||
}
|
|
||||||
if rpc.Partial != nil {
|
|
||||||
pubCtr.WithLabelValues(rpc.Partial.GetTopicID()).Inc()
|
|
||||||
pubSizeCtr.WithLabelValues(rpc.Partial.GetTopicID(), "true").Add(float64(rpc.Partial.Size()))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// updateMeshPeersMetric requires the caller to hold the state mutex
|
|
||||||
func (g *gossipTracer) updateMeshPeersMetric(topic string) {
|
|
||||||
meshPeers, ok := g.meshPeers[topic]
|
|
||||||
if !ok {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
partialPeers, ok := g.partialMessagePeers[topic]
|
|
||||||
if !ok {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
var supportsPartial, doesNotSupportPartial float64
|
|
||||||
for p := range meshPeers {
|
|
||||||
if _, ok := partialPeers[p]; ok {
|
|
||||||
supportsPartial++
|
|
||||||
} else {
|
|
||||||
doesNotSupportPartial++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pubsubMeshPeers.WithLabelValues(topic, "true").Set(supportsPartial)
|
|
||||||
pubsubMeshPeers.WithLabelValues(topic, "false").Set(doesNotSupportPartial)
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ import (
|
|||||||
|
|
||||||
"github.com/OffchainLabs/prysm/v7/async"
|
"github.com/OffchainLabs/prysm/v7/async"
|
||||||
"github.com/OffchainLabs/prysm/v7/beacon-chain/p2p/encoder"
|
"github.com/OffchainLabs/prysm/v7/beacon-chain/p2p/encoder"
|
||||||
"github.com/OffchainLabs/prysm/v7/beacon-chain/p2p/partialdatacolumnbroadcaster"
|
|
||||||
"github.com/OffchainLabs/prysm/v7/beacon-chain/p2p/peers"
|
"github.com/OffchainLabs/prysm/v7/beacon-chain/p2p/peers"
|
||||||
"github.com/OffchainLabs/prysm/v7/beacon-chain/p2p/peers/scorers"
|
"github.com/OffchainLabs/prysm/v7/beacon-chain/p2p/peers/scorers"
|
||||||
"github.com/OffchainLabs/prysm/v7/beacon-chain/p2p/types"
|
"github.com/OffchainLabs/prysm/v7/beacon-chain/p2p/types"
|
||||||
@@ -78,7 +77,6 @@ type Service struct {
|
|||||||
privKey *ecdsa.PrivateKey
|
privKey *ecdsa.PrivateKey
|
||||||
metaData metadata.Metadata
|
metaData metadata.Metadata
|
||||||
pubsub *pubsub.PubSub
|
pubsub *pubsub.PubSub
|
||||||
partialColumnBroadcaster *partialdatacolumnbroadcaster.PartialColumnBroadcaster
|
|
||||||
joinedTopics map[string]*pubsub.Topic
|
joinedTopics map[string]*pubsub.Topic
|
||||||
joinedTopicsLock sync.RWMutex
|
joinedTopicsLock sync.RWMutex
|
||||||
subnetsLock map[uint64]*sync.RWMutex
|
subnetsLock map[uint64]*sync.RWMutex
|
||||||
@@ -149,10 +147,6 @@ func NewService(ctx context.Context, cfg *Config) (*Service, error) {
|
|||||||
custodyInfoSet: make(chan struct{}),
|
custodyInfoSet: make(chan struct{}),
|
||||||
}
|
}
|
||||||
|
|
||||||
if cfg.PartialDataColumns {
|
|
||||||
s.partialColumnBroadcaster = partialdatacolumnbroadcaster.NewBroadcaster(log.Logger)
|
|
||||||
}
|
|
||||||
|
|
||||||
ipAddr := prysmnetwork.IPAddr()
|
ipAddr := prysmnetwork.IPAddr()
|
||||||
|
|
||||||
opts, err := s.buildOptions(ipAddr, s.privKey)
|
opts, err := s.buildOptions(ipAddr, s.privKey)
|
||||||
@@ -311,10 +305,6 @@ func (s *Service) Start() {
|
|||||||
logExternalDNSAddr(s.host.ID(), p2pHostDNS, p2pTCPPort)
|
logExternalDNSAddr(s.host.ID(), p2pHostDNS, p2pTCPPort)
|
||||||
}
|
}
|
||||||
go s.forkWatcher()
|
go s.forkWatcher()
|
||||||
|
|
||||||
if s.partialColumnBroadcaster != nil {
|
|
||||||
go s.partialColumnBroadcaster.Start()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Stop the p2p service and terminate all peer connections.
|
// Stop the p2p service and terminate all peer connections.
|
||||||
@@ -324,10 +314,6 @@ func (s *Service) Stop() error {
|
|||||||
if s.dv5Listener != nil {
|
if s.dv5Listener != nil {
|
||||||
s.dv5Listener.Close()
|
s.dv5Listener.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
if s.partialColumnBroadcaster != nil {
|
|
||||||
s.partialColumnBroadcaster.Stop()
|
|
||||||
}
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -364,10 +350,6 @@ func (s *Service) PubSub() *pubsub.PubSub {
|
|||||||
return s.pubsub
|
return s.pubsub
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Service) PartialColumnBroadcaster() *partialdatacolumnbroadcaster.PartialColumnBroadcaster {
|
|
||||||
return s.partialColumnBroadcaster
|
|
||||||
}
|
|
||||||
|
|
||||||
// Host returns the currently running libp2p
|
// Host returns the currently running libp2p
|
||||||
// host of the service.
|
// host of the service.
|
||||||
func (s *Service) Host() host.Host {
|
func (s *Service) Host() host.Host {
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ go_library(
|
|||||||
deps = [
|
deps = [
|
||||||
"//beacon-chain/core/peerdas:go_default_library",
|
"//beacon-chain/core/peerdas:go_default_library",
|
||||||
"//beacon-chain/p2p/encoder:go_default_library",
|
"//beacon-chain/p2p/encoder:go_default_library",
|
||||||
"//beacon-chain/p2p/partialdatacolumnbroadcaster:go_default_library",
|
|
||||||
"//beacon-chain/p2p/peers:go_default_library",
|
"//beacon-chain/p2p/peers:go_default_library",
|
||||||
"//beacon-chain/p2p/peers/scorers:go_default_library",
|
"//beacon-chain/p2p/peers/scorers:go_default_library",
|
||||||
"//config/fieldparams:go_default_library",
|
"//config/fieldparams:go_default_library",
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
|
|
||||||
"github.com/OffchainLabs/prysm/v7/beacon-chain/p2p/encoder"
|
"github.com/OffchainLabs/prysm/v7/beacon-chain/p2p/encoder"
|
||||||
"github.com/OffchainLabs/prysm/v7/beacon-chain/p2p/partialdatacolumnbroadcaster"
|
|
||||||
"github.com/OffchainLabs/prysm/v7/beacon-chain/p2p/peers"
|
"github.com/OffchainLabs/prysm/v7/beacon-chain/p2p/peers"
|
||||||
fieldparams "github.com/OffchainLabs/prysm/v7/config/fieldparams"
|
fieldparams "github.com/OffchainLabs/prysm/v7/config/fieldparams"
|
||||||
"github.com/OffchainLabs/prysm/v7/consensus-types/blocks"
|
"github.com/OffchainLabs/prysm/v7/consensus-types/blocks"
|
||||||
@@ -109,10 +108,6 @@ func (*FakeP2P) PubSub() *pubsub.PubSub {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (*FakeP2P) PartialColumnBroadcaster() *partialdatacolumnbroadcaster.PartialColumnBroadcaster {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// MetadataSeq -- fake.
|
// MetadataSeq -- fake.
|
||||||
func (*FakeP2P) MetadataSeq() uint64 {
|
func (*FakeP2P) MetadataSeq() uint64 {
|
||||||
return 0
|
return 0
|
||||||
@@ -174,7 +169,7 @@ func (*FakeP2P) BroadcastLightClientFinalityUpdate(_ context.Context, _ interfac
|
|||||||
}
|
}
|
||||||
|
|
||||||
// BroadcastDataColumnSidecar -- fake.
|
// BroadcastDataColumnSidecar -- fake.
|
||||||
func (*FakeP2P) BroadcastDataColumnSidecars(_ context.Context, _ []blocks.VerifiedRODataColumn, _ []blocks.PartialDataColumn) error {
|
func (*FakeP2P) BroadcastDataColumnSidecars(_ context.Context, _ []blocks.VerifiedRODataColumn) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ func (m *MockBroadcaster) BroadcastLightClientFinalityUpdate(_ context.Context,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// BroadcastDataColumnSidecar broadcasts a data column for mock.
|
// BroadcastDataColumnSidecar broadcasts a data column for mock.
|
||||||
func (m *MockBroadcaster) BroadcastDataColumnSidecars(context.Context, []blocks.VerifiedRODataColumn, []blocks.PartialDataColumn) error {
|
func (m *MockBroadcaster) BroadcastDataColumnSidecars(context.Context, []blocks.VerifiedRODataColumn) error {
|
||||||
m.BroadcastCalled.Store(true)
|
m.BroadcastCalled.Store(true)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,7 +13,6 @@ import (
|
|||||||
|
|
||||||
"github.com/OffchainLabs/prysm/v7/beacon-chain/core/peerdas"
|
"github.com/OffchainLabs/prysm/v7/beacon-chain/core/peerdas"
|
||||||
"github.com/OffchainLabs/prysm/v7/beacon-chain/p2p/encoder"
|
"github.com/OffchainLabs/prysm/v7/beacon-chain/p2p/encoder"
|
||||||
"github.com/OffchainLabs/prysm/v7/beacon-chain/p2p/partialdatacolumnbroadcaster"
|
|
||||||
"github.com/OffchainLabs/prysm/v7/beacon-chain/p2p/peers"
|
"github.com/OffchainLabs/prysm/v7/beacon-chain/p2p/peers"
|
||||||
"github.com/OffchainLabs/prysm/v7/beacon-chain/p2p/peers/scorers"
|
"github.com/OffchainLabs/prysm/v7/beacon-chain/p2p/peers/scorers"
|
||||||
fieldparams "github.com/OffchainLabs/prysm/v7/config/fieldparams"
|
fieldparams "github.com/OffchainLabs/prysm/v7/config/fieldparams"
|
||||||
@@ -243,7 +242,7 @@ func (p *TestP2P) BroadcastLightClientFinalityUpdate(_ context.Context, _ interf
|
|||||||
}
|
}
|
||||||
|
|
||||||
// BroadcastDataColumnSidecar broadcasts a data column for mock.
|
// BroadcastDataColumnSidecar broadcasts a data column for mock.
|
||||||
func (p *TestP2P) BroadcastDataColumnSidecars(context.Context, []blocks.VerifiedRODataColumn, []blocks.PartialDataColumn) error {
|
func (p *TestP2P) BroadcastDataColumnSidecars(context.Context, []blocks.VerifiedRODataColumn) error {
|
||||||
p.BroadcastCalled.Store(true)
|
p.BroadcastCalled.Store(true)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -309,10 +308,6 @@ func (p *TestP2P) PubSub() *pubsub.PubSub {
|
|||||||
return p.pubsub
|
return p.pubsub
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *TestP2P) PartialColumnBroadcaster() *partialdatacolumnbroadcaster.PartialColumnBroadcaster {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Disconnect from a peer.
|
// Disconnect from a peer.
|
||||||
func (p *TestP2P) Disconnect(pid peer.ID) error {
|
func (p *TestP2P) Disconnect(pid peer.ID) error {
|
||||||
return p.BHost.Network().ClosePeer(pid)
|
return p.BHost.Network().ClosePeer(pid)
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/OffchainLabs/go-bitfield"
|
|
||||||
builderapi "github.com/OffchainLabs/prysm/v7/api/client/builder"
|
builderapi "github.com/OffchainLabs/prysm/v7/api/client/builder"
|
||||||
"github.com/OffchainLabs/prysm/v7/beacon-chain/blockchain"
|
"github.com/OffchainLabs/prysm/v7/beacon-chain/blockchain"
|
||||||
"github.com/OffchainLabs/prysm/v7/beacon-chain/builder"
|
"github.com/OffchainLabs/prysm/v7/beacon-chain/builder"
|
||||||
@@ -309,7 +308,6 @@ func (vs *Server) ProposeBeaconBlock(ctx context.Context, req *ethpb.GenericSign
|
|||||||
}
|
}
|
||||||
|
|
||||||
rob, err := blocks.NewROBlockWithRoot(block, root)
|
rob, err := blocks.NewROBlockWithRoot(block, root)
|
||||||
var partialColumns []blocks.PartialDataColumn
|
|
||||||
if block.IsBlinded() {
|
if block.IsBlinded() {
|
||||||
block, blobSidecars, err = vs.handleBlindedBlock(ctx, block)
|
block, blobSidecars, err = vs.handleBlindedBlock(ctx, block)
|
||||||
if errors.Is(err, builderapi.ErrBadGateway) {
|
if errors.Is(err, builderapi.ErrBadGateway) {
|
||||||
@@ -317,7 +315,7 @@ func (vs *Server) ProposeBeaconBlock(ctx context.Context, req *ethpb.GenericSign
|
|||||||
return ðpb.ProposeResponse{BlockRoot: root[:]}, nil
|
return ðpb.ProposeResponse{BlockRoot: root[:]}, nil
|
||||||
}
|
}
|
||||||
} else if block.Version() >= version.Deneb {
|
} else if block.Version() >= version.Deneb {
|
||||||
blobSidecars, dataColumnSidecars, partialColumns, err = vs.handleUnblindedBlock(rob, req)
|
blobSidecars, dataColumnSidecars, err = vs.handleUnblindedBlock(rob, req)
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, status.Errorf(codes.Internal, "%s: %v", "handle block failed", err)
|
return nil, status.Errorf(codes.Internal, "%s: %v", "handle block failed", err)
|
||||||
@@ -337,7 +335,7 @@ func (vs *Server) ProposeBeaconBlock(ctx context.Context, req *ethpb.GenericSign
|
|||||||
|
|
||||||
wg.Wait()
|
wg.Wait()
|
||||||
|
|
||||||
if err := vs.broadcastAndReceiveSidecars(ctx, block, root, blobSidecars, dataColumnSidecars, partialColumns); err != nil {
|
if err := vs.broadcastAndReceiveSidecars(ctx, block, root, blobSidecars, dataColumnSidecars); err != nil {
|
||||||
return nil, status.Errorf(codes.Internal, "Could not broadcast/receive sidecars: %v", err)
|
return nil, status.Errorf(codes.Internal, "Could not broadcast/receive sidecars: %v", err)
|
||||||
}
|
}
|
||||||
if err := <-errChan; err != nil {
|
if err := <-errChan; err != nil {
|
||||||
@@ -354,10 +352,9 @@ func (vs *Server) broadcastAndReceiveSidecars(
|
|||||||
root [fieldparams.RootLength]byte,
|
root [fieldparams.RootLength]byte,
|
||||||
blobSidecars []*ethpb.BlobSidecar,
|
blobSidecars []*ethpb.BlobSidecar,
|
||||||
dataColumnSidecars []blocks.RODataColumn,
|
dataColumnSidecars []blocks.RODataColumn,
|
||||||
partialColumns []blocks.PartialDataColumn,
|
|
||||||
) error {
|
) error {
|
||||||
if block.Version() >= version.Fulu {
|
if block.Version() >= version.Fulu {
|
||||||
if err := vs.broadcastAndReceiveDataColumns(ctx, dataColumnSidecars, partialColumns); err != nil {
|
if err := vs.broadcastAndReceiveDataColumns(ctx, dataColumnSidecars); err != nil {
|
||||||
return errors.Wrap(err, "broadcast and receive data columns")
|
return errors.Wrap(err, "broadcast and receive data columns")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
@@ -406,41 +403,34 @@ func (vs *Server) handleBlindedBlock(ctx context.Context, block interfaces.Signe
|
|||||||
func (vs *Server) handleUnblindedBlock(
|
func (vs *Server) handleUnblindedBlock(
|
||||||
block blocks.ROBlock,
|
block blocks.ROBlock,
|
||||||
req *ethpb.GenericSignedBeaconBlock,
|
req *ethpb.GenericSignedBeaconBlock,
|
||||||
) ([]*ethpb.BlobSidecar, []blocks.RODataColumn, []blocks.PartialDataColumn, error) {
|
) ([]*ethpb.BlobSidecar, []blocks.RODataColumn, error) {
|
||||||
rawBlobs, proofs, err := blobsAndProofs(req)
|
rawBlobs, proofs, err := blobsAndProofs(req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if block.Version() >= version.Fulu {
|
if block.Version() >= version.Fulu {
|
||||||
// Compute cells and proofs from the blobs and cell proofs.
|
// Compute cells and proofs from the blobs and cell proofs.
|
||||||
cellsPerBlob, proofsPerBlob, err := peerdas.ComputeCellsAndProofsFromFlat(rawBlobs, proofs)
|
cellsPerBlob, proofsPerBlob, err := peerdas.ComputeCellsAndProofsFromFlat(rawBlobs, proofs)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, nil, errors.Wrap(err, "compute cells and proofs")
|
return nil, nil, errors.Wrap(err, "compute cells and proofs")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Construct data column sidecars from the signed block and cells and proofs.
|
// Construct data column sidecars from the signed block and cells and proofs.
|
||||||
roDataColumnSidecars, err := peerdas.DataColumnSidecars(cellsPerBlob, proofsPerBlob, peerdas.PopulateFromBlock(block))
|
roDataColumnSidecars, err := peerdas.DataColumnSidecars(cellsPerBlob, proofsPerBlob, peerdas.PopulateFromBlock(block))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, nil, errors.Wrap(err, "data column sidcars")
|
return nil, nil, errors.Wrap(err, "data column sidcars")
|
||||||
}
|
}
|
||||||
|
|
||||||
included := bitfield.NewBitlist(uint64(len(cellsPerBlob)))
|
return nil, roDataColumnSidecars, nil
|
||||||
included = included.Not() // all bits set to 1
|
|
||||||
partialColumns, err := peerdas.PartialColumns(included, cellsPerBlob, proofsPerBlob, peerdas.PopulateFromBlock(block))
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, nil, errors.Wrap(err, "data column sidcars")
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil, roDataColumnSidecars, partialColumns, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
blobSidecars, err := BuildBlobSidecars(block, rawBlobs, proofs)
|
blobSidecars, err := BuildBlobSidecars(block, rawBlobs, proofs)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, nil, errors.Wrap(err, "build blob sidecars")
|
return nil, nil, errors.Wrap(err, "build blob sidecars")
|
||||||
}
|
}
|
||||||
|
|
||||||
return blobSidecars, nil, nil, nil
|
return blobSidecars, nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// broadcastReceiveBlock broadcasts a block and handles its reception.
|
// broadcastReceiveBlock broadcasts a block and handles its reception.
|
||||||
@@ -507,7 +497,7 @@ func (vs *Server) broadcastAndReceiveBlobs(ctx context.Context, sidecars []*ethp
|
|||||||
}
|
}
|
||||||
|
|
||||||
// broadcastAndReceiveDataColumns handles the broadcasting and reception of data columns sidecars.
|
// broadcastAndReceiveDataColumns handles the broadcasting and reception of data columns sidecars.
|
||||||
func (vs *Server) broadcastAndReceiveDataColumns(ctx context.Context, roSidecars []blocks.RODataColumn, partialColumns []blocks.PartialDataColumn) error {
|
func (vs *Server) broadcastAndReceiveDataColumns(ctx context.Context, roSidecars []blocks.RODataColumn) error {
|
||||||
// We built this block ourselves, so we can upgrade the read only data column sidecar into a verified one.
|
// We built this block ourselves, so we can upgrade the read only data column sidecar into a verified one.
|
||||||
verifiedSidecars := make([]blocks.VerifiedRODataColumn, 0, len(roSidecars))
|
verifiedSidecars := make([]blocks.VerifiedRODataColumn, 0, len(roSidecars))
|
||||||
for _, sidecar := range roSidecars {
|
for _, sidecar := range roSidecars {
|
||||||
@@ -516,7 +506,7 @@ func (vs *Server) broadcastAndReceiveDataColumns(ctx context.Context, roSidecars
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Broadcast sidecars (non blocking).
|
// Broadcast sidecars (non blocking).
|
||||||
if err := vs.P2P.BroadcastDataColumnSidecars(ctx, verifiedSidecars, partialColumns); err != nil {
|
if err := vs.P2P.BroadcastDataColumnSidecars(ctx, verifiedSidecars); err != nil {
|
||||||
return errors.Wrap(err, "broadcast data column sidecars")
|
return errors.Wrap(err, "broadcast data column sidecars")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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:
|
|
||||||
//
|
//
|
||||||
|
// <spec fn="is_active_builder" fork="gloas" hash="1a599fb2">
|
||||||
|
// def is_active_builder(state: BeaconState, builder_index: BuilderIndex) -> bool:
|
||||||
|
// """
|
||||||
|
// Check if the builder at ``builder_index`` is active for the given ``state``.
|
||||||
|
// """
|
||||||
// builder = state.builders[builder_index]
|
// builder = state.builders[builder_index]
|
||||||
// return (
|
// return (
|
||||||
|
// # Placement in builder list is finalized
|
||||||
// builder.deposit_epoch < state.finalized_checkpoint.epoch
|
// builder.deposit_epoch < state.finalized_checkpoint.epoch
|
||||||
|
// # Has not initiated exit
|
||||||
// and builder.withdrawable_epoch == FAR_FUTURE_EPOCH
|
// 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:
|
|
||||||
//
|
//
|
||||||
|
// <spec fn="can_builder_cover_bid" fork="gloas" hash="9e3f2d7c">
|
||||||
|
// def can_builder_cover_bid(
|
||||||
|
// state: BeaconState, builder_index: BuilderIndex, bid_amount: Gwei
|
||||||
|
// ) -> bool:
|
||||||
// builder_balance = state.builders[builder_index].balance
|
// builder_balance = state.builders[builder_index].balance
|
||||||
// pending_withdrawals_amount = get_pending_balance_to_withdraw_for_builder(state, builder_index)
|
// pending_withdrawals_amount = get_pending_balance_to_withdraw_for_builder(state, builder_index)
|
||||||
// min_balance = MIN_DEPOSIT_AMOUNT + pending_withdrawals_amount
|
// min_balance = MIN_DEPOSIT_AMOUNT + pending_withdrawals_amount
|
||||||
// if builder_balance < min_balance:
|
// if builder_balance < min_balance:
|
||||||
// return False
|
// return False
|
||||||
// return builder_balance - min_balance >= bid_amount
|
// 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)
|
||||||
|
|||||||
@@ -58,7 +58,6 @@ go_library(
|
|||||||
"validate_bls_to_execution_change.go",
|
"validate_bls_to_execution_change.go",
|
||||||
"validate_data_column.go",
|
"validate_data_column.go",
|
||||||
"validate_light_client.go",
|
"validate_light_client.go",
|
||||||
"validate_partial_header.go",
|
|
||||||
"validate_proposer_slashing.go",
|
"validate_proposer_slashing.go",
|
||||||
"validate_sync_committee_message.go",
|
"validate_sync_committee_message.go",
|
||||||
"validate_sync_contribution_proof.go",
|
"validate_sync_contribution_proof.go",
|
||||||
@@ -99,7 +98,6 @@ go_library(
|
|||||||
"//beacon-chain/operations/voluntaryexits:go_default_library",
|
"//beacon-chain/operations/voluntaryexits:go_default_library",
|
||||||
"//beacon-chain/p2p:go_default_library",
|
"//beacon-chain/p2p:go_default_library",
|
||||||
"//beacon-chain/p2p/encoder:go_default_library",
|
"//beacon-chain/p2p/encoder:go_default_library",
|
||||||
"//beacon-chain/p2p/partialdatacolumnbroadcaster:go_default_library",
|
|
||||||
"//beacon-chain/p2p/peers:go_default_library",
|
"//beacon-chain/p2p/peers:go_default_library",
|
||||||
"//beacon-chain/p2p/types:go_default_library",
|
"//beacon-chain/p2p/types:go_default_library",
|
||||||
"//beacon-chain/slasher/types:go_default_library",
|
"//beacon-chain/slasher/types:go_default_library",
|
||||||
|
|||||||
@@ -2,10 +2,8 @@ package sync
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"iter"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/OffchainLabs/prysm/v7/beacon-chain/core/peerdas"
|
|
||||||
"github.com/OffchainLabs/prysm/v7/consensus-types/blocks"
|
"github.com/OffchainLabs/prysm/v7/consensus-types/blocks"
|
||||||
"github.com/OffchainLabs/prysm/v7/crypto/bls"
|
"github.com/OffchainLabs/prysm/v7/crypto/bls"
|
||||||
"github.com/OffchainLabs/prysm/v7/monitoring/tracing"
|
"github.com/OffchainLabs/prysm/v7/monitoring/tracing"
|
||||||
@@ -21,16 +19,9 @@ type signatureVerifier struct {
|
|||||||
resChan chan error
|
resChan chan error
|
||||||
}
|
}
|
||||||
|
|
||||||
type errorWithSegment struct {
|
|
||||||
err error
|
|
||||||
// segment is only available if the batched verification failed
|
|
||||||
segment peerdas.CellProofBundleSegment
|
|
||||||
}
|
|
||||||
|
|
||||||
type kzgVerifier struct {
|
type kzgVerifier struct {
|
||||||
sizeHint int
|
dataColumns []blocks.RODataColumn
|
||||||
cellProofs iter.Seq[blocks.CellProofBundle]
|
resChan chan error
|
||||||
resChan chan errorWithSegment
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// A routine that runs in the background to perform batch
|
// A routine that runs in the background to perform batch
|
||||||
|
|||||||
@@ -256,16 +256,6 @@ var (
|
|||||||
Help: "Count the number of data column sidecars obtained via the execution layer.",
|
Help: "Count the number of data column sidecars obtained via the execution layer.",
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
usefulFullColumnsReceivedTotal = promauto.NewCounterVec(prometheus.CounterOpts{
|
|
||||||
Name: "beacon_useful_full_columns_received_total",
|
|
||||||
Help: "Number of useful full columns (any cell being useful) received",
|
|
||||||
}, []string{"column_index"})
|
|
||||||
|
|
||||||
partialMessageColumnCompletionsTotal = promauto.NewCounterVec(prometheus.CounterOpts{
|
|
||||||
Name: "beacon_partial_message_column_completions_total",
|
|
||||||
Help: "How often the partial message first completed the column",
|
|
||||||
}, []string{"column_index"})
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func (s *Service) updateMetrics() {
|
func (s *Service) updateMetrics() {
|
||||||
|
|||||||
@@ -5,8 +5,6 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"reflect"
|
"reflect"
|
||||||
"runtime/debug"
|
"runtime/debug"
|
||||||
"slices"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
@@ -16,13 +14,11 @@ import (
|
|||||||
"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/core/peerdas"
|
"github.com/OffchainLabs/prysm/v7/beacon-chain/core/peerdas"
|
||||||
"github.com/OffchainLabs/prysm/v7/beacon-chain/p2p"
|
"github.com/OffchainLabs/prysm/v7/beacon-chain/p2p"
|
||||||
"github.com/OffchainLabs/prysm/v7/beacon-chain/p2p/partialdatacolumnbroadcaster"
|
|
||||||
"github.com/OffchainLabs/prysm/v7/beacon-chain/p2p/peers"
|
"github.com/OffchainLabs/prysm/v7/beacon-chain/p2p/peers"
|
||||||
"github.com/OffchainLabs/prysm/v7/beacon-chain/startup"
|
"github.com/OffchainLabs/prysm/v7/beacon-chain/startup"
|
||||||
"github.com/OffchainLabs/prysm/v7/cmd/beacon-chain/flags"
|
"github.com/OffchainLabs/prysm/v7/cmd/beacon-chain/flags"
|
||||||
"github.com/OffchainLabs/prysm/v7/config/features"
|
"github.com/OffchainLabs/prysm/v7/config/features"
|
||||||
"github.com/OffchainLabs/prysm/v7/config/params"
|
"github.com/OffchainLabs/prysm/v7/config/params"
|
||||||
"github.com/OffchainLabs/prysm/v7/consensus-types/blocks"
|
|
||||||
"github.com/OffchainLabs/prysm/v7/consensus-types/primitives"
|
"github.com/OffchainLabs/prysm/v7/consensus-types/primitives"
|
||||||
"github.com/OffchainLabs/prysm/v7/monitoring/tracing"
|
"github.com/OffchainLabs/prysm/v7/monitoring/tracing"
|
||||||
"github.com/OffchainLabs/prysm/v7/monitoring/tracing/trace"
|
"github.com/OffchainLabs/prysm/v7/monitoring/tracing/trace"
|
||||||
@@ -65,16 +61,6 @@ type subscribeParameters struct {
|
|||||||
// getSubnetsRequiringPeers is a function that returns all subnets that require peers to be found
|
// getSubnetsRequiringPeers is a function that returns all subnets that require peers to be found
|
||||||
// but for which no subscriptions are needed.
|
// but for which no subscriptions are needed.
|
||||||
getSubnetsRequiringPeers func(currentSlot primitives.Slot) map[uint64]bool
|
getSubnetsRequiringPeers func(currentSlot primitives.Slot) map[uint64]bool
|
||||||
|
|
||||||
partial *partialSubscribeParameters
|
|
||||||
}
|
|
||||||
|
|
||||||
type partialSubscribeParameters struct {
|
|
||||||
broadcaster *partialdatacolumnbroadcaster.PartialColumnBroadcaster
|
|
||||||
validateHeader partialdatacolumnbroadcaster.HeaderValidator
|
|
||||||
validate partialdatacolumnbroadcaster.ColumnValidator
|
|
||||||
handle partialdatacolumnbroadcaster.SubHandler
|
|
||||||
handleHeader partialdatacolumnbroadcaster.HeaderHandler
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// shortTopic is a less verbose version of topic strings used for logging.
|
// shortTopic is a less verbose version of topic strings used for logging.
|
||||||
@@ -334,43 +320,6 @@ func (s *Service) registerSubscribers(nse params.NetworkScheduleEntry) bool {
|
|||||||
// New gossip topic in Fulu.
|
// New gossip topic in Fulu.
|
||||||
if params.BeaconConfig().FuluForkEpoch <= nse.Epoch {
|
if params.BeaconConfig().FuluForkEpoch <= nse.Epoch {
|
||||||
s.spawn(func() {
|
s.spawn(func() {
|
||||||
var ps *partialSubscribeParameters
|
|
||||||
broadcaster := s.cfg.p2p.PartialColumnBroadcaster()
|
|
||||||
if broadcaster != nil {
|
|
||||||
ps = &partialSubscribeParameters{
|
|
||||||
broadcaster: broadcaster,
|
|
||||||
validateHeader: func(header *ethpb.PartialDataColumnHeader) (bool, error) {
|
|
||||||
return s.validatePartialDataColumnHeader(context.TODO(), header)
|
|
||||||
},
|
|
||||||
validate: func(cellsToVerify []blocks.CellProofBundle) error {
|
|
||||||
return peerdas.VerifyDataColumnsCellsKZGProofs(len(cellsToVerify), slices.Values(cellsToVerify))
|
|
||||||
},
|
|
||||||
handle: func(topic string, col blocks.VerifiedRODataColumn) {
|
|
||||||
ctx, cancel := context.WithTimeout(s.ctx, pubsubMessageTimeout)
|
|
||||||
defer cancel()
|
|
||||||
|
|
||||||
slot := col.SignedBlockHeader.Header.Slot
|
|
||||||
proposerIndex := col.SignedBlockHeader.Header.ProposerIndex
|
|
||||||
if !s.hasSeenDataColumnIndex(slot, proposerIndex, col.Index) {
|
|
||||||
s.setSeenDataColumnIndex(slot, proposerIndex, col.Index)
|
|
||||||
// This column was completed from a partial message.
|
|
||||||
partialMessageColumnCompletionsTotal.WithLabelValues(strconv.FormatUint(col.Index, 10)).Inc()
|
|
||||||
}
|
|
||||||
err := s.verifiedRODataColumnSubscriber(ctx, col)
|
|
||||||
if err != nil {
|
|
||||||
log.WithError(err).Error("Failed to handle verified RO data column subscriber")
|
|
||||||
}
|
|
||||||
},
|
|
||||||
handleHeader: func(header *ethpb.PartialDataColumnHeader) {
|
|
||||||
ctx, cancel := context.WithTimeout(s.ctx, pubsubMessageTimeout)
|
|
||||||
defer cancel()
|
|
||||||
err := s.partialDataColumnHeaderSubscriber(ctx, header)
|
|
||||||
if err != nil {
|
|
||||||
log.WithError(err).Error("Failed to handle partial data column header")
|
|
||||||
}
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
s.subscribeWithParameters(subscribeParameters{
|
s.subscribeWithParameters(subscribeParameters{
|
||||||
topicFormat: p2p.DataColumnSubnetTopicFormat,
|
topicFormat: p2p.DataColumnSubnetTopicFormat,
|
||||||
validate: s.validateDataColumn,
|
validate: s.validateDataColumn,
|
||||||
@@ -378,7 +327,6 @@ func (s *Service) registerSubscribers(nse params.NetworkScheduleEntry) bool {
|
|||||||
nse: nse,
|
nse: nse,
|
||||||
getSubnetsToJoin: s.dataColumnSubnetIndices,
|
getSubnetsToJoin: s.dataColumnSubnetIndices,
|
||||||
getSubnetsRequiringPeers: s.allDataColumnSubnets,
|
getSubnetsRequiringPeers: s.allDataColumnSubnets,
|
||||||
partial: ps,
|
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -417,10 +365,11 @@ func (s *Service) subscribe(topic string, validator wrappedVal, handle subHandle
|
|||||||
// Impossible condition as it would mean topic does not exist.
|
// Impossible condition as it would mean topic does not exist.
|
||||||
panic(fmt.Sprintf("%s is not mapped to any message in GossipTopicMappings", topic)) // lint:nopanic -- Impossible condition.
|
panic(fmt.Sprintf("%s is not mapped to any message in GossipTopicMappings", topic)) // lint:nopanic -- Impossible condition.
|
||||||
}
|
}
|
||||||
s.subscribeWithBase(s.addDigestToTopic(topic, nse.ForkDigest)+s.cfg.p2p.Encoding().ProtocolSuffix(), validator, handle)
|
s.subscribeWithBase(s.addDigestToTopic(topic, nse.ForkDigest), validator, handle)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Service) subscribeWithBase(topic string, validator wrappedVal, handle subHandler) *pubsub.Subscription {
|
func (s *Service) subscribeWithBase(topic string, validator wrappedVal, handle subHandler) *pubsub.Subscription {
|
||||||
|
topic += s.cfg.p2p.Encoding().ProtocolSuffix()
|
||||||
log := log.WithField("topic", topic)
|
log := log.WithField("topic", topic)
|
||||||
|
|
||||||
// Do not resubscribe already seen subscriptions.
|
// Do not resubscribe already seen subscriptions.
|
||||||
@@ -583,11 +532,7 @@ func (s *Service) wrapAndReportValidation(topic string, v wrappedVal) (string, p
|
|||||||
func (s *Service) pruneNotWanted(t *subnetTracker, wantedSubnets map[uint64]bool) {
|
func (s *Service) pruneNotWanted(t *subnetTracker, wantedSubnets map[uint64]bool) {
|
||||||
for _, subnet := range t.unwanted(wantedSubnets) {
|
for _, subnet := range t.unwanted(wantedSubnets) {
|
||||||
t.cancelSubscription(subnet)
|
t.cancelSubscription(subnet)
|
||||||
topic := t.fullTopic(subnet, s.cfg.p2p.Encoding().ProtocolSuffix())
|
s.unSubscribeFromTopic(t.fullTopic(subnet, s.cfg.p2p.Encoding().ProtocolSuffix()))
|
||||||
if t.partial != nil {
|
|
||||||
_ = t.partial.broadcaster.Unsubscribe(topic)
|
|
||||||
}
|
|
||||||
s.unSubscribeFromTopic(topic)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -634,34 +579,9 @@ func (s *Service) trySubscribeSubnets(t *subnetTracker) {
|
|||||||
subnetsToJoin := t.getSubnetsToJoin(s.cfg.clock.CurrentSlot())
|
subnetsToJoin := t.getSubnetsToJoin(s.cfg.clock.CurrentSlot())
|
||||||
s.pruneNotWanted(t, subnetsToJoin)
|
s.pruneNotWanted(t, subnetsToJoin)
|
||||||
for _, subnet := range t.missing(subnetsToJoin) {
|
for _, subnet := range t.missing(subnetsToJoin) {
|
||||||
topicStr := t.fullTopic(subnet, s.cfg.p2p.Encoding().ProtocolSuffix())
|
// TODO: subscribeWithBase appends the protocol suffix, other methods don't. Make this consistent.
|
||||||
topicOpts := make([]pubsub.TopicOpt, 0, 2)
|
topic := t.fullTopic(subnet, "")
|
||||||
|
t.track(subnet, s.subscribeWithBase(topic, t.validate, t.handle))
|
||||||
requestPartial := t.partial != nil
|
|
||||||
|
|
||||||
if requestPartial {
|
|
||||||
// TODO: do we want the ability to support partial messages without requesting them?
|
|
||||||
topicOpts = append(topicOpts, pubsub.RequestPartialMessages())
|
|
||||||
}
|
|
||||||
|
|
||||||
topic, err := s.cfg.p2p.JoinTopic(topicStr, topicOpts...)
|
|
||||||
if err != nil {
|
|
||||||
log.WithError(err).Error("Failed to join topic")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if requestPartial {
|
|
||||||
log.Info("Subscribing to partial columns on", topicStr)
|
|
||||||
err = t.partial.broadcaster.Subscribe(topic, t.partial.validateHeader, t.partial.validate, t.partial.handle, t.partial.handleHeader)
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
log.WithError(err).Error("Failed to subscribe to partial column")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// We still need to subscribe to the full columns as well as partial in
|
|
||||||
// case our peers don't support partial messages.
|
|
||||||
t.track(subnet, s.subscribeWithBase(topicStr, t.validate, t.handle))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ import (
|
|||||||
"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/core/peerdas"
|
"github.com/OffchainLabs/prysm/v7/beacon-chain/core/peerdas"
|
||||||
"github.com/OffchainLabs/prysm/v7/beacon-chain/core/transition/interop"
|
"github.com/OffchainLabs/prysm/v7/beacon-chain/core/transition/interop"
|
||||||
"github.com/OffchainLabs/prysm/v7/beacon-chain/p2p"
|
|
||||||
"github.com/OffchainLabs/prysm/v7/config/features"
|
"github.com/OffchainLabs/prysm/v7/config/features"
|
||||||
fieldparams "github.com/OffchainLabs/prysm/v7/config/fieldparams"
|
fieldparams "github.com/OffchainLabs/prysm/v7/config/fieldparams"
|
||||||
"github.com/OffchainLabs/prysm/v7/config/params"
|
"github.com/OffchainLabs/prysm/v7/config/params"
|
||||||
@@ -202,16 +201,6 @@ func (s *Service) processDataColumnSidecarsFromExecution(ctx context.Context, so
|
|||||||
return nil, errors.Wrap(err, "column indices to sample")
|
return nil, errors.Wrap(err, "column indices to sample")
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: the deadline here was removed in https://github.com/OffchainLabs/prysm/pull/16155/files
|
|
||||||
// make sure that reintroducing it does not cause issues.
|
|
||||||
secondsPerHalfSlot := time.Duration(params.BeaconConfig().SecondsPerSlot/2) * time.Second
|
|
||||||
ctx, cancel := context.WithTimeout(ctx, secondsPerHalfSlot)
|
|
||||||
defer cancel()
|
|
||||||
|
|
||||||
digest, err := s.currentForkDigest()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
log := log.WithFields(logrus.Fields{
|
log := log.WithFields(logrus.Fields{
|
||||||
"root": fmt.Sprintf("%#x", source.Root()),
|
"root": fmt.Sprintf("%#x", source.Root()),
|
||||||
"slot": source.Slot(),
|
"slot": source.Slot(),
|
||||||
@@ -242,30 +231,11 @@ func (s *Service) processDataColumnSidecarsFromExecution(ctx context.Context, so
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Try to reconstruct data column constructedSidecars from the execution client.
|
// Try to reconstruct data column constructedSidecars from the execution client.
|
||||||
constructedSidecars, partialColumns, err := s.cfg.executionReconstructor.ConstructDataColumnSidecars(ctx, source)
|
constructedSidecars, err := s.cfg.executionReconstructor.ConstructDataColumnSidecars(ctx, source)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrap(err, "reconstruct data column sidecars")
|
return nil, errors.Wrap(err, "reconstruct data column sidecars")
|
||||||
}
|
}
|
||||||
|
|
||||||
partialBroadcaster := s.cfg.p2p.PartialColumnBroadcaster()
|
|
||||||
if partialBroadcaster != nil {
|
|
||||||
log.WithField("len(partialColumns)", len(partialColumns)).Debug("Publishing partial columns")
|
|
||||||
for i := range uint64(len(partialColumns)) {
|
|
||||||
if !columnIndicesToSample[i] {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
subnet := peerdas.ComputeSubnetForDataColumnSidecar(i)
|
|
||||||
topic := fmt.Sprintf(p2p.DataColumnSubnetTopicFormat, digest, subnet) + s.cfg.p2p.Encoding().ProtocolSuffix()
|
|
||||||
// Publish the partial column. This is idempotent if we republish the same data twice.
|
|
||||||
// Note, the "partial column" may indeed be complete. We still
|
|
||||||
// should publish to help our peers.
|
|
||||||
err = partialBroadcaster.Publish(topic, partialColumns[i])
|
|
||||||
if err != nil {
|
|
||||||
log.WithError(err).Warn("Failed to publish partial column")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// No sidecars are retrieved from the EL, retry later
|
// No sidecars are retrieved from the EL, retry later
|
||||||
constructedCount := uint64(len(constructedSidecars))
|
constructedCount := uint64(len(constructedSidecars))
|
||||||
|
|
||||||
@@ -337,7 +307,7 @@ func (s *Service) broadcastAndReceiveUnseenDataColumnSidecars(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Broadcast all the data column sidecars we reconstructed but did not see via gossip (non blocking).
|
// Broadcast all the data column sidecars we reconstructed but did not see via gossip (non blocking).
|
||||||
if err := s.cfg.p2p.BroadcastDataColumnSidecars(ctx, unseenSidecars, nil); err != nil {
|
if err := s.cfg.p2p.BroadcastDataColumnSidecars(ctx, unseenSidecars); err != nil {
|
||||||
return nil, errors.Wrap(err, "broadcast data column sidecars")
|
return nil, errors.Wrap(err, "broadcast data column sidecars")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ package sync
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"strconv"
|
|
||||||
|
|
||||||
"github.com/OffchainLabs/prysm/v7/beacon-chain/core/feed"
|
"github.com/OffchainLabs/prysm/v7/beacon-chain/core/feed"
|
||||||
opfeed "github.com/OffchainLabs/prysm/v7/beacon-chain/core/feed/operation"
|
opfeed "github.com/OffchainLabs/prysm/v7/beacon-chain/core/feed/operation"
|
||||||
@@ -11,9 +10,7 @@ import (
|
|||||||
"github.com/OffchainLabs/prysm/v7/config/params"
|
"github.com/OffchainLabs/prysm/v7/config/params"
|
||||||
"github.com/OffchainLabs/prysm/v7/consensus-types/blocks"
|
"github.com/OffchainLabs/prysm/v7/consensus-types/blocks"
|
||||||
"github.com/OffchainLabs/prysm/v7/consensus-types/primitives"
|
"github.com/OffchainLabs/prysm/v7/consensus-types/primitives"
|
||||||
ethpb "github.com/OffchainLabs/prysm/v7/proto/prysm/v1alpha1"
|
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"github.com/sirupsen/logrus"
|
|
||||||
"golang.org/x/sync/errgroup"
|
"golang.org/x/sync/errgroup"
|
||||||
"google.golang.org/protobuf/proto"
|
"google.golang.org/protobuf/proto"
|
||||||
)
|
)
|
||||||
@@ -27,13 +24,6 @@ func (s *Service) dataColumnSubscriber(ctx context.Context, msg proto.Message) e
|
|||||||
return fmt.Errorf("message was not type blocks.VerifiedRODataColumn, type=%T", msg)
|
return fmt.Errorf("message was not type blocks.VerifiedRODataColumn, type=%T", msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Track useful full columns received via gossip (not previously seen)
|
|
||||||
slot := sidecar.SignedBlockHeader.Header.Slot
|
|
||||||
proposerIndex := sidecar.SignedBlockHeader.Header.ProposerIndex
|
|
||||||
if !s.hasSeenDataColumnIndex(slot, proposerIndex, sidecar.Index) {
|
|
||||||
usefulFullColumnsReceivedTotal.WithLabelValues(strconv.FormatUint(sidecar.Index, 10)).Inc()
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := s.receiveDataColumnSidecar(ctx, sidecar); err != nil {
|
if err := s.receiveDataColumnSidecar(ctx, sidecar); err != nil {
|
||||||
return wrapDataColumnError(sidecar, "receive data column sidecar", err)
|
return wrapDataColumnError(sidecar, "receive data column sidecar", err)
|
||||||
}
|
}
|
||||||
@@ -67,54 +57,6 @@ func (s *Service) dataColumnSubscriber(ctx context.Context, msg proto.Message) e
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Service) partialDataColumnHeaderSubscriber(ctx context.Context, header *ethpb.PartialDataColumnHeader) error {
|
|
||||||
source := peerdas.PopulateFromPartialHeader(header)
|
|
||||||
log.WithField("slot", source.Slot()).Info("Received data column header")
|
|
||||||
|
|
||||||
go func() {
|
|
||||||
if err := s.processDataColumnSidecarsFromExecution(ctx, source); err != nil {
|
|
||||||
log.WithError(err).WithFields(logrus.Fields{
|
|
||||||
"root": fmt.Sprintf("%#x", source.Root()),
|
|
||||||
"slot": source.Slot(),
|
|
||||||
}).Error("Failed to process sidecars from execution for partial data column header")
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *Service) verifiedRODataColumnSubscriber(ctx context.Context, sidecar blocks.VerifiedRODataColumn) error {
|
|
||||||
log.WithField("slot", sidecar.Slot()).WithField("column", sidecar.Index).Info("Received data column sidecar")
|
|
||||||
|
|
||||||
if err := s.receiveDataColumnSidecar(ctx, sidecar); err != nil {
|
|
||||||
return errors.Wrap(err, "receive data column sidecar")
|
|
||||||
}
|
|
||||||
|
|
||||||
var wg errgroup.Group
|
|
||||||
wg.Go(func() error {
|
|
||||||
if err := s.processDataColumnSidecarsFromReconstruction(ctx, sidecar); err != nil {
|
|
||||||
return errors.Wrap(err, "process data column sidecars from reconstruction")
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
|
|
||||||
wg.Go(func() error {
|
|
||||||
// Broadcast our complete column for peers that don't use partial messages
|
|
||||||
if err := s.cfg.p2p.BroadcastDataColumnSidecars(ctx, []blocks.VerifiedRODataColumn{sidecar}, nil); err != nil {
|
|
||||||
return errors.Wrap(err, "process data column sidecars from execution")
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
|
|
||||||
if err := wg.Wait(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// receiveDataColumnSidecar receives a single data column sidecar: marks it as seen and saves it to the chain.
|
// receiveDataColumnSidecar receives a single data column sidecar: marks it as seen and saves it to the chain.
|
||||||
// Do not loop over this function to receive multiple sidecars, use receiveDataColumnSidecars instead.
|
// Do not loop over this function to receive multiple sidecars, use receiveDataColumnSidecars instead.
|
||||||
func (s *Service) receiveDataColumnSidecar(ctx context.Context, sidecar blocks.VerifiedRODataColumn) error {
|
func (s *Service) receiveDataColumnSidecar(ctx context.Context, sidecar blocks.VerifiedRODataColumn) error {
|
||||||
|
|||||||
@@ -71,7 +71,6 @@ func (s *Service) validateDataColumn(ctx context.Context, pid peer.ID, msg *pubs
|
|||||||
roDataColumns := []blocks.RODataColumn{roDataColumn}
|
roDataColumns := []blocks.RODataColumn{roDataColumn}
|
||||||
|
|
||||||
// Create the verifier.
|
// Create the verifier.
|
||||||
// Question(marco): Do we want the multiple columns verifier? Is batching used only for kzg proofs?
|
|
||||||
verifier := s.newColumnsVerifier(roDataColumns, verification.GossipDataColumnSidecarRequirements)
|
verifier := s.newColumnsVerifier(roDataColumns, verification.GossipDataColumnSidecarRequirements)
|
||||||
|
|
||||||
// Start the verification process.
|
// Start the verification process.
|
||||||
|
|||||||
@@ -1,143 +0,0 @@
|
|||||||
package sync
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
|
|
||||||
"github.com/OffchainLabs/prysm/v7/beacon-chain/core/helpers"
|
|
||||||
"github.com/OffchainLabs/prysm/v7/beacon-chain/core/peerdas"
|
|
||||||
"github.com/OffchainLabs/prysm/v7/beacon-chain/core/signing"
|
|
||||||
"github.com/OffchainLabs/prysm/v7/config/params"
|
|
||||||
"github.com/OffchainLabs/prysm/v7/encoding/bytesutil"
|
|
||||||
ethpb "github.com/OffchainLabs/prysm/v7/proto/prysm/v1alpha1"
|
|
||||||
"github.com/OffchainLabs/prysm/v7/time/slots"
|
|
||||||
"github.com/pkg/errors"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
// REJECT errors - peer should be penalized
|
|
||||||
errHeaderEmptyCommitments = errors.New("header has no kzg commitments")
|
|
||||||
errHeaderParentInvalid = errors.New("header parent invalid")
|
|
||||||
errHeaderSlotNotAfterParent = errors.New("header slot not after parent")
|
|
||||||
errHeaderNotFinalizedDescendant = errors.New("header not finalized descendant")
|
|
||||||
errHeaderInvalidInclusionProof = errors.New("invalid inclusion proof")
|
|
||||||
errHeaderInvalidSignature = errors.New("invalid proposer signature")
|
|
||||||
errHeaderUnexpectedProposer = errors.New("unexpected proposer index")
|
|
||||||
|
|
||||||
// IGNORE errors - don't penalize peer
|
|
||||||
errHeaderNil = errors.New("nil header")
|
|
||||||
errHeaderFromFuture = errors.New("header is from future slot")
|
|
||||||
errHeaderNotAboveFinalized = errors.New("header slot not above finalized")
|
|
||||||
errHeaderParentNotSeen = errors.New("header parent not seen")
|
|
||||||
)
|
|
||||||
|
|
||||||
// validatePartialDataColumnHeader validates a PartialDataColumnHeader per the consensus spec.
|
|
||||||
// Returns (reject, err) where reject=true means the peer should be penalized.
|
|
||||||
// TODO: we should consolidate this with the existing DataColumn validation pipeline.
|
|
||||||
func (s *Service) validatePartialDataColumnHeader(ctx context.Context, header *ethpb.PartialDataColumnHeader) (reject bool, err error) {
|
|
||||||
if header == nil || header.SignedBlockHeader == nil || header.SignedBlockHeader.Header == nil {
|
|
||||||
return false, errHeaderNil // IGNORE
|
|
||||||
}
|
|
||||||
|
|
||||||
blockHeader := header.SignedBlockHeader.Header
|
|
||||||
headerSlot := blockHeader.Slot
|
|
||||||
parentRoot := bytesutil.ToBytes32(blockHeader.ParentRoot)
|
|
||||||
|
|
||||||
// [REJECT] kzg_commitments list is non-empty
|
|
||||||
if len(header.KzgCommitments) == 0 {
|
|
||||||
return true, errHeaderEmptyCommitments
|
|
||||||
}
|
|
||||||
|
|
||||||
// [IGNORE] Not from future slot (with MAXIMUM_GOSSIP_CLOCK_DISPARITY allowance)
|
|
||||||
currentSlot := s.cfg.clock.CurrentSlot()
|
|
||||||
if headerSlot > currentSlot {
|
|
||||||
maxDisparity := params.BeaconConfig().MaximumGossipClockDisparityDuration()
|
|
||||||
slotStart, err := s.cfg.clock.SlotStart(headerSlot)
|
|
||||||
if err != nil {
|
|
||||||
return false, err
|
|
||||||
}
|
|
||||||
if s.cfg.clock.Now().Before(slotStart.Add(-maxDisparity)) {
|
|
||||||
return false, errHeaderFromFuture // IGNORE
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// [IGNORE] Slot above finalized
|
|
||||||
finalizedCheckpoint := s.cfg.chain.FinalizedCheckpt()
|
|
||||||
startSlot, err := slots.EpochStart(finalizedCheckpoint.Epoch)
|
|
||||||
if err != nil {
|
|
||||||
return false, err
|
|
||||||
}
|
|
||||||
if headerSlot <= startSlot {
|
|
||||||
return false, errHeaderNotAboveFinalized // IGNORE
|
|
||||||
}
|
|
||||||
|
|
||||||
// [IGNORE] Parent has been seen
|
|
||||||
if !s.cfg.chain.HasBlock(ctx, parentRoot) {
|
|
||||||
return false, errHeaderParentNotSeen // IGNORE
|
|
||||||
}
|
|
||||||
|
|
||||||
// [REJECT] Parent passes validation (not a bad block)
|
|
||||||
if s.hasBadBlock(parentRoot) {
|
|
||||||
return true, errHeaderParentInvalid
|
|
||||||
}
|
|
||||||
|
|
||||||
// [REJECT] Header slot > parent slot
|
|
||||||
parentSlot, err := s.cfg.chain.RecentBlockSlot(parentRoot)
|
|
||||||
if err != nil {
|
|
||||||
return false, errors.Wrap(err, "get parent slot")
|
|
||||||
}
|
|
||||||
if headerSlot <= parentSlot {
|
|
||||||
return true, errHeaderSlotNotAfterParent
|
|
||||||
}
|
|
||||||
|
|
||||||
// [REJECT] Finalized checkpoint is ancestor (parent is in forkchoice)
|
|
||||||
if !s.cfg.chain.InForkchoice(parentRoot) {
|
|
||||||
return true, errHeaderNotFinalizedDescendant
|
|
||||||
}
|
|
||||||
|
|
||||||
// [REJECT] Inclusion proof valid
|
|
||||||
if err := peerdas.VerifyPartialDataColumnHeaderInclusionProof(header); err != nil {
|
|
||||||
return true, errHeaderInvalidInclusionProof
|
|
||||||
}
|
|
||||||
|
|
||||||
// [REJECT] Valid proposer signature
|
|
||||||
parentState, err := s.cfg.stateGen.StateByRoot(ctx, parentRoot)
|
|
||||||
if err != nil {
|
|
||||||
return false, errors.Wrap(err, "get parent state")
|
|
||||||
}
|
|
||||||
|
|
||||||
proposerIdx := blockHeader.ProposerIndex
|
|
||||||
proposer, err := parentState.ValidatorAtIndex(proposerIdx)
|
|
||||||
if err != nil {
|
|
||||||
return false, errors.Wrap(err, "get proposer")
|
|
||||||
}
|
|
||||||
|
|
||||||
domain, err := signing.Domain(
|
|
||||||
parentState.Fork(),
|
|
||||||
slots.ToEpoch(headerSlot),
|
|
||||||
params.BeaconConfig().DomainBeaconProposer,
|
|
||||||
parentState.GenesisValidatorsRoot(),
|
|
||||||
)
|
|
||||||
if err != nil {
|
|
||||||
return false, errors.Wrap(err, "get domain")
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := signing.VerifyBlockHeaderSigningRoot(
|
|
||||||
blockHeader,
|
|
||||||
proposer.PublicKey,
|
|
||||||
header.SignedBlockHeader.Signature,
|
|
||||||
domain,
|
|
||||||
); err != nil {
|
|
||||||
return true, errHeaderInvalidSignature
|
|
||||||
}
|
|
||||||
|
|
||||||
// [REJECT] Expected proposer for slot
|
|
||||||
expectedProposer, err := helpers.BeaconProposerIndexAtSlot(ctx, parentState, headerSlot)
|
|
||||||
if err != nil {
|
|
||||||
return false, errors.Wrap(err, "compute expected proposer")
|
|
||||||
}
|
|
||||||
if expectedProposer != proposerIdx {
|
|
||||||
return true, errHeaderUnexpectedProposer
|
|
||||||
}
|
|
||||||
|
|
||||||
return false, nil // Valid header
|
|
||||||
}
|
|
||||||
@@ -81,17 +81,7 @@ func (ini *Initializer) NewDataColumnsVerifier(roDataColumns []blocks.RODataColu
|
|||||||
sharedResources: ini.shared,
|
sharedResources: ini.shared,
|
||||||
dataColumns: roDataColumns,
|
dataColumns: roDataColumns,
|
||||||
results: newResults(reqs...),
|
results: newResults(reqs...),
|
||||||
verifyDataColumnsCommitment: func(rc []blocks.RODataColumn) error {
|
verifyDataColumnsCommitment: peerdas.VerifyDataColumnsSidecarKZGProofs,
|
||||||
if len(rc) == 0 {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
var sizeHint int
|
|
||||||
if len(rc) > 0 {
|
|
||||||
sizeHint = len(rc[0].Column)
|
|
||||||
}
|
|
||||||
sizeHint *= len(rc)
|
|
||||||
return peerdas.VerifyDataColumnsCellsKZGProofs(sizeHint, blocks.RODataColumnsToCellProofBundles(rc))
|
|
||||||
},
|
|
||||||
stateByRoot: make(map[[fieldparams.RootLength]byte]state.BeaconState),
|
stateByRoot: make(map[[fieldparams.RootLength]byte]state.BeaconState),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
11
changelog/james-prysm_host-fallback-cleanup.md
Normal file
11
changelog/james-prysm_host-fallback-cleanup.md
Normal 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.
|
||||||
3
changelog/jtraglia-improve-ethspecify-integration.md
Normal file
3
changelog/jtraglia-improve-ethspecify-integration.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
### Changed
|
||||||
|
|
||||||
|
- Improved integrations with ethspecify so specrefs can be used throughout the codebase.
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
### Added
|
|
||||||
|
|
||||||
- Add support for partial columns
|
|
||||||
@@ -368,9 +368,4 @@ var (
|
|||||||
Usage: "Disables the engine_getBlobsV2 usage.",
|
Usage: "Disables the engine_getBlobsV2 usage.",
|
||||||
Hidden: true,
|
Hidden: true,
|
||||||
}
|
}
|
||||||
// PartialDataColumns specifies the regex for enabling partial messages on datacolumns
|
|
||||||
PartialDataColumns = &cli.BoolFlag{
|
|
||||||
Name: "partial-data-columns",
|
|
||||||
Usage: "Enable cell-level dissemination for PeerDAS data columns",
|
|
||||||
}
|
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -162,7 +162,6 @@ var appFlags = []cli.Flag{
|
|||||||
flags.BatchVerifierLimit,
|
flags.BatchVerifierLimit,
|
||||||
flags.StateDiffExponents,
|
flags.StateDiffExponents,
|
||||||
flags.DisableEphemeralLogFile,
|
flags.DisableEphemeralLogFile,
|
||||||
flags.PartialDataColumns,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
|||||||
@@ -75,7 +75,6 @@ var appHelpFlagGroups = []flagGroup{
|
|||||||
flags.RPCPort,
|
flags.RPCPort,
|
||||||
flags.BatchVerifierLimit,
|
flags.BatchVerifierLimit,
|
||||||
flags.StateDiffExponents,
|
flags.StateDiffExponents,
|
||||||
flags.PartialDataColumns,
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -8,8 +8,6 @@ go_library(
|
|||||||
"get_payload.go",
|
"get_payload.go",
|
||||||
"getters.go",
|
"getters.go",
|
||||||
"kzg.go",
|
"kzg.go",
|
||||||
"log.go",
|
|
||||||
"partialdatacolumn.go",
|
|
||||||
"proofs.go",
|
"proofs.go",
|
||||||
"proto.go",
|
"proto.go",
|
||||||
"roblob.go",
|
"roblob.go",
|
||||||
@@ -38,11 +36,8 @@ go_library(
|
|||||||
"//proto/prysm/v1alpha1:go_default_library",
|
"//proto/prysm/v1alpha1:go_default_library",
|
||||||
"//proto/prysm/v1alpha1/validator-client:go_default_library",
|
"//proto/prysm/v1alpha1/validator-client:go_default_library",
|
||||||
"//runtime/version:go_default_library",
|
"//runtime/version:go_default_library",
|
||||||
"@com_github_libp2p_go_libp2p_pubsub//partialmessages:go_default_library",
|
|
||||||
"@com_github_pkg_errors//:go_default_library",
|
"@com_github_pkg_errors//:go_default_library",
|
||||||
"@com_github_prysmaticlabs_fastssz//:go_default_library",
|
"@com_github_prysmaticlabs_fastssz//:go_default_library",
|
||||||
"@com_github_prysmaticlabs_go_bitfield//:go_default_library",
|
|
||||||
"@com_github_sirupsen_logrus//:go_default_library",
|
|
||||||
"@org_golang_google_protobuf//proto:go_default_library",
|
"@org_golang_google_protobuf//proto:go_default_library",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
@@ -54,7 +49,6 @@ go_test(
|
|||||||
"factory_test.go",
|
"factory_test.go",
|
||||||
"getters_test.go",
|
"getters_test.go",
|
||||||
"kzg_test.go",
|
"kzg_test.go",
|
||||||
"partialdatacolumn_invariants_test.go",
|
|
||||||
"proofs_test.go",
|
"proofs_test.go",
|
||||||
"proto_test.go",
|
"proto_test.go",
|
||||||
"roblob_test.go",
|
"roblob_test.go",
|
||||||
@@ -80,9 +74,6 @@ go_test(
|
|||||||
"//runtime/version:go_default_library",
|
"//runtime/version:go_default_library",
|
||||||
"//testing/assert:go_default_library",
|
"//testing/assert:go_default_library",
|
||||||
"//testing/require:go_default_library",
|
"//testing/require:go_default_library",
|
||||||
"//testing/util:go_default_library",
|
|
||||||
"@com_github_libp2p_go_libp2p//core/peer:go_default_library",
|
|
||||||
"@com_github_libp2p_go_libp2p_pubsub//partialmessages:go_default_library",
|
|
||||||
"@com_github_prysmaticlabs_fastssz//:go_default_library",
|
"@com_github_prysmaticlabs_fastssz//:go_default_library",
|
||||||
"@com_github_prysmaticlabs_go_bitfield//:go_default_library",
|
"@com_github_prysmaticlabs_go_bitfield//:go_default_library",
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -1,245 +0,0 @@
|
|||||||
package blocks
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
|
|
||||||
"github.com/OffchainLabs/go-bitfield"
|
|
||||||
fieldparams "github.com/OffchainLabs/prysm/v7/config/fieldparams"
|
|
||||||
ethpb "github.com/OffchainLabs/prysm/v7/proto/prysm/v1alpha1"
|
|
||||||
"github.com/libp2p/go-libp2p-pubsub/partialmessages"
|
|
||||||
"github.com/sirupsen/logrus"
|
|
||||||
)
|
|
||||||
|
|
||||||
type CellProofBundle struct {
|
|
||||||
ColumnIndex uint64
|
|
||||||
Commitment []byte
|
|
||||||
Cell []byte
|
|
||||||
Proof []byte
|
|
||||||
}
|
|
||||||
|
|
||||||
type PartialDataColumn struct {
|
|
||||||
*ethpb.DataColumnSidecar
|
|
||||||
root [fieldparams.RootLength]byte
|
|
||||||
groupID []byte
|
|
||||||
|
|
||||||
Included bitfield.Bitlist
|
|
||||||
|
|
||||||
// Parts we've received before we have any commitments to validate against.
|
|
||||||
// Happens when a peer eager pushes to us.
|
|
||||||
// TODO implement. For now, not bothering to handle the eager pushes.
|
|
||||||
// quarantine []*ethpb.PartialDataColumnSidecar
|
|
||||||
}
|
|
||||||
|
|
||||||
// const quarantineSize = 3
|
|
||||||
|
|
||||||
// NewPartialDataColumn creates a new Partial Data Column for the given block.
|
|
||||||
// It does not validate the inputs. The caller is responsible for validating the
|
|
||||||
// block header and KZG Commitment Inclusion proof.
|
|
||||||
func NewPartialDataColumn(
|
|
||||||
signedBlockHeader *ethpb.SignedBeaconBlockHeader,
|
|
||||||
columnIndex uint64,
|
|
||||||
kzgCommitments [][]byte,
|
|
||||||
kzgInclusionProof [][]byte,
|
|
||||||
) (PartialDataColumn, error) {
|
|
||||||
root, err := signedBlockHeader.Header.HashTreeRoot()
|
|
||||||
if err != nil {
|
|
||||||
return PartialDataColumn{}, err
|
|
||||||
}
|
|
||||||
|
|
||||||
sidecar := ðpb.DataColumnSidecar{
|
|
||||||
Index: columnIndex,
|
|
||||||
KzgCommitments: kzgCommitments,
|
|
||||||
Column: make([][]byte, len(kzgCommitments)),
|
|
||||||
KzgProofs: make([][]byte, len(kzgCommitments)),
|
|
||||||
SignedBlockHeader: signedBlockHeader,
|
|
||||||
KzgCommitmentsInclusionProof: kzgInclusionProof,
|
|
||||||
}
|
|
||||||
|
|
||||||
groupID := make([]byte, len(root)+1)
|
|
||||||
copy(groupID[1:], root[:])
|
|
||||||
// Version 0
|
|
||||||
groupID[0] = 0
|
|
||||||
|
|
||||||
c := PartialDataColumn{
|
|
||||||
DataColumnSidecar: sidecar,
|
|
||||||
root: root,
|
|
||||||
groupID: groupID,
|
|
||||||
Included: bitfield.NewBitlist(uint64(len(sidecar.KzgCommitments))),
|
|
||||||
}
|
|
||||||
if len(c.Column) != len(c.KzgCommitments) {
|
|
||||||
return PartialDataColumn{}, errors.New("mismatch between number of cells and commitments")
|
|
||||||
}
|
|
||||||
if len(c.KzgProofs) != len(c.KzgCommitments) {
|
|
||||||
return PartialDataColumn{}, errors.New("mismatch between number of proofs and commitments")
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := range len(c.KzgCommitments) {
|
|
||||||
if sidecar.Column[i] == nil {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
c.Included.SetBitAt(uint64(i), true)
|
|
||||||
}
|
|
||||||
return c, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *PartialDataColumn) GroupID() []byte {
|
|
||||||
return p.groupID
|
|
||||||
}
|
|
||||||
func (p *PartialDataColumn) PartialMessageBytes(metadata partialmessages.PartsMetadata) ([]byte, error) {
|
|
||||||
peerHas := bitfield.Bitlist(metadata)
|
|
||||||
if peerHas.Len() != p.Included.Len() {
|
|
||||||
return nil, errors.New("metadata length does not match expected length")
|
|
||||||
}
|
|
||||||
|
|
||||||
var cellsToReturn int
|
|
||||||
for i := range peerHas.Len() {
|
|
||||||
if !peerHas.BitAt(i) && p.Included.BitAt(i) {
|
|
||||||
cellsToReturn++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if cellsToReturn == 0 {
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
included := bitfield.NewBitlist(p.Included.Len())
|
|
||||||
outMessage := ethpb.PartialDataColumnSidecar{
|
|
||||||
CellsPresentBitmap: included,
|
|
||||||
PartialColumn: make([][]byte, 0, cellsToReturn),
|
|
||||||
KzgProofs: make([][]byte, 0, cellsToReturn),
|
|
||||||
}
|
|
||||||
for i := range peerHas.Len() {
|
|
||||||
if peerHas.BitAt(i) || !p.Included.BitAt(i) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
included.SetBitAt(i, true)
|
|
||||||
outMessage.PartialColumn = append(outMessage.PartialColumn, p.Column[i])
|
|
||||||
outMessage.KzgProofs = append(outMessage.KzgProofs, p.KzgProofs[i])
|
|
||||||
}
|
|
||||||
|
|
||||||
marshalled, err := outMessage.MarshalSSZ()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return marshalled, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *PartialDataColumn) EagerPartialMessageBytes() ([]byte, partialmessages.PartsMetadata, error) {
|
|
||||||
// TODO: do we want to send this once per groupID per peer
|
|
||||||
// Eagerly push the PartialDataColumnHeader
|
|
||||||
outHeader := ðpb.PartialDataColumnHeader{
|
|
||||||
KzgCommitments: p.KzgCommitments,
|
|
||||||
SignedBlockHeader: p.SignedBlockHeader,
|
|
||||||
KzgCommitmentsInclusionProof: p.KzgCommitmentsInclusionProof,
|
|
||||||
}
|
|
||||||
outMessage := ðpb.PartialDataColumnSidecar{
|
|
||||||
CellsPresentBitmap: bitfield.NewBitlist(uint64(len(p.KzgCommitments))),
|
|
||||||
Header: []*ethpb.PartialDataColumnHeader{outHeader},
|
|
||||||
}
|
|
||||||
|
|
||||||
marshalled, err := outMessage.MarshalSSZ()
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
// Empty bitlist since we aren't including any cells here
|
|
||||||
peersNextParts := partialmessages.PartsMetadata(bitfield.NewBitlist(uint64(len(p.KzgCommitments))))
|
|
||||||
|
|
||||||
return marshalled, peersNextParts, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *PartialDataColumn) PartsMetadata() partialmessages.PartsMetadata {
|
|
||||||
return partialmessages.PartsMetadata(p.Included)
|
|
||||||
}
|
|
||||||
|
|
||||||
// CellsToVerifyFromPartialMessage returns cells from the partial message that need to be verified.
|
|
||||||
func (p *PartialDataColumn) CellsToVerifyFromPartialMessage(message *ethpb.PartialDataColumnSidecar) ([]uint64, []CellProofBundle, error) {
|
|
||||||
included := message.CellsPresentBitmap
|
|
||||||
if included.Len() == 0 {
|
|
||||||
return nil, nil, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Some basic sanity checks
|
|
||||||
includedCells := included.Count()
|
|
||||||
if uint64(len(message.KzgProofs)) != includedCells {
|
|
||||||
return nil, nil, errors.New("invalid message. Missing KZG proofs")
|
|
||||||
}
|
|
||||||
if uint64(len(message.PartialColumn)) != includedCells {
|
|
||||||
return nil, nil, errors.New("invalid message. Missing cells")
|
|
||||||
}
|
|
||||||
|
|
||||||
ourIncludedList := p.Included
|
|
||||||
if included.Len() != ourIncludedList.Len() {
|
|
||||||
return nil, nil, errors.New("invalid message. Wrong bitmap length.")
|
|
||||||
}
|
|
||||||
|
|
||||||
cellIndices := make([]uint64, 0, includedCells)
|
|
||||||
cellsToVerify := make([]CellProofBundle, 0, includedCells)
|
|
||||||
// Filter out cells we already have
|
|
||||||
for i := range included.Len() {
|
|
||||||
if len(message.PartialColumn) == 0 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
if !included.BitAt(i) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
if !ourIncludedList.BitAt(i) {
|
|
||||||
cellIndices = append(cellIndices, i)
|
|
||||||
cellsToVerify = append(cellsToVerify, CellProofBundle{
|
|
||||||
ColumnIndex: p.Index,
|
|
||||||
Cell: message.PartialColumn[0],
|
|
||||||
Proof: message.KzgProofs[0],
|
|
||||||
// Use the commitment from our datacolumn, indexed by i since we
|
|
||||||
// have all commitments.
|
|
||||||
Commitment: p.KzgCommitments[i],
|
|
||||||
})
|
|
||||||
}
|
|
||||||
message.PartialColumn = message.PartialColumn[1:]
|
|
||||||
message.KzgProofs = message.KzgProofs[1:]
|
|
||||||
}
|
|
||||||
return cellIndices, cellsToVerify, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ExtendFromVerfifiedCells will extend this partial column with the provided verified cells
|
|
||||||
func (p *PartialDataColumn) ExtendFromVerfifiedCell(cellIndex uint64, cell, proof []byte) bool {
|
|
||||||
if p.Included.BitAt(cellIndex) {
|
|
||||||
// We already have this cell
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
p.Included.SetBitAt(cellIndex, true)
|
|
||||||
p.Column[cellIndex] = cell
|
|
||||||
p.KzgProofs[cellIndex] = proof
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// ExtendFromVerfifiedCells will extend this partial column with the provided verified cells
|
|
||||||
func (p *PartialDataColumn) ExtendFromVerfifiedCells(cellIndices []uint64, cells []CellProofBundle) /* extended */ bool {
|
|
||||||
var extended bool
|
|
||||||
for i, bundle := range cells {
|
|
||||||
if bundle.ColumnIndex != p.Index {
|
|
||||||
// Invalid column index, shouldn't happen
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
if p.ExtendFromVerfifiedCell(cellIndices[i], bundle.Cell, bundle.Proof) {
|
|
||||||
extended = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return extended
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *PartialDataColumn) Complete(logger *logrus.Logger) (VerifiedRODataColumn, bool) {
|
|
||||||
if uint64(len(p.KzgCommitments)) != p.Included.Count() {
|
|
||||||
return VerifiedRODataColumn{}, false
|
|
||||||
}
|
|
||||||
|
|
||||||
rodc, err := NewRODataColumn(p.DataColumnSidecar)
|
|
||||||
if err != nil {
|
|
||||||
// We shouldn't get an error, as we check the hash root when creating
|
|
||||||
// the partial column
|
|
||||||
logger.Error("failed to create RODataColumn", "err", err)
|
|
||||||
return VerifiedRODataColumn{}, false
|
|
||||||
}
|
|
||||||
|
|
||||||
return NewVerifiedRODataColumn(rodc), true
|
|
||||||
}
|
|
||||||
@@ -1,160 +0,0 @@
|
|||||||
package blocks_test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"fmt"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/OffchainLabs/go-bitfield"
|
|
||||||
"github.com/OffchainLabs/prysm/v7/consensus-types/blocks"
|
|
||||||
ethpb "github.com/OffchainLabs/prysm/v7/proto/prysm/v1alpha1"
|
|
||||||
"github.com/OffchainLabs/prysm/v7/testing/util"
|
|
||||||
"github.com/libp2p/go-libp2p-pubsub/partialmessages"
|
|
||||||
"github.com/libp2p/go-libp2p/core/peer"
|
|
||||||
)
|
|
||||||
|
|
||||||
type invariantChecker struct {
|
|
||||||
t *testing.T
|
|
||||||
}
|
|
||||||
|
|
||||||
var _ partialmessages.InvariantChecker[*blocks.PartialDataColumn] = (*invariantChecker)(nil)
|
|
||||||
|
|
||||||
func (i *invariantChecker) MergePartsMetadata(left, right partialmessages.PartsMetadata) partialmessages.PartsMetadata {
|
|
||||||
return partialmessages.MergeBitmap(left, right)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *invariantChecker) SplitIntoParts(in *blocks.PartialDataColumn) ([]*blocks.PartialDataColumn, error) {
|
|
||||||
var parts []*blocks.PartialDataColumn
|
|
||||||
for idx := range in.Column {
|
|
||||||
if !in.Included.BitAt(uint64(idx)) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
msg := i.EmptyMessage()
|
|
||||||
msg.Included.SetBitAt(uint64(idx), true)
|
|
||||||
msg.KzgCommitments = in.KzgCommitments
|
|
||||||
msg.Column[idx] = in.Column[idx]
|
|
||||||
msg.KzgProofs[idx] = in.KzgProofs[idx]
|
|
||||||
parts = append(parts, msg)
|
|
||||||
}
|
|
||||||
return parts, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *invariantChecker) FullMessage() (*blocks.PartialDataColumn, error) {
|
|
||||||
blockRoot := []byte("test-block-root")
|
|
||||||
numCells := 128
|
|
||||||
commitments := make([][]byte, numCells)
|
|
||||||
cells := make([][]byte, numCells)
|
|
||||||
proofs := make([][]byte, numCells)
|
|
||||||
|
|
||||||
for i := range numCells {
|
|
||||||
for j := range commitments[i] {
|
|
||||||
commitments[i][j] = byte(i)
|
|
||||||
}
|
|
||||||
cells[i] = make([]byte, 2048)
|
|
||||||
cells[i] = fmt.Appendf(cells[i][:0], "cell %d", i)
|
|
||||||
proofs[i] = make([]byte, 48)
|
|
||||||
proofs[i] = fmt.Appendf(proofs[i][:0], "proof %d", i)
|
|
||||||
}
|
|
||||||
|
|
||||||
roDC, _ := util.CreateTestVerifiedRoDataColumnSidecars(i.t, []util.DataColumnParam{
|
|
||||||
{
|
|
||||||
BodyRoot: blockRoot,
|
|
||||||
KzgCommitments: commitments,
|
|
||||||
Column: cells,
|
|
||||||
KzgProofs: proofs,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
|
|
||||||
c, err := blocks.NewPartialDataColumn(roDC[0].DataColumnSidecar.SignedBlockHeader, roDC[0].Index, roDC[0].KzgCommitments, roDC[0].KzgCommitmentsInclusionProof)
|
|
||||||
return &c, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *invariantChecker) EmptyMessage() *blocks.PartialDataColumn {
|
|
||||||
blockRoot := []byte("test-block-root")
|
|
||||||
numCells := 128
|
|
||||||
commitments := make([][]byte, numCells)
|
|
||||||
cells := make([][]byte, numCells)
|
|
||||||
proofs := make([][]byte, numCells)
|
|
||||||
roDC, _ := util.CreateTestVerifiedRoDataColumnSidecars(i.t, []util.DataColumnParam{
|
|
||||||
{
|
|
||||||
BodyRoot: blockRoot,
|
|
||||||
KzgCommitments: commitments,
|
|
||||||
Column: cells,
|
|
||||||
KzgProofs: proofs,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
for i := range roDC[0].Column {
|
|
||||||
// Clear these fields since this is an empty message
|
|
||||||
roDC[0].Column[i] = nil
|
|
||||||
roDC[0].KzgProofs[i] = nil
|
|
||||||
}
|
|
||||||
|
|
||||||
pc, err := blocks.NewPartialDataColumn(roDC[0].DataColumnSidecar.SignedBlockHeader, roDC[0].Index, roDC[0].KzgCommitments, roDC[0].KzgCommitmentsInclusionProof)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
return &pc
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *invariantChecker) ExtendFromBytes(a *blocks.PartialDataColumn, data []byte) (*blocks.PartialDataColumn, error) {
|
|
||||||
var message ethpb.PartialDataColumnSidecar
|
|
||||||
err := message.UnmarshalSSZ(data)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
cellIndices, bundle, err := a.CellsToVerifyFromPartialMessage(&message)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
// No validation happening here. Copy-pasters beware!
|
|
||||||
_ = a.ExtendFromVerfifiedCells(cellIndices, bundle)
|
|
||||||
return a, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *invariantChecker) ShouldRequest(a *blocks.PartialDataColumn, from peer.ID, partsMetadata []byte) bool {
|
|
||||||
peerHas := bitfield.Bitlist(partsMetadata)
|
|
||||||
for i := range peerHas.Len() {
|
|
||||||
if peerHas.BitAt(i) && !a.Included.BitAt(i) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *invariantChecker) Equal(a, b *blocks.PartialDataColumn) bool {
|
|
||||||
if !bytes.Equal(a.GroupID(), b.GroupID()) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
if !bytes.Equal(a.Included, b.Included) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
if len(a.KzgCommitments) != len(b.KzgCommitments) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
for i := range a.KzgCommitments {
|
|
||||||
if !bytes.Equal(a.KzgCommitments[i], b.KzgCommitments[i]) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if len(a.Column) != len(b.Column) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
for i := range a.Column {
|
|
||||||
if !bytes.Equal(a.Column[i], b.Column[i]) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if len(a.KzgProofs) != len(b.KzgProofs) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
for i := range a.KzgProofs {
|
|
||||||
if !bytes.Equal(a.KzgProofs[i], b.KzgProofs[i]) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestDataColumnInvariants(t *testing.T) {
|
|
||||||
partialmessages.TestPartialMessageInvariants(t, &invariantChecker{t})
|
|
||||||
}
|
|
||||||
@@ -1,8 +1,6 @@
|
|||||||
package blocks
|
package blocks
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"iter"
|
|
||||||
|
|
||||||
fieldparams "github.com/OffchainLabs/prysm/v7/config/fieldparams"
|
fieldparams "github.com/OffchainLabs/prysm/v7/config/fieldparams"
|
||||||
"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"
|
||||||
@@ -87,20 +85,3 @@ type VerifiedRODataColumn struct {
|
|||||||
func NewVerifiedRODataColumn(roDataColumn RODataColumn) VerifiedRODataColumn {
|
func NewVerifiedRODataColumn(roDataColumn RODataColumn) VerifiedRODataColumn {
|
||||||
return VerifiedRODataColumn{RODataColumn: roDataColumn}
|
return VerifiedRODataColumn{RODataColumn: roDataColumn}
|
||||||
}
|
}
|
||||||
|
|
||||||
func RODataColumnsToCellProofBundles(sidecars []RODataColumn) iter.Seq[CellProofBundle] {
|
|
||||||
return func(yield func(CellProofBundle) bool) {
|
|
||||||
for _, sidecar := range sidecars {
|
|
||||||
for i := range sidecar.Column {
|
|
||||||
if !yield(CellProofBundle{
|
|
||||||
ColumnIndex: sidecar.Index,
|
|
||||||
Commitment: sidecar.KzgCommitments[i],
|
|
||||||
Cell: sidecar.Column[i],
|
|
||||||
Proof: sidecar.KzgProofs[i],
|
|
||||||
}) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
196
deps.bzl
196
deps.bzl
@@ -76,6 +76,12 @@ def prysm_deps():
|
|||||||
sum = "h1:eMwmnE/GDgah4HI848JfFxHt+iPb26b4zyfspmqY0/8=",
|
sum = "h1:eMwmnE/GDgah4HI848JfFxHt+iPb26b4zyfspmqY0/8=",
|
||||||
version = "v1.2.1-0.20190218064605-e24eb225f156",
|
version = "v1.2.1-0.20190218064605-e24eb225f156",
|
||||||
)
|
)
|
||||||
|
go_repository(
|
||||||
|
name = "com_github_andreasbriese_bbloom",
|
||||||
|
importpath = "github.com/AndreasBriese/bbloom",
|
||||||
|
sum = "h1:cTp8I5+VIoKjsnZuH8vjyaysT/ses3EvZeaV/1UkF2M=",
|
||||||
|
version = "v0.0.0-20190825152654-46b345b51c96",
|
||||||
|
)
|
||||||
go_repository(
|
go_repository(
|
||||||
name = "com_github_andybalholm_brotli",
|
name = "com_github_andybalholm_brotli",
|
||||||
importpath = "github.com/andybalholm/brotli",
|
importpath = "github.com/andybalholm/brotli",
|
||||||
@@ -370,6 +376,12 @@ def prysm_deps():
|
|||||||
sum = "h1:nCb6ZLdB7NRaqsm91JtQTAme2SKJzXVsdPIPkyJr1MU=",
|
sum = "h1:nCb6ZLdB7NRaqsm91JtQTAme2SKJzXVsdPIPkyJr1MU=",
|
||||||
version = "v1.1.1",
|
version = "v1.1.1",
|
||||||
)
|
)
|
||||||
|
go_repository(
|
||||||
|
name = "com_github_cespare_xxhash",
|
||||||
|
importpath = "github.com/cespare/xxhash",
|
||||||
|
sum = "h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=",
|
||||||
|
version = "v1.1.0",
|
||||||
|
)
|
||||||
go_repository(
|
go_repository(
|
||||||
name = "com_github_cespare_xxhash_v2",
|
name = "com_github_cespare_xxhash_v2",
|
||||||
importpath = "github.com/cespare/xxhash/v2",
|
importpath = "github.com/cespare/xxhash/v2",
|
||||||
@@ -394,6 +406,12 @@ def prysm_deps():
|
|||||||
sum = "h1:p3BQDXSxOhOG0P9z6/hGnII4LGiEPOYBhs8asl/fC04=",
|
sum = "h1:p3BQDXSxOhOG0P9z6/hGnII4LGiEPOYBhs8asl/fC04=",
|
||||||
version = "v1.0.0",
|
version = "v1.0.0",
|
||||||
)
|
)
|
||||||
|
go_repository(
|
||||||
|
name = "com_github_cilium_ebpf",
|
||||||
|
importpath = "github.com/cilium/ebpf",
|
||||||
|
sum = "h1:64sn2K3UKw8NbP/blsixRpF3nXuyhz/VjRlRzvlBRu4=",
|
||||||
|
version = "v0.9.1",
|
||||||
|
)
|
||||||
go_repository(
|
go_repository(
|
||||||
name = "com_github_clbanning_x2j",
|
name = "com_github_clbanning_x2j",
|
||||||
importpath = "github.com/clbanning/x2j",
|
importpath = "github.com/clbanning/x2j",
|
||||||
@@ -626,6 +644,18 @@ def prysm_deps():
|
|||||||
sum = "h1:SegyeYGcdi0jLLrpbCMoJxnUUn8GBXHsvr4rbzjuhfU=",
|
sum = "h1:SegyeYGcdi0jLLrpbCMoJxnUUn8GBXHsvr4rbzjuhfU=",
|
||||||
version = "v1.8.2",
|
version = "v1.8.2",
|
||||||
)
|
)
|
||||||
|
go_repository(
|
||||||
|
name = "com_github_dgraph_io_badger",
|
||||||
|
importpath = "github.com/dgraph-io/badger",
|
||||||
|
sum = "h1:mNw0qs90GVgGGWylh0umH5iag1j6n/PeJtNvL6KY/x8=",
|
||||||
|
version = "v1.6.2",
|
||||||
|
)
|
||||||
|
go_repository(
|
||||||
|
name = "com_github_dgraph_io_ristretto",
|
||||||
|
importpath = "github.com/dgraph-io/ristretto",
|
||||||
|
sum = "h1:a5WaUrDa0qm0YrAAS1tUykT5El3kt62KNZZeMxQn3po=",
|
||||||
|
version = "v0.0.2",
|
||||||
|
)
|
||||||
go_repository(
|
go_repository(
|
||||||
name = "com_github_dgraph_io_ristretto_v2",
|
name = "com_github_dgraph_io_ristretto_v2",
|
||||||
importpath = "github.com/dgraph-io/ristretto/v2",
|
importpath = "github.com/dgraph-io/ristretto/v2",
|
||||||
@@ -1604,8 +1634,20 @@ def prysm_deps():
|
|||||||
go_repository(
|
go_repository(
|
||||||
name = "com_github_ipfs_go_datastore",
|
name = "com_github_ipfs_go_datastore",
|
||||||
importpath = "github.com/ipfs/go-datastore",
|
importpath = "github.com/ipfs/go-datastore",
|
||||||
sum = "h1:Jy3wjqQR6sg/LhyY0NIePZC3Vux19nLtg7dx0TVqr6U=",
|
sum = "h1:JKyz+Gvz1QEZw0LsX1IBn+JFCJQH4SJVFtM4uWU0Myk=",
|
||||||
version = "v0.8.2",
|
version = "v0.6.0",
|
||||||
|
)
|
||||||
|
go_repository(
|
||||||
|
name = "com_github_ipfs_go_ds_badger",
|
||||||
|
importpath = "github.com/ipfs/go-ds-badger",
|
||||||
|
sum = "h1:xREL3V0EH9S219kFFueOYJJTcjgNSZ2HY1iSvN7U1Ro=",
|
||||||
|
version = "v0.3.0",
|
||||||
|
)
|
||||||
|
go_repository(
|
||||||
|
name = "com_github_ipfs_go_ds_leveldb",
|
||||||
|
importpath = "github.com/ipfs/go-ds-leveldb",
|
||||||
|
sum = "h1:s++MEBbD3ZKc9/8/njrn4flZLnCuY9I79v94gBUNumo=",
|
||||||
|
version = "v0.5.0",
|
||||||
)
|
)
|
||||||
go_repository(
|
go_repository(
|
||||||
name = "com_github_ipfs_go_log_v2",
|
name = "com_github_ipfs_go_log_v2",
|
||||||
@@ -1632,6 +1674,12 @@ def prysm_deps():
|
|||||||
sum = "h1:zpb3ZH6wIE8Shj2sKS+khgRvf7T7RABoLk/+KKHggpk=",
|
sum = "h1:zpb3ZH6wIE8Shj2sKS+khgRvf7T7RABoLk/+KKHggpk=",
|
||||||
version = "v0.1.0",
|
version = "v0.1.0",
|
||||||
)
|
)
|
||||||
|
go_repository(
|
||||||
|
name = "com_github_jbenet_goprocess",
|
||||||
|
importpath = "github.com/jbenet/goprocess",
|
||||||
|
sum = "h1:DRGOFReOMqqDNXwW70QkacFW0YN9QnwLV0Vqk+3oU0o=",
|
||||||
|
version = "v0.1.4",
|
||||||
|
)
|
||||||
go_repository(
|
go_repository(
|
||||||
name = "com_github_jcmturner_gofork",
|
name = "com_github_jcmturner_gofork",
|
||||||
importpath = "github.com/jcmturner/gofork",
|
importpath = "github.com/jcmturner/gofork",
|
||||||
@@ -1804,8 +1852,8 @@ def prysm_deps():
|
|||||||
go_repository(
|
go_repository(
|
||||||
name = "com_github_klauspost_cpuid_v2",
|
name = "com_github_klauspost_cpuid_v2",
|
||||||
importpath = "github.com/klauspost/cpuid/v2",
|
importpath = "github.com/klauspost/cpuid/v2",
|
||||||
sum = "h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2skhE=",
|
sum = "h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY=",
|
||||||
version = "v2.2.10",
|
version = "v2.2.9",
|
||||||
)
|
)
|
||||||
go_repository(
|
go_repository(
|
||||||
name = "com_github_klauspost_reedsolomon",
|
name = "com_github_klauspost_reedsolomon",
|
||||||
@@ -1828,8 +1876,8 @@ def prysm_deps():
|
|||||||
go_repository(
|
go_repository(
|
||||||
name = "com_github_koron_go_ssdp",
|
name = "com_github_koron_go_ssdp",
|
||||||
importpath = "github.com/koron/go-ssdp",
|
importpath = "github.com/koron/go-ssdp",
|
||||||
sum = "h1:Jb0h04599eq/CY7rB5YEqPS83HmRfHP2azkxMN2rFtU=",
|
sum = "h1:E1iSMxIs4WqxTbIBLtmNBeOOC+1sCIXQeqTWVnpmwhk=",
|
||||||
version = "v0.0.6",
|
version = "v0.0.5",
|
||||||
)
|
)
|
||||||
go_repository(
|
go_repository(
|
||||||
name = "com_github_kr_fs",
|
name = "com_github_kr_fs",
|
||||||
@@ -1910,8 +1958,8 @@ def prysm_deps():
|
|||||||
],
|
],
|
||||||
build_file_proto_mode = "disable_global",
|
build_file_proto_mode = "disable_global",
|
||||||
importpath = "github.com/libp2p/go-libp2p",
|
importpath = "github.com/libp2p/go-libp2p",
|
||||||
sum = "h1:5Gtt8OrF8yiXmH+Mx4+/iBeFRMK1TY3a8OrEBDEqAvs=",
|
sum = "h1:1Ur6rPCf3GR+g8jkrnaQaM0ha2IGespsnNlCqJLLALE=",
|
||||||
version = "v0.44.0",
|
version = "v0.39.1",
|
||||||
)
|
)
|
||||||
go_repository(
|
go_repository(
|
||||||
name = "com_github_libp2p_go_libp2p_asn_util",
|
name = "com_github_libp2p_go_libp2p_asn_util",
|
||||||
@@ -1922,15 +1970,15 @@ def prysm_deps():
|
|||||||
go_repository(
|
go_repository(
|
||||||
name = "com_github_libp2p_go_libp2p_mplex",
|
name = "com_github_libp2p_go_libp2p_mplex",
|
||||||
importpath = "github.com/libp2p/go-libp2p-mplex",
|
importpath = "github.com/libp2p/go-libp2p-mplex",
|
||||||
sum = "h1:0vwpLXRSfkTzshEjETIEgJaVxXvg+orbxYoIb3Ty5qM=",
|
sum = "h1:R58pDRAmuBXkYugbSSXR9wrTX3+1pFM1xP2bLuodIq8=",
|
||||||
version = "v0.11.0",
|
version = "v0.9.0",
|
||||||
)
|
)
|
||||||
go_repository(
|
go_repository(
|
||||||
name = "com_github_libp2p_go_libp2p_pubsub",
|
name = "com_github_libp2p_go_libp2p_pubsub",
|
||||||
build_file_proto_mode = "disable_global",
|
build_file_proto_mode = "disable_global",
|
||||||
importpath = "github.com/libp2p/go-libp2p-pubsub",
|
importpath = "github.com/libp2p/go-libp2p-pubsub",
|
||||||
sum = "h1:dJcYvoeKRxO2DbwG8E3nlZHbEMaxnEzghBltmGel93U=",
|
sum = "h1:nT5lFHPQOFJcp9CW8hpKtvbpQNdl2udJuzLQWbgRum8=",
|
||||||
version = "v0.15.1-0.20260127225230-d9e98cd10cf3",
|
version = "v0.14.2",
|
||||||
)
|
)
|
||||||
go_repository(
|
go_repository(
|
||||||
name = "com_github_libp2p_go_libp2p_testing",
|
name = "com_github_libp2p_go_libp2p_testing",
|
||||||
@@ -1974,12 +2022,6 @@ def prysm_deps():
|
|||||||
sum = "h1:nrLh89LN/LEiqcFiqdKDRHjGstN300C1269K/EX0CPU=",
|
sum = "h1:nrLh89LN/LEiqcFiqdKDRHjGstN300C1269K/EX0CPU=",
|
||||||
version = "v4.0.2",
|
version = "v4.0.2",
|
||||||
)
|
)
|
||||||
go_repository(
|
|
||||||
name = "com_github_libp2p_go_yamux_v5",
|
|
||||||
importpath = "github.com/libp2p/go-yamux/v5",
|
|
||||||
sum = "h1:f0WoX/bEF2E8SbE4c/k1Mo+/9z0O4oC/hWEA+nfYRSg=",
|
|
||||||
version = "v5.0.1",
|
|
||||||
)
|
|
||||||
go_repository(
|
go_repository(
|
||||||
name = "com_github_libp2p_zeroconf_v2",
|
name = "com_github_libp2p_zeroconf_v2",
|
||||||
importpath = "github.com/libp2p/zeroconf/v2",
|
importpath = "github.com/libp2p/zeroconf/v2",
|
||||||
@@ -2040,12 +2082,6 @@ def prysm_deps():
|
|||||||
sum = "h1:3l11YT8tm9MnwGFQ4kETwkzpAwY2Jt9lCrumCUW4+z4=",
|
sum = "h1:3l11YT8tm9MnwGFQ4kETwkzpAwY2Jt9lCrumCUW4+z4=",
|
||||||
version = "v0.7.0",
|
version = "v0.7.0",
|
||||||
)
|
)
|
||||||
go_repository(
|
|
||||||
name = "com_github_marcopolo_simnet",
|
|
||||||
importpath = "github.com/marcopolo/simnet",
|
|
||||||
sum = "h1:rSMslhPz6q9IvJeFWDoMGxMIrlsbXau3NkuIXHGJxfg=",
|
|
||||||
version = "v0.0.1",
|
|
||||||
)
|
|
||||||
go_repository(
|
go_repository(
|
||||||
name = "com_github_marten_seemann_tcp",
|
name = "com_github_marten_seemann_tcp",
|
||||||
importpath = "github.com/marten-seemann/tcp",
|
importpath = "github.com/marten-seemann/tcp",
|
||||||
@@ -2103,8 +2139,8 @@ def prysm_deps():
|
|||||||
go_repository(
|
go_repository(
|
||||||
name = "com_github_miekg_dns",
|
name = "com_github_miekg_dns",
|
||||||
importpath = "github.com/miekg/dns",
|
importpath = "github.com/miekg/dns",
|
||||||
sum = "h1:FeZXOS3VCVsKnEAd+wBkjMC3D2K+ww66Cq3VnCINuJE=",
|
sum = "h1:8M5aAw6OMZfFXTT7K5V0Eu5YiiL8l7nUAkyN6C9YwaY=",
|
||||||
version = "v1.1.66",
|
version = "v1.1.63",
|
||||||
)
|
)
|
||||||
go_repository(
|
go_repository(
|
||||||
name = "com_github_mikioh_tcp",
|
name = "com_github_mikioh_tcp",
|
||||||
@@ -2241,8 +2277,8 @@ def prysm_deps():
|
|||||||
go_repository(
|
go_repository(
|
||||||
name = "com_github_multiformats_go_multiaddr",
|
name = "com_github_multiformats_go_multiaddr",
|
||||||
importpath = "github.com/multiformats/go-multiaddr",
|
importpath = "github.com/multiformats/go-multiaddr",
|
||||||
sum = "h1:oGWEVKioVQcdIOBlYM8BH1rZDWOGJSqr9/BKl6zQ4qc=",
|
sum = "h1:bfrHrJhrRuh/NXH5mCnemjpbGjzRw/b+tJFOD41g2tU=",
|
||||||
version = "v0.16.0",
|
version = "v0.14.0",
|
||||||
)
|
)
|
||||||
go_repository(
|
go_repository(
|
||||||
name = "com_github_multiformats_go_multiaddr_dns",
|
name = "com_github_multiformats_go_multiaddr_dns",
|
||||||
@@ -2268,8 +2304,8 @@ def prysm_deps():
|
|||||||
"gazelle:exclude gen.go",
|
"gazelle:exclude gen.go",
|
||||||
],
|
],
|
||||||
importpath = "github.com/multiformats/go-multicodec",
|
importpath = "github.com/multiformats/go-multicodec",
|
||||||
sum = "h1:x/Fuxr7ZuR4jJV4Os5g444F7xC4XmyUaT/FWtE+9Zjo=",
|
sum = "h1:pb/dlPnzee/Sxv/j4PmkDRxCOi3hXTz3IbPKOXWJkmg=",
|
||||||
version = "v0.9.1",
|
version = "v0.9.0",
|
||||||
)
|
)
|
||||||
go_repository(
|
go_repository(
|
||||||
name = "com_github_multiformats_go_multihash",
|
name = "com_github_multiformats_go_multihash",
|
||||||
@@ -2280,8 +2316,8 @@ def prysm_deps():
|
|||||||
go_repository(
|
go_repository(
|
||||||
name = "com_github_multiformats_go_multistream",
|
name = "com_github_multiformats_go_multistream",
|
||||||
importpath = "github.com/multiformats/go-multistream",
|
importpath = "github.com/multiformats/go-multistream",
|
||||||
sum = "h1:4aoX5v6T+yWmc2raBHsTvzmFhOI8WVOer28DeBBEYdQ=",
|
sum = "h1:ZaHKbsL404720283o4c/IHQXiS6gb8qAN5EIJ4PN5EA=",
|
||||||
version = "v0.6.1",
|
version = "v0.6.0",
|
||||||
)
|
)
|
||||||
go_repository(
|
go_repository(
|
||||||
name = "com_github_multiformats_go_varint",
|
name = "com_github_multiformats_go_varint",
|
||||||
@@ -2364,8 +2400,8 @@ def prysm_deps():
|
|||||||
go_repository(
|
go_repository(
|
||||||
name = "com_github_nxadm_tail",
|
name = "com_github_nxadm_tail",
|
||||||
importpath = "github.com/nxadm/tail",
|
importpath = "github.com/nxadm/tail",
|
||||||
sum = "h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78=",
|
sum = "h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY=",
|
||||||
version = "v1.4.4",
|
version = "v1.4.11",
|
||||||
)
|
)
|
||||||
go_repository(
|
go_repository(
|
||||||
name = "com_github_offchainlabs_hashtree",
|
name = "com_github_offchainlabs_hashtree",
|
||||||
@@ -2577,8 +2613,8 @@ def prysm_deps():
|
|||||||
go_repository(
|
go_repository(
|
||||||
name = "com_github_pion_dtls_v3",
|
name = "com_github_pion_dtls_v3",
|
||||||
importpath = "github.com/pion/dtls/v3",
|
importpath = "github.com/pion/dtls/v3",
|
||||||
sum = "h1:7Hkd8WhAJNbRgq9RgdNh1aaWlZlGpYTzdqjy9x9sK2E=",
|
sum = "h1:44CZekewMzfrn9pmGrj5BNnTMDCFwr+6sLH+cCuLM7U=",
|
||||||
version = "v3.0.6",
|
version = "v3.0.4",
|
||||||
)
|
)
|
||||||
go_repository(
|
go_repository(
|
||||||
name = "com_github_pion_ice_v2",
|
name = "com_github_pion_ice_v2",
|
||||||
@@ -2589,14 +2625,14 @@ def prysm_deps():
|
|||||||
go_repository(
|
go_repository(
|
||||||
name = "com_github_pion_ice_v4",
|
name = "com_github_pion_ice_v4",
|
||||||
importpath = "github.com/pion/ice/v4",
|
importpath = "github.com/pion/ice/v4",
|
||||||
sum = "h1:P59w1iauC/wPk9PdY8Vjl4fOFL5B+USq1+xbDcN6gT4=",
|
sum = "h1:jmM9HwI9lfetQV/39uD0nY4y++XZNPhvzIPCb8EwxUM=",
|
||||||
version = "v4.0.10",
|
version = "v4.0.6",
|
||||||
)
|
)
|
||||||
go_repository(
|
go_repository(
|
||||||
name = "com_github_pion_interceptor",
|
name = "com_github_pion_interceptor",
|
||||||
importpath = "github.com/pion/interceptor",
|
importpath = "github.com/pion/interceptor",
|
||||||
sum = "h1:e0BjnPcGpr2CFQgKhrQisBU7V3GXK6wrfYrGYaU6Jq4=",
|
sum = "h1:aRA8Zpab/wE7/c0O3fh1PqY0AJI3fCSEM5lRWJVorwI=",
|
||||||
version = "v0.1.40",
|
version = "v0.1.37",
|
||||||
)
|
)
|
||||||
go_repository(
|
go_repository(
|
||||||
name = "com_github_pion_logging",
|
name = "com_github_pion_logging",
|
||||||
@@ -2631,26 +2667,26 @@ def prysm_deps():
|
|||||||
go_repository(
|
go_repository(
|
||||||
name = "com_github_pion_rtp",
|
name = "com_github_pion_rtp",
|
||||||
importpath = "github.com/pion/rtp",
|
importpath = "github.com/pion/rtp",
|
||||||
sum = "h1:jhdO/3XhL/aKm/wARFVmvTfq0lC/CvN1xwYKmduly3c=",
|
sum = "h1:17xjnY5WO5hgO6SD3/NTIUPvSFw/PbLsIJyz1r1yNIk=",
|
||||||
version = "v1.8.19",
|
version = "v1.8.11",
|
||||||
)
|
)
|
||||||
go_repository(
|
go_repository(
|
||||||
name = "com_github_pion_sctp",
|
name = "com_github_pion_sctp",
|
||||||
importpath = "github.com/pion/sctp",
|
importpath = "github.com/pion/sctp",
|
||||||
sum = "h1:PJma40vRHa3UTO3C4MyeJDQ+KIobVYRZQZ0Nt7SjQnE=",
|
sum = "h1:qwtKvNK1Wc5tHMIYgTDJhfZk7vATGVHhXbUDfHbYwzA=",
|
||||||
version = "v1.8.39",
|
version = "v1.8.35",
|
||||||
)
|
)
|
||||||
go_repository(
|
go_repository(
|
||||||
name = "com_github_pion_sdp_v3",
|
name = "com_github_pion_sdp_v3",
|
||||||
importpath = "github.com/pion/sdp/v3",
|
importpath = "github.com/pion/sdp/v3",
|
||||||
sum = "h1:uN3SS2b+QDZnWXgdr69SM8KB4EbcnPnPf2Laxhty/l4=",
|
sum = "h1:6MChLE/1xYB+CjumMw+gZ9ufp2DPApuVSnDT8t5MIgA=",
|
||||||
version = "v3.0.13",
|
version = "v3.0.10",
|
||||||
)
|
)
|
||||||
go_repository(
|
go_repository(
|
||||||
name = "com_github_pion_srtp_v3",
|
name = "com_github_pion_srtp_v3",
|
||||||
importpath = "github.com/pion/srtp/v3",
|
importpath = "github.com/pion/srtp/v3",
|
||||||
sum = "h1:E2gyj1f5X10sB/qILUGIkL4C2CqK269Xq167PbGCc/4=",
|
sum = "h1:2Z6vDVxzrX3UHEgrUyIGM4rRouoC7v+NiF1IHtp9B5M=",
|
||||||
version = "v3.0.6",
|
version = "v3.0.4",
|
||||||
)
|
)
|
||||||
go_repository(
|
go_repository(
|
||||||
name = "com_github_pion_stun",
|
name = "com_github_pion_stun",
|
||||||
@@ -2691,14 +2727,14 @@ def prysm_deps():
|
|||||||
go_repository(
|
go_repository(
|
||||||
name = "com_github_pion_turn_v4",
|
name = "com_github_pion_turn_v4",
|
||||||
importpath = "github.com/pion/turn/v4",
|
importpath = "github.com/pion/turn/v4",
|
||||||
sum = "h1:ZqgQ3+MjP32ug30xAbD6Mn+/K4Sxi3SdNOTFf+7mpps=",
|
sum = "h1:qxplo3Rxa9Yg1xXDxxH8xaqcyGUtbHYw4QSCvmFWvhM=",
|
||||||
version = "v4.0.2",
|
version = "v4.0.0",
|
||||||
)
|
)
|
||||||
go_repository(
|
go_repository(
|
||||||
name = "com_github_pion_webrtc_v4",
|
name = "com_github_pion_webrtc_v4",
|
||||||
importpath = "github.com/pion/webrtc/v4",
|
importpath = "github.com/pion/webrtc/v4",
|
||||||
sum = "h1:mpuUo/EJ1zMNKGE79fAdYNFZBX790KE7kQQpLMjjR54=",
|
sum = "h1:T1ZmnT9qxIJIt4d8XoiMOBrTClGHDDXNg9e/fh018Qc=",
|
||||||
version = "v4.1.2",
|
version = "v4.0.8",
|
||||||
)
|
)
|
||||||
go_repository(
|
go_repository(
|
||||||
name = "com_github_pkg_diff",
|
name = "com_github_pkg_diff",
|
||||||
@@ -2757,26 +2793,26 @@ def prysm_deps():
|
|||||||
go_repository(
|
go_repository(
|
||||||
name = "com_github_prometheus_client_golang",
|
name = "com_github_prometheus_client_golang",
|
||||||
importpath = "github.com/prometheus/client_golang",
|
importpath = "github.com/prometheus/client_golang",
|
||||||
sum = "h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q=",
|
sum = "h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y=",
|
||||||
version = "v1.22.0",
|
version = "v1.20.5",
|
||||||
)
|
)
|
||||||
go_repository(
|
go_repository(
|
||||||
name = "com_github_prometheus_client_model",
|
name = "com_github_prometheus_client_model",
|
||||||
importpath = "github.com/prometheus/client_model",
|
importpath = "github.com/prometheus/client_model",
|
||||||
sum = "h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk=",
|
sum = "h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=",
|
||||||
version = "v0.6.2",
|
version = "v0.6.1",
|
||||||
)
|
)
|
||||||
go_repository(
|
go_repository(
|
||||||
name = "com_github_prometheus_common",
|
name = "com_github_prometheus_common",
|
||||||
importpath = "github.com/prometheus/common",
|
importpath = "github.com/prometheus/common",
|
||||||
sum = "h1:pdZeA+g617P7oGv1CzdTzyeShxAGrTBsolKNOLQPGO4=",
|
sum = "h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io=",
|
||||||
version = "v0.64.0",
|
version = "v0.62.0",
|
||||||
)
|
)
|
||||||
go_repository(
|
go_repository(
|
||||||
name = "com_github_prometheus_procfs",
|
name = "com_github_prometheus_procfs",
|
||||||
importpath = "github.com/prometheus/procfs",
|
importpath = "github.com/prometheus/procfs",
|
||||||
sum = "h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg=",
|
sum = "h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=",
|
||||||
version = "v0.16.1",
|
version = "v0.15.1",
|
||||||
)
|
)
|
||||||
go_repository(
|
go_repository(
|
||||||
name = "com_github_prometheus_prom2json",
|
name = "com_github_prometheus_prom2json",
|
||||||
@@ -2848,14 +2884,14 @@ def prysm_deps():
|
|||||||
"gazelle:exclude tools.go",
|
"gazelle:exclude tools.go",
|
||||||
],
|
],
|
||||||
importpath = "github.com/quic-go/quic-go",
|
importpath = "github.com/quic-go/quic-go",
|
||||||
sum = "h1:zccPQIqYCXDt5NmcEabyYvOnomjs8Tlwl7tISjJh9Mk=",
|
sum = "h1:x09Agz4ATTMEP3qb5P0MRxNZfd6O9wAyK3qwwqQZVQc=",
|
||||||
version = "v0.55.0",
|
version = "v0.49.1-0.20250925085836-275c172fec2b",
|
||||||
)
|
)
|
||||||
go_repository(
|
go_repository(
|
||||||
name = "com_github_quic_go_webtransport_go",
|
name = "com_github_quic_go_webtransport_go",
|
||||||
importpath = "github.com/quic-go/webtransport-go",
|
importpath = "github.com/quic-go/webtransport-go",
|
||||||
sum = "h1:jgys+7/wm6JarGDrW+lD/r9BGqBAmqY/ssklE09bA70=",
|
sum = "h1:4WFk6u3sOT6pLa1kQ50ZVdm8BQFgJNA117cepZxtLIg=",
|
||||||
version = "v0.9.0",
|
version = "v0.8.1-0.20241018022711-4ac2c9250e66",
|
||||||
)
|
)
|
||||||
go_repository(
|
go_repository(
|
||||||
name = "com_github_r3labs_sse_v2",
|
name = "com_github_r3labs_sse_v2",
|
||||||
@@ -3341,8 +3377,8 @@ def prysm_deps():
|
|||||||
go_repository(
|
go_repository(
|
||||||
name = "com_github_urfave_cli",
|
name = "com_github_urfave_cli",
|
||||||
importpath = "github.com/urfave/cli",
|
importpath = "github.com/urfave/cli",
|
||||||
sum = "h1:+mkCCcOFKPnCmVYVcURKps1Xe+3zP90gSYGNfRkjoIY=",
|
sum = "h1:gsqYFH8bb9ekPA12kRo0hfjngWQjkJPlN9R0N78BoUo=",
|
||||||
version = "v1.22.1",
|
version = "v1.22.2",
|
||||||
)
|
)
|
||||||
go_repository(
|
go_repository(
|
||||||
name = "com_github_urfave_cli_v2",
|
name = "com_github_urfave_cli_v2",
|
||||||
@@ -4262,8 +4298,8 @@ def prysm_deps():
|
|||||||
go_repository(
|
go_repository(
|
||||||
name = "com_lukechampine_blake3",
|
name = "com_lukechampine_blake3",
|
||||||
importpath = "lukechampine.com/blake3",
|
importpath = "lukechampine.com/blake3",
|
||||||
sum = "h1:I3Smz7gso8w4/TunLKec6K2fn+kyKtDxr/xcQEN84Wg=",
|
sum = "h1:sJ3XhFINmHSrYCgl958hscfIa3bw8x4DqMP3u1YvoYE=",
|
||||||
version = "v1.4.1",
|
version = "v1.3.0",
|
||||||
)
|
)
|
||||||
go_repository(
|
go_repository(
|
||||||
name = "com_shuralyov_dmitri_app_changes",
|
name = "com_shuralyov_dmitri_app_changes",
|
||||||
@@ -4687,8 +4723,8 @@ def prysm_deps():
|
|||||||
go_repository(
|
go_repository(
|
||||||
name = "org_golang_google_protobuf",
|
name = "org_golang_google_protobuf",
|
||||||
importpath = "google.golang.org/protobuf",
|
importpath = "google.golang.org/protobuf",
|
||||||
sum = "h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=",
|
sum = "h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM=",
|
||||||
version = "v1.36.6",
|
version = "v1.36.5",
|
||||||
)
|
)
|
||||||
go_repository(
|
go_repository(
|
||||||
name = "org_golang_x_build",
|
name = "org_golang_x_build",
|
||||||
@@ -4705,8 +4741,8 @@ def prysm_deps():
|
|||||||
go_repository(
|
go_repository(
|
||||||
name = "org_golang_x_exp",
|
name = "org_golang_x_exp",
|
||||||
importpath = "golang.org/x/exp",
|
importpath = "golang.org/x/exp",
|
||||||
sum = "h1:bsqhLWFR6G6xiQcb+JoGqdKdRU6WzPWmK8E0jxTjzo4=",
|
sum = "h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI=",
|
||||||
version = "v0.0.0-20250606033433-dcc06ee1d476",
|
version = "v0.0.0-20250506013437-ce4c2cf36ca6",
|
||||||
)
|
)
|
||||||
go_repository(
|
go_repository(
|
||||||
name = "org_golang_x_exp_typeparams",
|
name = "org_golang_x_exp_typeparams",
|
||||||
@@ -4747,8 +4783,8 @@ def prysm_deps():
|
|||||||
go_repository(
|
go_repository(
|
||||||
name = "org_golang_x_oauth2",
|
name = "org_golang_x_oauth2",
|
||||||
importpath = "golang.org/x/oauth2",
|
importpath = "golang.org/x/oauth2",
|
||||||
sum = "h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI=",
|
sum = "h1:CY4y7XT9v0cRI9oupztF8AgiIu99L/ksR/Xp/6jrZ70=",
|
||||||
version = "v0.30.0",
|
version = "v0.25.0",
|
||||||
)
|
)
|
||||||
go_repository(
|
go_repository(
|
||||||
name = "org_golang_x_perf",
|
name = "org_golang_x_perf",
|
||||||
@@ -4789,8 +4825,8 @@ def prysm_deps():
|
|||||||
go_repository(
|
go_repository(
|
||||||
name = "org_golang_x_time",
|
name = "org_golang_x_time",
|
||||||
importpath = "golang.org/x/time",
|
importpath = "golang.org/x/time",
|
||||||
sum = "h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE=",
|
sum = "h1:EsRrnYcQiGH+5FfbgvV4AP7qEZstoyrHB0DzarOQ4ZY=",
|
||||||
version = "v0.12.0",
|
version = "v0.9.0",
|
||||||
)
|
)
|
||||||
go_repository(
|
go_repository(
|
||||||
name = "org_golang_x_tools",
|
name = "org_golang_x_tools",
|
||||||
@@ -4830,14 +4866,14 @@ def prysm_deps():
|
|||||||
go_repository(
|
go_repository(
|
||||||
name = "org_uber_go_dig",
|
name = "org_uber_go_dig",
|
||||||
importpath = "go.uber.org/dig",
|
importpath = "go.uber.org/dig",
|
||||||
sum = "h1:BACLhebsYdpQ7IROQ1AGPjrXcP5dF80U3gKoFzbaq/4=",
|
sum = "h1:imUL1UiY0Mg4bqbFfsRQO5G4CGRBec/ZujWTvSVp3pw=",
|
||||||
version = "v1.19.0",
|
version = "v1.18.0",
|
||||||
)
|
)
|
||||||
go_repository(
|
go_repository(
|
||||||
name = "org_uber_go_fx",
|
name = "org_uber_go_fx",
|
||||||
importpath = "go.uber.org/fx",
|
importpath = "go.uber.org/fx",
|
||||||
sum = "h1:wE8mruvpg2kiiL1Vqd0CC+tr0/24XIB10Iwp2lLWzkg=",
|
sum = "h1:lIr/gYWQGfTwGcSXWXu4vP5Ws6iqnNEIY+F/aFzCKTg=",
|
||||||
version = "v1.24.0",
|
version = "v1.23.0",
|
||||||
)
|
)
|
||||||
go_repository(
|
go_repository(
|
||||||
name = "org_uber_go_goleak",
|
name = "org_uber_go_goleak",
|
||||||
|
|||||||
80
go.mod
80
go.mod
@@ -41,24 +41,23 @@ require (
|
|||||||
github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213
|
github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213
|
||||||
github.com/kisielk/errcheck v1.8.0
|
github.com/kisielk/errcheck v1.8.0
|
||||||
github.com/kr/pretty v0.3.1
|
github.com/kr/pretty v0.3.1
|
||||||
github.com/libp2p/go-libp2p v0.44.0
|
github.com/libp2p/go-libp2p v0.39.1
|
||||||
github.com/libp2p/go-libp2p-mplex v0.11.0
|
github.com/libp2p/go-libp2p-mplex v0.9.0
|
||||||
github.com/libp2p/go-libp2p-pubsub v0.15.1-0.20260127225230-d9e98cd10cf3
|
github.com/libp2p/go-libp2p-pubsub v0.14.2
|
||||||
github.com/libp2p/go-mplex v0.7.0
|
github.com/libp2p/go-mplex v0.7.0
|
||||||
github.com/logrusorgru/aurora v2.0.3+incompatible
|
github.com/logrusorgru/aurora v2.0.3+incompatible
|
||||||
github.com/manifoldco/promptui v0.7.0
|
github.com/manifoldco/promptui v0.7.0
|
||||||
github.com/marcopolo/simnet v0.0.1
|
|
||||||
github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b
|
github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b
|
||||||
github.com/minio/highwayhash v1.0.2
|
github.com/minio/highwayhash v1.0.2
|
||||||
github.com/minio/sha256-simd v1.0.1
|
github.com/minio/sha256-simd v1.0.1
|
||||||
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826
|
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826
|
||||||
github.com/multiformats/go-multiaddr v0.16.0
|
github.com/multiformats/go-multiaddr v0.14.0
|
||||||
github.com/patrickmn/go-cache v2.1.0+incompatible
|
github.com/patrickmn/go-cache v2.1.0+incompatible
|
||||||
github.com/paulbellamy/ratecounter v0.2.0
|
github.com/paulbellamy/ratecounter v0.2.0
|
||||||
github.com/pborman/uuid v1.2.1
|
github.com/pborman/uuid v1.2.1
|
||||||
github.com/pkg/errors v0.9.1
|
github.com/pkg/errors v0.9.1
|
||||||
github.com/prometheus/client_golang v1.22.0
|
github.com/prometheus/client_golang v1.20.5
|
||||||
github.com/prometheus/client_model v0.6.2
|
github.com/prometheus/client_model v0.6.1
|
||||||
github.com/prometheus/prom2json v1.3.0
|
github.com/prometheus/prom2json v1.3.0
|
||||||
github.com/prysmaticlabs/fastssz v0.0.0-20251103153600-259302269bfc
|
github.com/prysmaticlabs/fastssz v0.0.0-20251103153600-259302269bfc
|
||||||
github.com/prysmaticlabs/prombbolt v0.0.0-20210126082820-9b7adba6db7c
|
github.com/prysmaticlabs/prombbolt v0.0.0-20210126082820-9b7adba6db7c
|
||||||
@@ -89,12 +88,12 @@ require (
|
|||||||
go.uber.org/automaxprocs v1.5.2
|
go.uber.org/automaxprocs v1.5.2
|
||||||
go.uber.org/mock v0.5.2
|
go.uber.org/mock v0.5.2
|
||||||
golang.org/x/crypto v0.44.0
|
golang.org/x/crypto v0.44.0
|
||||||
golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476
|
golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6
|
||||||
golang.org/x/sync v0.18.0
|
golang.org/x/sync v0.18.0
|
||||||
golang.org/x/tools v0.39.0
|
golang.org/x/tools v0.39.0
|
||||||
google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1
|
google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1
|
||||||
google.golang.org/grpc v1.71.0
|
google.golang.org/grpc v1.71.0
|
||||||
google.golang.org/protobuf v1.36.6
|
google.golang.org/protobuf v1.36.5
|
||||||
gopkg.in/d4l3k/messagediff.v1 v1.2.1
|
gopkg.in/d4l3k/messagediff.v1 v1.2.1
|
||||||
gopkg.in/natefinch/lumberjack.v2 v2.2.1
|
gopkg.in/natefinch/lumberjack.v2 v2.2.1
|
||||||
gopkg.in/yaml.v2 v2.4.0
|
gopkg.in/yaml.v2 v2.4.0
|
||||||
@@ -123,6 +122,8 @@ require (
|
|||||||
github.com/cockroachdb/pebble v1.1.5 // indirect
|
github.com/cockroachdb/pebble v1.1.5 // indirect
|
||||||
github.com/cockroachdb/redact v1.1.5 // indirect
|
github.com/cockroachdb/redact v1.1.5 // indirect
|
||||||
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect
|
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect
|
||||||
|
github.com/containerd/cgroups v1.1.0 // indirect
|
||||||
|
github.com/coreos/go-systemd/v22 v22.5.0 // indirect
|
||||||
github.com/cpuguy83/go-md2man/v2 v2.0.7 // indirect
|
github.com/cpuguy83/go-md2man/v2 v2.0.7 // indirect
|
||||||
github.com/crate-crypto/go-eth-kzg v1.4.0 // indirect
|
github.com/crate-crypto/go-eth-kzg v1.4.0 // indirect
|
||||||
github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a // indirect
|
github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a // indirect
|
||||||
@@ -133,7 +134,9 @@ require (
|
|||||||
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 // indirect
|
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 // indirect
|
||||||
github.com/deepmap/oapi-codegen v1.8.2 // indirect
|
github.com/deepmap/oapi-codegen v1.8.2 // indirect
|
||||||
github.com/dlclark/regexp2 v1.7.0 // indirect
|
github.com/dlclark/regexp2 v1.7.0 // indirect
|
||||||
|
github.com/docker/go-units v0.5.0 // indirect
|
||||||
github.com/dop251/goja v0.0.0-20230806174421-c933cf95e127 // indirect
|
github.com/dop251/goja v0.0.0-20230806174421-c933cf95e127 // indirect
|
||||||
|
github.com/elastic/gosigar v0.14.3 // indirect
|
||||||
github.com/ethereum/go-bigmodexpfix v0.0.0-20250911101455-f9e208c548ab // indirect
|
github.com/ethereum/go-bigmodexpfix v0.0.0-20250911101455-f9e208c548ab // indirect
|
||||||
github.com/ethereum/go-verkle v0.2.2 // indirect
|
github.com/ethereum/go-verkle v0.2.2 // indirect
|
||||||
github.com/felixge/httpsnoop v1.0.4 // indirect
|
github.com/felixge/httpsnoop v1.0.4 // indirect
|
||||||
@@ -145,7 +148,10 @@ require (
|
|||||||
github.com/go-playground/locales v0.14.1 // indirect
|
github.com/go-playground/locales v0.14.1 // indirect
|
||||||
github.com/go-playground/universal-translator v0.18.1 // indirect
|
github.com/go-playground/universal-translator v0.18.1 // indirect
|
||||||
github.com/go-sourcemap/sourcemap v2.1.3+incompatible // indirect
|
github.com/go-sourcemap/sourcemap v2.1.3+incompatible // indirect
|
||||||
|
github.com/go-task/slim-sprig/v3 v3.0.0 // indirect
|
||||||
|
github.com/godbus/dbus/v5 v5.1.0 // indirect
|
||||||
github.com/gofrs/flock v0.12.1 // indirect
|
github.com/gofrs/flock v0.12.1 // indirect
|
||||||
|
github.com/google/gopacket v1.1.19 // indirect
|
||||||
github.com/google/pprof v0.0.0-20250202011525-fc3143867406 // indirect
|
github.com/google/pprof v0.0.0-20250202011525-fc3143867406 // indirect
|
||||||
github.com/gorilla/websocket v1.5.3 // indirect
|
github.com/gorilla/websocket v1.5.3 // indirect
|
||||||
github.com/graph-gophers/graphql-go v1.3.0 // indirect
|
github.com/graph-gophers/graphql-go v1.3.0 // indirect
|
||||||
@@ -163,24 +169,25 @@ require (
|
|||||||
github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect
|
github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect
|
||||||
github.com/juju/ansiterm v0.0.0-20180109212912-720a0952cc2a // indirect
|
github.com/juju/ansiterm v0.0.0-20180109212912-720a0952cc2a // indirect
|
||||||
github.com/klauspost/compress v1.18.0 // indirect
|
github.com/klauspost/compress v1.18.0 // indirect
|
||||||
github.com/klauspost/cpuid/v2 v2.2.10 // indirect
|
github.com/klauspost/cpuid/v2 v2.2.9 // indirect
|
||||||
github.com/koron/go-ssdp v0.0.6 // indirect
|
github.com/koron/go-ssdp v0.0.5 // indirect
|
||||||
github.com/kr/text v0.2.0 // indirect
|
github.com/kr/text v0.2.0 // indirect
|
||||||
github.com/leodido/go-urn v1.2.3 // indirect
|
github.com/leodido/go-urn v1.2.3 // indirect
|
||||||
github.com/libp2p/go-buffer-pool v0.1.0 // indirect
|
github.com/libp2p/go-buffer-pool v0.1.0 // indirect
|
||||||
github.com/libp2p/go-flow-metrics v0.2.0 // indirect
|
github.com/libp2p/go-flow-metrics v0.2.0 // indirect
|
||||||
github.com/libp2p/go-libp2p-asn-util v0.4.1 // indirect
|
github.com/libp2p/go-libp2p-asn-util v0.4.1 // indirect
|
||||||
github.com/libp2p/go-msgio v0.3.0 // indirect
|
github.com/libp2p/go-msgio v0.3.0 // indirect
|
||||||
|
github.com/libp2p/go-nat v0.2.0 // indirect
|
||||||
github.com/libp2p/go-netroute v0.4.0 // indirect
|
github.com/libp2p/go-netroute v0.4.0 // indirect
|
||||||
github.com/libp2p/go-reuseport v0.4.0 // indirect
|
github.com/libp2p/go-reuseport v0.4.0 // indirect
|
||||||
github.com/libp2p/go-yamux/v5 v5.0.1 // indirect
|
github.com/libp2p/go-yamux/v4 v4.0.2 // indirect
|
||||||
github.com/lunixbochs/vtclean v1.0.0 // indirect
|
github.com/lunixbochs/vtclean v1.0.0 // indirect
|
||||||
github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect
|
github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect
|
||||||
github.com/mattn/go-colorable v0.1.13 // indirect
|
github.com/mattn/go-colorable v0.1.13 // indirect
|
||||||
github.com/mattn/go-isatty v0.0.20 // indirect
|
github.com/mattn/go-isatty v0.0.20 // indirect
|
||||||
github.com/mattn/go-runewidth v0.0.16 // indirect
|
github.com/mattn/go-runewidth v0.0.16 // indirect
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
|
github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
|
||||||
github.com/miekg/dns v1.1.66 // indirect
|
github.com/miekg/dns v1.1.63 // indirect
|
||||||
github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect
|
github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect
|
||||||
github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect
|
github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect
|
||||||
github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db // indirect
|
github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db // indirect
|
||||||
@@ -194,41 +201,46 @@ require (
|
|||||||
github.com/multiformats/go-multiaddr-dns v0.4.1 // indirect
|
github.com/multiformats/go-multiaddr-dns v0.4.1 // indirect
|
||||||
github.com/multiformats/go-multiaddr-fmt v0.1.0 // indirect
|
github.com/multiformats/go-multiaddr-fmt v0.1.0 // indirect
|
||||||
github.com/multiformats/go-multibase v0.2.0 // indirect
|
github.com/multiformats/go-multibase v0.2.0 // indirect
|
||||||
github.com/multiformats/go-multicodec v0.9.1 // indirect
|
github.com/multiformats/go-multicodec v0.9.0 // indirect
|
||||||
github.com/multiformats/go-multihash v0.2.3 // indirect
|
github.com/multiformats/go-multihash v0.2.3 // indirect
|
||||||
github.com/multiformats/go-multistream v0.6.1 // indirect
|
github.com/multiformats/go-multistream v0.6.0 // indirect
|
||||||
github.com/multiformats/go-varint v0.0.7 // indirect
|
github.com/multiformats/go-varint v0.0.7 // indirect
|
||||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
|
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
|
||||||
github.com/olekukonko/tablewriter v0.0.5 // indirect
|
github.com/olekukonko/tablewriter v0.0.5 // indirect
|
||||||
github.com/onsi/gomega v1.36.2 // indirect
|
github.com/onsi/ginkgo/v2 v2.22.2 // indirect
|
||||||
|
github.com/opencontainers/runtime-spec v1.2.0 // indirect
|
||||||
github.com/opentracing/opentracing-go v1.2.0 // indirect
|
github.com/opentracing/opentracing-go v1.2.0 // indirect
|
||||||
github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect
|
github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect
|
||||||
github.com/pion/datachannel v1.5.10 // indirect
|
github.com/pion/datachannel v1.5.10 // indirect
|
||||||
github.com/pion/dtls/v2 v2.2.12 // indirect
|
github.com/pion/dtls/v2 v2.2.12 // indirect
|
||||||
github.com/pion/dtls/v3 v3.0.6 // indirect
|
github.com/pion/dtls/v3 v3.0.4 // indirect
|
||||||
github.com/pion/ice/v4 v4.0.10 // indirect
|
github.com/pion/ice/v2 v2.3.37 // indirect
|
||||||
github.com/pion/interceptor v0.1.40 // indirect
|
github.com/pion/ice/v4 v4.0.6 // indirect
|
||||||
|
github.com/pion/interceptor v0.1.37 // indirect
|
||||||
github.com/pion/logging v0.2.3 // indirect
|
github.com/pion/logging v0.2.3 // indirect
|
||||||
|
github.com/pion/mdns v0.0.12 // indirect
|
||||||
github.com/pion/mdns/v2 v2.0.7 // indirect
|
github.com/pion/mdns/v2 v2.0.7 // indirect
|
||||||
github.com/pion/randutil v0.1.0 // indirect
|
github.com/pion/randutil v0.1.0 // indirect
|
||||||
github.com/pion/rtcp v1.2.15 // indirect
|
github.com/pion/rtcp v1.2.15 // indirect
|
||||||
github.com/pion/rtp v1.8.19 // indirect
|
github.com/pion/rtp v1.8.11 // indirect
|
||||||
github.com/pion/sctp v1.8.39 // indirect
|
github.com/pion/sctp v1.8.35 // indirect
|
||||||
github.com/pion/sdp/v3 v3.0.13 // indirect
|
github.com/pion/sdp/v3 v3.0.10 // indirect
|
||||||
github.com/pion/srtp/v3 v3.0.6 // indirect
|
github.com/pion/srtp/v3 v3.0.4 // indirect
|
||||||
github.com/pion/stun v0.6.1 // indirect
|
github.com/pion/stun v0.6.1 // indirect
|
||||||
github.com/pion/stun/v2 v2.0.0 // indirect
|
github.com/pion/stun/v2 v2.0.0 // indirect
|
||||||
github.com/pion/stun/v3 v3.0.0 // indirect
|
github.com/pion/stun/v3 v3.0.0 // indirect
|
||||||
github.com/pion/transport/v2 v2.2.10 // indirect
|
github.com/pion/transport/v2 v2.2.10 // indirect
|
||||||
github.com/pion/transport/v3 v3.0.7 // indirect
|
github.com/pion/transport/v3 v3.0.7 // indirect
|
||||||
github.com/pion/turn/v4 v4.0.2 // indirect
|
github.com/pion/turn/v2 v2.1.6 // indirect
|
||||||
github.com/pion/webrtc/v4 v4.1.2 // indirect
|
github.com/pion/turn/v4 v4.0.0 // indirect
|
||||||
|
github.com/pion/webrtc/v4 v4.0.8 // indirect
|
||||||
github.com/pmezard/go-difflib v1.0.0 // indirect
|
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||||
github.com/prometheus/common v0.64.0 // indirect
|
github.com/prometheus/common v0.62.0 // indirect
|
||||||
github.com/prometheus/procfs v0.16.1 // indirect
|
github.com/prometheus/procfs v0.15.1 // indirect
|
||||||
github.com/quic-go/qpack v0.5.1 // indirect
|
github.com/quic-go/qpack v0.5.1 // indirect
|
||||||
github.com/quic-go/quic-go v0.55.0 // indirect
|
github.com/quic-go/quic-go v0.49.1-0.20250925085836-275c172fec2b // indirect
|
||||||
github.com/quic-go/webtransport-go v0.9.0 // indirect
|
github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66 // indirect
|
||||||
|
github.com/raulk/go-watchdog v1.3.0 // indirect
|
||||||
github.com/rivo/uniseg v0.4.7 // indirect
|
github.com/rivo/uniseg v0.4.7 // indirect
|
||||||
github.com/rogpeppe/go-internal v1.13.1 // indirect
|
github.com/rogpeppe/go-internal v1.13.1 // indirect
|
||||||
github.com/russross/blackfriday/v2 v2.1.0 // indirect
|
github.com/russross/blackfriday/v2 v2.1.0 // indirect
|
||||||
@@ -246,22 +258,22 @@ require (
|
|||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 // indirect
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 // indirect
|
||||||
go.opentelemetry.io/otel/metric v1.35.0 // indirect
|
go.opentelemetry.io/otel/metric v1.35.0 // indirect
|
||||||
go.opentelemetry.io/proto/otlp v1.5.0 // indirect
|
go.opentelemetry.io/proto/otlp v1.5.0 // indirect
|
||||||
go.uber.org/dig v1.19.0 // indirect
|
go.uber.org/dig v1.18.0 // indirect
|
||||||
go.uber.org/fx v1.24.0 // indirect
|
go.uber.org/fx v1.23.0 // indirect
|
||||||
go.uber.org/multierr v1.11.0 // indirect
|
go.uber.org/multierr v1.11.0 // indirect
|
||||||
go.uber.org/zap v1.27.0 // indirect
|
go.uber.org/zap v1.27.0 // indirect
|
||||||
golang.org/x/exp/typeparams v0.0.0-20231108232855-2478ac86f678 // indirect
|
golang.org/x/exp/typeparams v0.0.0-20231108232855-2478ac86f678 // indirect
|
||||||
golang.org/x/mod v0.30.0 // indirect
|
golang.org/x/mod v0.30.0 // indirect
|
||||||
golang.org/x/net v0.47.0 // indirect
|
golang.org/x/net v0.47.0 // indirect
|
||||||
golang.org/x/oauth2 v0.30.0 // indirect
|
golang.org/x/oauth2 v0.25.0 // indirect
|
||||||
golang.org/x/telemetry v0.0.0-20251111182119-bc8e575c7b54 // indirect
|
golang.org/x/telemetry v0.0.0-20251111182119-bc8e575c7b54 // indirect
|
||||||
golang.org/x/term v0.37.0 // indirect
|
golang.org/x/term v0.37.0 // indirect
|
||||||
golang.org/x/text v0.31.0 // indirect
|
golang.org/x/text v0.31.0 // indirect
|
||||||
golang.org/x/time v0.12.0 // indirect
|
golang.org/x/time v0.9.0 // indirect
|
||||||
golang.org/x/tools/go/expect v0.1.1-deprecated // indirect
|
golang.org/x/tools/go/expect v0.1.1-deprecated // indirect
|
||||||
gopkg.in/cenkalti/backoff.v1 v1.1.0 // indirect
|
gopkg.in/cenkalti/backoff.v1 v1.1.0 // indirect
|
||||||
gopkg.in/inf.v0 v0.9.1 // indirect
|
gopkg.in/inf.v0 v0.9.1 // indirect
|
||||||
lukechampine.com/blake3 v1.4.1 // indirect
|
lukechampine.com/blake3 v1.3.0 // indirect
|
||||||
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
|
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
|
||||||
sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect
|
sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect
|
||||||
sigs.k8s.io/yaml v1.3.0 // indirect
|
sigs.k8s.io/yaml v1.3.0 // indirect
|
||||||
|
|||||||
181
go.sum
181
go.sum
@@ -91,6 +91,7 @@ github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZw
|
|||||||
github.com/bazelbuild/rules_go v0.23.2 h1:Wxu7JjqnF78cKZbsBsARLSXx/jlGaSLCnUV3mTlyHvM=
|
github.com/bazelbuild/rules_go v0.23.2 h1:Wxu7JjqnF78cKZbsBsARLSXx/jlGaSLCnUV3mTlyHvM=
|
||||||
github.com/bazelbuild/rules_go v0.23.2/go.mod h1:MC23Dc/wkXEyk3Wpq6lCqz0ZAYOZDw2DR5y3N1q2i7M=
|
github.com/bazelbuild/rules_go v0.23.2/go.mod h1:MC23Dc/wkXEyk3Wpq6lCqz0ZAYOZDw2DR5y3N1q2i7M=
|
||||||
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
|
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
|
||||||
|
github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
|
||||||
github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o=
|
github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o=
|
||||||
github.com/benbjohnson/clock v1.3.5/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
|
github.com/benbjohnson/clock v1.3.5/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
|
||||||
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
|
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
|
||||||
@@ -127,6 +128,7 @@ github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMn
|
|||||||
github.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
|
github.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
|
||||||
github.com/chzyer/test v1.0.0 h1:p3BQDXSxOhOG0P9z6/hGnII4LGiEPOYBhs8asl/fC04=
|
github.com/chzyer/test v1.0.0 h1:p3BQDXSxOhOG0P9z6/hGnII4LGiEPOYBhs8asl/fC04=
|
||||||
github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8=
|
github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8=
|
||||||
|
github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs=
|
||||||
github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE=
|
github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE=
|
||||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||||
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
|
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
|
||||||
@@ -150,13 +152,20 @@ github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:
|
|||||||
github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI=
|
github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI=
|
||||||
github.com/consensys/gnark-crypto v0.18.0 h1:vIye/FqI50VeAr0B3dx+YjeIvmc3LWz4yEfbWBpTUf0=
|
github.com/consensys/gnark-crypto v0.18.0 h1:vIye/FqI50VeAr0B3dx+YjeIvmc3LWz4yEfbWBpTUf0=
|
||||||
github.com/consensys/gnark-crypto v0.18.0/go.mod h1:L3mXGFTe1ZN+RSJ+CLjUt9x7PNdx8ubaYfDROyp2Z8c=
|
github.com/consensys/gnark-crypto v0.18.0/go.mod h1:L3mXGFTe1ZN+RSJ+CLjUt9x7PNdx8ubaYfDROyp2Z8c=
|
||||||
|
github.com/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE=
|
||||||
|
github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM=
|
||||||
|
github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw=
|
||||||
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
|
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
|
||||||
github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
||||||
github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
||||||
github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf h1:iW4rZ826su+pqaw19uhpSCzhj44qo35pNgKFGqzDKkU=
|
github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf h1:iW4rZ826su+pqaw19uhpSCzhj44qo35pNgKFGqzDKkU=
|
||||||
github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
||||||
|
github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk=
|
||||||
|
github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs=
|
||||||
|
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
|
||||||
github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
|
github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
|
||||||
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
|
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
|
||||||
|
github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
|
||||||
github.com/cpuguy83/go-md2man/v2 v2.0.7 h1:zbFlGlXEAKlwXpmvle3d8Oe3YnkKIK4xSRTd3sHPnBo=
|
github.com/cpuguy83/go-md2man/v2 v2.0.7 h1:zbFlGlXEAKlwXpmvle3d8Oe3YnkKIK4xSRTd3sHPnBo=
|
||||||
github.com/cpuguy83/go-md2man/v2 v2.0.7/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
|
github.com/cpuguy83/go-md2man/v2 v2.0.7/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
|
||||||
github.com/crate-crypto/go-eth-kzg v1.4.0 h1:WzDGjHk4gFg6YzV0rJOAsTK4z3Qkz5jd4RE3DAvPFkg=
|
github.com/crate-crypto/go-eth-kzg v1.4.0 h1:WzDGjHk4gFg6YzV0rJOAsTK4z3Qkz5jd4RE3DAvPFkg=
|
||||||
@@ -194,6 +203,9 @@ github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUn
|
|||||||
github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc=
|
github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc=
|
||||||
github.com/dlclark/regexp2 v1.7.0 h1:7lJfhqlPssTb1WQx4yvTHN0uElPEv52sbaECrAQxjAo=
|
github.com/dlclark/regexp2 v1.7.0 h1:7lJfhqlPssTb1WQx4yvTHN0uElPEv52sbaECrAQxjAo=
|
||||||
github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
|
github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
|
||||||
|
github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
|
||||||
|
github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4=
|
||||||
|
github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
|
||||||
github.com/dop251/goja v0.0.0-20211022113120-dc8c55024d06/go.mod h1:R9ET47fwRVRPZnOGvHxxhuZcbrMCuiqOz3Rlrh4KSnk=
|
github.com/dop251/goja v0.0.0-20211022113120-dc8c55024d06/go.mod h1:R9ET47fwRVRPZnOGvHxxhuZcbrMCuiqOz3Rlrh4KSnk=
|
||||||
github.com/dop251/goja v0.0.0-20230806174421-c933cf95e127 h1:qwcF+vdFrvPSEUDSX5RVoRccG8a5DhOdWdQ4zN62zzo=
|
github.com/dop251/goja v0.0.0-20230806174421-c933cf95e127 h1:qwcF+vdFrvPSEUDSX5RVoRccG8a5DhOdWdQ4zN62zzo=
|
||||||
github.com/dop251/goja v0.0.0-20230806174421-c933cf95e127/go.mod h1:QMWlm50DNe14hD7t24KEqZuUdC9sOTy8W6XbCU1mlw4=
|
github.com/dop251/goja v0.0.0-20230806174421-c933cf95e127/go.mod h1:QMWlm50DNe14hD7t24KEqZuUdC9sOTy8W6XbCU1mlw4=
|
||||||
@@ -208,6 +220,9 @@ github.com/eapache/go-resiliency v1.2.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5m
|
|||||||
github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU=
|
github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU=
|
||||||
github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=
|
github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=
|
||||||
github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
|
github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
|
||||||
|
github.com/elastic/gosigar v0.12.0/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs=
|
||||||
|
github.com/elastic/gosigar v0.14.3 h1:xwkKwPia+hSfg9GqrCUKYdId102m9qTJIIr7egmK/uo=
|
||||||
|
github.com/elastic/gosigar v0.14.3/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs=
|
||||||
github.com/emicklei/dot v1.6.2 h1:08GN+DD79cy/tzN6uLCT84+2Wk9u+wvqP+Hkx/dIR8A=
|
github.com/emicklei/dot v1.6.2 h1:08GN+DD79cy/tzN6uLCT84+2Wk9u+wvqP+Hkx/dIR8A=
|
||||||
github.com/emicklei/dot v1.6.2/go.mod h1:DeV7GvQtIw4h2u73RKBkkFdvVAz0D9fzeJrgPW6gy/s=
|
github.com/emicklei/dot v1.6.2/go.mod h1:DeV7GvQtIw4h2u73RKBkkFdvVAz0D9fzeJrgPW6gy/s=
|
||||||
github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g=
|
github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g=
|
||||||
@@ -302,14 +317,21 @@ github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5Nq
|
|||||||
github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
|
github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
|
||||||
github.com/go-stack/stack v1.6.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
github.com/go-stack/stack v1.6.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
||||||
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
||||||
|
github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
|
||||||
|
github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
|
||||||
github.com/go-yaml/yaml v2.1.0+incompatible h1:RYi2hDdss1u4YE7GwixGzWwVo47T8UQwnTLB6vQiq+o=
|
github.com/go-yaml/yaml v2.1.0+incompatible h1:RYi2hDdss1u4YE7GwixGzWwVo47T8UQwnTLB6vQiq+o=
|
||||||
github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0=
|
github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0=
|
||||||
|
github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
||||||
|
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
||||||
|
github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
|
||||||
|
github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
||||||
github.com/gofrs/flock v0.12.1 h1:MTLVXXHf8ekldpJk3AKicLij9MdwOWkZ+a/jHHZby9E=
|
github.com/gofrs/flock v0.12.1 h1:MTLVXXHf8ekldpJk3AKicLij9MdwOWkZ+a/jHHZby9E=
|
||||||
github.com/gofrs/flock v0.12.1/go.mod h1:9zxTsyu5xtJ9DK+1tFZyibEV7y3uwDxPPfbxeeHCoD0=
|
github.com/gofrs/flock v0.12.1/go.mod h1:9zxTsyu5xtJ9DK+1tFZyibEV7y3uwDxPPfbxeeHCoD0=
|
||||||
github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s=
|
github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s=
|
||||||
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
||||||
github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
||||||
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
|
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
|
||||||
|
github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
|
||||||
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
|
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
|
||||||
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
|
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
|
||||||
github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI=
|
github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI=
|
||||||
@@ -377,6 +399,8 @@ github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO
|
|||||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||||
github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
|
github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
|
||||||
github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||||
|
github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8=
|
||||||
|
github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo=
|
||||||
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
|
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
|
||||||
github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
|
github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
|
||||||
github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
|
github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
|
||||||
@@ -397,6 +421,7 @@ github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm4
|
|||||||
github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
|
github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
|
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
|
||||||
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY=
|
github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY=
|
||||||
@@ -514,6 +539,7 @@ github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8
|
|||||||
github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213 h1:qGQQKEcAR99REcMpsXCp3lJ03zYT1PkRd3kQGPn9GVg=
|
github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213 h1:qGQQKEcAR99REcMpsXCp3lJ03zYT1PkRd3kQGPn9GVg=
|
||||||
github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213/go.mod h1:vNUNkEQ1e29fT/6vq2aBdFsgNPmy8qMdSay1npru+Sw=
|
github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213/go.mod h1:vNUNkEQ1e29fT/6vq2aBdFsgNPmy8qMdSay1npru+Sw=
|
||||||
github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
|
github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
|
||||||
|
github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
|
||||||
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
|
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
|
||||||
github.com/kisielk/errcheck v1.8.0 h1:ZX/URYa7ilESY19ik/vBmCn6zdGQLxACwjAcWbHlYlg=
|
github.com/kisielk/errcheck v1.8.0 h1:ZX/URYa7ilESY19ik/vBmCn6zdGQLxACwjAcWbHlYlg=
|
||||||
github.com/kisielk/errcheck v1.8.0/go.mod h1:1kLL+jV4e+CFfueBmI1dSK2ADDyQnlrnrY/FqKluHJQ=
|
github.com/kisielk/errcheck v1.8.0/go.mod h1:1kLL+jV4e+CFfueBmI1dSK2ADDyQnlrnrY/FqKluHJQ=
|
||||||
@@ -523,14 +549,14 @@ github.com/klauspost/compress v1.10.1/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYs
|
|||||||
github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=
|
github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=
|
||||||
github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=
|
github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=
|
||||||
github.com/klauspost/cpuid v1.2.3/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
|
github.com/klauspost/cpuid v1.2.3/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
|
||||||
github.com/klauspost/cpuid/v2 v2.2.10 h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2skhE=
|
github.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY=
|
||||||
github.com/klauspost/cpuid/v2 v2.2.10/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
|
github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8=
|
||||||
github.com/klauspost/reedsolomon v1.9.3/go.mod h1:CwCi+NUr9pqSVktrkN+Ondf06rkhYZ/pcNv7fu+8Un4=
|
github.com/klauspost/reedsolomon v1.9.3/go.mod h1:CwCi+NUr9pqSVktrkN+Ondf06rkhYZ/pcNv7fu+8Un4=
|
||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||||
github.com/koron/go-ssdp v0.0.6 h1:Jb0h04599eq/CY7rB5YEqPS83HmRfHP2azkxMN2rFtU=
|
github.com/koron/go-ssdp v0.0.5 h1:E1iSMxIs4WqxTbIBLtmNBeOOC+1sCIXQeqTWVnpmwhk=
|
||||||
github.com/koron/go-ssdp v0.0.6/go.mod h1:0R9LfRJGek1zWTjN3JUNlm5INCDYGpRDfAptnct63fI=
|
github.com/koron/go-ssdp v0.0.5/go.mod h1:Qm59B7hpKpDqfyRNWRNr00jGwLdXjDyZh6y7rH6VS0w=
|
||||||
github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
|
github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
|
||||||
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
|
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
|
||||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||||
@@ -556,26 +582,28 @@ github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6
|
|||||||
github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg=
|
github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg=
|
||||||
github.com/libp2p/go-flow-metrics v0.2.0 h1:EIZzjmeOE6c8Dav0sNv35vhZxATIXWZg6j/C08XmmDw=
|
github.com/libp2p/go-flow-metrics v0.2.0 h1:EIZzjmeOE6c8Dav0sNv35vhZxATIXWZg6j/C08XmmDw=
|
||||||
github.com/libp2p/go-flow-metrics v0.2.0/go.mod h1:st3qqfu8+pMfh+9Mzqb2GTiwrAGjIPszEjZmtksN8Jc=
|
github.com/libp2p/go-flow-metrics v0.2.0/go.mod h1:st3qqfu8+pMfh+9Mzqb2GTiwrAGjIPszEjZmtksN8Jc=
|
||||||
github.com/libp2p/go-libp2p v0.44.0 h1:5Gtt8OrF8yiXmH+Mx4+/iBeFRMK1TY3a8OrEBDEqAvs=
|
github.com/libp2p/go-libp2p v0.39.1 h1:1Ur6rPCf3GR+g8jkrnaQaM0ha2IGespsnNlCqJLLALE=
|
||||||
github.com/libp2p/go-libp2p v0.44.0/go.mod h1:NovCojezAt4dnDd4fH048K7PKEqH0UFYYqJRjIIu8zc=
|
github.com/libp2p/go-libp2p v0.39.1/go.mod h1:3zicI8Lp7Isun+Afo/JOACUbbJqqR2owK6RQWFsVAbI=
|
||||||
github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94=
|
github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94=
|
||||||
github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8=
|
github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8=
|
||||||
github.com/libp2p/go-libp2p-mplex v0.11.0 h1:0vwpLXRSfkTzshEjETIEgJaVxXvg+orbxYoIb3Ty5qM=
|
github.com/libp2p/go-libp2p-mplex v0.9.0 h1:R58pDRAmuBXkYugbSSXR9wrTX3+1pFM1xP2bLuodIq8=
|
||||||
github.com/libp2p/go-libp2p-mplex v0.11.0/go.mod h1:QrsdNY3lzjpdo9V1goJfPb0O65Nms0sUR8CDAO18f6k=
|
github.com/libp2p/go-libp2p-mplex v0.9.0/go.mod h1:ro1i4kuwiFT+uMPbIDIFkcLs1KRbNp0QwnUXM+P64Og=
|
||||||
github.com/libp2p/go-libp2p-pubsub v0.15.1-0.20260127225230-d9e98cd10cf3 h1:dJcYvoeKRxO2DbwG8E3nlZHbEMaxnEzghBltmGel93U=
|
github.com/libp2p/go-libp2p-pubsub v0.14.2 h1:nT5lFHPQOFJcp9CW8hpKtvbpQNdl2udJuzLQWbgRum8=
|
||||||
github.com/libp2p/go-libp2p-pubsub v0.15.1-0.20260127225230-d9e98cd10cf3/go.mod h1:lr4oE8bFgQaifRcoc2uWhWWiK6tPdOEKpUuR408GFN4=
|
github.com/libp2p/go-libp2p-pubsub v0.14.2/go.mod h1:MKPU5vMI8RRFyTP0HfdsF9cLmL1nHAeJm44AxJGJx44=
|
||||||
github.com/libp2p/go-libp2p-testing v0.12.0 h1:EPvBb4kKMWO29qP4mZGyhVzUyR25dvfUIK5WDu6iPUA=
|
github.com/libp2p/go-libp2p-testing v0.12.0 h1:EPvBb4kKMWO29qP4mZGyhVzUyR25dvfUIK5WDu6iPUA=
|
||||||
github.com/libp2p/go-libp2p-testing v0.12.0/go.mod h1:KcGDRXyN7sQCllucn1cOOS+Dmm7ujhfEyXQL5lvkcPg=
|
github.com/libp2p/go-libp2p-testing v0.12.0/go.mod h1:KcGDRXyN7sQCllucn1cOOS+Dmm7ujhfEyXQL5lvkcPg=
|
||||||
github.com/libp2p/go-mplex v0.7.0 h1:BDhFZdlk5tbr0oyFq/xv/NPGfjbnrsDam1EvutpBDbY=
|
github.com/libp2p/go-mplex v0.7.0 h1:BDhFZdlk5tbr0oyFq/xv/NPGfjbnrsDam1EvutpBDbY=
|
||||||
github.com/libp2p/go-mplex v0.7.0/go.mod h1:rW8ThnRcYWft/Jb2jeORBmPd6xuG3dGxWN/W168L9EU=
|
github.com/libp2p/go-mplex v0.7.0/go.mod h1:rW8ThnRcYWft/Jb2jeORBmPd6xuG3dGxWN/W168L9EU=
|
||||||
github.com/libp2p/go-msgio v0.3.0 h1:mf3Z8B1xcFN314sWX+2vOTShIE0Mmn2TXn3YCUQGNj0=
|
github.com/libp2p/go-msgio v0.3.0 h1:mf3Z8B1xcFN314sWX+2vOTShIE0Mmn2TXn3YCUQGNj0=
|
||||||
github.com/libp2p/go-msgio v0.3.0/go.mod h1:nyRM819GmVaF9LX3l03RMh10QdOroF++NBbxAb0mmDM=
|
github.com/libp2p/go-msgio v0.3.0/go.mod h1:nyRM819GmVaF9LX3l03RMh10QdOroF++NBbxAb0mmDM=
|
||||||
|
github.com/libp2p/go-nat v0.2.0 h1:Tyz+bUFAYqGyJ/ppPPymMGbIgNRH+WqC5QrT5fKrrGk=
|
||||||
|
github.com/libp2p/go-nat v0.2.0/go.mod h1:3MJr+GRpRkyT65EpVPBstXLvOlAPzUVlG6Pwg9ohLJk=
|
||||||
github.com/libp2p/go-netroute v0.4.0 h1:sZZx9hyANYUx9PZyqcgE/E1GUG3iEtTZHUEvdtXT7/Q=
|
github.com/libp2p/go-netroute v0.4.0 h1:sZZx9hyANYUx9PZyqcgE/E1GUG3iEtTZHUEvdtXT7/Q=
|
||||||
github.com/libp2p/go-netroute v0.4.0/go.mod h1:Nkd5ShYgSMS5MUKy/MU2T57xFoOKvvLR92Lic48LEyA=
|
github.com/libp2p/go-netroute v0.4.0/go.mod h1:Nkd5ShYgSMS5MUKy/MU2T57xFoOKvvLR92Lic48LEyA=
|
||||||
github.com/libp2p/go-reuseport v0.4.0 h1:nR5KU7hD0WxXCJbmw7r2rhRYruNRl2koHw8fQscQm2s=
|
github.com/libp2p/go-reuseport v0.4.0 h1:nR5KU7hD0WxXCJbmw7r2rhRYruNRl2koHw8fQscQm2s=
|
||||||
github.com/libp2p/go-reuseport v0.4.0/go.mod h1:ZtI03j/wO5hZVDFo2jKywN6bYKWLOy8Se6DrI2E1cLU=
|
github.com/libp2p/go-reuseport v0.4.0/go.mod h1:ZtI03j/wO5hZVDFo2jKywN6bYKWLOy8Se6DrI2E1cLU=
|
||||||
github.com/libp2p/go-yamux/v5 v5.0.1 h1:f0WoX/bEF2E8SbE4c/k1Mo+/9z0O4oC/hWEA+nfYRSg=
|
github.com/libp2p/go-yamux/v4 v4.0.2 h1:nrLh89LN/LEiqcFiqdKDRHjGstN300C1269K/EX0CPU=
|
||||||
github.com/libp2p/go-yamux/v5 v5.0.1/go.mod h1:en+3cdX51U0ZslwRdRLrvQsdayFt3TSUKvBGErzpWbU=
|
github.com/libp2p/go-yamux/v4 v4.0.2/go.mod h1:C808cCRgOs1iBwY4S71T5oxgMxgLmqUw56qh4AeBW2o=
|
||||||
github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM=
|
github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM=
|
||||||
github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4=
|
github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4=
|
||||||
github.com/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczGlG91VSDkswnjF5A8=
|
github.com/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczGlG91VSDkswnjF5A8=
|
||||||
@@ -592,8 +620,6 @@ github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0
|
|||||||
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
|
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
|
||||||
github.com/manifoldco/promptui v0.7.0 h1:3l11YT8tm9MnwGFQ4kETwkzpAwY2Jt9lCrumCUW4+z4=
|
github.com/manifoldco/promptui v0.7.0 h1:3l11YT8tm9MnwGFQ4kETwkzpAwY2Jt9lCrumCUW4+z4=
|
||||||
github.com/manifoldco/promptui v0.7.0/go.mod h1:n4zTdgP0vr0S3w7/O/g98U+e0gwLScEXGwov2nIKuGQ=
|
github.com/manifoldco/promptui v0.7.0/go.mod h1:n4zTdgP0vr0S3w7/O/g98U+e0gwLScEXGwov2nIKuGQ=
|
||||||
github.com/marcopolo/simnet v0.0.1 h1:rSMslhPz6q9IvJeFWDoMGxMIrlsbXau3NkuIXHGJxfg=
|
|
||||||
github.com/marcopolo/simnet v0.0.1/go.mod h1:WDaQkgLAjqDUEBAOXz22+1j6wXKfGlC5sD5XWt3ddOs=
|
|
||||||
github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd h1:br0buuQ854V8u83wA0rVZ8ttrq5CpaPZdvrK0LP2lOk=
|
github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd h1:br0buuQ854V8u83wA0rVZ8ttrq5CpaPZdvrK0LP2lOk=
|
||||||
github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd/go.mod h1:QuCEs1Nt24+FYQEqAAncTDPJIuGs+LxK1MCiFL25pMU=
|
github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd/go.mod h1:QuCEs1Nt24+FYQEqAAncTDPJIuGs+LxK1MCiFL25pMU=
|
||||||
github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ=
|
github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ=
|
||||||
@@ -626,8 +652,8 @@ github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1f
|
|||||||
github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE=
|
github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE=
|
||||||
github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4=
|
github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4=
|
||||||
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
|
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
|
||||||
github.com/miekg/dns v1.1.66 h1:FeZXOS3VCVsKnEAd+wBkjMC3D2K+ww66Cq3VnCINuJE=
|
github.com/miekg/dns v1.1.63 h1:8M5aAw6OMZfFXTT7K5V0Eu5YiiL8l7nUAkyN6C9YwaY=
|
||||||
github.com/miekg/dns v1.1.66/go.mod h1:jGFzBsSNbJw6z1HYut1RKBKHA9PBdxeHrZG8J+gC2WE=
|
github.com/miekg/dns v1.1.63/go.mod h1:6NGHfjhpmr5lt3XPLuyfDJi5AXbNIPM9PY6H6sF1Nfs=
|
||||||
github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c h1:bzE/A84HN25pxAuk9Eej1Kz9OUelF97nAc82bDquQI8=
|
github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c h1:bzE/A84HN25pxAuk9Eej1Kz9OUelF97nAc82bDquQI8=
|
||||||
github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c/go.mod h1:0SQS9kMwD2VsyFEB++InYyBJroV/FRmBgcydeSUcJms=
|
github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c/go.mod h1:0SQS9kMwD2VsyFEB++InYyBJroV/FRmBgcydeSUcJms=
|
||||||
github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b h1:z78hV3sbSMAUoyUMM0I83AUIT6Hu17AWfgjzIbtrYFc=
|
github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b h1:z78hV3sbSMAUoyUMM0I83AUIT6Hu17AWfgjzIbtrYFc=
|
||||||
@@ -674,21 +700,21 @@ github.com/multiformats/go-base32 v0.1.0/go.mod h1:Kj3tFY6zNr+ABYMqeUNeGvkIC/UYg
|
|||||||
github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0=
|
github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0=
|
||||||
github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4=
|
github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4=
|
||||||
github.com/multiformats/go-multiaddr v0.1.1/go.mod h1:aMKBKNEYmzmDmxfX88/vz+J5IU55txyt0p4aiWVohjo=
|
github.com/multiformats/go-multiaddr v0.1.1/go.mod h1:aMKBKNEYmzmDmxfX88/vz+J5IU55txyt0p4aiWVohjo=
|
||||||
github.com/multiformats/go-multiaddr v0.16.0 h1:oGWEVKioVQcdIOBlYM8BH1rZDWOGJSqr9/BKl6zQ4qc=
|
github.com/multiformats/go-multiaddr v0.14.0 h1:bfrHrJhrRuh/NXH5mCnemjpbGjzRw/b+tJFOD41g2tU=
|
||||||
github.com/multiformats/go-multiaddr v0.16.0/go.mod h1:JSVUmXDjsVFiW7RjIFMP7+Ev+h1DTbiJgVeTV/tcmP0=
|
github.com/multiformats/go-multiaddr v0.14.0/go.mod h1:6EkVAxtznq2yC3QT5CM1UTAwG0GTP3EWAIcjHuzQ+r4=
|
||||||
github.com/multiformats/go-multiaddr-dns v0.4.1 h1:whi/uCLbDS3mSEUMb1MsoT4uzUeZB0N32yzufqS0i5M=
|
github.com/multiformats/go-multiaddr-dns v0.4.1 h1:whi/uCLbDS3mSEUMb1MsoT4uzUeZB0N32yzufqS0i5M=
|
||||||
github.com/multiformats/go-multiaddr-dns v0.4.1/go.mod h1:7hfthtB4E4pQwirrz+J0CcDUfbWzTqEzVyYKKIKpgkc=
|
github.com/multiformats/go-multiaddr-dns v0.4.1/go.mod h1:7hfthtB4E4pQwirrz+J0CcDUfbWzTqEzVyYKKIKpgkc=
|
||||||
github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E=
|
github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E=
|
||||||
github.com/multiformats/go-multiaddr-fmt v0.1.0/go.mod h1:hGtDIW4PU4BqJ50gW2quDuPVjyWNZxToGUh/HwTZYJo=
|
github.com/multiformats/go-multiaddr-fmt v0.1.0/go.mod h1:hGtDIW4PU4BqJ50gW2quDuPVjyWNZxToGUh/HwTZYJo=
|
||||||
github.com/multiformats/go-multibase v0.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivncJHmHnnd87g=
|
github.com/multiformats/go-multibase v0.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivncJHmHnnd87g=
|
||||||
github.com/multiformats/go-multibase v0.2.0/go.mod h1:bFBZX4lKCA/2lyOFSAoKH5SS6oPyjtnzK/XTFDPkNuk=
|
github.com/multiformats/go-multibase v0.2.0/go.mod h1:bFBZX4lKCA/2lyOFSAoKH5SS6oPyjtnzK/XTFDPkNuk=
|
||||||
github.com/multiformats/go-multicodec v0.9.1 h1:x/Fuxr7ZuR4jJV4Os5g444F7xC4XmyUaT/FWtE+9Zjo=
|
github.com/multiformats/go-multicodec v0.9.0 h1:pb/dlPnzee/Sxv/j4PmkDRxCOi3hXTz3IbPKOXWJkmg=
|
||||||
github.com/multiformats/go-multicodec v0.9.1/go.mod h1:LLWNMtyV5ithSBUo3vFIMaeDy+h3EbkMTek1m+Fybbo=
|
github.com/multiformats/go-multicodec v0.9.0/go.mod h1:L3QTQvMIaVBkXOXXtVmYE+LI16i14xuaojr/H7Ai54k=
|
||||||
github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew=
|
github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew=
|
||||||
github.com/multiformats/go-multihash v0.2.3 h1:7Lyc8XfX/IY2jWb/gI7JP+o7JEq9hOa7BFvVU9RSh+U=
|
github.com/multiformats/go-multihash v0.2.3 h1:7Lyc8XfX/IY2jWb/gI7JP+o7JEq9hOa7BFvVU9RSh+U=
|
||||||
github.com/multiformats/go-multihash v0.2.3/go.mod h1:dXgKXCXjBzdscBLk9JkjINiEsCKRVch90MdaGiKsvSM=
|
github.com/multiformats/go-multihash v0.2.3/go.mod h1:dXgKXCXjBzdscBLk9JkjINiEsCKRVch90MdaGiKsvSM=
|
||||||
github.com/multiformats/go-multistream v0.6.1 h1:4aoX5v6T+yWmc2raBHsTvzmFhOI8WVOer28DeBBEYdQ=
|
github.com/multiformats/go-multistream v0.6.0 h1:ZaHKbsL404720283o4c/IHQXiS6gb8qAN5EIJ4PN5EA=
|
||||||
github.com/multiformats/go-multistream v0.6.1/go.mod h1:ksQf6kqHAb6zIsyw7Zm+gAuVo57Qbq84E27YlYqavqw=
|
github.com/multiformats/go-multistream v0.6.0/go.mod h1:MOyoG5otO24cHIg8kf9QW2/NozURlkP/rvi2FQJyCPg=
|
||||||
github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8=
|
github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8=
|
||||||
github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU=
|
github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU=
|
||||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
|
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
|
||||||
@@ -704,8 +730,9 @@ github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxzi
|
|||||||
github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
|
github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
|
||||||
github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo=
|
github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo=
|
||||||
github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM=
|
github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM=
|
||||||
github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78=
|
|
||||||
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
|
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
|
||||||
|
github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY=
|
||||||
|
github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc=
|
||||||
github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs=
|
github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs=
|
||||||
github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA=
|
github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA=
|
||||||
github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
|
github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
|
||||||
@@ -718,6 +745,8 @@ github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108
|
|||||||
github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
|
github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
|
||||||
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
|
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
|
||||||
github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
|
github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
|
||||||
|
github.com/onsi/ginkgo/v2 v2.22.2 h1:/3X8Panh8/WwhU/3Ssa6rCKqPLuAkVY2I0RoyDLySlU=
|
||||||
|
github.com/onsi/ginkgo/v2 v2.22.2/go.mod h1:oeMosUL+8LtarXBHu/c0bx2D/K9zyQ6uX3cTyztHwsk=
|
||||||
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
||||||
github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
||||||
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
|
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
|
||||||
@@ -727,6 +756,9 @@ github.com/onsi/gomega v1.36.2/go.mod h1:DdwyADRjrc825LhMEkD76cHR5+pUnjhUN8GlHlR
|
|||||||
github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk=
|
github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk=
|
||||||
github.com/openconfig/gnmi v0.0.0-20190823184014-89b2bf29312c/go.mod h1:t+O9It+LKzfOAhKTT5O0ehDix+MTqbtT0T9t+7zzOvc=
|
github.com/openconfig/gnmi v0.0.0-20190823184014-89b2bf29312c/go.mod h1:t+O9It+LKzfOAhKTT5O0ehDix+MTqbtT0T9t+7zzOvc=
|
||||||
github.com/openconfig/reference v0.0.0-20190727015836-8dfd928c9696/go.mod h1:ym2A+zigScwkSEb/cVQB0/ZMpU3rqiH6X7WRRsxgOGw=
|
github.com/openconfig/reference v0.0.0-20190727015836-8dfd928c9696/go.mod h1:ym2A+zigScwkSEb/cVQB0/ZMpU3rqiH6X7WRRsxgOGw=
|
||||||
|
github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
|
||||||
|
github.com/opencontainers/runtime-spec v1.2.0 h1:z97+pHb3uELt/yiAWD691HNHQIF07bE7dzrbT927iTk=
|
||||||
|
github.com/opencontainers/runtime-spec v1.2.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
|
||||||
github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis=
|
github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis=
|
||||||
github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74=
|
github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74=
|
||||||
github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
|
github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
|
||||||
@@ -768,29 +800,33 @@ github.com/pion/datachannel v1.5.10/go.mod h1:p/jJfC9arb29W7WrxyKbepTU20CFgyx5oL
|
|||||||
github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s=
|
github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s=
|
||||||
github.com/pion/dtls/v2 v2.2.12 h1:KP7H5/c1EiVAAKUmXyCzPiQe5+bCJrpOeKg/L05dunk=
|
github.com/pion/dtls/v2 v2.2.12 h1:KP7H5/c1EiVAAKUmXyCzPiQe5+bCJrpOeKg/L05dunk=
|
||||||
github.com/pion/dtls/v2 v2.2.12/go.mod h1:d9SYc9fch0CqK90mRk1dC7AkzzpwJj6u2GU3u+9pqFE=
|
github.com/pion/dtls/v2 v2.2.12/go.mod h1:d9SYc9fch0CqK90mRk1dC7AkzzpwJj6u2GU3u+9pqFE=
|
||||||
github.com/pion/dtls/v3 v3.0.6 h1:7Hkd8WhAJNbRgq9RgdNh1aaWlZlGpYTzdqjy9x9sK2E=
|
github.com/pion/dtls/v3 v3.0.4 h1:44CZekewMzfrn9pmGrj5BNnTMDCFwr+6sLH+cCuLM7U=
|
||||||
github.com/pion/dtls/v3 v3.0.6/go.mod h1:iJxNQ3Uhn1NZWOMWlLxEEHAN5yX7GyPvvKw04v9bzYU=
|
github.com/pion/dtls/v3 v3.0.4/go.mod h1:R373CsjxWqNPf6MEkfdy3aSe9niZvL/JaKlGeFphtMg=
|
||||||
github.com/pion/ice/v4 v4.0.10 h1:P59w1iauC/wPk9PdY8Vjl4fOFL5B+USq1+xbDcN6gT4=
|
github.com/pion/ice/v2 v2.3.37 h1:ObIdaNDu1rCo7hObhs34YSBcO7fjslJMZV0ux+uZWh0=
|
||||||
github.com/pion/ice/v4 v4.0.10/go.mod h1:y3M18aPhIxLlcO/4dn9X8LzLLSma84cx6emMSu14FGw=
|
github.com/pion/ice/v2 v2.3.37/go.mod h1:mBF7lnigdqgtB+YHkaY/Y6s6tsyRyo4u4rPGRuOjUBQ=
|
||||||
github.com/pion/interceptor v0.1.40 h1:e0BjnPcGpr2CFQgKhrQisBU7V3GXK6wrfYrGYaU6Jq4=
|
github.com/pion/ice/v4 v4.0.6 h1:jmM9HwI9lfetQV/39uD0nY4y++XZNPhvzIPCb8EwxUM=
|
||||||
github.com/pion/interceptor v0.1.40/go.mod h1:Z6kqH7M/FYirg3frjGJ21VLSRJGBXB/KqaTIrdqnOic=
|
github.com/pion/ice/v4 v4.0.6/go.mod h1:y3M18aPhIxLlcO/4dn9X8LzLLSma84cx6emMSu14FGw=
|
||||||
|
github.com/pion/interceptor v0.1.37 h1:aRA8Zpab/wE7/c0O3fh1PqY0AJI3fCSEM5lRWJVorwI=
|
||||||
|
github.com/pion/interceptor v0.1.37/go.mod h1:JzxbJ4umVTlZAf+/utHzNesY8tmRkM2lVmkS82TTj8Y=
|
||||||
github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms=
|
github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms=
|
||||||
github.com/pion/logging v0.2.3 h1:gHuf0zpoh1GW67Nr6Gj4cv5Z9ZscU7g/EaoC/Ke/igI=
|
github.com/pion/logging v0.2.3 h1:gHuf0zpoh1GW67Nr6Gj4cv5Z9ZscU7g/EaoC/Ke/igI=
|
||||||
github.com/pion/logging v0.2.3/go.mod h1:z8YfknkquMe1csOrxK5kc+5/ZPAzMxbKLX5aXpbpC90=
|
github.com/pion/logging v0.2.3/go.mod h1:z8YfknkquMe1csOrxK5kc+5/ZPAzMxbKLX5aXpbpC90=
|
||||||
|
github.com/pion/mdns v0.0.12 h1:CiMYlY+O0azojWDmxdNr7ADGrnZ+V6Ilfner+6mSVK8=
|
||||||
|
github.com/pion/mdns v0.0.12/go.mod h1:VExJjv8to/6Wqm1FXK+Ii/Z9tsVk/F5sD/N70cnYFbk=
|
||||||
github.com/pion/mdns/v2 v2.0.7 h1:c9kM8ewCgjslaAmicYMFQIde2H9/lrZpjBkN8VwoVtM=
|
github.com/pion/mdns/v2 v2.0.7 h1:c9kM8ewCgjslaAmicYMFQIde2H9/lrZpjBkN8VwoVtM=
|
||||||
github.com/pion/mdns/v2 v2.0.7/go.mod h1:vAdSYNAT0Jy3Ru0zl2YiW3Rm/fJCwIeM0nToenfOJKA=
|
github.com/pion/mdns/v2 v2.0.7/go.mod h1:vAdSYNAT0Jy3Ru0zl2YiW3Rm/fJCwIeM0nToenfOJKA=
|
||||||
github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA=
|
github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA=
|
||||||
github.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8=
|
github.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8=
|
||||||
github.com/pion/rtcp v1.2.15 h1:LZQi2JbdipLOj4eBjK4wlVoQWfrZbh3Q6eHtWtJBZBo=
|
github.com/pion/rtcp v1.2.15 h1:LZQi2JbdipLOj4eBjK4wlVoQWfrZbh3Q6eHtWtJBZBo=
|
||||||
github.com/pion/rtcp v1.2.15/go.mod h1:jlGuAjHMEXwMUHK78RgX0UmEJFV4zUKOFHR7OP+D3D0=
|
github.com/pion/rtcp v1.2.15/go.mod h1:jlGuAjHMEXwMUHK78RgX0UmEJFV4zUKOFHR7OP+D3D0=
|
||||||
github.com/pion/rtp v1.8.19 h1:jhdO/3XhL/aKm/wARFVmvTfq0lC/CvN1xwYKmduly3c=
|
github.com/pion/rtp v1.8.11 h1:17xjnY5WO5hgO6SD3/NTIUPvSFw/PbLsIJyz1r1yNIk=
|
||||||
github.com/pion/rtp v1.8.19/go.mod h1:bAu2UFKScgzyFqvUKmbvzSdPr+NGbZtv6UB2hesqXBk=
|
github.com/pion/rtp v1.8.11/go.mod h1:8uMBJj32Pa1wwx8Fuv/AsFhn8jsgw+3rUC2PfoBZ8p4=
|
||||||
github.com/pion/sctp v1.8.39 h1:PJma40vRHa3UTO3C4MyeJDQ+KIobVYRZQZ0Nt7SjQnE=
|
github.com/pion/sctp v1.8.35 h1:qwtKvNK1Wc5tHMIYgTDJhfZk7vATGVHhXbUDfHbYwzA=
|
||||||
github.com/pion/sctp v1.8.39/go.mod h1:cNiLdchXra8fHQwmIoqw0MbLLMs+f7uQ+dGMG2gWebE=
|
github.com/pion/sctp v1.8.35/go.mod h1:EcXP8zCYVTRy3W9xtOF7wJm1L1aXfKRQzaM33SjQlzg=
|
||||||
github.com/pion/sdp/v3 v3.0.13 h1:uN3SS2b+QDZnWXgdr69SM8KB4EbcnPnPf2Laxhty/l4=
|
github.com/pion/sdp/v3 v3.0.10 h1:6MChLE/1xYB+CjumMw+gZ9ufp2DPApuVSnDT8t5MIgA=
|
||||||
github.com/pion/sdp/v3 v3.0.13/go.mod h1:88GMahN5xnScv1hIMTqLdu/cOcUkj6a9ytbncwMCq2E=
|
github.com/pion/sdp/v3 v3.0.10/go.mod h1:88GMahN5xnScv1hIMTqLdu/cOcUkj6a9ytbncwMCq2E=
|
||||||
github.com/pion/srtp/v3 v3.0.6 h1:E2gyj1f5X10sB/qILUGIkL4C2CqK269Xq167PbGCc/4=
|
github.com/pion/srtp/v3 v3.0.4 h1:2Z6vDVxzrX3UHEgrUyIGM4rRouoC7v+NiF1IHtp9B5M=
|
||||||
github.com/pion/srtp/v3 v3.0.6/go.mod h1:BxvziG3v/armJHAaJ87euvkhHqWe9I7iiOy50K2QkhY=
|
github.com/pion/srtp/v3 v3.0.4/go.mod h1:1Jx3FwDoxpRaTh1oRV8A/6G1BnFL+QI82eK4ms8EEJQ=
|
||||||
github.com/pion/stun v0.6.1 h1:8lp6YejULeHBF8NmV8e2787BogQhduZugh5PdhDyyN4=
|
github.com/pion/stun v0.6.1 h1:8lp6YejULeHBF8NmV8e2787BogQhduZugh5PdhDyyN4=
|
||||||
github.com/pion/stun v0.6.1/go.mod h1:/hO7APkX4hZKu/D0f2lHzNyvdkTGtIy3NDmLR7kSz/8=
|
github.com/pion/stun v0.6.1/go.mod h1:/hO7APkX4hZKu/D0f2lHzNyvdkTGtIy3NDmLR7kSz/8=
|
||||||
github.com/pion/stun/v2 v2.0.0 h1:A5+wXKLAypxQri59+tmQKVs7+l6mMM+3d+eER9ifRU0=
|
github.com/pion/stun/v2 v2.0.0 h1:A5+wXKLAypxQri59+tmQKVs7+l6mMM+3d+eER9ifRU0=
|
||||||
@@ -804,10 +840,13 @@ github.com/pion/transport/v2 v2.2.10/go.mod h1:sq1kSLWs+cHW9E+2fJP95QudkzbK7wscs
|
|||||||
github.com/pion/transport/v3 v3.0.1/go.mod h1:UY7kiITrlMv7/IKgd5eTUcaahZx5oUN3l9SzK5f5xE0=
|
github.com/pion/transport/v3 v3.0.1/go.mod h1:UY7kiITrlMv7/IKgd5eTUcaahZx5oUN3l9SzK5f5xE0=
|
||||||
github.com/pion/transport/v3 v3.0.7 h1:iRbMH05BzSNwhILHoBoAPxoB9xQgOaJk+591KC9P1o0=
|
github.com/pion/transport/v3 v3.0.7 h1:iRbMH05BzSNwhILHoBoAPxoB9xQgOaJk+591KC9P1o0=
|
||||||
github.com/pion/transport/v3 v3.0.7/go.mod h1:YleKiTZ4vqNxVwh77Z0zytYi7rXHl7j6uPLGhhz9rwo=
|
github.com/pion/transport/v3 v3.0.7/go.mod h1:YleKiTZ4vqNxVwh77Z0zytYi7rXHl7j6uPLGhhz9rwo=
|
||||||
github.com/pion/turn/v4 v4.0.2 h1:ZqgQ3+MjP32ug30xAbD6Mn+/K4Sxi3SdNOTFf+7mpps=
|
github.com/pion/turn/v2 v2.1.3/go.mod h1:huEpByKKHix2/b9kmTAM3YoX6MKP+/D//0ClgUYR2fY=
|
||||||
github.com/pion/turn/v4 v4.0.2/go.mod h1:pMMKP/ieNAG/fN5cZiN4SDuyKsXtNTr0ccN7IToA1zs=
|
github.com/pion/turn/v2 v2.1.6 h1:Xr2niVsiPTB0FPtt+yAWKFUkU1eotQbGgpTIld4x1Gc=
|
||||||
github.com/pion/webrtc/v4 v4.1.2 h1:mpuUo/EJ1zMNKGE79fAdYNFZBX790KE7kQQpLMjjR54=
|
github.com/pion/turn/v2 v2.1.6/go.mod h1:huEpByKKHix2/b9kmTAM3YoX6MKP+/D//0ClgUYR2fY=
|
||||||
github.com/pion/webrtc/v4 v4.1.2/go.mod h1:xsCXiNAmMEjIdFxAYU0MbB3RwRieJsegSB2JZsGN+8U=
|
github.com/pion/turn/v4 v4.0.0 h1:qxplo3Rxa9Yg1xXDxxH8xaqcyGUtbHYw4QSCvmFWvhM=
|
||||||
|
github.com/pion/turn/v4 v4.0.0/go.mod h1:MuPDkm15nYSklKpN8vWJ9W2M0PlyQZqYt1McGuxG7mA=
|
||||||
|
github.com/pion/webrtc/v4 v4.0.8 h1:T1ZmnT9qxIJIt4d8XoiMOBrTClGHDDXNg9e/fh018Qc=
|
||||||
|
github.com/pion/webrtc/v4 v4.0.8/go.mod h1:HHBeUVBAC+j4ZFnYhovEFStF02Arb1EyD4G7e7HBTJw=
|
||||||
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
|
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
|
||||||
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
@@ -830,16 +869,16 @@ github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeD
|
|||||||
github.com/prometheus/client_golang v1.4.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=
|
github.com/prometheus/client_golang v1.4.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=
|
||||||
github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
|
github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
|
||||||
github.com/prometheus/client_golang v1.9.0/go.mod h1:FqZLKOZnGdFAhOK4nqGHa7D66IdsO+O441Eve7ptJDU=
|
github.com/prometheus/client_golang v1.9.0/go.mod h1:FqZLKOZnGdFAhOK4nqGHa7D66IdsO+O441Eve7ptJDU=
|
||||||
github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q=
|
github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y=
|
||||||
github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0=
|
github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE=
|
||||||
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
||||||
github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
||||||
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||||
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||||
github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||||
github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||||
github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk=
|
github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
|
||||||
github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE=
|
github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
|
||||||
github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
|
github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
|
||||||
github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
|
github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
|
||||||
github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
|
github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
|
||||||
@@ -847,8 +886,8 @@ github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt2
|
|||||||
github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=
|
github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=
|
||||||
github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
|
github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
|
||||||
github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s=
|
github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s=
|
||||||
github.com/prometheus/common v0.64.0 h1:pdZeA+g617P7oGv1CzdTzyeShxAGrTBsolKNOLQPGO4=
|
github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io=
|
||||||
github.com/prometheus/common v0.64.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8=
|
github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I=
|
||||||
github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
||||||
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
||||||
github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
||||||
@@ -857,8 +896,8 @@ github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+Gx
|
|||||||
github.com/prometheus/procfs v0.0.10/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
|
github.com/prometheus/procfs v0.0.10/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
|
||||||
github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
|
github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
|
||||||
github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
|
github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
|
||||||
github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg=
|
github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
|
||||||
github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is=
|
github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
|
||||||
github.com/prometheus/prom2json v1.3.0 h1:BlqrtbT9lLH3ZsOVhXPsHzFrApCTKRifB7gjJuypu6Y=
|
github.com/prometheus/prom2json v1.3.0 h1:BlqrtbT9lLH3ZsOVhXPsHzFrApCTKRifB7gjJuypu6Y=
|
||||||
github.com/prometheus/prom2json v1.3.0/go.mod h1:rMN7m0ApCowcoDlypBHlkNbp5eJQf/+1isKykIP5ZnM=
|
github.com/prometheus/prom2json v1.3.0/go.mod h1:rMN7m0ApCowcoDlypBHlkNbp5eJQf/+1isKykIP5ZnM=
|
||||||
github.com/prysmaticlabs/fastssz v0.0.0-20251103153600-259302269bfc h1:ASmh3y4ALne2OoabF5pPL8OcIpBko8gFMg5018MxkBI=
|
github.com/prysmaticlabs/fastssz v0.0.0-20251103153600-259302269bfc h1:ASmh3y4ALne2OoabF5pPL8OcIpBko8gFMg5018MxkBI=
|
||||||
@@ -872,12 +911,14 @@ github.com/prysmaticlabs/protoc-gen-go-cast v0.0.0-20230228205207-28762a7b9294 h
|
|||||||
github.com/prysmaticlabs/protoc-gen-go-cast v0.0.0-20230228205207-28762a7b9294/go.mod h1:ZVEbRdnMkGhp/pu35zq4SXxtvUwWK0J1MATtekZpH2Y=
|
github.com/prysmaticlabs/protoc-gen-go-cast v0.0.0-20230228205207-28762a7b9294/go.mod h1:ZVEbRdnMkGhp/pu35zq4SXxtvUwWK0J1MATtekZpH2Y=
|
||||||
github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI=
|
github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI=
|
||||||
github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg=
|
github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg=
|
||||||
github.com/quic-go/quic-go v0.55.0 h1:zccPQIqYCXDt5NmcEabyYvOnomjs8Tlwl7tISjJh9Mk=
|
github.com/quic-go/quic-go v0.49.1-0.20250925085836-275c172fec2b h1:x09Agz4ATTMEP3qb5P0MRxNZfd6O9wAyK3qwwqQZVQc=
|
||||||
github.com/quic-go/quic-go v0.55.0/go.mod h1:DR51ilwU1uE164KuWXhinFcKWGlEjzys2l8zUl5Ss1U=
|
github.com/quic-go/quic-go v0.49.1-0.20250925085836-275c172fec2b/go.mod h1:s2wDnmCdooUQBmQfpUSTCYBl1/D4FcqbULMMkASvR6s=
|
||||||
github.com/quic-go/webtransport-go v0.9.0 h1:jgys+7/wm6JarGDrW+lD/r9BGqBAmqY/ssklE09bA70=
|
github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66 h1:4WFk6u3sOT6pLa1kQ50ZVdm8BQFgJNA117cepZxtLIg=
|
||||||
github.com/quic-go/webtransport-go v0.9.0/go.mod h1:4FUYIiUc75XSsF6HShcLeXXYZJ9AGwo/xh3L8M/P1ao=
|
github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66/go.mod h1:Vp72IJajgeOL6ddqrAhmp7IM9zbTcgkQxD/YdxrVwMw=
|
||||||
github.com/r3labs/sse/v2 v2.10.0 h1:hFEkLLFY4LDifoHdiCN/LlGBAdVJYsANaLqNYa1l/v0=
|
github.com/r3labs/sse/v2 v2.10.0 h1:hFEkLLFY4LDifoHdiCN/LlGBAdVJYsANaLqNYa1l/v0=
|
||||||
github.com/r3labs/sse/v2 v2.10.0/go.mod h1:Igau6Whc+F17QUgML1fYe1VPZzTV6EMCnYktEmkNJ7I=
|
github.com/r3labs/sse/v2 v2.10.0/go.mod h1:Igau6Whc+F17QUgML1fYe1VPZzTV6EMCnYktEmkNJ7I=
|
||||||
|
github.com/raulk/go-watchdog v1.3.0 h1:oUmdlHxdkXRJlwfG0O9omj8ukerm8MEQavSiDTEtBsk=
|
||||||
|
github.com/raulk/go-watchdog v1.3.0/go.mod h1:fIvOnLbF0b0ZwkB9YU4mOW9Did//4vPZtDqv66NfsMU=
|
||||||
github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
|
github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
|
||||||
github.com/rcrowley/go-metrics v0.0.0-20190826022208-cac0b30c2563/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
|
github.com/rcrowley/go-metrics v0.0.0-20190826022208-cac0b30c2563/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
|
||||||
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
|
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
|
||||||
@@ -930,6 +971,7 @@ github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5k
|
|||||||
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
||||||
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
|
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
|
||||||
github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
|
github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
|
||||||
|
github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
|
||||||
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
|
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
|
||||||
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
|
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
|
||||||
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
|
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
|
||||||
@@ -995,6 +1037,7 @@ github.com/trailofbits/go-mutexasserts v0.0.0-20250212181730-4c2b8e9e784b h1:EBo
|
|||||||
github.com/trailofbits/go-mutexasserts v0.0.0-20250212181730-4c2b8e9e784b/go.mod h1:4R6Qam+w871wOlyRq59zRLjhb5x9/De/wgPeaCTaCwI=
|
github.com/trailofbits/go-mutexasserts v0.0.0-20250212181730-4c2b8e9e784b/go.mod h1:4R6Qam+w871wOlyRq59zRLjhb5x9/De/wgPeaCTaCwI=
|
||||||
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
|
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
|
||||||
github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
|
github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
|
||||||
|
github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
|
||||||
github.com/urfave/cli/v2 v2.27.6 h1:VdRdS98FNhKZ8/Az8B7MTyGQmpIr36O1EHybx/LaZ4g=
|
github.com/urfave/cli/v2 v2.27.6 h1:VdRdS98FNhKZ8/Az8B7MTyGQmpIr36O1EHybx/LaZ4g=
|
||||||
github.com/urfave/cli/v2 v2.27.6/go.mod h1:3Sevf16NykTbInEnD0yKkjDAeZDS0A6bzhBH5hrMvTQ=
|
github.com/urfave/cli/v2 v2.27.6/go.mod h1:3Sevf16NykTbInEnD0yKkjDAeZDS0A6bzhBH5hrMvTQ=
|
||||||
github.com/uudashr/gocognit v1.0.5 h1:rrSex7oHr3/pPLQ0xoWq108XMU8s678FJcQ+aSfOHa4=
|
github.com/uudashr/gocognit v1.0.5 h1:rrSex7oHr3/pPLQ0xoWq108XMU8s678FJcQ+aSfOHa4=
|
||||||
@@ -1075,10 +1118,10 @@ go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
|
|||||||
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
|
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
|
||||||
go.uber.org/automaxprocs v1.5.2 h1:2LxUOGiR3O6tw8ui5sZa2LAaHnsviZdVOUZw4fvbnME=
|
go.uber.org/automaxprocs v1.5.2 h1:2LxUOGiR3O6tw8ui5sZa2LAaHnsviZdVOUZw4fvbnME=
|
||||||
go.uber.org/automaxprocs v1.5.2/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0=
|
go.uber.org/automaxprocs v1.5.2/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0=
|
||||||
go.uber.org/dig v1.19.0 h1:BACLhebsYdpQ7IROQ1AGPjrXcP5dF80U3gKoFzbaq/4=
|
go.uber.org/dig v1.18.0 h1:imUL1UiY0Mg4bqbFfsRQO5G4CGRBec/ZujWTvSVp3pw=
|
||||||
go.uber.org/dig v1.19.0/go.mod h1:Us0rSJiThwCv2GteUN0Q7OKvU7n5J4dxZ9JKUXozFdE=
|
go.uber.org/dig v1.18.0/go.mod h1:Us0rSJiThwCv2GteUN0Q7OKvU7n5J4dxZ9JKUXozFdE=
|
||||||
go.uber.org/fx v1.24.0 h1:wE8mruvpg2kiiL1Vqd0CC+tr0/24XIB10Iwp2lLWzkg=
|
go.uber.org/fx v1.23.0 h1:lIr/gYWQGfTwGcSXWXu4vP5Ws6iqnNEIY+F/aFzCKTg=
|
||||||
go.uber.org/fx v1.24.0/go.mod h1:AmDeGyS+ZARGKM4tlH4FY2Jr63VjbEDJHtqXTGP5hbo=
|
go.uber.org/fx v1.23.0/go.mod h1:o/D9n+2mLP6v1EG+qsdT1O8wKopYAsqZasju97SDFCU=
|
||||||
go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
|
go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
|
||||||
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
|
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
|
||||||
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
|
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
|
||||||
@@ -1134,8 +1177,8 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0
|
|||||||
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
|
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
|
||||||
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
|
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
|
||||||
golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw=
|
golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw=
|
||||||
golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476 h1:bsqhLWFR6G6xiQcb+JoGqdKdRU6WzPWmK8E0jxTjzo4=
|
golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI=
|
||||||
golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8=
|
golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ=
|
||||||
golang.org/x/exp/typeparams v0.0.0-20231108232855-2478ac86f678 h1:1P7xPZEwZMoBoz0Yze5Nx2/4pxj6nw9ZqHWXqP0iRgQ=
|
golang.org/x/exp/typeparams v0.0.0-20231108232855-2478ac86f678 h1:1P7xPZEwZMoBoz0Yze5Nx2/4pxj6nw9ZqHWXqP0iRgQ=
|
||||||
golang.org/x/exp/typeparams v0.0.0-20231108232855-2478ac86f678/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=
|
golang.org/x/exp/typeparams v0.0.0-20231108232855-2478ac86f678/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=
|
||||||
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
|
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
|
||||||
@@ -1236,8 +1279,8 @@ golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ
|
|||||||
golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||||
golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||||
golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||||
golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI=
|
golang.org/x/oauth2 v0.25.0 h1:CY4y7XT9v0cRI9oupztF8AgiIu99L/ksR/Xp/6jrZ70=
|
||||||
golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU=
|
golang.org/x/oauth2 v0.25.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
|
||||||
golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw=
|
golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw=
|
||||||
golang.org/x/sync v0.0.0-20170517211232-f52d1811a629/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20170517211232-f52d1811a629/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
@@ -1255,6 +1298,7 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJ
|
|||||||
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I=
|
golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I=
|
||||||
golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
|
golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
|
||||||
|
golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
@@ -1291,6 +1335,7 @@ golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7w
|
|||||||
golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200219091948-cb0a6d8edb6c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200219091948-cb0a6d8edb6c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
@@ -1337,6 +1382,7 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|||||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc=
|
golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc=
|
||||||
@@ -1376,12 +1422,13 @@ golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxb
|
|||||||
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE=
|
golang.org/x/time v0.9.0 h1:EsRrnYcQiGH+5FfbgvV4AP7qEZstoyrHB0DzarOQ4ZY=
|
||||||
golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg=
|
golang.org/x/time v0.9.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
|
||||||
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
|
golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
||||||
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||||
@@ -1566,8 +1613,8 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj
|
|||||||
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
|
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
|
||||||
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
|
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
|
||||||
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
||||||
google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=
|
google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM=
|
||||||
google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
|
google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
|
||||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
|
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
|
||||||
gopkg.in/bsm/ratelimit.v1 v1.0.0-20160220154919-db14e161995a/go.mod h1:KF9sEfUPAXdG8Oev9e99iLGnl2uJMjc5B+4y3O7x610=
|
gopkg.in/bsm/ratelimit.v1 v1.0.0-20160220154919-db14e161995a/go.mod h1:KF9sEfUPAXdG8Oev9e99iLGnl2uJMjc5B+4y3O7x610=
|
||||||
gopkg.in/cenkalti/backoff.v1 v1.1.0 h1:Arh75ttbsvlpVA7WtVpH4u9h6Zl46xuptxqLxPiSo4Y=
|
gopkg.in/cenkalti/backoff.v1 v1.1.0 h1:Arh75ttbsvlpVA7WtVpH4u9h6Zl46xuptxqLxPiSo4Y=
|
||||||
@@ -1633,8 +1680,8 @@ k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7F
|
|||||||
k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98=
|
k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98=
|
||||||
k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI=
|
k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI=
|
||||||
k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
|
k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
|
||||||
lukechampine.com/blake3 v1.4.1 h1:I3Smz7gso8w4/TunLKec6K2fn+kyKtDxr/xcQEN84Wg=
|
lukechampine.com/blake3 v1.3.0 h1:sJ3XhFINmHSrYCgl958hscfIa3bw8x4DqMP3u1YvoYE=
|
||||||
lukechampine.com/blake3 v1.4.1/go.mod h1:QFosUxmjB8mnrWFSNwKmvxHpfY72bmD2tQ0kBMM3kwo=
|
lukechampine.com/blake3 v1.3.0/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k=
|
||||||
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
|
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
|
||||||
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
|
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
|
||||||
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
|
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
|
||||||
|
|||||||
@@ -1,21 +0,0 @@
|
|||||||
load("@prysm//tools/go:def.bzl", "go_library", "go_test")
|
|
||||||
|
|
||||||
go_library(
|
|
||||||
name = "go_default_library",
|
|
||||||
srcs = [
|
|
||||||
"adapter.go",
|
|
||||||
"log.go",
|
|
||||||
],
|
|
||||||
importpath = "github.com/OffchainLabs/prysm/v7/internal/logrusadapter",
|
|
||||||
visibility = ["//:__subpackages__"],
|
|
||||||
deps = ["@com_github_sirupsen_logrus//:go_default_library"],
|
|
||||||
)
|
|
||||||
|
|
||||||
go_test(
|
|
||||||
name = "go_default_test",
|
|
||||||
srcs = ["adapter_test.go"],
|
|
||||||
deps = [
|
|
||||||
":go_default_library",
|
|
||||||
"@com_github_sirupsen_logrus//:go_default_library",
|
|
||||||
],
|
|
||||||
)
|
|
||||||
@@ -1,75 +0,0 @@
|
|||||||
package logrusadapter
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"log/slog"
|
|
||||||
|
|
||||||
"github.com/sirupsen/logrus"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Handler wraps a logrus.Logger to satisfy slog.Handler.
|
|
||||||
type Handler struct {
|
|
||||||
Logger *logrus.Logger
|
|
||||||
}
|
|
||||||
|
|
||||||
// Enabled implements slog.Handler.
|
|
||||||
func (h Handler) Enabled(_ context.Context, level slog.Level) bool {
|
|
||||||
switch level {
|
|
||||||
case slog.LevelDebug:
|
|
||||||
return h.Logger.Level >= logrus.DebugLevel
|
|
||||||
case slog.LevelInfo:
|
|
||||||
return h.Logger.Level >= logrus.InfoLevel
|
|
||||||
case slog.LevelWarn:
|
|
||||||
return h.Logger.Level >= logrus.WarnLevel
|
|
||||||
case slog.LevelError:
|
|
||||||
return h.Logger.Level >= logrus.ErrorLevel
|
|
||||||
default:
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handle converts slog.Record into a logrus.Entry.
|
|
||||||
func (h Handler) Handle(_ context.Context, r slog.Record) error {
|
|
||||||
entry := h.Logger.WithTime(r.Time)
|
|
||||||
|
|
||||||
r.Attrs(func(a slog.Attr) bool {
|
|
||||||
if a.Value.Kind() == slog.KindLogValuer {
|
|
||||||
entry = entry.WithField(a.Key, a.Value.LogValuer().LogValue().Any())
|
|
||||||
} else {
|
|
||||||
entry = entry.WithField(a.Key, a.Value.Any())
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
})
|
|
||||||
|
|
||||||
switch r.Level {
|
|
||||||
case slog.LevelDebug:
|
|
||||||
entry.Debug(r.Message)
|
|
||||||
case slog.LevelInfo:
|
|
||||||
entry.Info(r.Message)
|
|
||||||
case slog.LevelWarn:
|
|
||||||
entry.Warn(r.Message)
|
|
||||||
case slog.LevelError:
|
|
||||||
entry.Error(r.Message)
|
|
||||||
default:
|
|
||||||
entry.Print(r.Message)
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithAttrs implements slog.Handler.
|
|
||||||
func (h Handler) WithAttrs(attrs []slog.Attr) slog.Handler {
|
|
||||||
logger := h.Logger.WithFields(toFields(attrs))
|
|
||||||
return Handler{Logger: logger.Logger}
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithGroup implements slog.Handler (no-op for simplicity).
|
|
||||||
func (h Handler) WithGroup(_ string) slog.Handler { return h }
|
|
||||||
|
|
||||||
func toFields(attrs []slog.Attr) logrus.Fields {
|
|
||||||
fields := logrus.Fields{}
|
|
||||||
for _, a := range attrs {
|
|
||||||
fields[a.Key] = a.Value.Any()
|
|
||||||
}
|
|
||||||
return fields
|
|
||||||
}
|
|
||||||
@@ -1,170 +0,0 @@
|
|||||||
package logrusadapter_test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"context"
|
|
||||||
"log/slog"
|
|
||||||
"strings"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/OffchainLabs/prysm/v7/internal/logrusadapter"
|
|
||||||
"github.com/sirupsen/logrus"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestLogrusAdapter(t *testing.T) {
|
|
||||||
var outBuf bytes.Buffer
|
|
||||||
l := logrus.Logger{
|
|
||||||
Out: &outBuf,
|
|
||||||
Formatter: &logrus.TextFormatter{},
|
|
||||||
Level: logrus.DebugLevel,
|
|
||||||
}
|
|
||||||
|
|
||||||
slogger := slog.New(logrusadapter.Handler{Logger: &l})
|
|
||||||
slogger.Error("test")
|
|
||||||
|
|
||||||
if !strings.Contains(outBuf.String(), "test") {
|
|
||||||
t.Errorf("unexpected output: %s", outBuf.String())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestLevelMapping(t *testing.T) {
|
|
||||||
tests := []struct {
|
|
||||||
name string
|
|
||||||
slogLevel slog.Level
|
|
||||||
logrusLevel logrus.Level
|
|
||||||
message string
|
|
||||||
wantInLog string
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
name: "Debug level",
|
|
||||||
slogLevel: slog.LevelDebug,
|
|
||||||
logrusLevel: logrus.DebugLevel,
|
|
||||||
message: "debug message",
|
|
||||||
wantInLog: "level=debug",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "Info level",
|
|
||||||
slogLevel: slog.LevelInfo,
|
|
||||||
logrusLevel: logrus.InfoLevel,
|
|
||||||
message: "info message",
|
|
||||||
wantInLog: "level=info",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "Warn level",
|
|
||||||
slogLevel: slog.LevelWarn,
|
|
||||||
logrusLevel: logrus.WarnLevel,
|
|
||||||
message: "warn message",
|
|
||||||
wantInLog: "level=warning",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "Error level",
|
|
||||||
slogLevel: slog.LevelError,
|
|
||||||
logrusLevel: logrus.ErrorLevel,
|
|
||||||
message: "error message",
|
|
||||||
wantInLog: "level=error",
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, tt := range tests {
|
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
|
||||||
var outBuf bytes.Buffer
|
|
||||||
l := logrus.Logger{
|
|
||||||
Out: &outBuf,
|
|
||||||
Formatter: &logrus.TextFormatter{},
|
|
||||||
Level: tt.logrusLevel,
|
|
||||||
}
|
|
||||||
|
|
||||||
slogger := slog.New(logrusadapter.Handler{Logger: &l})
|
|
||||||
|
|
||||||
// Log at the specified level
|
|
||||||
switch tt.slogLevel {
|
|
||||||
case slog.LevelDebug:
|
|
||||||
slogger.Debug(tt.message)
|
|
||||||
case slog.LevelInfo:
|
|
||||||
slogger.Info(tt.message)
|
|
||||||
case slog.LevelWarn:
|
|
||||||
slogger.Warn(tt.message)
|
|
||||||
case slog.LevelError:
|
|
||||||
slogger.Error(tt.message)
|
|
||||||
}
|
|
||||||
|
|
||||||
output := outBuf.String()
|
|
||||||
if !strings.Contains(output, tt.message) {
|
|
||||||
t.Errorf("expected message %q not found in output: %s", tt.message, output)
|
|
||||||
}
|
|
||||||
if !strings.Contains(output, tt.wantInLog) {
|
|
||||||
t.Errorf("expected level indicator %q not found in output: %s", tt.wantInLog, output)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestEnabledLevels(t *testing.T) {
|
|
||||||
tests := []struct {
|
|
||||||
shouldBeEnabled bool
|
|
||||||
logrusLevel logrus.Level
|
|
||||||
slogLevel slog.Level
|
|
||||||
name string
|
|
||||||
}{
|
|
||||||
// When logrus is at DebugLevel, all levels should be enabled
|
|
||||||
{name: "Debug logger, debug level", logrusLevel: logrus.DebugLevel, slogLevel: slog.LevelDebug, shouldBeEnabled: true},
|
|
||||||
{name: "Debug logger, info level", logrusLevel: logrus.DebugLevel, slogLevel: slog.LevelInfo, shouldBeEnabled: true},
|
|
||||||
{name: "Debug logger, warn level", logrusLevel: logrus.DebugLevel, slogLevel: slog.LevelWarn, shouldBeEnabled: true},
|
|
||||||
{name: "Debug logger, error level", logrusLevel: logrus.DebugLevel, slogLevel: slog.LevelError, shouldBeEnabled: true},
|
|
||||||
|
|
||||||
// When logrus is at InfoLevel, debug should be disabled
|
|
||||||
{name: "Info logger, debug level", logrusLevel: logrus.InfoLevel, slogLevel: slog.LevelDebug, shouldBeEnabled: false},
|
|
||||||
{name: "Info logger, info level", logrusLevel: logrus.InfoLevel, slogLevel: slog.LevelInfo, shouldBeEnabled: true},
|
|
||||||
{name: "Info logger, warn level", logrusLevel: logrus.InfoLevel, slogLevel: slog.LevelWarn, shouldBeEnabled: true},
|
|
||||||
{name: "Info logger, error level", logrusLevel: logrus.InfoLevel, slogLevel: slog.LevelError, shouldBeEnabled: true},
|
|
||||||
|
|
||||||
// When logrus is at WarnLevel, debug and info should be disabled
|
|
||||||
{name: "Warn logger, debug level", logrusLevel: logrus.WarnLevel, slogLevel: slog.LevelDebug, shouldBeEnabled: false},
|
|
||||||
{name: "Warn logger, info level", logrusLevel: logrus.WarnLevel, slogLevel: slog.LevelInfo, shouldBeEnabled: false},
|
|
||||||
{name: "Warn logger, warn level", logrusLevel: logrus.WarnLevel, slogLevel: slog.LevelWarn, shouldBeEnabled: true},
|
|
||||||
{name: "Warn logger, error level", logrusLevel: logrus.WarnLevel, slogLevel: slog.LevelError, shouldBeEnabled: true},
|
|
||||||
|
|
||||||
// When logrus is at ErrorLevel, only error should be enabled
|
|
||||||
{name: "Error logger, debug level", logrusLevel: logrus.ErrorLevel, slogLevel: slog.LevelDebug, shouldBeEnabled: false},
|
|
||||||
{name: "Error logger, info level", logrusLevel: logrus.ErrorLevel, slogLevel: slog.LevelInfo, shouldBeEnabled: false},
|
|
||||||
{name: "Error logger, warn level", logrusLevel: logrus.ErrorLevel, slogLevel: slog.LevelWarn, shouldBeEnabled: false},
|
|
||||||
{name: "Error logger, error level", logrusLevel: logrus.ErrorLevel, slogLevel: slog.LevelError, shouldBeEnabled: true},
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, tt := range tests {
|
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
|
||||||
var outBuf bytes.Buffer
|
|
||||||
l := logrus.Logger{
|
|
||||||
Out: &outBuf,
|
|
||||||
Formatter: &logrus.TextFormatter{},
|
|
||||||
Level: tt.logrusLevel,
|
|
||||||
}
|
|
||||||
|
|
||||||
handler := logrusadapter.Handler{Logger: &l}
|
|
||||||
enabled := handler.Enabled(context.Background(), tt.slogLevel)
|
|
||||||
|
|
||||||
if enabled != tt.shouldBeEnabled {
|
|
||||||
t.Errorf("Enabled() = %v, want %v for logrus level %v and slog level %v",
|
|
||||||
enabled, tt.shouldBeEnabled, tt.logrusLevel, tt.slogLevel)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Verify that disabled logs don't actually produce output
|
|
||||||
slogger := slog.New(handler)
|
|
||||||
switch tt.slogLevel {
|
|
||||||
case slog.LevelDebug:
|
|
||||||
slogger.Debug("test message")
|
|
||||||
case slog.LevelInfo:
|
|
||||||
slogger.Info("test message")
|
|
||||||
case slog.LevelWarn:
|
|
||||||
slogger.Warn("test message")
|
|
||||||
case slog.LevelError:
|
|
||||||
slogger.Error("test message")
|
|
||||||
}
|
|
||||||
|
|
||||||
hasOutput := strings.Contains(outBuf.String(), "test message")
|
|
||||||
if hasOutput != tt.shouldBeEnabled {
|
|
||||||
t.Errorf("Log output presence = %v, want %v", hasOutput, tt.shouldBeEnabled)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
// Code generated by hack/gen-logs.sh; DO NOT EDIT.
|
|
||||||
// This file is created and regenerated automatically. Anything added here might get removed.
|
|
||||||
package logrusadapter
|
|
||||||
|
|
||||||
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", "internal/logrusadapter")
|
|
||||||
@@ -188,7 +188,6 @@ ssz_fulu_objs = [
|
|||||||
"DataColumnIdentifier",
|
"DataColumnIdentifier",
|
||||||
"DataColumnsByRootIdentifier",
|
"DataColumnsByRootIdentifier",
|
||||||
"DataColumnSidecar",
|
"DataColumnSidecar",
|
||||||
"PartialDataColumnSidecar",
|
|
||||||
"StatusV2",
|
"StatusV2",
|
||||||
"SignedBeaconBlockContentsFulu",
|
"SignedBeaconBlockContentsFulu",
|
||||||
"SignedBeaconBlockFulu",
|
"SignedBeaconBlockFulu",
|
||||||
@@ -429,7 +428,6 @@ ssz_proto_files(
|
|||||||
"blobs.proto",
|
"blobs.proto",
|
||||||
"data_columns.proto",
|
"data_columns.proto",
|
||||||
"gloas.proto",
|
"gloas.proto",
|
||||||
"partial_data_columns.proto",
|
|
||||||
"light_client.proto",
|
"light_client.proto",
|
||||||
"sync_committee.proto",
|
"sync_committee.proto",
|
||||||
"withdrawals.proto",
|
"withdrawals.proto",
|
||||||
|
|||||||
@@ -2494,455 +2494,3 @@ func (s *StatusV2) HashTreeRootWith(hh *ssz.Hasher) (err error) {
|
|||||||
hh.Merkleize(indx)
|
hh.Merkleize(indx)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// MarshalSSZ ssz marshals the PartialDataColumnSidecar object
|
|
||||||
func (p *PartialDataColumnSidecar) MarshalSSZ() ([]byte, error) {
|
|
||||||
return ssz.MarshalSSZ(p)
|
|
||||||
}
|
|
||||||
|
|
||||||
// MarshalSSZTo ssz marshals the PartialDataColumnSidecar object to a target array
|
|
||||||
func (p *PartialDataColumnSidecar) MarshalSSZTo(buf []byte) (dst []byte, err error) {
|
|
||||||
dst = buf
|
|
||||||
offset := int(16)
|
|
||||||
|
|
||||||
// Offset (0) 'CellsPresentBitmap'
|
|
||||||
dst = ssz.WriteOffset(dst, offset)
|
|
||||||
offset += len(p.CellsPresentBitmap)
|
|
||||||
|
|
||||||
// Offset (1) 'PartialColumn'
|
|
||||||
dst = ssz.WriteOffset(dst, offset)
|
|
||||||
offset += len(p.PartialColumn) * 2048
|
|
||||||
|
|
||||||
// Offset (2) 'KzgProofs'
|
|
||||||
dst = ssz.WriteOffset(dst, offset)
|
|
||||||
offset += len(p.KzgProofs) * 48
|
|
||||||
|
|
||||||
// Offset (3) 'Header'
|
|
||||||
dst = ssz.WriteOffset(dst, offset)
|
|
||||||
for ii := 0; ii < len(p.Header); ii++ {
|
|
||||||
offset += 4
|
|
||||||
offset += p.Header[ii].SizeSSZ()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Field (0) 'CellsPresentBitmap'
|
|
||||||
if size := len(p.CellsPresentBitmap); size > 512 {
|
|
||||||
err = ssz.ErrBytesLengthFn("--.CellsPresentBitmap", size, 512)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
dst = append(dst, p.CellsPresentBitmap...)
|
|
||||||
|
|
||||||
// Field (1) 'PartialColumn'
|
|
||||||
if size := len(p.PartialColumn); size > 4096 {
|
|
||||||
err = ssz.ErrListTooBigFn("--.PartialColumn", size, 4096)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
for ii := 0; ii < len(p.PartialColumn); ii++ {
|
|
||||||
if size := len(p.PartialColumn[ii]); size != 2048 {
|
|
||||||
err = ssz.ErrBytesLengthFn("--.PartialColumn[ii]", size, 2048)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
dst = append(dst, p.PartialColumn[ii]...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Field (2) 'KzgProofs'
|
|
||||||
if size := len(p.KzgProofs); size > 4096 {
|
|
||||||
err = ssz.ErrListTooBigFn("--.KzgProofs", size, 4096)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
for ii := 0; ii < len(p.KzgProofs); ii++ {
|
|
||||||
if size := len(p.KzgProofs[ii]); size != 48 {
|
|
||||||
err = ssz.ErrBytesLengthFn("--.KzgProofs[ii]", size, 48)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
dst = append(dst, p.KzgProofs[ii]...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Field (3) 'Header'
|
|
||||||
if size := len(p.Header); size > 1 {
|
|
||||||
err = ssz.ErrListTooBigFn("--.Header", size, 1)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
{
|
|
||||||
offset = 4 * len(p.Header)
|
|
||||||
for ii := 0; ii < len(p.Header); ii++ {
|
|
||||||
dst = ssz.WriteOffset(dst, offset)
|
|
||||||
offset += p.Header[ii].SizeSSZ()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for ii := 0; ii < len(p.Header); ii++ {
|
|
||||||
if dst, err = p.Header[ii].MarshalSSZTo(dst); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnmarshalSSZ ssz unmarshals the PartialDataColumnSidecar object
|
|
||||||
func (p *PartialDataColumnSidecar) UnmarshalSSZ(buf []byte) error {
|
|
||||||
var err error
|
|
||||||
size := uint64(len(buf))
|
|
||||||
if size < 16 {
|
|
||||||
return ssz.ErrSize
|
|
||||||
}
|
|
||||||
|
|
||||||
tail := buf
|
|
||||||
var o0, o1, o2, o3 uint64
|
|
||||||
|
|
||||||
// Offset (0) 'CellsPresentBitmap'
|
|
||||||
if o0 = ssz.ReadOffset(buf[0:4]); o0 > size {
|
|
||||||
return ssz.ErrOffset
|
|
||||||
}
|
|
||||||
|
|
||||||
if o0 != 16 {
|
|
||||||
return ssz.ErrInvalidVariableOffset
|
|
||||||
}
|
|
||||||
|
|
||||||
// Offset (1) 'PartialColumn'
|
|
||||||
if o1 = ssz.ReadOffset(buf[4:8]); o1 > size || o0 > o1 {
|
|
||||||
return ssz.ErrOffset
|
|
||||||
}
|
|
||||||
|
|
||||||
// Offset (2) 'KzgProofs'
|
|
||||||
if o2 = ssz.ReadOffset(buf[8:12]); o2 > size || o1 > o2 {
|
|
||||||
return ssz.ErrOffset
|
|
||||||
}
|
|
||||||
|
|
||||||
// Offset (3) 'Header'
|
|
||||||
if o3 = ssz.ReadOffset(buf[12:16]); o3 > size || o2 > o3 {
|
|
||||||
return ssz.ErrOffset
|
|
||||||
}
|
|
||||||
|
|
||||||
// Field (0) 'CellsPresentBitmap'
|
|
||||||
{
|
|
||||||
buf = tail[o0:o1]
|
|
||||||
if err = ssz.ValidateBitlist(buf, 512); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if cap(p.CellsPresentBitmap) == 0 {
|
|
||||||
p.CellsPresentBitmap = make([]byte, 0, len(buf))
|
|
||||||
}
|
|
||||||
p.CellsPresentBitmap = append(p.CellsPresentBitmap, buf...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Field (1) 'PartialColumn'
|
|
||||||
{
|
|
||||||
buf = tail[o1:o2]
|
|
||||||
num, err := ssz.DivideInt2(len(buf), 2048, 4096)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
p.PartialColumn = make([][]byte, num)
|
|
||||||
for ii := 0; ii < num; ii++ {
|
|
||||||
if cap(p.PartialColumn[ii]) == 0 {
|
|
||||||
p.PartialColumn[ii] = make([]byte, 0, len(buf[ii*2048:(ii+1)*2048]))
|
|
||||||
}
|
|
||||||
p.PartialColumn[ii] = append(p.PartialColumn[ii], buf[ii*2048:(ii+1)*2048]...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Field (2) 'KzgProofs'
|
|
||||||
{
|
|
||||||
buf = tail[o2:o3]
|
|
||||||
num, err := ssz.DivideInt2(len(buf), 48, 4096)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
p.KzgProofs = make([][]byte, num)
|
|
||||||
for ii := 0; ii < num; ii++ {
|
|
||||||
if cap(p.KzgProofs[ii]) == 0 {
|
|
||||||
p.KzgProofs[ii] = make([]byte, 0, len(buf[ii*48:(ii+1)*48]))
|
|
||||||
}
|
|
||||||
p.KzgProofs[ii] = append(p.KzgProofs[ii], buf[ii*48:(ii+1)*48]...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Field (3) 'Header'
|
|
||||||
{
|
|
||||||
buf = tail[o3:]
|
|
||||||
num, err := ssz.DecodeDynamicLength(buf, 1)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
p.Header = make([]*PartialDataColumnHeader, num)
|
|
||||||
err = ssz.UnmarshalDynamic(buf, num, func(indx int, buf []byte) (err error) {
|
|
||||||
if p.Header[indx] == nil {
|
|
||||||
p.Header[indx] = new(PartialDataColumnHeader)
|
|
||||||
}
|
|
||||||
if err = p.Header[indx].UnmarshalSSZ(buf); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// SizeSSZ returns the ssz encoded size in bytes for the PartialDataColumnSidecar object
|
|
||||||
func (p *PartialDataColumnSidecar) SizeSSZ() (size int) {
|
|
||||||
size = 16
|
|
||||||
|
|
||||||
// Field (0) 'CellsPresentBitmap'
|
|
||||||
size += len(p.CellsPresentBitmap)
|
|
||||||
|
|
||||||
// Field (1) 'PartialColumn'
|
|
||||||
size += len(p.PartialColumn) * 2048
|
|
||||||
|
|
||||||
// Field (2) 'KzgProofs'
|
|
||||||
size += len(p.KzgProofs) * 48
|
|
||||||
|
|
||||||
// Field (3) 'Header'
|
|
||||||
for ii := 0; ii < len(p.Header); ii++ {
|
|
||||||
size += 4
|
|
||||||
size += p.Header[ii].SizeSSZ()
|
|
||||||
}
|
|
||||||
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// HashTreeRoot ssz hashes the PartialDataColumnSidecar object
|
|
||||||
func (p *PartialDataColumnSidecar) HashTreeRoot() ([32]byte, error) {
|
|
||||||
return ssz.HashWithDefaultHasher(p)
|
|
||||||
}
|
|
||||||
|
|
||||||
// HashTreeRootWith ssz hashes the PartialDataColumnSidecar object with a hasher
|
|
||||||
func (p *PartialDataColumnSidecar) HashTreeRootWith(hh *ssz.Hasher) (err error) {
|
|
||||||
indx := hh.Index()
|
|
||||||
|
|
||||||
// Field (0) 'CellsPresentBitmap'
|
|
||||||
if len(p.CellsPresentBitmap) == 0 {
|
|
||||||
err = ssz.ErrEmptyBitlist
|
|
||||||
return
|
|
||||||
}
|
|
||||||
hh.PutBitlist(p.CellsPresentBitmap, 512)
|
|
||||||
|
|
||||||
// Field (1) 'PartialColumn'
|
|
||||||
{
|
|
||||||
if size := len(p.PartialColumn); size > 4096 {
|
|
||||||
err = ssz.ErrListTooBigFn("--.PartialColumn", size, 4096)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
subIndx := hh.Index()
|
|
||||||
for _, i := range p.PartialColumn {
|
|
||||||
if len(i) != 2048 {
|
|
||||||
err = ssz.ErrBytesLength
|
|
||||||
return
|
|
||||||
}
|
|
||||||
hh.PutBytes(i)
|
|
||||||
}
|
|
||||||
|
|
||||||
numItems := uint64(len(p.PartialColumn))
|
|
||||||
hh.MerkleizeWithMixin(subIndx, numItems, 4096)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Field (2) 'KzgProofs'
|
|
||||||
{
|
|
||||||
if size := len(p.KzgProofs); size > 4096 {
|
|
||||||
err = ssz.ErrListTooBigFn("--.KzgProofs", size, 4096)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
subIndx := hh.Index()
|
|
||||||
for _, i := range p.KzgProofs {
|
|
||||||
if len(i) != 48 {
|
|
||||||
err = ssz.ErrBytesLength
|
|
||||||
return
|
|
||||||
}
|
|
||||||
hh.PutBytes(i)
|
|
||||||
}
|
|
||||||
|
|
||||||
numItems := uint64(len(p.KzgProofs))
|
|
||||||
hh.MerkleizeWithMixin(subIndx, numItems, 4096)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Field (3) 'Header'
|
|
||||||
{
|
|
||||||
subIndx := hh.Index()
|
|
||||||
num := uint64(len(p.Header))
|
|
||||||
if num > 1 {
|
|
||||||
err = ssz.ErrIncorrectListSize
|
|
||||||
return
|
|
||||||
}
|
|
||||||
for _, elem := range p.Header {
|
|
||||||
if err = elem.HashTreeRootWith(hh); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
hh.MerkleizeWithMixin(subIndx, num, 1)
|
|
||||||
}
|
|
||||||
|
|
||||||
hh.Merkleize(indx)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// MarshalSSZ ssz marshals the PartialDataColumnHeader object
|
|
||||||
func (p *PartialDataColumnHeader) MarshalSSZ() ([]byte, error) {
|
|
||||||
return ssz.MarshalSSZ(p)
|
|
||||||
}
|
|
||||||
|
|
||||||
// MarshalSSZTo ssz marshals the PartialDataColumnHeader object to a target array
|
|
||||||
func (p *PartialDataColumnHeader) MarshalSSZTo(buf []byte) (dst []byte, err error) {
|
|
||||||
dst = buf
|
|
||||||
offset := int(340)
|
|
||||||
|
|
||||||
// Offset (0) 'KzgCommitments'
|
|
||||||
dst = ssz.WriteOffset(dst, offset)
|
|
||||||
offset += len(p.KzgCommitments) * 48
|
|
||||||
|
|
||||||
// Field (1) 'SignedBlockHeader'
|
|
||||||
if p.SignedBlockHeader == nil {
|
|
||||||
p.SignedBlockHeader = new(SignedBeaconBlockHeader)
|
|
||||||
}
|
|
||||||
if dst, err = p.SignedBlockHeader.MarshalSSZTo(dst); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Field (2) 'KzgCommitmentsInclusionProof'
|
|
||||||
if size := len(p.KzgCommitmentsInclusionProof); size != 4 {
|
|
||||||
err = ssz.ErrVectorLengthFn("--.KzgCommitmentsInclusionProof", size, 4)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
for ii := 0; ii < 4; ii++ {
|
|
||||||
if size := len(p.KzgCommitmentsInclusionProof[ii]); size != 32 {
|
|
||||||
err = ssz.ErrBytesLengthFn("--.KzgCommitmentsInclusionProof[ii]", size, 32)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
dst = append(dst, p.KzgCommitmentsInclusionProof[ii]...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Field (0) 'KzgCommitments'
|
|
||||||
if size := len(p.KzgCommitments); size > 4096 {
|
|
||||||
err = ssz.ErrListTooBigFn("--.KzgCommitments", size, 4096)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
for ii := 0; ii < len(p.KzgCommitments); ii++ {
|
|
||||||
if size := len(p.KzgCommitments[ii]); size != 48 {
|
|
||||||
err = ssz.ErrBytesLengthFn("--.KzgCommitments[ii]", size, 48)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
dst = append(dst, p.KzgCommitments[ii]...)
|
|
||||||
}
|
|
||||||
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnmarshalSSZ ssz unmarshals the PartialDataColumnHeader object
|
|
||||||
func (p *PartialDataColumnHeader) UnmarshalSSZ(buf []byte) error {
|
|
||||||
var err error
|
|
||||||
size := uint64(len(buf))
|
|
||||||
if size < 340 {
|
|
||||||
return ssz.ErrSize
|
|
||||||
}
|
|
||||||
|
|
||||||
tail := buf
|
|
||||||
var o0 uint64
|
|
||||||
|
|
||||||
// Offset (0) 'KzgCommitments'
|
|
||||||
if o0 = ssz.ReadOffset(buf[0:4]); o0 > size {
|
|
||||||
return ssz.ErrOffset
|
|
||||||
}
|
|
||||||
|
|
||||||
if o0 != 340 {
|
|
||||||
return ssz.ErrInvalidVariableOffset
|
|
||||||
}
|
|
||||||
|
|
||||||
// Field (1) 'SignedBlockHeader'
|
|
||||||
if p.SignedBlockHeader == nil {
|
|
||||||
p.SignedBlockHeader = new(SignedBeaconBlockHeader)
|
|
||||||
}
|
|
||||||
if err = p.SignedBlockHeader.UnmarshalSSZ(buf[4:212]); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Field (2) 'KzgCommitmentsInclusionProof'
|
|
||||||
p.KzgCommitmentsInclusionProof = make([][]byte, 4)
|
|
||||||
for ii := 0; ii < 4; ii++ {
|
|
||||||
if cap(p.KzgCommitmentsInclusionProof[ii]) == 0 {
|
|
||||||
p.KzgCommitmentsInclusionProof[ii] = make([]byte, 0, len(buf[212:340][ii*32:(ii+1)*32]))
|
|
||||||
}
|
|
||||||
p.KzgCommitmentsInclusionProof[ii] = append(p.KzgCommitmentsInclusionProof[ii], buf[212:340][ii*32:(ii+1)*32]...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Field (0) 'KzgCommitments'
|
|
||||||
{
|
|
||||||
buf = tail[o0:]
|
|
||||||
num, err := ssz.DivideInt2(len(buf), 48, 4096)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
p.KzgCommitments = make([][]byte, num)
|
|
||||||
for ii := 0; ii < num; ii++ {
|
|
||||||
if cap(p.KzgCommitments[ii]) == 0 {
|
|
||||||
p.KzgCommitments[ii] = make([]byte, 0, len(buf[ii*48:(ii+1)*48]))
|
|
||||||
}
|
|
||||||
p.KzgCommitments[ii] = append(p.KzgCommitments[ii], buf[ii*48:(ii+1)*48]...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// SizeSSZ returns the ssz encoded size in bytes for the PartialDataColumnHeader object
|
|
||||||
func (p *PartialDataColumnHeader) SizeSSZ() (size int) {
|
|
||||||
size = 340
|
|
||||||
|
|
||||||
// Field (0) 'KzgCommitments'
|
|
||||||
size += len(p.KzgCommitments) * 48
|
|
||||||
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// HashTreeRoot ssz hashes the PartialDataColumnHeader object
|
|
||||||
func (p *PartialDataColumnHeader) HashTreeRoot() ([32]byte, error) {
|
|
||||||
return ssz.HashWithDefaultHasher(p)
|
|
||||||
}
|
|
||||||
|
|
||||||
// HashTreeRootWith ssz hashes the PartialDataColumnHeader object with a hasher
|
|
||||||
func (p *PartialDataColumnHeader) HashTreeRootWith(hh *ssz.Hasher) (err error) {
|
|
||||||
indx := hh.Index()
|
|
||||||
|
|
||||||
// Field (0) 'KzgCommitments'
|
|
||||||
{
|
|
||||||
if size := len(p.KzgCommitments); size > 4096 {
|
|
||||||
err = ssz.ErrListTooBigFn("--.KzgCommitments", size, 4096)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
subIndx := hh.Index()
|
|
||||||
for _, i := range p.KzgCommitments {
|
|
||||||
if len(i) != 48 {
|
|
||||||
err = ssz.ErrBytesLength
|
|
||||||
return
|
|
||||||
}
|
|
||||||
hh.PutBytes(i)
|
|
||||||
}
|
|
||||||
|
|
||||||
numItems := uint64(len(p.KzgCommitments))
|
|
||||||
hh.MerkleizeWithMixin(subIndx, numItems, 4096)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Field (1) 'SignedBlockHeader'
|
|
||||||
if err = p.SignedBlockHeader.HashTreeRootWith(hh); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Field (2) 'KzgCommitmentsInclusionProof'
|
|
||||||
{
|
|
||||||
if size := len(p.KzgCommitmentsInclusionProof); size != 4 {
|
|
||||||
err = ssz.ErrVectorLengthFn("--.KzgCommitmentsInclusionProof", size, 4)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
subIndx := hh.Index()
|
|
||||||
for _, i := range p.KzgCommitmentsInclusionProof {
|
|
||||||
if len(i) != 32 {
|
|
||||||
err = ssz.ErrBytesLength
|
|
||||||
return
|
|
||||||
}
|
|
||||||
hh.Append(i)
|
|
||||||
}
|
|
||||||
hh.Merkleize(subIndx)
|
|
||||||
}
|
|
||||||
|
|
||||||
hh.Merkleize(indx)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|||||||
262
proto/prysm/v1alpha1/partial_data_columns.pb.go
generated
262
proto/prysm/v1alpha1/partial_data_columns.pb.go
generated
@@ -1,262 +0,0 @@
|
|||||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
|
||||||
// versions:
|
|
||||||
// protoc-gen-go v1.36.3
|
|
||||||
// protoc v3.21.7
|
|
||||||
// source: proto/prysm/v1alpha1/partial_data_columns.proto
|
|
||||||
|
|
||||||
package eth
|
|
||||||
|
|
||||||
import (
|
|
||||||
reflect "reflect"
|
|
||||||
sync "sync"
|
|
||||||
|
|
||||||
github_com_OffchainLabs_go_bitfield "github.com/OffchainLabs/go-bitfield"
|
|
||||||
_ "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 PartialDataColumnSidecar struct {
|
|
||||||
state protoimpl.MessageState `protogen:"open.v1"`
|
|
||||||
CellsPresentBitmap github_com_OffchainLabs_go_bitfield.Bitlist `protobuf:"bytes,1,opt,name=cells_present_bitmap,json=cellsPresentBitmap,proto3" json:"cells_present_bitmap,omitempty" cast-type:"github.com/OffchainLabs/go-bitfield.Bitlist" ssz-max:"512"`
|
|
||||||
PartialColumn [][]byte `protobuf:"bytes,2,rep,name=partial_column,json=partialColumn,proto3" json:"partial_column,omitempty" ssz-max:"4096" ssz-size:"?,2048"`
|
|
||||||
KzgProofs [][]byte `protobuf:"bytes,3,rep,name=kzg_proofs,json=kzgProofs,proto3" json:"kzg_proofs,omitempty" ssz-max:"4096" ssz-size:"?,48"`
|
|
||||||
Header []*PartialDataColumnHeader `protobuf:"bytes,4,rep,name=header,proto3" json:"header,omitempty" ssz-max:"1"`
|
|
||||||
unknownFields protoimpl.UnknownFields
|
|
||||||
sizeCache protoimpl.SizeCache
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *PartialDataColumnSidecar) Reset() {
|
|
||||||
*x = PartialDataColumnSidecar{}
|
|
||||||
mi := &file_proto_prysm_v1alpha1_partial_data_columns_proto_msgTypes[0]
|
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
|
||||||
ms.StoreMessageInfo(mi)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *PartialDataColumnSidecar) String() string {
|
|
||||||
return protoimpl.X.MessageStringOf(x)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (*PartialDataColumnSidecar) ProtoMessage() {}
|
|
||||||
|
|
||||||
func (x *PartialDataColumnSidecar) ProtoReflect() protoreflect.Message {
|
|
||||||
mi := &file_proto_prysm_v1alpha1_partial_data_columns_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 PartialDataColumnSidecar.ProtoReflect.Descriptor instead.
|
|
||||||
func (*PartialDataColumnSidecar) Descriptor() ([]byte, []int) {
|
|
||||||
return file_proto_prysm_v1alpha1_partial_data_columns_proto_rawDescGZIP(), []int{0}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *PartialDataColumnSidecar) GetCellsPresentBitmap() github_com_OffchainLabs_go_bitfield.Bitlist {
|
|
||||||
if x != nil {
|
|
||||||
return x.CellsPresentBitmap
|
|
||||||
}
|
|
||||||
return github_com_OffchainLabs_go_bitfield.Bitlist(nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *PartialDataColumnSidecar) GetPartialColumn() [][]byte {
|
|
||||||
if x != nil {
|
|
||||||
return x.PartialColumn
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *PartialDataColumnSidecar) GetKzgProofs() [][]byte {
|
|
||||||
if x != nil {
|
|
||||||
return x.KzgProofs
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *PartialDataColumnSidecar) GetHeader() []*PartialDataColumnHeader {
|
|
||||||
if x != nil {
|
|
||||||
return x.Header
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type PartialDataColumnHeader struct {
|
|
||||||
state protoimpl.MessageState `protogen:"open.v1"`
|
|
||||||
KzgCommitments [][]byte `protobuf:"bytes,1,rep,name=kzg_commitments,json=kzgCommitments,proto3" json:"kzg_commitments,omitempty" ssz-max:"4096" ssz-size:"?,48"`
|
|
||||||
SignedBlockHeader *SignedBeaconBlockHeader `protobuf:"bytes,2,opt,name=signed_block_header,json=signedBlockHeader,proto3" json:"signed_block_header,omitempty"`
|
|
||||||
KzgCommitmentsInclusionProof [][]byte `protobuf:"bytes,3,rep,name=kzg_commitments_inclusion_proof,json=kzgCommitmentsInclusionProof,proto3" json:"kzg_commitments_inclusion_proof,omitempty" ssz-size:"4,32"`
|
|
||||||
unknownFields protoimpl.UnknownFields
|
|
||||||
sizeCache protoimpl.SizeCache
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *PartialDataColumnHeader) Reset() {
|
|
||||||
*x = PartialDataColumnHeader{}
|
|
||||||
mi := &file_proto_prysm_v1alpha1_partial_data_columns_proto_msgTypes[1]
|
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
|
||||||
ms.StoreMessageInfo(mi)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *PartialDataColumnHeader) String() string {
|
|
||||||
return protoimpl.X.MessageStringOf(x)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (*PartialDataColumnHeader) ProtoMessage() {}
|
|
||||||
|
|
||||||
func (x *PartialDataColumnHeader) ProtoReflect() protoreflect.Message {
|
|
||||||
mi := &file_proto_prysm_v1alpha1_partial_data_columns_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 PartialDataColumnHeader.ProtoReflect.Descriptor instead.
|
|
||||||
func (*PartialDataColumnHeader) Descriptor() ([]byte, []int) {
|
|
||||||
return file_proto_prysm_v1alpha1_partial_data_columns_proto_rawDescGZIP(), []int{1}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *PartialDataColumnHeader) GetKzgCommitments() [][]byte {
|
|
||||||
if x != nil {
|
|
||||||
return x.KzgCommitments
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *PartialDataColumnHeader) GetSignedBlockHeader() *SignedBeaconBlockHeader {
|
|
||||||
if x != nil {
|
|
||||||
return x.SignedBlockHeader
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *PartialDataColumnHeader) GetKzgCommitmentsInclusionProof() [][]byte {
|
|
||||||
if x != nil {
|
|
||||||
return x.KzgCommitmentsInclusionProof
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
var File_proto_prysm_v1alpha1_partial_data_columns_proto protoreflect.FileDescriptor
|
|
||||||
|
|
||||||
var file_proto_prysm_v1alpha1_partial_data_columns_proto_rawDesc = []byte{
|
|
||||||
0x0a, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x31,
|
|
||||||
0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x64,
|
|
||||||
0x61, 0x74, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74,
|
|
||||||
0x6f, 0x12, 0x15, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e,
|
|
||||||
0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 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, 0x1a, 0x2c, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x72, 0x79,
|
|
||||||
0x73, 0x6d, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x62, 0x65, 0x61, 0x63,
|
|
||||||
0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x72, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x70, 0x72,
|
|
||||||
0x6f, 0x74, 0x6f, 0x22, 0xbf, 0x02, 0x0a, 0x18, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x44,
|
|
||||||
0x61, 0x74, 0x61, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x53, 0x69, 0x64, 0x65, 0x63, 0x61, 0x72,
|
|
||||||
0x12, 0x68, 0x0a, 0x14, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x5f, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e,
|
|
||||||
0x74, 0x5f, 0x62, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x36,
|
|
||||||
0x82, 0xb5, 0x18, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4f,
|
|
||||||
0x66, 0x66, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x4c, 0x61, 0x62, 0x73, 0x2f, 0x67, 0x6f, 0x2d, 0x62,
|
|
||||||
0x69, 0x74, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x2e, 0x42, 0x69, 0x74, 0x6c, 0x69, 0x73, 0x74, 0x92,
|
|
||||||
0xb5, 0x18, 0x03, 0x35, 0x31, 0x32, 0x52, 0x12, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x50, 0x72, 0x65,
|
|
||||||
0x73, 0x65, 0x6e, 0x74, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x12, 0x39, 0x0a, 0x0e, 0x70, 0x61,
|
|
||||||
0x72, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x18, 0x02, 0x20, 0x03,
|
|
||||||
0x28, 0x0c, 0x42, 0x12, 0x8a, 0xb5, 0x18, 0x06, 0x3f, 0x2c, 0x32, 0x30, 0x34, 0x38, 0x92, 0xb5,
|
|
||||||
0x18, 0x04, 0x34, 0x30, 0x39, 0x36, 0x52, 0x0d, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x43,
|
|
||||||
0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x12, 0x2f, 0x0a, 0x0a, 0x6b, 0x7a, 0x67, 0x5f, 0x70, 0x72, 0x6f,
|
|
||||||
0x6f, 0x66, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0c, 0x42, 0x10, 0x8a, 0xb5, 0x18, 0x04, 0x3f,
|
|
||||||
0x2c, 0x34, 0x38, 0x92, 0xb5, 0x18, 0x04, 0x34, 0x30, 0x39, 0x36, 0x52, 0x09, 0x6b, 0x7a, 0x67,
|
|
||||||
0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x12, 0x4d, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72,
|
|
||||||
0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75,
|
|
||||||
0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50,
|
|
||||||
0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e,
|
|
||||||
0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x42, 0x05, 0x92, 0xb5, 0x18, 0x01, 0x31, 0x52, 0x06, 0x68,
|
|
||||||
0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x85, 0x02, 0x0a, 0x17, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61,
|
|
||||||
0x6c, 0x44, 0x61, 0x74, 0x61, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x48, 0x65, 0x61, 0x64, 0x65,
|
|
||||||
0x72, 0x12, 0x39, 0x0a, 0x0f, 0x6b, 0x7a, 0x67, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d,
|
|
||||||
0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x42, 0x10, 0x8a, 0xb5, 0x18, 0x04,
|
|
||||||
0x3f, 0x2c, 0x34, 0x38, 0x92, 0xb5, 0x18, 0x04, 0x34, 0x30, 0x39, 0x36, 0x52, 0x0e, 0x6b, 0x7a,
|
|
||||||
0x67, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x5e, 0x0a, 0x13,
|
|
||||||
0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x61,
|
|
||||||
0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x65, 0x74, 0x68, 0x65,
|
|
||||||
0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61,
|
|
||||||
0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c,
|
|
||||||
0x6f, 0x63, 0x6b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x11, 0x73, 0x69, 0x67, 0x6e, 0x65,
|
|
||||||
0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x4f, 0x0a, 0x1f,
|
|
||||||
0x6b, 0x7a, 0x67, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f,
|
|
||||||
0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18,
|
|
||||||
0x03, 0x20, 0x03, 0x28, 0x0c, 0x42, 0x08, 0x8a, 0xb5, 0x18, 0x04, 0x34, 0x2c, 0x33, 0x32, 0x52,
|
|
||||||
0x1c, 0x6b, 0x7a, 0x67, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x49,
|
|
||||||
0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 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, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x31,
|
|
||||||
0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x3b, 0x65, 0x74, 0x68, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,
|
|
||||||
0x6f, 0x33,
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
|
||||||
file_proto_prysm_v1alpha1_partial_data_columns_proto_rawDescOnce sync.Once
|
|
||||||
file_proto_prysm_v1alpha1_partial_data_columns_proto_rawDescData = file_proto_prysm_v1alpha1_partial_data_columns_proto_rawDesc
|
|
||||||
)
|
|
||||||
|
|
||||||
func file_proto_prysm_v1alpha1_partial_data_columns_proto_rawDescGZIP() []byte {
|
|
||||||
file_proto_prysm_v1alpha1_partial_data_columns_proto_rawDescOnce.Do(func() {
|
|
||||||
file_proto_prysm_v1alpha1_partial_data_columns_proto_rawDescData = protoimpl.X.CompressGZIP(file_proto_prysm_v1alpha1_partial_data_columns_proto_rawDescData)
|
|
||||||
})
|
|
||||||
return file_proto_prysm_v1alpha1_partial_data_columns_proto_rawDescData
|
|
||||||
}
|
|
||||||
|
|
||||||
var file_proto_prysm_v1alpha1_partial_data_columns_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
|
|
||||||
var file_proto_prysm_v1alpha1_partial_data_columns_proto_goTypes = []any{
|
|
||||||
(*PartialDataColumnSidecar)(nil), // 0: ethereum.eth.v1alpha1.PartialDataColumnSidecar
|
|
||||||
(*PartialDataColumnHeader)(nil), // 1: ethereum.eth.v1alpha1.PartialDataColumnHeader
|
|
||||||
(*SignedBeaconBlockHeader)(nil), // 2: ethereum.eth.v1alpha1.SignedBeaconBlockHeader
|
|
||||||
}
|
|
||||||
var file_proto_prysm_v1alpha1_partial_data_columns_proto_depIdxs = []int32{
|
|
||||||
1, // 0: ethereum.eth.v1alpha1.PartialDataColumnSidecar.header:type_name -> ethereum.eth.v1alpha1.PartialDataColumnHeader
|
|
||||||
2, // 1: ethereum.eth.v1alpha1.PartialDataColumnHeader.signed_block_header:type_name -> ethereum.eth.v1alpha1.SignedBeaconBlockHeader
|
|
||||||
2, // [2:2] is the sub-list for method output_type
|
|
||||||
2, // [2:2] is the sub-list for method input_type
|
|
||||||
2, // [2:2] is the sub-list for extension type_name
|
|
||||||
2, // [2:2] is the sub-list for extension extendee
|
|
||||||
0, // [0:2] is the sub-list for field type_name
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() { file_proto_prysm_v1alpha1_partial_data_columns_proto_init() }
|
|
||||||
func file_proto_prysm_v1alpha1_partial_data_columns_proto_init() {
|
|
||||||
if File_proto_prysm_v1alpha1_partial_data_columns_proto != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
file_proto_prysm_v1alpha1_beacon_core_types_proto_init()
|
|
||||||
type x struct{}
|
|
||||||
out := protoimpl.TypeBuilder{
|
|
||||||
File: protoimpl.DescBuilder{
|
|
||||||
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
|
||||||
RawDescriptor: file_proto_prysm_v1alpha1_partial_data_columns_proto_rawDesc,
|
|
||||||
NumEnums: 0,
|
|
||||||
NumMessages: 2,
|
|
||||||
NumExtensions: 0,
|
|
||||||
NumServices: 0,
|
|
||||||
},
|
|
||||||
GoTypes: file_proto_prysm_v1alpha1_partial_data_columns_proto_goTypes,
|
|
||||||
DependencyIndexes: file_proto_prysm_v1alpha1_partial_data_columns_proto_depIdxs,
|
|
||||||
MessageInfos: file_proto_prysm_v1alpha1_partial_data_columns_proto_msgTypes,
|
|
||||||
}.Build()
|
|
||||||
File_proto_prysm_v1alpha1_partial_data_columns_proto = out.File
|
|
||||||
file_proto_prysm_v1alpha1_partial_data_columns_proto_rawDesc = nil
|
|
||||||
file_proto_prysm_v1alpha1_partial_data_columns_proto_goTypes = nil
|
|
||||||
file_proto_prysm_v1alpha1_partial_data_columns_proto_depIdxs = nil
|
|
||||||
}
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
// Copyright 2025 Offchain Labs.
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
syntax = "proto3";
|
|
||||||
|
|
||||||
package ethereum.eth.v1alpha1;
|
|
||||||
|
|
||||||
import "proto/eth/ext/options.proto";
|
|
||||||
import "proto/prysm/v1alpha1/beacon_core_types.proto";
|
|
||||||
|
|
||||||
option go_package = "github.com/OffchainLabs/prysm/v6/proto/prysm/v1alpha1;eth";
|
|
||||||
|
|
||||||
message PartialDataColumnSidecar {
|
|
||||||
bytes cells_present_bitmap = 1 [
|
|
||||||
(ethereum.eth.ext.ssz_max) = "max_blob_commitments_bitmap.size",
|
|
||||||
(ethereum.eth.ext.cast_type) = "github.com/OffchainLabs/go-bitfield.Bitlist"
|
|
||||||
];
|
|
||||||
repeated bytes partial_column = 2 [
|
|
||||||
(ethereum.eth.ext.ssz_size) = "?,bytes_per_cell.size",
|
|
||||||
(ethereum.eth.ext.ssz_max) = "max_blob_commitments.size"
|
|
||||||
];
|
|
||||||
repeated bytes kzg_proofs = 3 [
|
|
||||||
(ethereum.eth.ext.ssz_size) = "?,48",
|
|
||||||
(ethereum.eth.ext.ssz_max) = "max_blob_commitments.size"
|
|
||||||
];
|
|
||||||
repeated PartialDataColumnHeader header = 4 [(ethereum.eth.ext.ssz_max) = "1"];
|
|
||||||
}
|
|
||||||
|
|
||||||
message PartialDataColumnHeader {
|
|
||||||
repeated bytes kzg_commitments = 1 [
|
|
||||||
(ethereum.eth.ext.ssz_size) = "?,48",
|
|
||||||
(ethereum.eth.ext.ssz_max) = "max_blob_commitments.size"
|
|
||||||
];
|
|
||||||
SignedBeaconBlockHeader signed_block_header = 2;
|
|
||||||
repeated bytes kzg_commitments_inclusion_proof = 3 [(ethereum.eth.ext.ssz_size) = "kzg_commitments_inclusion_proof_depth.size,32"];
|
|
||||||
}
|
|
||||||
@@ -25,7 +25,6 @@ mainnet = {
|
|||||||
"extra_data.size": "32",
|
"extra_data.size": "32",
|
||||||
"max_blobs_per_block.size": "6",
|
"max_blobs_per_block.size": "6",
|
||||||
"max_blob_commitments.size": "4096",
|
"max_blob_commitments.size": "4096",
|
||||||
"max_blob_commitments_bitmap.size": "512", # MAX_BLOB_COMMITMENTS_PER_BLOCK / 8
|
|
||||||
"max_cell_proofs_length.size": "33554432", # FIELD_ELEMENTS_PER_EXT_BLOB * MAX_BLOB_COMMITMENTS_PER_BLOCK
|
"max_cell_proofs_length.size": "33554432", # FIELD_ELEMENTS_PER_EXT_BLOB * MAX_BLOB_COMMITMENTS_PER_BLOCK
|
||||||
"kzg_commitment_inclusion_proof_depth.size": "17",
|
"kzg_commitment_inclusion_proof_depth.size": "17",
|
||||||
"max_withdrawal_requests_per_payload.size": "16",
|
"max_withdrawal_requests_per_payload.size": "16",
|
||||||
@@ -71,7 +70,6 @@ minimal = {
|
|||||||
"extra_data.size": "32",
|
"extra_data.size": "32",
|
||||||
"max_blobs_per_block.size": "6",
|
"max_blobs_per_block.size": "6",
|
||||||
"max_blob_commitments.size": "4096",
|
"max_blob_commitments.size": "4096",
|
||||||
"max_blob_commitments_bitmap.size": "512", # MAX_BLOB_COMMITMENTS_PER_BLOCK / 8
|
|
||||||
"max_cell_proofs_length.size": "33554432", # FIELD_ELEMENTS_PER_EXT_BLOB * MAX_BLOB_COMMITMENTS_PER_BLOCK
|
"max_cell_proofs_length.size": "33554432", # FIELD_ELEMENTS_PER_EXT_BLOB * MAX_BLOB_COMMITMENTS_PER_BLOCK
|
||||||
"kzg_commitment_inclusion_proof_depth.size": "17",
|
"kzg_commitment_inclusion_proof_depth.size": "17",
|
||||||
"max_withdrawal_requests_per_payload.size": "16",
|
"max_withdrawal_requests_per_payload.size": "16",
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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="d378428f">
|
||||||
|
MIN_BUILDER_WITHDRAWABILITY_DELAY: uint64 = 4096
|
||||||
|
</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
@@ -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,26 @@
|
|||||||
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="8028928b">
|
||||||
|
class DataColumnSidecar(Container):
|
||||||
|
index: ColumnIndex
|
||||||
|
column: List[Cell, MAX_BLOB_COMMITMENTS_PER_BLOCK]
|
||||||
|
kzg_commitments: List[KZGCommitment, MAX_BLOB_COMMITMENTS_PER_BLOCK]
|
||||||
|
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 +765,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 +776,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 +789,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 +801,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 +815,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 +913,38 @@
|
|||||||
excess_blob_gas: uint64
|
excess_blob_gas: uint64
|
||||||
</spec>
|
</spec>
|
||||||
|
|
||||||
|
- name: ExecutionPayloadBid#gloas
|
||||||
|
sources: []
|
||||||
|
spec: |
|
||||||
|
<spec ssz_object="ExecutionPayloadBid" fork="gloas" hash="aa71ba16">
|
||||||
|
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_root: Root
|
||||||
|
</spec>
|
||||||
|
|
||||||
|
- name: ExecutionPayloadEnvelope#gloas
|
||||||
|
sources: []
|
||||||
|
spec: |
|
||||||
|
<spec ssz_object="ExecutionPayloadEnvelope" fork="gloas" hash="cd522f7f">
|
||||||
|
class ExecutionPayloadEnvelope(Container):
|
||||||
|
payload: ExecutionPayload
|
||||||
|
execution_requests: ExecutionRequests
|
||||||
|
builder_index: BuilderIndex
|
||||||
|
beacon_block_root: Root
|
||||||
|
slot: Slot
|
||||||
|
blob_kzg_commitments: List[KZGCommitment, MAX_BLOB_COMMITMENTS_PER_BLOCK]
|
||||||
|
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 {
|
||||||
|
|||||||
@@ -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
@@ -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"
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
package util
|
package util
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"slices"
|
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/OffchainLabs/prysm/v7/beacon-chain/blockchain/kzg"
|
"github.com/OffchainLabs/prysm/v7/beacon-chain/blockchain/kzg"
|
||||||
@@ -66,7 +65,7 @@ func CreateTestVerifiedRoDataColumnSidecars(t *testing.T, params []DataColumnPar
|
|||||||
Index: param.Index,
|
Index: param.Index,
|
||||||
Column: column,
|
Column: column,
|
||||||
KzgCommitments: param.KzgCommitments,
|
KzgCommitments: param.KzgCommitments,
|
||||||
KzgProofs: slices.Clone(param.KzgProofs),
|
KzgProofs: param.KzgProofs,
|
||||||
SignedBlockHeader: ðpb.SignedBeaconBlockHeader{
|
SignedBlockHeader: ðpb.SignedBeaconBlockHeader{
|
||||||
Header: ðpb.BeaconBlockHeader{
|
Header: ðpb.BeaconBlockHeader{
|
||||||
Slot: param.Slot,
|
Slot: param.Slot,
|
||||||
|
|||||||
14
testing/validator-mock/validator_client_mock.go
generated
14
testing/validator-mock/validator_client_mock.go
generated
@@ -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.
|
||||||
|
|||||||
12
testing/validator-mock/validator_mock.go
generated
12
testing/validator-mock/validator_mock.go
generated
@@ -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.
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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, ðpb.ListValidatorsRequest{
|
_, err := beaconChainClient.Validators(ctx, ðpb.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, ðpb.ListValidatorsRequest{
|
_, err := beaconChainClient.Validators(ctx, ðpb.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)
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user