Skip to content

Commit 5d49652

Browse files
committed
Add a CLI option to toggle feature
1 parent 3fc0230 commit 5d49652

File tree

4 files changed

+72
-5
lines changed

4 files changed

+72
-5
lines changed

teku/src/main/java/tech/pegasys/teku/cli/options/ValidatorKeysOptions.java

+13
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,17 @@ public class ValidatorKeysOptions {
4848
arity = "0..*")
4949
private List<String> validatorExternalSignerPublicKeys = new ArrayList<>();
5050

51+
@CommandLine.Option(
52+
hidden = true,
53+
names = {"--Xvalidators-external-signer-public-keys-retry-enabled"},
54+
paramLabel = "<BOOLEAN>",
55+
showDefaultValue = CommandLine.Help.Visibility.ALWAYS,
56+
fallbackValue = "true",
57+
description = "Enable retry loading URL to load validators external signer public keys.",
58+
arity = "0..1")
59+
private boolean validatorExternalSignerPublicKeysRetryEnabled =
60+
ValidatorConfig.DEFAULT_VALIDATOR_EXTERNAL_SIGNER_KEYS_RETRY_ENABLED;
61+
5162
@CommandLine.Option(
5263
names = {"--validators-external-signer-url"},
5364
paramLabel = "<NETWORK>",
@@ -110,6 +121,8 @@ public void configure(final TekuConfiguration.Builder builder) {
110121
config
111122
.validatorKeys(validatorKeys)
112123
.validatorExternalSignerPublicKeySources(parseValidatorExternalKeys())
124+
.validatorExternalSignerPublicKeysRetryEnabled(
125+
validatorExternalSignerPublicKeysRetryEnabled)
113126
.validatorExternalSignerUrl(parseValidatorExternalSignerUrl())
114127
.validatorExternalSignerConcurrentRequestLimit(
115128
validatorExternalSignerConcurrentRequestLimit)

validator/api/src/main/java/tech/pegasys/teku/validator/api/ValidatorConfig.java

+17
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ public class ValidatorConfig {
5656
public static final int DEFAULT_EXECUTOR_MAX_QUEUE_SIZE = 40_000;
5757
public static final Duration DEFAULT_VALIDATOR_EXTERNAL_SIGNER_TIMEOUT = Duration.ofSeconds(5);
5858
public static final int DEFAULT_VALIDATOR_EXTERNAL_SIGNER_CONCURRENT_REQUEST_LIMIT = 32;
59+
public static final boolean DEFAULT_VALIDATOR_EXTERNAL_SIGNER_KEYS_RETRY_ENABLED = true;
5960
public static final boolean DEFAULT_VALIDATOR_KEYSTORE_LOCKING_ENABLED = true;
6061
public static final boolean DEFAULT_VALIDATOR_EXTERNAL_SIGNER_SLASHING_PROTECTION_ENABLED = true;
6162
public static final boolean DEFAULT_GENERATE_EARLY_ATTESTATIONS = true;
@@ -71,6 +72,7 @@ public class ValidatorConfig {
7172

7273
private final List<String> validatorKeys;
7374
private final List<String> validatorExternalSignerPublicKeySources;
75+
private final boolean validatorExternalSignerPublicKeysRetryEnabled;
7476
private final boolean validatorExternalSignerSlashingProtectionEnabled;
7577
private final URL validatorExternalSignerUrl;
7678
private final Optional<String> validatorExternalSignerUserInfo;
@@ -114,6 +116,7 @@ public class ValidatorConfig {
114116
private ValidatorConfig(
115117
final List<String> validatorKeys,
116118
final List<String> validatorExternalSignerPublicKeySources,
119+
final boolean validatorExternalSignerPublicKeysRetryEnabled,
117120
final URL validatorExternalSignerUrl,
118121
final Optional<String> validatorExternalSignerUserInfo,
119122
final Duration validatorExternalSignerTimeout,
@@ -153,6 +156,8 @@ private ValidatorConfig(
153156
boolean dvtSelectionsEndpointEnabled) {
154157
this.validatorKeys = validatorKeys;
155158
this.validatorExternalSignerPublicKeySources = validatorExternalSignerPublicKeySources;
159+
this.validatorExternalSignerPublicKeysRetryEnabled =
160+
validatorExternalSignerPublicKeysRetryEnabled;
156161
this.validatorExternalSignerUrl = validatorExternalSignerUrl;
157162
this.validatorExternalSignerUserInfo = validatorExternalSignerUserInfo;
158163
this.validatorExternalSignerTimeout = validatorExternalSignerTimeout;
@@ -213,6 +218,10 @@ public List<String> getValidatorExternalSignerPublicKeySources() {
213218
return validatorExternalSignerPublicKeySources;
214219
}
215220

221+
public boolean validatorExternalSignerPublicKeysRetryEnabled() {
222+
return validatorExternalSignerPublicKeysRetryEnabled;
223+
}
224+
216225
public boolean isValidatorExternalSignerSlashingProtectionEnabled() {
217226
return validatorExternalSignerSlashingProtectionEnabled;
218227
}
@@ -368,6 +377,8 @@ public boolean isDvtSelectionsEndpointEnabled() {
368377
public static final class Builder {
369378
private List<String> validatorKeys = new ArrayList<>();
370379
private List<String> validatorExternalSignerPublicKeySources = new ArrayList<>();
380+
private boolean validatorExternalSignerPublicKeysRetryEnabled =
381+
DEFAULT_VALIDATOR_EXTERNAL_SIGNER_KEYS_RETRY_ENABLED;
371382
private URL validatorExternalSignerUrl;
372383
private Optional<String> validatorExternalSignerUserInfo = Optional.empty();
373384
private int validatorExternalSignerConcurrentRequestLimit =
@@ -433,6 +444,11 @@ public Builder validatorExternalSignerPublicKeySources(
433444
return this;
434445
}
435446

447+
public Builder validatorExternalSignerPublicKeysRetryEnabled(final boolean enabled) {
448+
this.validatorExternalSignerPublicKeysRetryEnabled = enabled;
449+
return this;
450+
}
451+
436452
public Builder validatorExternalSignerUrl(final URL validatorExternalSignerUrl) {
437453
if (validatorExternalSignerUrl != null) {
438454
this.validatorExternalSignerUrl = UrlSanitizer.sanitizeUrl(validatorExternalSignerUrl);
@@ -678,6 +694,7 @@ public ValidatorConfig build() {
678694
return new ValidatorConfig(
679695
validatorKeys,
680696
validatorExternalSignerPublicKeySources,
697+
validatorExternalSignerPublicKeysRetryEnabled,
681698
validatorExternalSignerUrl,
682699
validatorExternalSignerUserInfo,
683700
validatorExternalSignerTimeout,

validator/api/src/test/java/tech/pegasys/teku/validator/api/ValidatorConfigTest.java

+33
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,39 @@ public void shouldThrowIfExternalPublicKeysAreSpecifiedWithoutExternalSignerUrl(
3838
"Invalid configuration. '--validators-external-signer-url' and '--validators-external-signer-public-keys' must be specified together");
3939
}
4040

41+
@Test
42+
public void shouldNotThrowIfExternalPublicKeysEnabledAreSpecifiedWithPublicKeys()
43+
throws MalformedURLException {
44+
final ValidatorConfig.Builder builder =
45+
configBuilder
46+
.validatorExternalSignerUrl(URI.create("http://localhost:9000").toURL())
47+
.validatorExternalSignerPublicKeySources(List.of("http://localhost:9000/test"))
48+
.validatorExternalSignerPublicKeysRetryEnabled(true);
49+
Assertions.assertThatCode(builder::build).doesNotThrowAnyException();
50+
}
51+
52+
@Test
53+
public void shouldNotThrowIfExternalPublicKeysDisabledAreSpecifiedWithPublicKeys()
54+
throws MalformedURLException {
55+
final ValidatorConfig.Builder builder =
56+
configBuilder
57+
.validatorExternalSignerUrl(URI.create("http://localhost:9000").toURL())
58+
.validatorExternalSignerPublicKeySources(List.of("http://localhost:9000/test"))
59+
.validatorExternalSignerPublicKeysRetryEnabled(false);
60+
Assertions.assertThatCode(builder::build).doesNotThrowAnyException();
61+
}
62+
63+
@Test
64+
public void shouldNotThrowIfExternalPublicKeysEnabledAreSpecifiedWithoutPublicKeys()
65+
throws MalformedURLException {
66+
final ValidatorConfig.Builder builder =
67+
configBuilder
68+
.validatorExternalSignerUrl(URI.create("http://localhost:9000").toURL())
69+
.validatorExternalSignerPublicKeySources(List.of())
70+
.validatorExternalSignerPublicKeysRetryEnabled(true);
71+
Assertions.assertThatCode(builder::build).doesNotThrowAnyException();
72+
}
73+
4174
@Test
4275
public void shouldNotThrowIfExternalSignerUrlIsSpecifiedWithoutExternalPublicKeys()
4376
throws MalformedURLException {

validator/client/src/main/java/tech/pegasys/teku/validator/client/ValidatorClientService.java

+9-5
Original file line numberDiff line numberDiff line change
@@ -410,8 +410,9 @@ private static ValidatorLoader createValidatorLoader(
410410
final AsyncRunner asyncRunner,
411411
final Function<BLSPublicKey, Optional<Bytes32>> updatableGraffitiProvider) {
412412
final Path slashingProtectionPath = getSlashingProtectionPath(services.getDataDirLayout());
413+
final ValidatorConfig validatorConfig = config.getValidatorConfig();
413414
final SlashingProtector slashingProtector =
414-
config.getValidatorConfig().isLocalSlashingProtectionSynchronizedModeEnabled()
415+
validatorConfig.isLocalSlashingProtectionSynchronizedModeEnabled()
415416
? new LocalSlashingProtector(
416417
SyncDataAccessor.create(slashingProtectionPath), slashingProtectionPath)
417418
: new LocalSlashingProtectorConcurrentAccess(
@@ -420,18 +421,21 @@ private static ValidatorLoader createValidatorLoader(
420421
new SlashingProtectionLogger(
421422
slashingProtector, config.getSpec(), asyncRunner, ValidatorLogger.VALIDATOR_LOGGER);
422423
final Supplier<HttpClient> externalSignerHttpClientFactory =
423-
HttpClientExternalSignerFactory.create(config.getValidatorConfig());
424+
HttpClientExternalSignerFactory.create(validatorConfig);
425+
final Optional<AsyncRunner> maybeAsyncRunner =
426+
Optional.ofNullable(
427+
validatorConfig.validatorExternalSignerPublicKeysRetryEnabled() ? asyncRunner : null);
424428
return ValidatorLoader.create(
425429
config.getSpec(),
426-
config.getValidatorConfig(),
430+
validatorConfig,
427431
config.getInteropConfig(),
428432
externalSignerHttpClientFactory,
429433
slashingProtector,
430434
slashingProtectionLogger,
431435
new PublicKeyLoader(
432436
externalSignerHttpClientFactory,
433-
config.getValidatorConfig().getValidatorExternalSignerUrl(),
434-
Optional.of(asyncRunner)),
437+
validatorConfig.getValidatorExternalSignerUrl(),
438+
maybeAsyncRunner),
435439
asyncRunner,
436440
services.getMetricsSystem(),
437441
config.getValidatorRestApiConfig().isRestApiEnabled()

0 commit comments

Comments
 (0)