Merge branch 'unstable' into eip4844

This commit is contained in:
Diva M 2023-03-03 14:14:18 -05:00
commit f16e82ab2c
No known key found for this signature in database
GPG Key ID: 1BAE5E01126680FE
21 changed files with 154 additions and 244 deletions

View File

@ -5210,18 +5210,34 @@ impl<T: BeaconChainTypes> BeaconChain<T> {
"status" => ?status "status" => ?status
); );
// This implies that the terminal block was invalid. We are being explicit in match latest_valid_hash {
// invalidating only the head block in this case. // The `latest_valid_hash` is set to `None` when the EE
if latest_valid_hash == ExecutionBlockHash::zero() { // "cannot determine the ancestor of the invalid
// payload". In such a scenario we should only
// invalidate the head block and nothing else.
None => {
self.process_invalid_execution_payload( self.process_invalid_execution_payload(
&InvalidationOperation::InvalidateOne { &InvalidationOperation::InvalidateOne {
block_root: head_block_root, block_root: head_block_root,
}, },
) )
.await?; .await?;
} else { }
// An all-zeros execution block hash implies that
// the terminal block was invalid. We are being
// explicit in invalidating only the head block in
// this case.
Some(hash) if hash == ExecutionBlockHash::zero() => {
self.process_invalid_execution_payload(
&InvalidationOperation::InvalidateOne {
block_root: head_block_root,
},
)
.await?;
}
// The execution engine has stated that all blocks between the // The execution engine has stated that all blocks between the
// `head_execution_block_hash` and `latest_valid_hash` are invalid. // `head_execution_block_hash` and `latest_valid_hash` are invalid.
Some(latest_valid_hash) => {
self.process_invalid_execution_payload( self.process_invalid_execution_payload(
&InvalidationOperation::InvalidateMany { &InvalidationOperation::InvalidateMany {
head_block_root, head_block_root,
@ -5231,6 +5247,7 @@ impl<T: BeaconChainTypes> BeaconChain<T> {
) )
.await?; .await?;
} }
}
Err(BeaconChainError::ExecutionForkChoiceUpdateInvalid { status }) Err(BeaconChainError::ExecutionForkChoiceUpdateInvalid { status })
} }

View File

@ -172,14 +172,26 @@ async fn notify_new_payload<'a, T: BeaconChainTypes>(
"method" => "new_payload", "method" => "new_payload",
); );
// latest_valid_hash == 0 implies that this was the terminal block // Only trigger payload invalidation in fork choice if the
// Hence, we don't need to run `BeaconChain::process_invalid_execution_payload`. // `latest_valid_hash` is `Some` and non-zero.
if latest_valid_hash == ExecutionBlockHash::zero() { //
return Err(ExecutionPayloadError::RejectedByExecutionEngine { status }.into()); // A `None` latest valid hash indicates that the EE was unable
} // to determine the most recent valid ancestor. Since `block`
// has not yet been applied to fork choice, there's nothing to
// invalidate.
//
// An all-zeros payload indicates that an EIP-3675 check has
// failed regarding the validity of the terminal block. Rather
// than iterating back in the chain to find the terminal block
// and invalidating that, we simply reject this block without
// invalidating anything else.
if let Some(latest_valid_hash) =
latest_valid_hash.filter(|hash| *hash != ExecutionBlockHash::zero())
{
// This block has not yet been applied to fork choice, so the latest block that was // This block has not yet been applied to fork choice, so the latest block that was
// imported to fork choice was the parent. // imported to fork choice was the parent.
let latest_root = block.parent_root(); let latest_root = block.parent_root();
chain chain
.process_invalid_execution_payload(&InvalidationOperation::InvalidateMany { .process_invalid_execution_payload(&InvalidationOperation::InvalidateMany {
head_block_root: latest_root, head_block_root: latest_root,
@ -187,6 +199,7 @@ async fn notify_new_payload<'a, T: BeaconChainTypes>(
latest_valid_ancestor: latest_valid_hash, latest_valid_ancestor: latest_valid_hash,
}) })
.await?; .await?;
}
Err(ExecutionPayloadError::RejectedByExecutionEngine { status }.into()) Err(ExecutionPayloadError::RejectedByExecutionEngine { status }.into())
} }

