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:
Eitan Seri-Levi
2024-01-25 00:09:47 +02:00
committed by GitHub
parent 612eaf2d41
commit f9e36c94ed
28 changed files with 715 additions and 21 deletions

View File

@@ -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()