Fix execution layer redundancy (#5588)

* remove execution layer url redundancy

* fix typo

* fix tests

* fix formatting
This commit is contained in:
AMIT SINGH
2024-04-18 12:44:56 +05:30
committed by GitHub
parent 49617f3e82
commit 62e4abfbff
9 changed files with 46 additions and 52 deletions

View File

@@ -419,21 +419,17 @@ where
self self
} }
pub fn execution_layer_from_urls(mut self, urls: &[&str]) -> Self { pub fn execution_layer_from_url(mut self, url: &str) -> Self {
assert!( assert!(
self.execution_layer.is_none(), self.execution_layer.is_none(),
"execution layer already defined" "execution layer already defined"
); );
let urls: Vec<SensitiveUrl> = urls let url = SensitiveUrl::parse(url).ok();
.iter()
.map(|s| SensitiveUrl::parse(s))
.collect::<Result<_, _>>()
.unwrap();
let config = execution_layer::Config { let config = execution_layer::Config {
execution_endpoints: urls, execution_endpoint: url,
secret_files: vec![], secret_file: None,
suggested_fee_recipient: Some(Address::repeat_byte(42)), suggested_fee_recipient: Some(Address::repeat_byte(42)),
..Default::default() ..Default::default()
}; };

View File

@@ -355,14 +355,14 @@ struct Inner<E: EthSpec> {
#[derive(Debug, Default, Clone, Serialize, Deserialize)] #[derive(Debug, Default, Clone, Serialize, Deserialize)]
pub struct Config { pub struct Config {
/// Endpoint urls for EL nodes that are running the engine api. /// Endpoint url for EL nodes that are running the engine api.
pub execution_endpoints: Vec<SensitiveUrl>, pub execution_endpoint: Option<SensitiveUrl>,
/// Endpoint urls for services providing the builder api. /// Endpoint urls for services providing the builder api.
pub builder_url: Option<SensitiveUrl>, pub builder_url: Option<SensitiveUrl>,
/// User agent to send with requests to the builder API. /// User agent to send with requests to the builder API.
pub builder_user_agent: Option<String>, pub builder_user_agent: Option<String>,
/// JWT secrets for the above endpoints running the engine api. /// JWT secret for the above endpoint running the engine api.
pub secret_files: Vec<PathBuf>, pub secret_file: Option<PathBuf>,
/// The default fee recipient to use on the beacon node if none if provided from /// The default fee recipient to use on the beacon node if none if provided from
/// the validator client during block preparation. /// the validator client during block preparation.
pub suggested_fee_recipient: Option<Address>, pub suggested_fee_recipient: Option<Address>,
@@ -386,10 +386,10 @@ impl<E: EthSpec> ExecutionLayer<E> {
/// Instantiate `Self` with an Execution engine specified in `Config`, using JSON-RPC via HTTP. /// Instantiate `Self` with an Execution engine specified in `Config`, using JSON-RPC via HTTP.
pub fn from_config(config: Config, executor: TaskExecutor, log: Logger) -> Result<Self, Error> { pub fn from_config(config: Config, executor: TaskExecutor, log: Logger) -> Result<Self, Error> {
let Config { let Config {
execution_endpoints: urls, execution_endpoint: url,
builder_url, builder_url,
builder_user_agent, builder_user_agent,
secret_files, secret_file,
suggested_fee_recipient, suggested_fee_recipient,
jwt_id, jwt_id,
jwt_version, jwt_version,
@@ -397,16 +397,10 @@ impl<E: EthSpec> ExecutionLayer<E> {
execution_timeout_multiplier, execution_timeout_multiplier,
} = config; } = config;
if urls.len() > 1 { let execution_url = url.ok_or(Error::NoEngine)?;
warn!(log, "Only the first execution engine url will be used");
}
let execution_url = urls.into_iter().next().ok_or(Error::NoEngine)?;
// Use the default jwt secret path if not provided via cli. // Use the default jwt secret path if not provided via cli.
let secret_file = secret_files let secret_file = secret_file.unwrap_or_else(|| default_datadir.join(DEFAULT_JWT_FILE));
.into_iter()
.next()
.unwrap_or_else(|| default_datadir.join(DEFAULT_JWT_FILE));
let jwt_key = if secret_file.exists() { let jwt_key = if secret_file.exists() {
// Read secret from file if it already exists // Read secret from file if it already exists

View File

@@ -229,8 +229,8 @@ impl<E: EthSpec> MockBuilder<E> {
// This EL should not talk to a builder // This EL should not talk to a builder
let config = Config { let config = Config {
execution_endpoints: vec![mock_el_url], execution_endpoint: Some(mock_el_url),
secret_files: vec![path], secret_file: Some(path),
suggested_fee_recipient: None, suggested_fee_recipient: None,
..Default::default() ..Default::default()
}; };

View File

@@ -67,8 +67,8 @@ impl<E: EthSpec> MockExecutionLayer<E> {
std::fs::write(&path, hex::encode(DEFAULT_JWT_SECRET)).unwrap(); std::fs::write(&path, hex::encode(DEFAULT_JWT_SECRET)).unwrap();
let config = Config { let config = Config {
execution_endpoints: vec![url], execution_endpoint: Some(url),
secret_files: vec![path], secret_file: Some(path),
suggested_fee_recipient: Some(Address::repeat_byte(42)), suggested_fee_recipient: Some(Address::repeat_byte(42)),
..Default::default() ..Default::default()
}; };

View File

@@ -348,8 +348,8 @@ pub fn get_config<E: EthSpec>(
} }
// Set config values from parse values. // Set config values from parse values.
el_config.secret_files = vec![secret_file.clone()]; el_config.secret_file = Some(secret_file.clone());
el_config.execution_endpoints = vec![execution_endpoint.clone()]; el_config.execution_endpoint = Some(execution_endpoint.clone());
el_config.suggested_fee_recipient = el_config.suggested_fee_recipient =
clap_utils::parse_optional(cli_args, "suggested-fee-recipient")?; clap_utils::parse_optional(cli_args, "suggested-fee-recipient")?;
el_config.jwt_id = clap_utils::parse_optional(cli_args, "execution-jwt-id")?; el_config.jwt_id = clap_utils::parse_optional(cli_args, "execution-jwt-id")?;

View File

@@ -445,13 +445,16 @@ fn run_merge_execution_endpoints_flag_test(flag: &str) {
.run_with_zero_port() .run_with_zero_port()
.with_config(|config| { .with_config(|config| {
let config = config.execution_layer.as_ref().unwrap(); let config = config.execution_layer.as_ref().unwrap();
assert_eq!(config.execution_endpoints.len(), 1); assert_eq!(config.execution_endpoint.is_some(), true);
assert_eq!( assert_eq!(
config.execution_endpoints[0], config.execution_endpoint.as_ref().unwrap().clone(),
SensitiveUrl::parse(&urls[0]).unwrap() SensitiveUrl::parse(&urls[0]).unwrap()
); );
// Only the first secret file should be used. // Only the first secret file should be used.
assert_eq!(config.secret_files, vec![jwts[0].clone()]); assert_eq!(
config.secret_file.as_ref().unwrap().clone(),
jwts[0].clone()
);
}); });
} }
#[test] #[test]
@@ -464,11 +467,11 @@ fn run_execution_jwt_secret_key_is_persisted() {
.with_config(|config| { .with_config(|config| {
let config = config.execution_layer.as_ref().unwrap(); let config = config.execution_layer.as_ref().unwrap();
assert_eq!( assert_eq!(
config.execution_endpoints[0].full.to_string(), config.execution_endpoint.as_ref().unwrap().full.to_string(),
"http://localhost:8551/" "http://localhost:8551/"
); );
let mut file_jwt_secret_key = String::new(); let mut file_jwt_secret_key = String::new();
File::open(config.secret_files[0].clone()) File::open(config.secret_file.as_ref().unwrap())
.expect("could not open jwt_secret_key file") .expect("could not open jwt_secret_key file")
.read_to_string(&mut file_jwt_secret_key) .read_to_string(&mut file_jwt_secret_key)
.expect("could not read from file"); .expect("could not read from file");
@@ -515,10 +518,13 @@ fn merge_jwt_secrets_flag() {
.with_config(|config| { .with_config(|config| {
let config = config.execution_layer.as_ref().unwrap(); let config = config.execution_layer.as_ref().unwrap();
assert_eq!( assert_eq!(
config.execution_endpoints[0].full.to_string(), config.execution_endpoint.as_ref().unwrap().full.to_string(),
"http://localhost:8551/" "http://localhost:8551/"
); );
assert_eq!(config.secret_files[0], dir.path().join("jwt-file")); assert_eq!(
config.secret_file.as_ref().unwrap().clone(),
dir.path().join("jwt-file")
);
}); });
} }
#[test] #[test]

View File

@@ -121,11 +121,11 @@ impl<Engine: GenericExecutionEngine> TestRig<Engine> {
let ee_a = { let ee_a = {
let execution_engine = ExecutionEngine::new(generic_engine.clone()); let execution_engine = ExecutionEngine::new(generic_engine.clone());
let urls = vec![execution_engine.http_auth_url()]; let url = Some(execution_engine.http_auth_url());
let config = execution_layer::Config { let config = execution_layer::Config {
execution_endpoints: urls, execution_endpoint: url,
secret_files: vec![], secret_file: None,
suggested_fee_recipient: Some(Address::repeat_byte(42)), suggested_fee_recipient: Some(Address::repeat_byte(42)),
default_datadir: execution_engine.datadir(), default_datadir: execution_engine.datadir(),
..Default::default() ..Default::default()
@@ -140,11 +140,11 @@ impl<Engine: GenericExecutionEngine> TestRig<Engine> {
let ee_b = { let ee_b = {
let execution_engine = ExecutionEngine::new(generic_engine); let execution_engine = ExecutionEngine::new(generic_engine);
let urls = vec![execution_engine.http_auth_url()]; let url = Some(execution_engine.http_auth_url());
let config = execution_layer::Config { let config = execution_layer::Config {
execution_endpoints: urls, execution_endpoint: url,
secret_files: vec![], secret_file: None,
suggested_fee_recipient: fee_recipient, suggested_fee_recipient: fee_recipient,
default_datadir: execution_engine.datadir(), default_datadir: execution_engine.datadir(),
..Default::default() ..Default::default()

View File

@@ -395,11 +395,9 @@ async fn create_local_network<E: EthSpec>(
if post_merge_sim { if post_merge_sim {
let el_config = execution_layer::Config { let el_config = execution_layer::Config {
execution_endpoints: vec![SensitiveUrl::parse(&format!( execution_endpoint: Some(
"http://localhost:{}", SensitiveUrl::parse(&format!("http://localhost:{}", EXECUTION_PORT)).unwrap(),
EXECUTION_PORT ),
))
.unwrap()],
..Default::default() ..Default::default()
}; };

View File

@@ -85,9 +85,9 @@ impl<E: EthSpec> LocalNetwork<E> {
mock_execution_config, mock_execution_config,
); );
el_config.default_datadir = execution_node.datadir.path().to_path_buf(); el_config.default_datadir = execution_node.datadir.path().to_path_buf();
el_config.secret_files = vec![execution_node.datadir.path().join("jwt.hex")]; el_config.secret_file = Some(execution_node.datadir.path().join("jwt.hex"));
el_config.execution_endpoints = el_config.execution_endpoint =
vec![SensitiveUrl::parse(&execution_node.server.url()).unwrap()]; Some(SensitiveUrl::parse(&execution_node.server.url()).unwrap());
vec![execution_node] vec![execution_node]
} else { } else {
vec![] vec![]
@@ -180,9 +180,9 @@ impl<E: EthSpec> LocalNetwork<E> {
config, config,
); );
el_config.default_datadir = execution_node.datadir.path().to_path_buf(); el_config.default_datadir = execution_node.datadir.path().to_path_buf();
el_config.secret_files = vec![execution_node.datadir.path().join("jwt.hex")]; el_config.secret_file = Some(execution_node.datadir.path().join("jwt.hex"));
el_config.execution_endpoints = el_config.execution_endpoint =
vec![SensitiveUrl::parse(&execution_node.server.url()).unwrap()]; Some(SensitiveUrl::parse(&execution_node.server.url()).unwrap());
self.execution_nodes.write().push(execution_node); self.execution_nodes.write().push(execution_node);
} }