View File

@ -10,7 +10,9 @@ use types::ExecutionBlockHash;
pub enum PayloadStatus { pub enum PayloadStatus {
Valid, Valid,
Invalid { Invalid {
latest_valid_hash: ExecutionBlockHash, /// The EE will provide a `None` LVH when it is unable to determine the
/// latest valid ancestor.
latest_valid_hash: Option<ExecutionBlockHash>,
validation_error: Option<String>, validation_error: Option<String>,
}, },
Syncing, Syncing,
@ -55,22 +57,10 @@ pub fn process_payload_status(
}) })
} }
} }
PayloadStatusV1Status::Invalid => { PayloadStatusV1Status::Invalid => Ok(PayloadStatus::Invalid {
if let Some(latest_valid_hash) = response.latest_valid_hash { latest_valid_hash: response.latest_valid_hash,
// The response is only valid if `latest_valid_hash` is not `null`. validation_error: response.validation_error,
Ok(PayloadStatus::Invalid { }),
latest_valid_hash,
validation_error: response.validation_error.clone(),
})
} else {
Err(EngineError::Api {
error: ApiError::BadResponse(
"new_payload: response.status = INVALID but null latest_valid_hash"
.to_string(),
),
})
}
}
PayloadStatusV1Status::InvalidBlockHash => { PayloadStatusV1Status::InvalidBlockHash => {
// In the interests of being liberal with what we accept, only raise a // In the interests of being liberal with what we accept, only raise a
// warning here. // warning here.

View File

@ -13,8 +13,8 @@ use crate::rpc::*;
use crate::service::behaviour::BehaviourEvent; use crate::service::behaviour::BehaviourEvent;
pub use crate::service::behaviour::Gossipsub; pub use crate::service::behaviour::Gossipsub;
use crate::types::{ use crate::types::{
subnet_from_topic_hash, GossipEncoding, GossipKind, GossipTopic, SnappyTransform, Subnet, fork_core_topics, subnet_from_topic_hash, GossipEncoding, GossipKind, GossipTopic,
SubnetDiscovery, SnappyTransform, Subnet, SubnetDiscovery,
}; };
use crate::EnrExt; use crate::EnrExt;
use crate::Eth2Enr; use crate::Eth2Enr;
@ -41,6 +41,7 @@ use std::{
sync::Arc, sync::Arc,
task::{Context, Poll}, task::{Context, Poll},
}; };
use types::ForkName;
use types::{ use types::{
consts::altair::SYNC_COMMITTEE_SUBNET_COUNT, EnrForkId, EthSpec, ForkContext, Slot, SubnetId, consts::altair::SYNC_COMMITTEE_SUBNET_COUNT, EnrForkId, EthSpec, ForkContext, Slot, SubnetId,
}; };
@ -561,13 +562,20 @@ impl<AppReqId: ReqId, TSpec: EthSpec> Network<AppReqId, TSpec> {
self.unsubscribe(gossip_topic) self.unsubscribe(gossip_topic)
} }
/// Subscribe to all currently subscribed topics with the new fork digest. /// Subscribe to all required topics for the `new_fork` with the given `new_fork_digest`.
pub fn subscribe_new_fork_topics(&mut self, new_fork_digest: [u8; 4]) { pub fn subscribe_new_fork_topics(&mut self, new_fork: ForkName, new_fork_digest: [u8; 4]) {
// Subscribe to existing topics with new fork digest
let subscriptions = self.network_globals.gossipsub_subscriptions.read().clone(); let subscriptions = self.network_globals.gossipsub_subscriptions.read().clone();
for mut topic in subscriptions.into_iter() { for mut topic in subscriptions.into_iter() {
topic.fork_digest = new_fork_digest; topic.fork_digest = new_fork_digest;
self.subscribe(topic); self.subscribe(topic);
} }
// Subscribe to core topics for the new fork
for kind in fork_core_topics(&new_fork) {
let topic = GossipTopic::new(kind, GossipEncoding::default(), new_fork_digest);
self.subscribe(topic);
}
} }
/// Unsubscribe from all topics that doesn't have the given fork_digest /// Unsubscribe from all topics that doesn't have the given fork_digest

