Skip to content

Commit

Permalink
Watermark repair subcommand (#679)
Browse files Browse the repository at this point in the history
  • Loading branch information
jframe authored Nov 24, 2022
1 parent 381bc57 commit b6c291a
Show file tree
Hide file tree
Showing 10 changed files with 476 additions and 28 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
pool (Hikari) to allow using external database connection pool such as pgBouncer. `--slashing-protection-db-pool-configuration-file` and
`--slashing-protection-pruning-db-pool-configuration-file` can be reused to specify PG Datasource properties.
[#662](https://github.com/ConsenSys/web3signer/issues/662)
- Added new subcommand watermark-repair to update low watermarks

---

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ public class SignerConfiguration {
private final Optional<Long> bellatrixForkEpoch;
private final Optional<String> network;
private final boolean keyManagerApiEnabled;
private Optional<WatermarkRepairParameters> watermarkRepairParameters;
private final Duration startupTimeout;

public SignerConfiguration(
Expand Down Expand Up @@ -104,7 +105,8 @@ public SignerConfiguration(
final Optional<Long> altairForkEpoch,
final Optional<Long> bellatrixForkEpoch,
final Optional<String> network,
final boolean keyManagerApiEnabled) {
final boolean keyManagerApiEnabled,
final Optional<WatermarkRepairParameters> watermarkRepairParameters) {
this.hostname = hostname;
this.logLevel = logLevel;
this.httpRpcPort = httpRpcPort;
Expand Down Expand Up @@ -141,6 +143,7 @@ public SignerConfiguration(
this.bellatrixForkEpoch = bellatrixForkEpoch;
this.network = network;
this.keyManagerApiEnabled = keyManagerApiEnabled;
this.watermarkRepairParameters = watermarkRepairParameters;
}

public String hostname() {
Expand Down Expand Up @@ -294,4 +297,8 @@ public Duration getStartupTimeout() {
public boolean isSlashingProtectionDbConnectionPoolEnabled() {
return slashingProtectionDbConnectionPoolEnabled;
}

public Optional<WatermarkRepairParameters> getWatermarkRepairParameters() {
return watermarkRepairParameters;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ public class SignerConfigurationBuilder {
private String network = null;
private boolean keyManagerApiEnabled = false;
private KeystoresParameters keystoresParameters;
private WatermarkRepairParameters watermarkRepairParameters;

public SignerConfigurationBuilder withLogLevel(final Level logLevel) {
this.logLevel = logLevel;
Expand Down Expand Up @@ -262,6 +263,11 @@ public SignerConfigurationBuilder withStartupTimeout(final Duration startupTimeo
return this;
}

public void withWatermarkRepairParameters(
final WatermarkRepairParameters watermarkRepairParameters) {
this.watermarkRepairParameters = watermarkRepairParameters;
}

public SignerConfiguration build() {
if (mode == null) {
throw new IllegalArgumentException("Mode cannot be null");
Expand Down Expand Up @@ -302,6 +308,7 @@ public SignerConfiguration build() {
Optional.ofNullable(altairForkEpoch),
Optional.ofNullable(bellatrixForkEpoch),
Optional.ofNullable(network),
keyManagerApiEnabled);
keyManagerApiEnabled,
Optional.ofNullable(watermarkRepairParameters));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
/*
* Copyright 2022 ConsenSys AG.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/
package tech.pegasys.web3signer.dsl.signer;

import java.util.Collections;
import java.util.List;

public class WatermarkRepairParameters {

private final long slot;
private final long epoch;
private final List<String> validators;

public WatermarkRepairParameters(final long slot, final long epoch) {
this(slot, epoch, Collections.emptyList());
}

public WatermarkRepairParameters(
final long slot, final long epoch, final List<String> validators) {
this.slot = slot;
this.epoch = epoch;
this.validators = validators;
}

public long getSlot() {
return slot;
}

public long getEpoch() {
return epoch;
}

public List<String> getValidators() {
return validators;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import tech.pegasys.web3signer.core.config.ClientAuthConstraints;
import tech.pegasys.web3signer.core.config.TlsOptions;
import tech.pegasys.web3signer.dsl.signer.SignerConfiguration;
import tech.pegasys.web3signer.dsl.signer.WatermarkRepairParameters;
import tech.pegasys.web3signer.dsl.utils.DatabaseUtil;
import tech.pegasys.web3signer.signing.config.AwsSecretsManagerParameters;
import tech.pegasys.web3signer.signing.config.AzureKeyVaultParameters;
Expand All @@ -36,6 +37,7 @@
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

import org.apache.commons.io.FileUtils;

Expand Down Expand Up @@ -157,21 +159,9 @@ public List<String> createCmdLineParams() {
.getAwsSecretsManagerParameters()
.ifPresent(awsParams -> yamlConfig.append(awsBulkLoadingOptions(awsParams)));

if (signerConfig.getSlashingExportPath().isPresent()) {
params.add("export"); // sub-sub command
yamlConfig.append(
String.format(
YAML_STRING_FMT,
"eth2.export.to",
signerConfig.getSlashingExportPath().get().toAbsolutePath()));
} else if (signerConfig.getSlashingImportPath().isPresent()) {
params.add("import"); // sub-sub command
yamlConfig.append(
String.format(
YAML_STRING_FMT,
"eth2.import.from",
signerConfig.getSlashingImportPath().get().toAbsolutePath()));
}
final CommandArgs subCommandArgs = createSubCommandArgs();
params.addAll(subCommandArgs.params);
yamlConfig.append(subCommandArgs.yamlConfig);
}

// create temporary config file
Expand All @@ -189,6 +179,44 @@ public List<String> createCmdLineParams() {
return params;
}

private CommandArgs createSubCommandArgs() {
final List<String> params = new ArrayList<>();
final StringBuilder yamlConfig = new StringBuilder();

if (signerConfig.getSlashingExportPath().isPresent()) {
params.add("export"); // sub-sub command
yamlConfig.append(
String.format(
YAML_STRING_FMT,
"eth2.export.to",
signerConfig.getSlashingExportPath().get().toAbsolutePath()));
} else if (signerConfig.getSlashingImportPath().isPresent()) {
params.add("import"); // sub-sub command
yamlConfig.append(
String.format(
YAML_STRING_FMT,
"eth2.import.from",
signerConfig.getSlashingImportPath().get().toAbsolutePath()));
} else if (signerConfig.getWatermarkRepairParameters().isPresent()) {
params.add("watermark-repair"); // sub-sub command
final WatermarkRepairParameters watermarkRepairParameters =
signerConfig.getWatermarkRepairParameters().get();
yamlConfig.append(
String.format(
YAML_NUMERIC_FMT, "eth2.watermark-repair.slot", watermarkRepairParameters.getSlot()));
yamlConfig.append(
String.format(
YAML_NUMERIC_FMT,
"eth2.watermark-repair.epoch",
watermarkRepairParameters.getEpoch()));
yamlConfig.append(
formatStringList(
"eth2.watermark-repair.validator-ids", watermarkRepairParameters.getValidators()));
}

return new CommandArgs(params, yamlConfig.toString());
}

@Override
public Optional<String> slashingProtectionDbUrl() {
return slashingProtectionDbUrl;
Expand Down Expand Up @@ -388,4 +416,22 @@ private String awsBulkLoadingOptions(

return yamlConfig.toString();
}

private String formatStringList(final String key, final List<String> stringList) {
return stringList.isEmpty()
? String.format("%s: []%n", key)
: String.format(
"%s: [\"%s\"]%n",
key, stringList.stream().map(s -> "\"" + s + "\"").collect(Collectors.joining(",")));
}

private static class CommandArgs {
private final List<String> params;
private final String yamlConfig;

public CommandArgs(List<String> params, String yamlConfig) {
this.params = params;
this.yamlConfig = yamlConfig;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import tech.pegasys.web3signer.core.config.ClientAuthConstraints;
import tech.pegasys.web3signer.core.config.TlsOptions;
import tech.pegasys.web3signer.dsl.signer.SignerConfiguration;
import tech.pegasys.web3signer.dsl.signer.WatermarkRepairParameters;
import tech.pegasys.web3signer.dsl.utils.DatabaseUtil;
import tech.pegasys.web3signer.signing.config.AwsSecretsManagerParameters;
import tech.pegasys.web3signer.signing.config.AzureKeyVaultParameters;
Expand Down Expand Up @@ -187,15 +188,7 @@ private Collection<String> createEth2Args() {
}
}

if (signerConfig.getSlashingExportPath().isPresent()) {
params.add("export");
params.add("--to");
params.add(signerConfig.getSlashingExportPath().get().toAbsolutePath().toString());
} else if (signerConfig.getSlashingImportPath().isPresent()) {
params.add("import");
params.add("--from");
params.add(signerConfig.getSlashingImportPath().get().toAbsolutePath().toString());
}
params.addAll(createSubCommandArgs());

if (signerConfig.isSlashingProtectionPruningEnabled()) {
params.add("--slashing-protection-pruning-enabled");
Expand Down Expand Up @@ -274,4 +267,32 @@ private Collection<String> awsBulkLoadingOptions(

return params;
}

private List<String> createSubCommandArgs() {
final List<String> params = new ArrayList<>();

if (signerConfig.getSlashingExportPath().isPresent()) {
params.add("export");
params.add("--to");
params.add(signerConfig.getSlashingExportPath().get().toAbsolutePath().toString());
} else if (signerConfig.getSlashingImportPath().isPresent()) {
params.add("import");
params.add("--from");
params.add(signerConfig.getSlashingImportPath().get().toAbsolutePath().toString());
} else if (signerConfig.getWatermarkRepairParameters().isPresent()) {
final WatermarkRepairParameters watermarkRepairParameters =
signerConfig.getWatermarkRepairParameters().get();
params.add("watermark-repair");
params.add("--epoch");
params.add(Long.toString(watermarkRepairParameters.getEpoch()));
params.add("--slot");
params.add(Long.toString(watermarkRepairParameters.getSlot()));
if (!watermarkRepairParameters.getValidators().isEmpty()) {
params.add(
"--validator-ids" + "=" + String.join(",", watermarkRepairParameters.getValidators()));
}
}

return params;
}
}
Loading

0 comments on commit b6c291a

Please sign in to comment.