mirror of
https://github.com/sigp/lighthouse.git
synced 2026-05-07 16:55:46 +00:00
Fix execution layer redundancy (#5588)
* remove execution layer url redundancy * fix typo * fix tests * fix formatting
This commit is contained in:
@@ -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()
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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()
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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()
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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")?;
|
||||||
|
|||||||
@@ -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]
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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()
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user