mirror of
https://github.com/sigp/lighthouse.git
synced 2026-03-14 02:12:33 +00:00
Expose additional builder booster related flags in the vc (#5086)
* expose builder booster flags in vc, enable options in validator endpoints, update tests * resolve failing test * fix issues related to CreateConfig and MoveConfig * remove unneeded val, change how boost factor flag logic in the vc, add some additional documentation * fix typos * fix typos * assume builder-proosals flag if one of other two vc builder flags are present * fmt * typo * typo * Fix CLI help text * Prioritise per validator builder boost configurations over CLI flags. * Add http test for builder boost factor with process defaults. * Fix issue with PATCH request * Add prefer builder proposals * Add more builder boost factor tests. --------- Co-authored-by: Mac L <mjladson@pm.me> Co-authored-by: Jimmy Chen <jchen.tc@gmail.com> Co-authored-by: Paul Hauner <paul@paulhauner.com>
This commit is contained in:
@@ -52,6 +52,12 @@ struct ApiTester {
|
||||
|
||||
impl ApiTester {
|
||||
pub async fn new() -> Self {
|
||||
let mut config = Config::default();
|
||||
config.fee_recipient = Some(TEST_DEFAULT_FEE_RECIPIENT);
|
||||
Self::new_with_config(config).await
|
||||
}
|
||||
|
||||
pub async fn new_with_config(mut config: Config) -> Self {
|
||||
let log = test_logger();
|
||||
|
||||
let validator_dir = tempdir().unwrap();
|
||||
@@ -70,10 +76,8 @@ impl ApiTester {
|
||||
let api_secret = ApiSecret::create_or_open(validator_dir.path()).unwrap();
|
||||
let api_pubkey = api_secret.api_token();
|
||||
|
||||
let mut config = Config::default();
|
||||
config.validator_dir = validator_dir.path().into();
|
||||
config.secrets_dir = secrets_dir.path().into();
|
||||
config.fee_recipient = Some(TEST_DEFAULT_FEE_RECIPIENT);
|
||||
|
||||
let spec = E::default_spec();
|
||||
|
||||
@@ -271,6 +275,8 @@ impl ApiTester {
|
||||
suggested_fee_recipient: None,
|
||||
gas_limit: None,
|
||||
builder_proposals: None,
|
||||
builder_boost_factor: None,
|
||||
prefer_builder_proposals: None,
|
||||
deposit_gwei: E::default_spec().max_effective_balance,
|
||||
})
|
||||
.collect::<Vec<_>>();
|
||||
@@ -404,6 +410,8 @@ impl ApiTester {
|
||||
suggested_fee_recipient: None,
|
||||
gas_limit: None,
|
||||
builder_proposals: None,
|
||||
builder_boost_factor: None,
|
||||
prefer_builder_proposals: None,
|
||||
};
|
||||
|
||||
self.client
|
||||
@@ -424,6 +432,8 @@ impl ApiTester {
|
||||
suggested_fee_recipient: None,
|
||||
gas_limit: None,
|
||||
builder_proposals: None,
|
||||
builder_boost_factor: None,
|
||||
prefer_builder_proposals: None,
|
||||
};
|
||||
|
||||
let response = self
|
||||
@@ -462,6 +472,8 @@ impl ApiTester {
|
||||
suggested_fee_recipient: None,
|
||||
gas_limit: None,
|
||||
builder_proposals: None,
|
||||
builder_boost_factor: None,
|
||||
prefer_builder_proposals: None,
|
||||
voting_public_key: kp.pk,
|
||||
url: format!("http://signer_{}.com/", i),
|
||||
root_certificate_path: None,
|
||||
@@ -518,7 +530,15 @@ impl ApiTester {
|
||||
let validator = &self.client.get_lighthouse_validators().await.unwrap().data[index];
|
||||
|
||||
self.client
|
||||
.patch_lighthouse_validators(&validator.voting_pubkey, Some(enabled), None, None, None)
|
||||
.patch_lighthouse_validators(
|
||||
&validator.voting_pubkey,
|
||||
Some(enabled),
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
)
|
||||
.await
|
||||
.unwrap();
|
||||
|
||||
@@ -566,6 +586,8 @@ impl ApiTester {
|
||||
Some(gas_limit),
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
)
|
||||
.await
|
||||
.unwrap();
|
||||
@@ -594,6 +616,50 @@ impl ApiTester {
|
||||
None,
|
||||
Some(builder_proposals),
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
)
|
||||
.await
|
||||
.unwrap();
|
||||
|
||||
self
|
||||
}
|
||||
|
||||
pub async fn set_builder_boost_factor(self, index: usize, builder_boost_factor: u64) -> Self {
|
||||
let validator = &self.client.get_lighthouse_validators().await.unwrap().data[index];
|
||||
|
||||
self.client
|
||||
.patch_lighthouse_validators(
|
||||
&validator.voting_pubkey,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
Some(builder_boost_factor),
|
||||
None,
|
||||
None,
|
||||
)
|
||||
.await
|
||||
.unwrap();
|
||||
|
||||
self
|
||||
}
|
||||
|
||||
pub async fn set_prefer_builder_proposals(
|
||||
self,
|
||||
index: usize,
|
||||
prefer_builder_proposals: bool,
|
||||
) -> Self {
|
||||
let validator = &self.client.get_lighthouse_validators().await.unwrap().data[index];
|
||||
|
||||
self.client
|
||||
.patch_lighthouse_validators(
|
||||
&validator.voting_pubkey,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
Some(prefer_builder_proposals),
|
||||
None,
|
||||
)
|
||||
.await
|
||||
.unwrap();
|
||||
@@ -613,6 +679,64 @@ impl ApiTester {
|
||||
self
|
||||
}
|
||||
|
||||
pub async fn assert_builder_boost_factor(
|
||||
self,
|
||||
index: usize,
|
||||
builder_boost_factor: Option<u64>,
|
||||
) -> Self {
|
||||
let validator = &self.client.get_lighthouse_validators().await.unwrap().data[index];
|
||||
|
||||
assert_eq!(
|
||||
self.validator_store
|
||||
.get_builder_boost_factor(&validator.voting_pubkey),
|
||||
builder_boost_factor
|
||||
);
|
||||
|
||||
self
|
||||
}
|
||||
|
||||
pub async fn assert_validator_derived_builder_boost_factor(
|
||||
self,
|
||||
index: usize,
|
||||
builder_boost_factor: Option<u64>,
|
||||
) -> Self {
|
||||
let validator = &self.client.get_lighthouse_validators().await.unwrap().data[index];
|
||||
|
||||
assert_eq!(
|
||||
self.validator_store
|
||||
.determine_validator_builder_boost_factor(&validator.voting_pubkey),
|
||||
builder_boost_factor
|
||||
);
|
||||
|
||||
self
|
||||
}
|
||||
|
||||
pub fn assert_default_builder_boost_factor(self, builder_boost_factor: Option<u64>) -> Self {
|
||||
assert_eq!(
|
||||
self.validator_store
|
||||
.determine_default_builder_boost_factor(),
|
||||
builder_boost_factor
|
||||
);
|
||||
|
||||
self
|
||||
}
|
||||
|
||||
pub async fn assert_prefer_builder_proposals(
|
||||
self,
|
||||
index: usize,
|
||||
prefer_builder_proposals: bool,
|
||||
) -> Self {
|
||||
let validator = &self.client.get_lighthouse_validators().await.unwrap().data[index];
|
||||
|
||||
assert_eq!(
|
||||
self.validator_store
|
||||
.get_prefer_builder_proposals(&validator.voting_pubkey),
|
||||
prefer_builder_proposals
|
||||
);
|
||||
|
||||
self
|
||||
}
|
||||
|
||||
pub async fn set_graffiti(self, index: usize, graffiti: &str) -> Self {
|
||||
let validator = &self.client.get_lighthouse_validators().await.unwrap().data[index];
|
||||
let graffiti_str = GraffitiString::from_str(graffiti).unwrap();
|
||||
@@ -622,6 +746,8 @@ impl ApiTester {
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
Some(graffiti_str),
|
||||
)
|
||||
.await
|
||||
@@ -741,6 +867,8 @@ async fn routes_with_invalid_auth() {
|
||||
gas_limit: <_>::default(),
|
||||
builder_proposals: <_>::default(),
|
||||
deposit_gwei: <_>::default(),
|
||||
builder_boost_factor: <_>::default(),
|
||||
prefer_builder_proposals: <_>::default(),
|
||||
}])
|
||||
.await
|
||||
})
|
||||
@@ -771,6 +899,8 @@ async fn routes_with_invalid_auth() {
|
||||
suggested_fee_recipient: <_>::default(),
|
||||
gas_limit: <_>::default(),
|
||||
builder_proposals: <_>::default(),
|
||||
builder_boost_factor: <_>::default(),
|
||||
prefer_builder_proposals: <_>::default(),
|
||||
})
|
||||
.await
|
||||
})
|
||||
@@ -783,6 +913,8 @@ async fn routes_with_invalid_auth() {
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
)
|
||||
.await
|
||||
})
|
||||
@@ -980,6 +1112,100 @@ async fn validator_builder_proposals() {
|
||||
.await;
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn validator_builder_boost_factor() {
|
||||
ApiTester::new()
|
||||
.await
|
||||
.create_hd_validators(HdValidatorScenario {
|
||||
count: 2,
|
||||
specify_mnemonic: false,
|
||||
key_derivation_path_offset: 0,
|
||||
disabled: vec![],
|
||||
})
|
||||
.await
|
||||
.assert_enabled_validators_count(2)
|
||||
.assert_validators_count(2)
|
||||
.set_builder_boost_factor(0, 120)
|
||||
.await
|
||||
// Test setting builder proposals while the validator is disabled
|
||||
.set_validator_enabled(0, false)
|
||||
.await
|
||||
.assert_enabled_validators_count(1)
|
||||
.assert_validators_count(2)
|
||||
.set_builder_boost_factor(0, 80)
|
||||
.await
|
||||
.set_validator_enabled(0, true)
|
||||
.await
|
||||
.assert_enabled_validators_count(2)
|
||||
.assert_builder_boost_factor(0, Some(80))
|
||||
.await;
|
||||
}
|
||||
|
||||
/// Verifies the builder boost factors translated from the `builder_proposals`,
|
||||
/// `prefer_builder_proposals` and `builder_boost_factor` values.
|
||||
#[tokio::test]
|
||||
async fn validator_derived_builder_boost_factor_with_process_defaults() {
|
||||
let config = Config {
|
||||
builder_proposals: true,
|
||||
prefer_builder_proposals: false,
|
||||
builder_boost_factor: Some(80),
|
||||
..Config::default()
|
||||
};
|
||||
ApiTester::new_with_config(config)
|
||||
.await
|
||||
.create_hd_validators(HdValidatorScenario {
|
||||
count: 3,
|
||||
specify_mnemonic: false,
|
||||
key_derivation_path_offset: 0,
|
||||
disabled: vec![],
|
||||
})
|
||||
.await
|
||||
.assert_default_builder_boost_factor(Some(80))
|
||||
.assert_validator_derived_builder_boost_factor(0, None)
|
||||
.await
|
||||
.set_builder_proposals(0, false)
|
||||
.await
|
||||
.assert_validator_derived_builder_boost_factor(0, Some(0))
|
||||
.await
|
||||
.set_builder_boost_factor(1, 120)
|
||||
.await
|
||||
.assert_validator_derived_builder_boost_factor(1, Some(120))
|
||||
.await
|
||||
.set_prefer_builder_proposals(2, true)
|
||||
.await
|
||||
.assert_validator_derived_builder_boost_factor(2, Some(u64::MAX))
|
||||
.await;
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn prefer_builder_proposals_validator() {
|
||||
ApiTester::new()
|
||||
.await
|
||||
.create_hd_validators(HdValidatorScenario {
|
||||
count: 2,
|
||||
specify_mnemonic: false,
|
||||
key_derivation_path_offset: 0,
|
||||
disabled: vec![],
|
||||
})
|
||||
.await
|
||||
.assert_enabled_validators_count(2)
|
||||
.assert_validators_count(2)
|
||||
.set_prefer_builder_proposals(0, false)
|
||||
.await
|
||||
// Test setting builder proposals while the validator is disabled
|
||||
.set_validator_enabled(0, false)
|
||||
.await
|
||||
.assert_enabled_validators_count(1)
|
||||
.assert_validators_count(2)
|
||||
.set_prefer_builder_proposals(0, true)
|
||||
.await
|
||||
.set_validator_enabled(0, true)
|
||||
.await
|
||||
.assert_enabled_validators_count(2)
|
||||
.assert_prefer_builder_proposals(0, true)
|
||||
.await;
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn validator_graffiti() {
|
||||
ApiTester::new()
|
||||
|
||||
Reference in New Issue
Block a user