From 67a8dc955262985a74fb088bfc0cd9d6c43ded70 Mon Sep 17 00:00:00 2001 From: Paul Harris Date: Mon, 31 Oct 2022 07:48:02 +1000 Subject: [PATCH] Move bellatrix configuration to be comparable to altair In order to define Capella configuration, I need to move Bellatrix config into the same kind of structure as Altair, so that I can build on it from there. Partially addresses #5680 Signed-off-by: Paul Harris --- .../config/DelegatingSpecConfigBellatrix.java | 100 +++++++++ .../teku/spec/config/SpecConfigBellatrix.java | 156 ++------------ .../spec/config/SpecConfigBellatrixImpl.java | 198 ++++++++++++++++++ .../teku/spec/config/SpecConfigBuilder.java | 2 +- .../spec/config/SpecConfigBellatrixTest.java | 2 +- 5 files changed, 317 insertions(+), 141 deletions(-) create mode 100644 ethereum/spec/src/main/java/tech/pegasys/teku/spec/config/DelegatingSpecConfigBellatrix.java create mode 100644 ethereum/spec/src/main/java/tech/pegasys/teku/spec/config/SpecConfigBellatrixImpl.java diff --git a/ethereum/spec/src/main/java/tech/pegasys/teku/spec/config/DelegatingSpecConfigBellatrix.java b/ethereum/spec/src/main/java/tech/pegasys/teku/spec/config/DelegatingSpecConfigBellatrix.java new file mode 100644 index 00000000000..f0df2744c42 --- /dev/null +++ b/ethereum/spec/src/main/java/tech/pegasys/teku/spec/config/DelegatingSpecConfigBellatrix.java @@ -0,0 +1,100 @@ +/* + * Copyright ConsenSys Software Inc., 2022 + * + * 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.teku.spec.config; + +import java.util.Optional; +import org.apache.tuweni.bytes.Bytes32; +import org.apache.tuweni.units.bigints.UInt256; +import tech.pegasys.teku.infrastructure.bytes.Bytes4; +import tech.pegasys.teku.infrastructure.unsigned.UInt64; + +public class DelegatingSpecConfigBellatrix extends DelegatingSpecConfigAltair + implements SpecConfigBellatrix { + private final SpecConfigBellatrix specConfigBellatrix; + + public DelegatingSpecConfigBellatrix(final SpecConfigBellatrix specConfig) { + super(specConfig); + this.specConfigBellatrix = SpecConfigBellatrix.required(specConfig); + } + + @Override + public Optional toVersionBellatrix() { + return Optional.of(this); + } + + @Override + public Bytes4 getBellatrixForkVersion() { + return specConfigBellatrix.getBellatrixForkVersion(); + } + + @Override + public UInt64 getBellatrixForkEpoch() { + return specConfigBellatrix.getBellatrixForkEpoch(); + } + + @Override + public UInt64 getInactivityPenaltyQuotientBellatrix() { + return specConfigBellatrix.getInactivityPenaltyQuotientBellatrix(); + } + + @Override + public int getMinSlashingPenaltyQuotientBellatrix() { + return specConfigBellatrix.getMinSlashingPenaltyQuotientBellatrix(); + } + + @Override + public int getProportionalSlashingMultiplierBellatrix() { + return specConfigBellatrix.getProportionalSlashingMultiplierBellatrix(); + } + + @Override + public int getMaxBytesPerTransaction() { + return specConfigBellatrix.getMaxBytesPerTransaction(); + } + + @Override + public int getMaxTransactionsPerPayload() { + return specConfigBellatrix.getMaxTransactionsPerPayload(); + } + + @Override + public int getBytesPerLogsBloom() { + return specConfigBellatrix.getBytesPerLogsBloom(); + } + + @Override + public int getMaxExtraDataBytes() { + return specConfigBellatrix.getMaxExtraDataBytes(); + } + + @Override + public UInt64 getTerminalBlockHashActivationEpoch() { + return specConfigBellatrix.getTerminalBlockHashActivationEpoch(); + } + + @Override + public Bytes32 getTerminalBlockHash() { + return specConfigBellatrix.getTerminalBlockHash(); + } + + @Override + public UInt256 getTerminalTotalDifficulty() { + return specConfigBellatrix.getTerminalTotalDifficulty(); + } + + @Override + public int getSafeSlotsToImportOptimistically() { + return specConfigBellatrix.getSafeSlotsToImportOptimistically(); + } +} diff --git a/ethereum/spec/src/main/java/tech/pegasys/teku/spec/config/SpecConfigBellatrix.java b/ethereum/spec/src/main/java/tech/pegasys/teku/spec/config/SpecConfigBellatrix.java index 706e8c01369..70cbda5c1ef 100644 --- a/ethereum/spec/src/main/java/tech/pegasys/teku/spec/config/SpecConfigBellatrix.java +++ b/ethereum/spec/src/main/java/tech/pegasys/teku/spec/config/SpecConfigBellatrix.java @@ -13,66 +13,15 @@ package tech.pegasys.teku.spec.config; -import java.util.Objects; import java.util.Optional; import org.apache.tuweni.bytes.Bytes32; import org.apache.tuweni.units.bigints.UInt256; import tech.pegasys.teku.infrastructure.bytes.Bytes4; import tech.pegasys.teku.infrastructure.unsigned.UInt64; -public class SpecConfigBellatrix extends DelegatingSpecConfigAltair { - - // Fork - private final Bytes4 bellatrixForkVersion; - private final UInt64 bellatrixForkEpoch; - private final UInt64 inactivityPenaltyQuotientBellatrix; - private final int minSlashingPenaltyQuotientBellatrix; - private final int proportionalSlashingMultiplierBellatrix; - private final int maxBytesPerTransaction; - private final int maxTransactionsPerPayload; - private final int bytesPerLogsBloom; - private final int maxExtraDataBytes; - - // Transition - private final UInt256 terminalTotalDifficulty; - private final Bytes32 terminalBlockHash; - private final UInt64 terminalBlockHashActivationEpoch; - - // Optimistic Sync - private final int safeSlotsToImportOptimistically; - - public SpecConfigBellatrix( - final SpecConfigAltair specConfig, - final Bytes4 bellatrixForkVersion, - final UInt64 bellatrixForkEpoch, - final UInt64 inactivityPenaltyQuotientBellatrix, - final int minSlashingPenaltyQuotientBellatrix, - final int proportionalSlashingMultiplierBellatrix, - final int maxBytesPerTransaction, - final int maxTransactionsPerPayload, - final int bytesPerLogsBloom, - final int maxExtraDataBytes, - final UInt256 terminalTotalDifficulty, - final Bytes32 terminalBlockHash, - final UInt64 terminalBlockHashActivationEpoch, - final int safeSlotsToImportOptimistically) { - super(specConfig); - this.bellatrixForkVersion = bellatrixForkVersion; - this.bellatrixForkEpoch = bellatrixForkEpoch; - this.inactivityPenaltyQuotientBellatrix = inactivityPenaltyQuotientBellatrix; - this.minSlashingPenaltyQuotientBellatrix = minSlashingPenaltyQuotientBellatrix; - this.proportionalSlashingMultiplierBellatrix = proportionalSlashingMultiplierBellatrix; - this.maxBytesPerTransaction = maxBytesPerTransaction; - this.maxTransactionsPerPayload = maxTransactionsPerPayload; - this.bytesPerLogsBloom = bytesPerLogsBloom; - this.maxExtraDataBytes = maxExtraDataBytes; - this.terminalTotalDifficulty = terminalTotalDifficulty; - this.terminalBlockHash = terminalBlockHash; - this.terminalBlockHashActivationEpoch = terminalBlockHashActivationEpoch; - this.safeSlotsToImportOptimistically = safeSlotsToImportOptimistically; - } +public interface SpecConfigBellatrix extends SpecConfigAltair { - public static SpecConfigBellatrix required(final SpecConfig specConfig) { + static SpecConfigBellatrix required(SpecConfig specConfig) { return specConfig .toVersionBellatrix() .orElseThrow( @@ -82,103 +31,32 @@ public static SpecConfigBellatrix required(final SpecConfig specConfig) { + specConfig.getClass().getSimpleName())); } - public Bytes4 getBellatrixForkVersion() { - return bellatrixForkVersion; - } + @Override + Optional toVersionBellatrix(); - public UInt64 getBellatrixForkEpoch() { - return bellatrixForkEpoch; - } + Bytes4 getBellatrixForkVersion(); - public UInt64 getInactivityPenaltyQuotientBellatrix() { - return inactivityPenaltyQuotientBellatrix; - } + UInt64 getBellatrixForkEpoch(); - public int getMinSlashingPenaltyQuotientBellatrix() { - return minSlashingPenaltyQuotientBellatrix; - } + UInt64 getInactivityPenaltyQuotientBellatrix(); - public int getProportionalSlashingMultiplierBellatrix() { - return proportionalSlashingMultiplierBellatrix; - } + int getMinSlashingPenaltyQuotientBellatrix(); - public int getMaxBytesPerTransaction() { - return maxBytesPerTransaction; - } + int getProportionalSlashingMultiplierBellatrix(); - public int getMaxTransactionsPerPayload() { - return maxTransactionsPerPayload; - } + int getMaxBytesPerTransaction(); - public int getBytesPerLogsBloom() { - return bytesPerLogsBloom; - } + int getMaxTransactionsPerPayload(); - public int getMaxExtraDataBytes() { - return maxExtraDataBytes; - } + int getBytesPerLogsBloom(); - public UInt256 getTerminalTotalDifficulty() { - return terminalTotalDifficulty; - } + int getMaxExtraDataBytes(); - public Bytes32 getTerminalBlockHash() { - return terminalBlockHash; - } - - public UInt64 getTerminalBlockHashActivationEpoch() { - return terminalBlockHashActivationEpoch; - } + UInt64 getTerminalBlockHashActivationEpoch(); - public int getSafeSlotsToImportOptimistically() { - return safeSlotsToImportOptimistically; - } + Bytes32 getTerminalBlockHash(); - @Override - public Optional toVersionBellatrix() { - return Optional.of(this); - } + UInt256 getTerminalTotalDifficulty(); - @Override - public boolean equals(final Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - final SpecConfigBellatrix that = (SpecConfigBellatrix) o; - return Objects.equals(specConfig, that.specConfig) - && minSlashingPenaltyQuotientBellatrix == that.minSlashingPenaltyQuotientBellatrix - && proportionalSlashingMultiplierBellatrix == that.proportionalSlashingMultiplierBellatrix - && maxBytesPerTransaction == that.maxBytesPerTransaction - && maxTransactionsPerPayload == that.maxTransactionsPerPayload - && bytesPerLogsBloom == that.bytesPerLogsBloom - && maxExtraDataBytes == that.maxExtraDataBytes - && Objects.equals(bellatrixForkVersion, that.bellatrixForkVersion) - && Objects.equals(bellatrixForkEpoch, that.bellatrixForkEpoch) - && Objects.equals( - inactivityPenaltyQuotientBellatrix, that.inactivityPenaltyQuotientBellatrix) - && Objects.equals(terminalTotalDifficulty, that.terminalTotalDifficulty) - && Objects.equals(terminalBlockHash, that.terminalBlockHash) - && Objects.equals(terminalBlockHashActivationEpoch, that.terminalBlockHashActivationEpoch); - } - - @Override - public int hashCode() { - return Objects.hash( - specConfig, - bellatrixForkVersion, - bellatrixForkEpoch, - inactivityPenaltyQuotientBellatrix, - minSlashingPenaltyQuotientBellatrix, - proportionalSlashingMultiplierBellatrix, - maxBytesPerTransaction, - maxTransactionsPerPayload, - bytesPerLogsBloom, - maxExtraDataBytes, - terminalTotalDifficulty, - terminalBlockHash, - terminalBlockHashActivationEpoch); - } + int getSafeSlotsToImportOptimistically(); } diff --git a/ethereum/spec/src/main/java/tech/pegasys/teku/spec/config/SpecConfigBellatrixImpl.java b/ethereum/spec/src/main/java/tech/pegasys/teku/spec/config/SpecConfigBellatrixImpl.java new file mode 100644 index 00000000000..394f7ebc487 --- /dev/null +++ b/ethereum/spec/src/main/java/tech/pegasys/teku/spec/config/SpecConfigBellatrixImpl.java @@ -0,0 +1,198 @@ +/* + * Copyright ConsenSys Software Inc., 2022 + * + * 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.teku.spec.config; + +import java.util.Objects; +import java.util.Optional; +import org.apache.tuweni.bytes.Bytes32; +import org.apache.tuweni.units.bigints.UInt256; +import tech.pegasys.teku.infrastructure.bytes.Bytes4; +import tech.pegasys.teku.infrastructure.unsigned.UInt64; + +public class SpecConfigBellatrixImpl extends DelegatingSpecConfigAltair + implements SpecConfigBellatrix { + + // Fork + private final Bytes4 bellatrixForkVersion; + private final UInt64 bellatrixForkEpoch; + private final UInt64 inactivityPenaltyQuotientBellatrix; + private final int minSlashingPenaltyQuotientBellatrix; + private final int proportionalSlashingMultiplierBellatrix; + private final int maxBytesPerTransaction; + private final int maxTransactionsPerPayload; + private final int bytesPerLogsBloom; + private final int maxExtraDataBytes; + + // Transition + private final UInt256 terminalTotalDifficulty; + private final Bytes32 terminalBlockHash; + private final UInt64 terminalBlockHashActivationEpoch; + + // Optimistic Sync + private final int safeSlotsToImportOptimistically; + + public SpecConfigBellatrixImpl( + final SpecConfigAltair specConfig, + final Bytes4 bellatrixForkVersion, + final UInt64 bellatrixForkEpoch, + final UInt64 inactivityPenaltyQuotientBellatrix, + final int minSlashingPenaltyQuotientBellatrix, + final int proportionalSlashingMultiplierBellatrix, + final int maxBytesPerTransaction, + final int maxTransactionsPerPayload, + final int bytesPerLogsBloom, + final int maxExtraDataBytes, + final UInt256 terminalTotalDifficulty, + final Bytes32 terminalBlockHash, + final UInt64 terminalBlockHashActivationEpoch, + final int safeSlotsToImportOptimistically) { + super(specConfig); + this.bellatrixForkVersion = bellatrixForkVersion; + this.bellatrixForkEpoch = bellatrixForkEpoch; + this.inactivityPenaltyQuotientBellatrix = inactivityPenaltyQuotientBellatrix; + this.minSlashingPenaltyQuotientBellatrix = minSlashingPenaltyQuotientBellatrix; + this.proportionalSlashingMultiplierBellatrix = proportionalSlashingMultiplierBellatrix; + this.maxBytesPerTransaction = maxBytesPerTransaction; + this.maxTransactionsPerPayload = maxTransactionsPerPayload; + this.bytesPerLogsBloom = bytesPerLogsBloom; + this.maxExtraDataBytes = maxExtraDataBytes; + this.terminalTotalDifficulty = terminalTotalDifficulty; + this.terminalBlockHash = terminalBlockHash; + this.terminalBlockHashActivationEpoch = terminalBlockHashActivationEpoch; + this.safeSlotsToImportOptimistically = safeSlotsToImportOptimistically; + } + + public static SpecConfigBellatrix required(final SpecConfig specConfig) { + return specConfig + .toVersionBellatrix() + .orElseThrow( + () -> + new IllegalArgumentException( + "Expected bellatrix spec config but got: " + + specConfig.getClass().getSimpleName())); + } + + @Override + public Bytes4 getBellatrixForkVersion() { + return bellatrixForkVersion; + } + + @Override + public UInt64 getBellatrixForkEpoch() { + return bellatrixForkEpoch; + } + + @Override + public UInt64 getInactivityPenaltyQuotientBellatrix() { + return inactivityPenaltyQuotientBellatrix; + } + + @Override + public int getMinSlashingPenaltyQuotientBellatrix() { + return minSlashingPenaltyQuotientBellatrix; + } + + @Override + public int getProportionalSlashingMultiplierBellatrix() { + return proportionalSlashingMultiplierBellatrix; + } + + @Override + public int getMaxBytesPerTransaction() { + return maxBytesPerTransaction; + } + + @Override + public int getMaxTransactionsPerPayload() { + return maxTransactionsPerPayload; + } + + @Override + public int getBytesPerLogsBloom() { + return bytesPerLogsBloom; + } + + @Override + public int getMaxExtraDataBytes() { + return maxExtraDataBytes; + } + + @Override + public UInt256 getTerminalTotalDifficulty() { + return terminalTotalDifficulty; + } + + @Override + public Bytes32 getTerminalBlockHash() { + return terminalBlockHash; + } + + @Override + public UInt64 getTerminalBlockHashActivationEpoch() { + return terminalBlockHashActivationEpoch; + } + + @Override + public int getSafeSlotsToImportOptimistically() { + return safeSlotsToImportOptimistically; + } + + @Override + public Optional toVersionBellatrix() { + return Optional.of(this); + } + + @Override + public boolean equals(final Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + final SpecConfigBellatrixImpl that = (SpecConfigBellatrixImpl) o; + return Objects.equals(specConfig, that.specConfig) + && minSlashingPenaltyQuotientBellatrix == that.minSlashingPenaltyQuotientBellatrix + && proportionalSlashingMultiplierBellatrix == that.proportionalSlashingMultiplierBellatrix + && maxBytesPerTransaction == that.maxBytesPerTransaction + && maxTransactionsPerPayload == that.maxTransactionsPerPayload + && bytesPerLogsBloom == that.bytesPerLogsBloom + && maxExtraDataBytes == that.maxExtraDataBytes + && Objects.equals(bellatrixForkVersion, that.bellatrixForkVersion) + && Objects.equals(bellatrixForkEpoch, that.bellatrixForkEpoch) + && Objects.equals( + inactivityPenaltyQuotientBellatrix, that.inactivityPenaltyQuotientBellatrix) + && Objects.equals(terminalTotalDifficulty, that.terminalTotalDifficulty) + && Objects.equals(terminalBlockHash, that.terminalBlockHash) + && Objects.equals(terminalBlockHashActivationEpoch, that.terminalBlockHashActivationEpoch); + } + + @Override + public int hashCode() { + return Objects.hash( + specConfig, + bellatrixForkVersion, + bellatrixForkEpoch, + inactivityPenaltyQuotientBellatrix, + minSlashingPenaltyQuotientBellatrix, + proportionalSlashingMultiplierBellatrix, + maxBytesPerTransaction, + maxTransactionsPerPayload, + bytesPerLogsBloom, + maxExtraDataBytes, + terminalTotalDifficulty, + terminalBlockHash, + terminalBlockHashActivationEpoch); + } +} diff --git a/ethereum/spec/src/main/java/tech/pegasys/teku/spec/config/SpecConfigBuilder.java b/ethereum/spec/src/main/java/tech/pegasys/teku/spec/config/SpecConfigBuilder.java index dc2b3872fe5..448e7eef448 100644 --- a/ethereum/spec/src/main/java/tech/pegasys/teku/spec/config/SpecConfigBuilder.java +++ b/ethereum/spec/src/main/java/tech/pegasys/teku/spec/config/SpecConfigBuilder.java @@ -735,7 +735,7 @@ public boolean isBellatrixIncluded() { } SpecConfig build(final SpecConfigAltair specConfig) { - return new SpecConfigBellatrix( + return new SpecConfigBellatrixImpl( specConfig, bellatrixForkVersion, bellatrixForkEpoch, diff --git a/ethereum/spec/src/test/java/tech/pegasys/teku/spec/config/SpecConfigBellatrixTest.java b/ethereum/spec/src/test/java/tech/pegasys/teku/spec/config/SpecConfigBellatrixTest.java index 00271086460..59f43c2d76d 100644 --- a/ethereum/spec/src/test/java/tech/pegasys/teku/spec/config/SpecConfigBellatrixTest.java +++ b/ethereum/spec/src/test/java/tech/pegasys/teku/spec/config/SpecConfigBellatrixTest.java @@ -80,7 +80,7 @@ private SpecConfigBellatrix createRandomBellatrixConfig( final SpecConfigAltair altairConfig, final int seed) { final DataStructureUtil dataStructureUtil = new DataStructureUtil(seed, spec); - return new SpecConfigBellatrix( + return new SpecConfigBellatrixImpl( altairConfig, dataStructureUtil.randomBytes4(), dataStructureUtil.randomUInt64(),