View File

@ -17,6 +17,6 @@ pub use pubsub::{PubsubMessage, SnappyTransform};
pub use subnet::{Subnet, SubnetDiscovery}; pub use subnet::{Subnet, SubnetDiscovery};
pub use sync_state::{BackFillState, SyncState}; pub use sync_state::{BackFillState, SyncState};
pub use topics::{ pub use topics::{
subnet_from_topic_hash, GossipEncoding, GossipKind, GossipTopic, CORE_TOPICS, core_topics_to_subscribe, fork_core_topics, subnet_from_topic_hash, GossipEncoding, GossipKind,
LIGHT_CLIENT_GOSSIP_TOPICS, GossipTopic, LIGHT_CLIENT_GOSSIP_TOPICS,
}; };

View File

@ -1,7 +1,7 @@
use libp2p::gossipsub::{IdentTopic as Topic, TopicHash}; use libp2p::gossipsub::{IdentTopic as Topic, TopicHash};
use serde_derive::{Deserialize, Serialize}; use serde_derive::{Deserialize, Serialize};
use strum::AsRefStr; use strum::AsRefStr;
use types::{SubnetId, SyncSubnetId}; use types::{ForkName, SubnetId, SyncSubnetId};
use crate::Subnet; use crate::Subnet;
@ -23,21 +23,45 @@ pub const BLS_TO_EXECUTION_CHANGE_TOPIC: &str = "bls_to_execution_change";
pub const LIGHT_CLIENT_FINALITY_UPDATE: &str = "light_client_finality_update"; pub const LIGHT_CLIENT_FINALITY_UPDATE: &str = "light_client_finality_update";
pub const LIGHT_CLIENT_OPTIMISTIC_UPDATE: &str = "light_client_optimistic_update"; pub const LIGHT_CLIENT_OPTIMISTIC_UPDATE: &str = "light_client_optimistic_update";
pub const CORE_TOPICS: [GossipKind; 7] = [ pub const BASE_CORE_TOPICS: [GossipKind; 5] = [
GossipKind::BeaconBlock, GossipKind::BeaconBlock,
GossipKind::BeaconAggregateAndProof, GossipKind::BeaconAggregateAndProof,
GossipKind::VoluntaryExit, GossipKind::VoluntaryExit,
GossipKind::ProposerSlashing, GossipKind::ProposerSlashing,
GossipKind::AttesterSlashing, GossipKind::AttesterSlashing,
GossipKind::SignedContributionAndProof,
GossipKind::BlsToExecutionChange,
]; ];
pub const ALTAIR_CORE_TOPICS: [GossipKind; 1] = [GossipKind::SignedContributionAndProof];
pub const CAPELLA_CORE_TOPICS: [GossipKind; 1] = [GossipKind::BlsToExecutionChange];
pub const LIGHT_CLIENT_GOSSIP_TOPICS: [GossipKind; 2] = [ pub const LIGHT_CLIENT_GOSSIP_TOPICS: [GossipKind; 2] = [
GossipKind::LightClientFinalityUpdate, GossipKind::LightClientFinalityUpdate,
GossipKind::LightClientOptimisticUpdate, GossipKind::LightClientOptimisticUpdate,
]; ];
/// Returns the core topics associated with each fork that are new to the previous fork
pub fn fork_core_topics(fork_name: &ForkName) -> Vec<GossipKind> {
match fork_name {
ForkName::Base => BASE_CORE_TOPICS.to_vec(),
ForkName::Altair => ALTAIR_CORE_TOPICS.to_vec(),
ForkName::Merge => vec![],
ForkName::Capella => CAPELLA_CORE_TOPICS.to_vec(),
}
}
/// Returns all the topics that we need to subscribe to for a given fork
/// including topics from older forks and new topics for the current fork.
pub fn core_topics_to_subscribe(mut current_fork: ForkName) -> Vec<GossipKind> {
let mut topics = fork_core_topics(&current_fork);
while let Some(previous_fork) = current_fork.previous_fork() {
let previous_fork_topics = fork_core_topics(&previous_fork);
topics.extend(previous_fork_topics);
current_fork = previous_fork;
}
topics
}
/// A gossipsub topic which encapsulates the type of messages that should be sent and received over /// A gossipsub topic which encapsulates the type of messages that should be sent and received over
/// the pubsub protocol and the way the messages should be encoded. /// the pubsub protocol and the way the messages should be encoded.
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Hash)] #[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Hash)]
@ -396,4 +420,15 @@ mod tests {
assert_eq!("proposer_slashing", ProposerSlashing.as_ref()); assert_eq!("proposer_slashing", ProposerSlashing.as_ref());
assert_eq!("attester_slashing", AttesterSlashing.as_ref()); assert_eq!("attester_slashing", AttesterSlashing.as_ref());
} }
#[test]
fn test_core_topics_to_subscribe() {
let mut all_topics = Vec::new();
all_topics.extend(CAPELLA_CORE_TOPICS);
all_topics.extend(ALTAIR_CORE_TOPICS);
all_topics.extend(BASE_CORE_TOPICS);
let latest_fork = *ForkName::list_all().last().unwrap();
assert_eq!(core_topics_to_subscribe(latest_fork), all_topics);
}
} }

