From 936af463325d1cb5e7132eaa17432e30dd22d282 Mon Sep 17 00:00:00 2001 From: realbigsean Date: Mon, 16 Oct 2023 12:58:14 -0400 Subject: [PATCH] add new config to `Config` api struct --- .../lighthouse_network/src/rpc/protocol.rs | 8 +- consensus/types/src/chain_spec.rs | 180 +++++++++++++++++- consensus/types/src/fork_context.rs | 65 +++---- 3 files changed, 204 insertions(+), 49 deletions(-) diff --git a/beacon_node/lighthouse_network/src/rpc/protocol.rs b/beacon_node/lighthouse_network/src/rpc/protocol.rs index 75f11fd6b47..46652b363bf 100644 --- a/beacon_node/lighthouse_network/src/rpc/protocol.rs +++ b/beacon_node/lighthouse_network/src/rpc/protocol.rs @@ -364,16 +364,16 @@ impl ProtocolId { ::ssz_fixed_len(), ), Protocol::BlocksByRoot => RpcLimits::new( - fork_context.blocks_by_root_request_min, - fork_context.blocks_by_root_request_max, + fork_context.min_blocks_by_root_request(), + fork_context.max_blocks_by_root_request(), ), Protocol::BlobsByRange => RpcLimits::new( ::ssz_fixed_len(), ::ssz_fixed_len(), ), Protocol::BlobsByRoot => RpcLimits::new( - fork_context.blobs_by_root_request_min, - fork_context.blobs_by_root_request_max, + fork_context.min_blobs_by_root_request(), + fork_context.max_blobs_by_root_request(), ), Protocol::Ping => RpcLimits::new( ::ssz_fixed_len(), diff --git a/consensus/types/src/chain_spec.rs b/consensus/types/src/chain_spec.rs index 9a5dc117335..55173645ae7 100644 --- a/consensus/types/src/chain_spec.rs +++ b/consensus/types/src/chain_spec.rs @@ -4,6 +4,7 @@ use int_to_bytes::int_to_bytes4; use serde::Deserialize; use serde::{Deserializer, Serialize, Serializer}; use serde_utils::quoted_u64::MaybeQuoted; +use ssz::Encode; use std::fs::File; use std::path::Path; use std::time::Duration; @@ -174,8 +175,6 @@ pub struct ChainSpec { */ pub boot_nodes: Vec, pub network_id: u8, - pub attestation_propagation_slot_range: u64, - pub maximum_gossip_clock_disparity_millis: u64, pub target_aggregators_per_committee: u64, pub gossip_max_size: u64, pub max_request_blocks: u64, @@ -184,6 +183,8 @@ pub struct ChainSpec { pub max_chunk_size: u64, pub ttfb_timeout: u64, pub resp_timeout: u64, + pub attestation_propagation_slot_range: u64, + pub maximum_gossip_clock_disparity_millis: u64, pub message_domain_invalid_snappy: [u8; 4], pub message_domain_valid_snappy: [u8; 4], pub subnets_per_node: u8, @@ -199,6 +200,18 @@ pub struct ChainSpec { pub min_epochs_for_blob_sidecars_requests: u64, pub blob_sidecar_subnet_count: u64, + /* + * Networking Derived + * + * When adding fields here, make sure any values are derived again during `apply_to_chain_spec`. + */ + pub min_blocks_by_root_request: usize, + pub max_blocks_by_root_request: usize, + pub min_blocks_by_root_request_deneb: usize, + pub max_blocks_by_root_request_deneb: usize, + pub min_blobs_by_root_request: usize, + pub max_blobs_by_root_request: usize, + /* * Application params */ @@ -661,12 +674,12 @@ impl ChainSpec { */ boot_nodes: vec![], network_id: 1, // mainnet network id - attestation_propagation_slot_range: 32, + attestation_propagation_slot_range: default_attestation_propagation_slot_range(), attestation_subnet_count: 64, subnets_per_node: 2, - maximum_gossip_clock_disparity_millis: 500, + maximum_gossip_clock_disparity_millis: default_maximum_gossip_clock_disparity_millis(), target_aggregators_per_committee: 16, - epochs_per_subnet_subscription: 256, + epochs_per_subnet_subscription: default_epochs_per_subnet_subscription(), gossip_max_size: default_gossip_max_size(), min_epochs_for_block_requests: default_min_epochs_for_block_requests(), max_chunk_size: default_max_chunk_size(), @@ -686,6 +699,16 @@ impl ChainSpec { min_epochs_for_blob_sidecars_requests: default_min_epochs_for_blob_sidecars_requests(), blob_sidecar_subnet_count: default_blob_sidecar_subnet_count(), + /* + * Derived Deneb Specific + */ + min_blocks_by_root_request: default_min_blocks_by_root_request(), + max_blocks_by_root_request: default_max_blocks_by_root_request(), + min_blocks_by_root_request_deneb: default_min_blocks_by_root_request_deneb(), + max_blocks_by_root_request_deneb: default_max_blocks_by_root_request_deneb(), + min_blobs_by_root_request: default_min_blobs_by_root_request(), + max_blobs_by_root_request: default_max_blobs_by_root_request(), + /* * Application specific */ @@ -916,12 +939,12 @@ impl ChainSpec { */ boot_nodes: vec![], network_id: 100, // Gnosis Chain network id - attestation_propagation_slot_range: 32, + attestation_propagation_slot_range: default_attestation_propagation_slot_range(), attestation_subnet_count: 64, subnets_per_node: 4, // Make this larger than usual to avoid network damage - maximum_gossip_clock_disparity_millis: 500, + maximum_gossip_clock_disparity_millis: default_maximum_gossip_clock_disparity_millis(), target_aggregators_per_committee: 16, - epochs_per_subnet_subscription: 256, + epochs_per_subnet_subscription: default_epochs_per_subnet_subscription(), gossip_max_size: default_gossip_max_size(), min_epochs_for_block_requests: default_min_epochs_for_block_requests(), max_chunk_size: default_max_chunk_size(), @@ -941,6 +964,16 @@ impl ChainSpec { min_epochs_for_blob_sidecars_requests: default_min_epochs_for_blob_sidecars_requests(), blob_sidecar_subnet_count: default_blob_sidecar_subnet_count(), + /* + * Derived Deneb Specific + */ + min_blocks_by_root_request: default_min_blocks_by_root_request(), + max_blocks_by_root_request: default_max_blocks_by_root_request(), + min_blocks_by_root_request_deneb: default_min_blocks_by_root_request_deneb(), + max_blocks_by_root_request_deneb: default_max_blocks_by_root_request_deneb(), + min_blobs_by_root_request: default_min_blobs_by_root_request(), + max_blobs_by_root_request: default_max_blobs_by_root_request(), + /* * Application specific */ @@ -1065,6 +1098,12 @@ pub struct Config { #[serde(default = "default_gossip_max_size")] #[serde(with = "serde_utils::quoted_u64")] gossip_max_size: u64, + #[serde(default = "default_max_request_blocks")] + #[serde(with = "serde_utils::quoted_u64")] + max_request_blocks: u64, + #[serde(default = "default_epochs_per_subnet_subscription")] + #[serde(with = "serde_utils::quoted_u64")] + epochs_per_subnet_subscription: u64, #[serde(default = "default_min_epochs_for_block_requests")] #[serde(with = "serde_utils::quoted_u64")] min_epochs_for_block_requests: u64, @@ -1077,6 +1116,12 @@ pub struct Config { #[serde(default = "default_resp_timeout")] #[serde(with = "serde_utils::quoted_u64")] resp_timeout: u64, + #[serde(default = "default_attestation_propagation_slot_range")] + #[serde(with = "serde_utils::quoted_u64")] + attestation_propagation_slot_range: u64, + #[serde(default = "default_maximum_gossip_clock_disparity_millis")] + #[serde(with = "serde_utils::quoted_u64")] + maximum_gossip_clock_disparity_millis: u64, #[serde(default = "default_message_domain_invalid_snappy")] #[serde(with = "serde_utils::bytes_4_hex")] message_domain_invalid_snappy: [u8; 4], @@ -1089,6 +1134,18 @@ pub struct Config { #[serde(default = "default_attestation_subnet_prefix_bits")] #[serde(with = "serde_utils::quoted_u8")] attestation_subnet_prefix_bits: u8, + #[serde(default = "default_max_request_blocks_deneb")] + #[serde(with = "serde_utils::quoted_u64")] + max_request_blocks_deneb: u64, + #[serde(default = "default_max_request_blob_sidecars")] + #[serde(with = "serde_utils::quoted_u64")] + max_request_blob_sidecars: u64, + #[serde(default = "default_min_epochs_for_blob_sidecars_requests")] + #[serde(with = "serde_utils::quoted_u64")] + min_epochs_for_blob_sidecars_requests: u64, + #[serde(default = "default_blob_sidecar_subnet_count")] + #[serde(with = "serde_utils::quoted_u64")] + blob_sidecar_subnet_count: u64, } fn default_bellatrix_fork_version() -> [u8; 4] { @@ -1190,6 +1247,76 @@ const fn default_blob_sidecar_subnet_count() -> u64 { 6 } +const fn default_epochs_per_subnet_subscription() -> u64 { + 256 +} + +const fn default_attestation_propagation_slot_range() -> u64 { + 32 +} + +const fn default_maximum_gossip_clock_disparity_millis() -> u64 { + 500 +} + +fn min_blocks_by_root_request_common(max_request_blocks: u64) -> usize { + let max_request_blocks = max_request_blocks as usize; + RuntimeVariableList::::from_vec(Vec::::new(), max_request_blocks) + .as_ssz_bytes() + .len() +} + +fn max_blocks_by_root_request_common(max_request_blocks: u64) -> usize { + let max_request_blocks = max_request_blocks as usize; + RuntimeVariableList::::from_vec( + vec![Hash256::zero(); max_request_blocks], + max_request_blocks, + ) + .as_ssz_bytes() + .len() +} + +fn min_blobs_by_root_request_common(max_request_blob_sidecars: u64) -> usize { + let max_request_blob_sidecars = max_request_blob_sidecars as usize; + RuntimeVariableList::::from_vec(Vec::::new(), max_request_blob_sidecars) + .as_ssz_bytes() + .len() +} + +fn max_blobs_by_root_request_common(max_request_blob_sidecars: u64) -> usize { + let max_request_blob_sidecars = max_request_blob_sidecars as usize; + RuntimeVariableList::::from_vec( + vec![Hash256::zero(); max_request_blob_sidecars], + max_request_blob_sidecars, + ) + .as_ssz_bytes() + .len() +} + +fn default_min_blocks_by_root_request() -> usize { + min_blocks_by_root_request_common(default_max_request_blocks()) +} + +fn default_max_blocks_by_root_request() -> usize { + max_blocks_by_root_request_common(default_max_request_blocks()) +} + +fn default_min_blocks_by_root_request_deneb() -> usize { + min_blocks_by_root_request_common(default_max_request_blocks_deneb()) +} + +fn default_max_blocks_by_root_request_deneb() -> usize { + max_blocks_by_root_request_common(default_max_request_blocks_deneb()) +} + +fn default_min_blobs_by_root_request() -> usize { + min_blobs_by_root_request_common(default_max_request_blob_sidecars()) +} + +fn default_max_blobs_by_root_request() -> usize { + max_blobs_by_root_request_common(default_max_request_blob_sidecars()) +} + impl Default for Config { fn default() -> Self { let chain_spec = MainnetEthSpec::default_spec(); @@ -1292,14 +1419,22 @@ impl Config { deposit_contract_address: spec.deposit_contract_address, gossip_max_size: spec.gossip_max_size, + max_request_blocks: spec.max_request_blocks, + epochs_per_subnet_subscription: spec.epochs_per_subnet_subscription, min_epochs_for_block_requests: spec.min_epochs_for_block_requests, max_chunk_size: spec.max_chunk_size, ttfb_timeout: spec.ttfb_timeout, resp_timeout: spec.resp_timeout, + attestation_propagation_slot_range: spec.attestation_propagation_slot_range, + maximum_gossip_clock_disparity_millis: spec.maximum_gossip_clock_disparity_millis, message_domain_invalid_snappy: spec.message_domain_invalid_snappy, message_domain_valid_snappy: spec.message_domain_valid_snappy, attestation_subnet_extra_bits: spec.attestation_subnet_extra_bits, attestation_subnet_prefix_bits: spec.attestation_subnet_prefix_bits, + max_request_blocks_deneb: spec.max_request_blocks_deneb, + max_request_blob_sidecars: spec.max_request_blob_sidecars, + min_epochs_for_blob_sidecars_requests: spec.min_epochs_for_blob_sidecars_requests, + blob_sidecar_subnet_count: spec.blob_sidecar_subnet_count, } } @@ -1356,6 +1491,14 @@ impl Config { message_domain_valid_snappy, attestation_subnet_extra_bits, attestation_subnet_prefix_bits, + max_request_blocks, + epochs_per_subnet_subscription, + attestation_propagation_slot_range, + maximum_gossip_clock_disparity_millis, + max_request_blocks_deneb, + max_request_blob_sidecars, + min_epochs_for_blob_sidecars_requests, + blob_sidecar_subnet_count, } = self; if preset_base != T::spec_name().to_string().as_str() { @@ -1405,6 +1548,27 @@ impl Config { message_domain_valid_snappy, attestation_subnet_extra_bits, attestation_subnet_prefix_bits, + max_request_blocks, + epochs_per_subnet_subscription, + attestation_propagation_slot_range, + maximum_gossip_clock_disparity_millis, + max_request_blocks_deneb, + max_request_blob_sidecars, + min_epochs_for_blob_sidecars_requests, + blob_sidecar_subnet_count, + + // We need to re-derive any values that might have changed in the config. + min_blocks_by_root_request: min_blocks_by_root_request_common(max_request_blocks), + max_blocks_by_root_request: max_blocks_by_root_request_common(max_request_blocks), + min_blocks_by_root_request_deneb: min_blocks_by_root_request_common( + max_request_blocks_deneb, + ), + max_blocks_by_root_request_deneb: max_blocks_by_root_request_common( + max_request_blocks_deneb, + ), + min_blobs_by_root_request: min_blobs_by_root_request_common(max_request_blob_sidecars), + max_blobs_by_root_request: max_blobs_by_root_request_common(max_request_blob_sidecars), + ..chain_spec.clone() }) } diff --git a/consensus/types/src/fork_context.rs b/consensus/types/src/fork_context.rs index 51d089df951..611175ea82e 100644 --- a/consensus/types/src/fork_context.rs +++ b/consensus/types/src/fork_context.rs @@ -1,7 +1,6 @@ use parking_lot::RwLock; -use crate::{ChainSpec, EthSpec, ForkName, Hash256, RuntimeVariableList, Slot}; -use ssz::Encode; +use crate::{ChainSpec, EthSpec, ForkName, Hash256, Slot}; use std::collections::HashMap; /// Provides fork specific info like the current fork name and the fork digests corresponding to every valid fork. @@ -10,11 +9,7 @@ pub struct ForkContext { current_fork: RwLock, fork_to_digest: HashMap, digest_to_fork: HashMap<[u8; 4], ForkName>, - pub blocks_by_root_request_min: usize, - pub blocks_by_root_request_max: usize, - pub blobs_by_root_request_min: usize, - pub blobs_by_root_request_max: usize, - pub spec: ChainSpec, + spec: ChainSpec, } impl ForkContext { @@ -75,40 +70,10 @@ impl ForkContext { .map(|(k, v)| (v, k)) .collect(); - let max_request_blocks = spec.max_request_blocks as usize; - let blocks_by_root_request_min = - RuntimeVariableList::::from_vec(Vec::::new(), max_request_blocks) - .as_ssz_bytes() - .len(); - let blocks_by_root_request_max = RuntimeVariableList::::from_vec( - vec![Hash256::zero(); max_request_blocks], - max_request_blocks, - ) - .as_ssz_bytes() - .len(); - - let max_request_blob_sidecars = spec.max_request_blob_sidecars as usize; - let blobs_by_root_request_min = RuntimeVariableList::::from_vec( - Vec::::new(), - max_request_blob_sidecars, - ) - .as_ssz_bytes() - .len(); - let blobs_by_root_request_max = RuntimeVariableList::::from_vec( - vec![Hash256::zero(); max_request_blob_sidecars], - max_request_blob_sidecars, - ) - .as_ssz_bytes() - .len(); - Self { current_fork: RwLock::new(spec.fork_name_at_slot::(current_slot)), fork_to_digest, digest_to_fork, - blocks_by_root_request_min, - blocks_by_root_request_max, - blobs_by_root_request_min, - blobs_by_root_request_max, spec: spec.clone(), } } @@ -152,4 +117,30 @@ impl ForkContext { pub fn all_fork_digests(&self) -> Vec<[u8; 4]> { self.digest_to_fork.keys().cloned().collect() } + + pub fn min_blocks_by_root_request(&self) -> usize { + let fork_name = self.current_fork(); + match fork_name { + ForkName::Base | ForkName::Altair | ForkName::Merge | ForkName::Capella => { + self.spec.min_blocks_by_root_request + } + ForkName::Deneb => self.spec.min_blocks_by_root_request_deneb, + } + } + + pub fn max_blocks_by_root_request(&self) -> usize { + let fork_name = self.current_fork(); + match fork_name { + ForkName::Base | ForkName::Altair | ForkName::Merge | ForkName::Capella => { + self.spec.max_blocks_by_root_request + } + ForkName::Deneb => self.spec.max_blocks_by_root_request_deneb, + } + } + pub fn min_blobs_by_root_request(&self) -> usize { + self.spec.min_blobs_by_root_request + } + pub fn max_blobs_by_root_request(&self) -> usize { + self.spec.max_blobs_by_root_request + } }