diff --git a/ethereum/spec/src/main/java/tech/pegasys/teku/spec/signatures/DeletableSigner.java b/ethereum/spec/src/main/java/tech/pegasys/teku/spec/signatures/DeletableSigner.java index 30bc8d78f54..571c574d111 100644 --- a/ethereum/spec/src/main/java/tech/pegasys/teku/spec/signatures/DeletableSigner.java +++ b/ethereum/spec/src/main/java/tech/pegasys/teku/spec/signatures/DeletableSigner.java @@ -27,6 +27,7 @@ import tech.pegasys.teku.spec.datastructures.builder.ValidatorRegistration; import tech.pegasys.teku.spec.datastructures.operations.AggregateAndProof; import tech.pegasys.teku.spec.datastructures.operations.AttestationData; +import tech.pegasys.teku.spec.datastructures.operations.InclusionList; import tech.pegasys.teku.spec.datastructures.operations.VoluntaryExit; import tech.pegasys.teku.spec.datastructures.operations.versions.altair.ContributionAndProof; import tech.pegasys.teku.spec.datastructures.operations.versions.altair.SyncAggregatorSelectionData; @@ -110,6 +111,12 @@ public SafeFuture signValidatorRegistration( return sign(() -> delegate.signValidatorRegistration(validatorRegistration)); } + @Override + public SafeFuture signInclusionList( + final InclusionList inclusionList, final ForkInfo forkInfo) { + return sign(() -> delegate.signInclusionList(inclusionList, forkInfo)); + } + @Override public Optional getSigningServiceUrl() { return delegate.getSigningServiceUrl(); diff --git a/ethereum/spec/src/main/java/tech/pegasys/teku/spec/signatures/LocalSigner.java b/ethereum/spec/src/main/java/tech/pegasys/teku/spec/signatures/LocalSigner.java index df5a1beed7f..c98682bf725 100644 --- a/ethereum/spec/src/main/java/tech/pegasys/teku/spec/signatures/LocalSigner.java +++ b/ethereum/spec/src/main/java/tech/pegasys/teku/spec/signatures/LocalSigner.java @@ -29,6 +29,7 @@ import tech.pegasys.teku.spec.datastructures.builder.ValidatorRegistration; import tech.pegasys.teku.spec.datastructures.operations.AggregateAndProof; import tech.pegasys.teku.spec.datastructures.operations.AttestationData; +import tech.pegasys.teku.spec.datastructures.operations.InclusionList; import tech.pegasys.teku.spec.datastructures.operations.VoluntaryExit; import tech.pegasys.teku.spec.datastructures.operations.versions.altair.ContributionAndProof; import tech.pegasys.teku.spec.datastructures.operations.versions.altair.SyncAggregatorSelectionData; @@ -122,6 +123,12 @@ public SafeFuture signValidatorRegistration( return sign(signingRootUtil.signingRootForValidatorRegistration(validatorRegistration)); } + @Override + public SafeFuture signInclusionList( + final InclusionList inclusionList, final ForkInfo forkInfo) { + return sign(signingRootUtil.signingRootForInclusionList(inclusionList, forkInfo)); + } + private SafeFuture signingRootFromSyncCommitteeUtils( final UInt64 slot, final Function createSigningRoot) { return SafeFuture.of(() -> createSigningRoot.apply(spec.getSyncCommitteeUtilRequired(slot))); diff --git a/ethereum/spec/src/main/java/tech/pegasys/teku/spec/signatures/Signer.java b/ethereum/spec/src/main/java/tech/pegasys/teku/spec/signatures/Signer.java index 89246a2375f..6e5a296c5c0 100644 --- a/ethereum/spec/src/main/java/tech/pegasys/teku/spec/signatures/Signer.java +++ b/ethereum/spec/src/main/java/tech/pegasys/teku/spec/signatures/Signer.java @@ -23,6 +23,7 @@ import tech.pegasys.teku.spec.datastructures.builder.ValidatorRegistration; import tech.pegasys.teku.spec.datastructures.operations.AggregateAndProof; import tech.pegasys.teku.spec.datastructures.operations.AttestationData; +import tech.pegasys.teku.spec.datastructures.operations.InclusionList; import tech.pegasys.teku.spec.datastructures.operations.VoluntaryExit; import tech.pegasys.teku.spec.datastructures.operations.versions.altair.ContributionAndProof; import tech.pegasys.teku.spec.datastructures.operations.versions.altair.SyncAggregatorSelectionData; @@ -56,6 +57,8 @@ SafeFuture signContributionAndProof( SafeFuture signValidatorRegistration(ValidatorRegistration validatorRegistration); + SafeFuture signInclusionList(InclusionList inclusionList, ForkInfo forkInfo); + default boolean isLocal() { return getSigningServiceUrl().isEmpty(); } diff --git a/ethereum/spec/src/main/java/tech/pegasys/teku/spec/signatures/SigningRootUtil.java b/ethereum/spec/src/main/java/tech/pegasys/teku/spec/signatures/SigningRootUtil.java index 4923887d55f..a22246e5ad0 100644 --- a/ethereum/spec/src/main/java/tech/pegasys/teku/spec/signatures/SigningRootUtil.java +++ b/ethereum/spec/src/main/java/tech/pegasys/teku/spec/signatures/SigningRootUtil.java @@ -24,6 +24,7 @@ import tech.pegasys.teku.spec.datastructures.builder.ValidatorRegistration; import tech.pegasys.teku.spec.datastructures.operations.AggregateAndProof; import tech.pegasys.teku.spec.datastructures.operations.AttestationData; +import tech.pegasys.teku.spec.datastructures.operations.InclusionList; import tech.pegasys.teku.spec.datastructures.operations.VoluntaryExit; import tech.pegasys.teku.spec.datastructures.state.ForkInfo; import tech.pegasys.teku.spec.logic.common.helpers.MiscHelpers; @@ -112,4 +113,17 @@ public Bytes signingRootForValidatorRegistration( final Bytes32 domain = miscHelpers.computeDomain(Domain.APPLICATION_BUILDER); return miscHelpers.computeSigningRoot(validatorRegistration, domain); } + + public Bytes signingRootForInclusionList( + final InclusionList inclusionList, final ForkInfo forkInfo) { + final UInt64 slot = inclusionList.getSlot(); + final SpecVersion specVersion = spec.atSlot(slot); + final Bytes32 domain = + spec.getDomain( + Domain.DOMAIN_INCLUSION_LIST_COMMITTEE, + spec.computeEpochAtSlot(slot), + forkInfo.getFork(), + forkInfo.getGenesisValidatorsRoot()); + return specVersion.miscHelpers().computeSigningRoot(inclusionList, domain); + } } diff --git a/ethereum/spec/src/main/java/tech/pegasys/teku/spec/signatures/SlashingProtectedSigner.java b/ethereum/spec/src/main/java/tech/pegasys/teku/spec/signatures/SlashingProtectedSigner.java index 635dcc9eb58..50421eaf8a7 100644 --- a/ethereum/spec/src/main/java/tech/pegasys/teku/spec/signatures/SlashingProtectedSigner.java +++ b/ethereum/spec/src/main/java/tech/pegasys/teku/spec/signatures/SlashingProtectedSigner.java @@ -26,6 +26,7 @@ import tech.pegasys.teku.spec.datastructures.builder.ValidatorRegistration; import tech.pegasys.teku.spec.datastructures.operations.AggregateAndProof; import tech.pegasys.teku.spec.datastructures.operations.AttestationData; +import tech.pegasys.teku.spec.datastructures.operations.InclusionList; import tech.pegasys.teku.spec.datastructures.operations.VoluntaryExit; import tech.pegasys.teku.spec.datastructures.operations.versions.altair.ContributionAndProof; import tech.pegasys.teku.spec.datastructures.operations.versions.altair.SyncAggregatorSelectionData; @@ -148,6 +149,12 @@ public SafeFuture signValidatorRegistration( return delegate.signValidatorRegistration(validatorRegistration); } + @Override + public SafeFuture signInclusionList( + final InclusionList inclusionList, final ForkInfo forkInfo) { + return delegate.signInclusionList(inclusionList, forkInfo); + } + @Override public Optional getSigningServiceUrl() { return delegate.getSigningServiceUrl(); diff --git a/ethereum/spec/src/testFixtures/java/tech/pegasys/teku/spec/generator/signatures/NoOpSigner.java b/ethereum/spec/src/testFixtures/java/tech/pegasys/teku/spec/generator/signatures/NoOpSigner.java index 05f6de611f2..832aad671e6 100644 --- a/ethereum/spec/src/testFixtures/java/tech/pegasys/teku/spec/generator/signatures/NoOpSigner.java +++ b/ethereum/spec/src/testFixtures/java/tech/pegasys/teku/spec/generator/signatures/NoOpSigner.java @@ -23,6 +23,7 @@ import tech.pegasys.teku.spec.datastructures.builder.ValidatorRegistration; import tech.pegasys.teku.spec.datastructures.operations.AggregateAndProof; import tech.pegasys.teku.spec.datastructures.operations.AttestationData; +import tech.pegasys.teku.spec.datastructures.operations.InclusionList; import tech.pegasys.teku.spec.datastructures.operations.VoluntaryExit; import tech.pegasys.teku.spec.datastructures.operations.versions.altair.ContributionAndProof; import tech.pegasys.teku.spec.datastructures.operations.versions.altair.SyncAggregatorSelectionData; @@ -93,6 +94,12 @@ public SafeFuture signValidatorRegistration( return new SafeFuture<>(); } + @Override + public SafeFuture signInclusionList( + final InclusionList inclusionList, final ForkInfo forkInfo) { + return new SafeFuture<>(); + } + @Override public abstract Optional getSigningServiceUrl(); } diff --git a/validator/api/src/main/java/tech/pegasys/teku/validator/api/signer/SignType.java b/validator/api/src/main/java/tech/pegasys/teku/validator/api/signer/SignType.java index 0fd6843c1b5..dea919b19af 100644 --- a/validator/api/src/main/java/tech/pegasys/teku/validator/api/signer/SignType.java +++ b/validator/api/src/main/java/tech/pegasys/teku/validator/api/signer/SignType.java @@ -28,7 +28,8 @@ public enum SignType { VALIDATOR_REGISTRATION("validator_registration"), CONTRIBUTION_AND_PROOF("contribution_and_proof"), BEACON_BLOCK("beacon_block"), - BLOB_SIDECAR("blob_sidecar"); + BLOB_SIDECAR("blob_sidecar"), + INCLUSION_LIST("inclusion_list"); private final String name; diff --git a/validator/client/src/main/java/tech/pegasys/teku/validator/client/signer/ExternalSigner.java b/validator/client/src/main/java/tech/pegasys/teku/validator/client/signer/ExternalSigner.java index 24ca83fb596..91bc8764f18 100644 --- a/validator/client/src/main/java/tech/pegasys/teku/validator/client/signer/ExternalSigner.java +++ b/validator/client/src/main/java/tech/pegasys/teku/validator/client/signer/ExternalSigner.java @@ -50,6 +50,7 @@ import tech.pegasys.teku.spec.datastructures.builder.ValidatorRegistration; import tech.pegasys.teku.spec.datastructures.operations.AggregateAndProof; import tech.pegasys.teku.spec.datastructures.operations.AttestationData; +import tech.pegasys.teku.spec.datastructures.operations.InclusionList; import tech.pegasys.teku.spec.datastructures.operations.VoluntaryExit; import tech.pegasys.teku.spec.datastructures.operations.versions.altair.ContributionAndProof; import tech.pegasys.teku.spec.datastructures.operations.versions.altair.SyncAggregatorSelectionData; @@ -264,6 +265,16 @@ public SafeFuture signValidatorRegistration( slashableGenericMessage("validator registration"))); } + @Override + public SafeFuture signInclusionList( + final InclusionList inclusionList, final ForkInfo forkInfo) { + return sign( + signingRootUtil.signingRootForInclusionList(inclusionList, forkInfo), + SignType.INCLUSION_LIST, + Map.of(SignType.INCLUSION_LIST.getName(), inclusionList, FORK_INFO, forkInfo), + slashableGenericMessage("inclusion list")); + } + @Override public Optional getSigningServiceUrl() { return Optional.of(signingServiceUrl);