View File

@ -19,7 +19,7 @@ use lighthouse_network::{
Context, PeerAction, PeerRequestId, PubsubMessage, ReportSource, Request, Response, Subnet, Context, PeerAction, PeerRequestId, PubsubMessage, ReportSource, Request, Response, Subnet,
}; };
use lighthouse_network::{ use lighthouse_network::{
types::{GossipEncoding, GossipTopic}, types::{core_topics_to_subscribe, GossipEncoding, GossipTopic},
MessageId, NetworkEvent, NetworkGlobals, PeerId, MessageId, NetworkEvent, NetworkGlobals, PeerId,
}; };
use slog::{crit, debug, error, info, o, trace, warn}; use slog::{crit, debug, error, info, o, trace, warn};
@ -445,7 +445,7 @@ impl<T: BeaconChainTypes> NetworkService<T> {
let fork_version = self.beacon_chain.spec.fork_version_for_name(fork_name); let fork_version = self.beacon_chain.spec.fork_version_for_name(fork_name);
let fork_digest = ChainSpec::compute_fork_digest(fork_version, self.beacon_chain.genesis_validators_root); let fork_digest = ChainSpec::compute_fork_digest(fork_version, self.beacon_chain.genesis_validators_root);
info!(self.log, "Subscribing to new fork topics"); info!(self.log, "Subscribing to new fork topics");
self.libp2p.subscribe_new_fork_topics(fork_digest); self.libp2p.subscribe_new_fork_topics(fork_name, fork_digest);
self.next_fork_subscriptions = Box::pin(None.into()); self.next_fork_subscriptions = Box::pin(None.into());
} }
else { else {
@ -685,7 +685,7 @@ impl<T: BeaconChainTypes> NetworkService<T> {
} }
let mut subscribed_topics: Vec<GossipTopic> = vec![]; let mut subscribed_topics: Vec<GossipTopic> = vec![];
for topic_kind in lighthouse_network::types::CORE_TOPICS.iter() { for topic_kind in core_topics_to_subscribe(self.fork_context.current_fork()) {
for fork_digest in self.required_gossip_fork_digests() { for fork_digest in self.required_gossip_fork_digests() {
let topic = GossipTopic::new( let topic = GossipTopic::new(
topic_kind.clone(), topic_kind.clone(),

View File

@ -116,7 +116,7 @@ Several conditions need to be met in order to run `lighthouse db`:
2. The command must run as the user that owns the beacon node database. If you are using systemd then 2. The command must run as the user that owns the beacon node database. If you are using systemd then
your beacon node might run as a user called `lighthousebeacon`. your beacon node might run as a user called `lighthousebeacon`.
3. The `--datadir` flag must be set to the location of the Lighthouse data directory. 3. The `--datadir` flag must be set to the location of the Lighthouse data directory.
4. The `--network` flag must be set to the correct network, e.g. `mainnet`, `prater` or `ropsten`. 4. The `--network` flag must be set to the correct network, e.g. `mainnet`, `prater` or `sepolia`.
The general form for a `lighthouse db` command is: The general form for a `lighthouse db` command is:

View File

@ -278,26 +278,6 @@ define_hardcoded_nets!(
// directory. // directory.
GENESIS_STATE_IS_KNOWN GENESIS_STATE_IS_KNOWN
), ),
(
// Network name (must be unique among all networks).
kiln,
// The name of the directory in the `eth2_network_config/built_in_network_configs`
// directory where the configuration files are located for this network.
"kiln",
// Set to `true` if the genesis state can be found in the `built_in_network_configs`
// directory.
GENESIS_STATE_IS_KNOWN
),
(
// Network name (must be unique among all networks).
ropsten,
// The name of the directory in the `eth2_network_config/built_in_network_configs`
// directory where the configuration files are located for this network.
"ropsten",
// Set to `true` if the genesis state can be found in the `built_in_network_configs`
// directory.
GENESIS_STATE_IS_KNOWN
),
( (
// Network name (must be unique among all networks). // Network name (must be unique among all networks).
sepolia, sepolia,

View File

@ -1,3 +0,0 @@
- enr:-Iq4QMCTfIMXnow27baRUb35Q8iiFHSIDBJh6hQM5Axohhf4b6Kr_cOCu0htQ5WvVqKvFgY28893DHAg8gnBAXsAVqmGAX53x8JggmlkgnY0gmlwhLKAlv6Jc2VjcDI1NmsxoQK6S-Cii_KmfFdUJL2TANL3ksaKUnNXvTCv1tLwXs0QgIN1ZHCCIyk
- enr:-KG4QFkPJUFWuONp5grM94OJvNht9wX6N36sA4wqucm6Z02ECWBQRmh6AzndaLVGYBHWre67mjK-E0uKt2CIbWrsZ_8DhGV0aDKQc6pfXHAAAHAyAAAAAAAAAIJpZIJ2NIJpcISl6LTmiXNlY3AyNTZrMaEDHlSNOgYrNWP8_l_WXqDMRvjv6gUAvHKizfqDDVc8feaDdGNwgiMog3VkcIIjKA
- enr:-MK4QI-wkVW1PxL4ksUM4H_hMgTTwxKMzvvDMfoiwPBuRxcsGkrGPLo4Kho3Ri1DEtJG4B6pjXddbzA9iF2gVctxv42GAX9v5WG5h2F0dG5ldHOIAAAAAAAAAACEZXRoMpBzql9ccAAAcDIAAAAAAAAAgmlkgnY0gmlwhKRcjMiJc2VjcDI1NmsxoQK1fc46pmVHKq8HNYLkSVaUv4uK2UBsGgjjGWU6AAhAY4hzeW5jbmV0cwCDdGNwgiMog3VkcIIjKA

View File

@ -1,69 +0,0 @@
# Extends the mainnet preset
CONFIG_NAME: 'kiln'
PRESET_BASE: 'mainnet'
# Genesis
# ---------------------------------------------------------------
MIN_GENESIS_ACTIVE_VALIDATOR_COUNT: 95000
# Mar 11th, 2022, 14:00 UTC
MIN_GENESIS_TIME: 1647007200
# Genesis fork
GENESIS_FORK_VERSION: 0x70000069
# 300 seconds (5 min)
GENESIS_DELAY: 300
# Forking
# ---------------------------------------------------------------
# Some forks are disabled for now:
# - These may be re-assigned to another fork-version later
# - Temporarily set to max uint64 value: 2**64 - 1
# Altair
ALTAIR_FORK_VERSION: 0x70000070
ALTAIR_FORK_EPOCH: 50
# Bellatrix
BELLATRIX_FORK_VERSION: 0x70000071
BELLATRIX_FORK_EPOCH: 150
TERMINAL_TOTAL_DIFFICULTY: 20000000000000
TERMINAL_BLOCK_HASH: 0x0000000000000000000000000000000000000000000000000000000000000000
TERMINAL_BLOCK_HASH_ACTIVATION_EPOCH: 18446744073709551615
# Sharding
SHARDING_FORK_VERSION: 0x03000000
SHARDING_FORK_EPOCH: 18446744073709551615
# Time parameters
# ---------------------------------------------------------------
# 12 seconds
SECONDS_PER_SLOT: 12
# 14 (estimate from Eth1 mainnet)
SECONDS_PER_ETH1_BLOCK: 14
# 2**8 (= 256) epochs ~27 hours
MIN_VALIDATOR_WITHDRAWABILITY_DELAY: 256
# 2**8 (= 256) epochs ~27 hours
SHARD_COMMITTEE_PERIOD: 256
# 16 blocks is ~190s
ETH1_FOLLOW_DISTANCE: 16
# Validator cycle
# ---------------------------------------------------------------
# 2**2 (= 4)
INACTIVITY_SCORE_BIAS: 4
# 2**4 (= 16)
INACTIVITY_SCORE_RECOVERY_RATE: 16
# 2**4 * 10**9 (= 16,000,000,000) Gwei
EJECTION_BALANCE: 16000000000
# 2**2 (= 4)
MIN_PER_EPOCH_CHURN_LIMIT: 4
# 2**16 (= 65,536)
CHURN_LIMIT_QUOTIENT: 65536
# Deposit contract
# ---------------------------------------------------------------
# Custom Ethereum testnet
DEPOSIT_CHAIN_ID: 1337802
DEPOSIT_NETWORK_ID: 1337802
DEPOSIT_CONTRACT_ADDRESS: 0x4242424242424242424242424242424242424242

View File

@ -1,4 +0,0 @@
# Pari
- enr:-Iq4QMCTfIMXnow27baRUb35Q8iiFHSIDBJh6hQM5Axohhf4b6Kr_cOCu0htQ5WvVqKvFgY28893DHAg8gnBAXsAVqmGAX53x8JggmlkgnY0gmlwhLKAlv6Jc2VjcDI1NmsxoQK6S-Cii_KmfFdUJL2TANL3ksaKUnNXvTCv1tLwXs0QgIN1ZHCCIyk
# Teku
- enr:-KG4QMJSJ7DHk6v2p-W8zQ3Xv7FfssZ_1E3p2eY6kN13staMObUonAurqyWhODoeY6edXtV8e9eL9RnhgZ9va2SMDRQMhGV0aDKQS-iVMYAAAHD0AQAAAAAAAIJpZIJ2NIJpcIQDhAAhiXNlY3AyNTZrMaEDXBVUZhhmdy1MYor1eGdRJ4vHYghFKDgjyHgt6sJ-IlCDdGNwgiMog3VkcIIjKA

View File

@ -1,71 +0,0 @@
# Extends the mainnet preset
PRESET_BASE: 'mainnet'
CONFIG_NAME: 'ropsten'
# Genesis
# ---------------------------------------------------------------
MIN_GENESIS_ACTIVE_VALIDATOR_COUNT: 100000
# Monday, May 30th, 2022 3:00:00 PM +UTC
MIN_GENESIS_TIME: 1653318000
GENESIS_FORK_VERSION: 0x80000069
GENESIS_DELAY: 604800
# Forking
# ---------------------------------------------------------------
# Some forks are disabled for now:
# - These may be re-assigned to another fork-version later
# - Temporarily set to max uint64 value: 2**64 - 1
# Altair
ALTAIR_FORK_VERSION: 0x80000070
ALTAIR_FORK_EPOCH: 500
# Merge
BELLATRIX_FORK_VERSION: 0x80000071
BELLATRIX_FORK_EPOCH: 750
TERMINAL_TOTAL_DIFFICULTY: 50000000000000000
TERMINAL_BLOCK_HASH: 0x0000000000000000000000000000000000000000000000000000000000000000
TERMINAL_BLOCK_HASH_ACTIVATION_EPOCH: 18446744073709551615
# Sharding
SHARDING_FORK_VERSION: 0x03001020
SHARDING_FORK_EPOCH: 18446744073709551615
# Time parameters
# ---------------------------------------------------------------
# 12 seconds
SECONDS_PER_SLOT: 12
# 14 (estimate from Eth1 mainnet)
SECONDS_PER_ETH1_BLOCK: 14
# 2**8 (= 256) epochs ~27 hours
MIN_VALIDATOR_WITHDRAWABILITY_DELAY: 256
# 2**8 (= 256) epochs ~27 hours
SHARD_COMMITTEE_PERIOD: 256
# 2**11 (= 2,048) Eth1 blocks ~8 hours
ETH1_FOLLOW_DISTANCE: 2048
# Validator cycle
# ---------------------------------------------------------------
# 2**2 (= 4)
INACTIVITY_SCORE_BIAS: 4
# 2**4 (= 16)
INACTIVITY_SCORE_RECOVERY_RATE: 16
# 2**4 * 10**9 (= 16,000,000,000) Gwei
EJECTION_BALANCE: 16000000000
# 2**2 (= 4)
MIN_PER_EPOCH_CHURN_LIMIT: 4
# 2**16 (= 65,536)
CHURN_LIMIT_QUOTIENT: 65536
# Fork choice
# ---------------------------------------------------------------
# 40%
PROPOSER_SCORE_BOOST: 40
# Deposit contract
# ---------------------------------------------------------------
DEPOSIT_CHAIN_ID: 3
DEPOSIT_NETWORK_ID: 3
DEPOSIT_CONTRACT_ADDRESS: 0x6f22fFbC56eFF051aECF839396DD1eD9aD6BBA9D

View File

@ -7,7 +7,7 @@ use std::{env, fs::File};
use tempfile::TempDir; use tempfile::TempDir;
use unused_port::unused_tcp_port; use unused_port::unused_tcp_port;
// const GETH_BRANCH: &str = "master"; const GETH_BRANCH: &str = "master";
const GETH_REPO_URL: &str = "https://github.com/ethereum/go-ethereum"; const GETH_REPO_URL: &str = "https://github.com/ethereum/go-ethereum";
pub fn build_result(repo_dir: &Path) -> Output { pub fn build_result(repo_dir: &Path) -> Output {
@ -27,9 +27,7 @@ pub fn build(execution_clients_dir: &Path) {
} }
// Get the latest tag on the branch // Get the latest tag on the branch
// TODO: Update when version is corrected let last_release = build_utils::get_latest_release(&repo_dir, GETH_BRANCH).unwrap();
// let last_release = build_utils::get_latest_release(&repo_dir, GETH_BRANCH).unwrap();
let last_release = "v1.11.1";
build_utils::checkout(&repo_dir, dbg!(&last_release)).unwrap(); build_utils::checkout(&repo_dir, dbg!(&last_release)).unwrap();
// Build geth // Build geth

View File

@ -427,7 +427,16 @@ impl<E: GenericExecutionEngine> TestRig<E> {
.notify_new_payload(&invalid_payload) .notify_new_payload(&invalid_payload)
.await .await
.unwrap(); .unwrap();
assert!(matches!(status, PayloadStatus::InvalidBlockHash { .. })); assert!(matches!(
status,
PayloadStatus::InvalidBlockHash { .. }
// Geth is returning `INVALID` with a `null` LVH to indicate it
// does not know the invalid ancestor.
| PayloadStatus::Invalid {
latest_valid_hash: None,
..
}
));
/* /*
* Execution Engine A: * Execution Engine A:

View File

@ -660,17 +660,17 @@ mod tests {
} }
#[tokio::test] #[tokio::test]
async fn ropsten_base_types() { async fn sepolia_base_types() {
test_base_types("ropsten", 4250).await test_base_types("sepolia", 4250).await
} }
#[tokio::test] #[tokio::test]
async fn ropsten_altair_types() { async fn sepolia_altair_types() {
test_altair_types("ropsten", 4251).await test_altair_types("sepolia", 4251).await
} }
#[tokio::test] #[tokio::test]
async fn ropsten_merge_types() { async fn sepolia_merge_types() {
test_merge_types("ropsten", 4252).await test_merge_types("sepolia", 4252).await
} }
} }

View File

@ -7,7 +7,7 @@ use crate::http_metrics::metrics::{inc_counter_vec, ENDPOINT_ERRORS, ENDPOINT_RE
use environment::RuntimeContext; use environment::RuntimeContext;
use eth2::BeaconNodeHttpClient; use eth2::BeaconNodeHttpClient;
use futures::future; use futures::future;
use slog::{error, info, warn, Logger}; use slog::{debug, error, info, warn, Logger};
use slot_clock::SlotClock; use slot_clock::SlotClock;
use std::fmt; use std::fmt;
use std::fmt::Debug; use std::fmt::Debug;
@ -409,10 +409,12 @@ impl<T: SlotClock, E: EthSpec> BeaconNodeFallback<T, E> {
where where
F: Fn(&'a BeaconNodeHttpClient) -> R, F: Fn(&'a BeaconNodeHttpClient) -> R,
R: Future<Output = Result<O, Err>>, R: Future<Output = Result<O, Err>>,
Err: Debug,
{ {
let mut errors = vec![]; let mut errors = vec![];
let mut to_retry = vec![]; let mut to_retry = vec![];
let mut retry_unsynced = vec![]; let mut retry_unsynced = vec![];
let log = &self.log.clone();
// Run `func` using a `candidate`, returning the value or capturing errors. // Run `func` using a `candidate`, returning the value or capturing errors.
// //
@ -427,6 +429,12 @@ impl<T: SlotClock, E: EthSpec> BeaconNodeFallback<T, E> {
match func(&$candidate.beacon_node).await { match func(&$candidate.beacon_node).await {
Ok(val) => return Ok(val), Ok(val) => return Ok(val),
Err(e) => { Err(e) => {
debug!(
log,
"Request to beacon node failed";
"node" => $candidate.beacon_node.to_string(),
"error" => ?e,
);
// If we have an error on this function, make the client as not-ready. // If we have an error on this function, make the client as not-ready.
// //
// There exists a race condition where the candidate may have been marked // There exists a race condition where the candidate may have been marked
@ -626,6 +634,7 @@ impl<T: SlotClock, E: EthSpec> BeaconNodeFallback<T, E> {
where where
F: Fn(&'a BeaconNodeHttpClient) -> R, F: Fn(&'a BeaconNodeHttpClient) -> R,
R: Future<Output = Result<(), Err>>, R: Future<Output = Result<(), Err>>,
Err: Debug,
{ {
if self.disable_run_on_all { if self.disable_run_on_all {
self.first_success(require_synced, offline_on_failure, func) self.first_success(require_synced, offline_on_failure, func)