diff --git a/besu/src/test/java/org/hyperledger/besu/ForkIdsTest.java b/besu/src/test/java/org/hyperledger/besu/ForkIdsTest.java index 98940b4981da..78dacb83dafd 100644 --- a/besu/src/test/java/org/hyperledger/besu/ForkIdsTest.java +++ b/besu/src/test/java/org/hyperledger/besu/ForkIdsTest.java @@ -56,6 +56,13 @@ public class ForkIdsTest { @Parameterized.Parameters(name = "{0}") public static Collection parameters() { return List.of( + new Object[] { + NetworkName.SEPOLIA, + List.of( + new ForkId(Bytes.ofUnsignedInt(0xfe3366e7L), 1735371L), + new ForkId(Bytes.ofUnsignedInt(0xb96cbd13L), 0L), + new ForkId(Bytes.ofUnsignedInt(0xb96cbd13L), 0L)) + }, new Object[] { NetworkName.ROPSTEN, List.of( diff --git a/config/src/main/java/org/hyperledger/besu/config/GenesisConfigOptions.java b/config/src/main/java/org/hyperledger/besu/config/GenesisConfigOptions.java index f1eef229d8c8..341bb6386925 100644 --- a/config/src/main/java/org/hyperledger/besu/config/GenesisConfigOptions.java +++ b/config/src/main/java/org/hyperledger/besu/config/GenesisConfigOptions.java @@ -88,7 +88,7 @@ default boolean isConsensusMigration() { OptionalLong getGrayGlacierBlockNumber(); - OptionalLong getParisBlockNumber(); + OptionalLong getMergeNetSplitBlockNumber(); Optional getBaseFeePerGas(); diff --git a/config/src/main/java/org/hyperledger/besu/config/JsonGenesisConfigOptions.java b/config/src/main/java/org/hyperledger/besu/config/JsonGenesisConfigOptions.java index 1a138e02cd4b..d93f32a0df0e 100644 --- a/config/src/main/java/org/hyperledger/besu/config/JsonGenesisConfigOptions.java +++ b/config/src/main/java/org/hyperledger/besu/config/JsonGenesisConfigOptions.java @@ -33,7 +33,6 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.node.ObjectNode; import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Streams; import org.apache.tuweni.units.bigints.UInt256; public class JsonGenesisConfigOptions implements GenesisConfigOptions { @@ -281,14 +280,8 @@ public OptionalLong getGrayGlacierBlockNumber() { } @Override - public OptionalLong getParisBlockNumber() { - var parisBlock = getOptionalLong("parisblock"); - var preMergeAlias = getOptionalLong("premergeforkblock"); - if (parisBlock.isPresent() && preMergeAlias.isPresent()) { - throw new RuntimeException( - "Found both paris and preMergeFork blocks. Should have one or the other"); - } - return Streams.concat(parisBlock.stream(), preMergeAlias.stream()).findFirst(); + public OptionalLong getMergeNetSplitBlockNumber() { + return getOptionalLong("mergenetsplitblock"); } @Override @@ -452,7 +445,7 @@ public Map asMap() { getLondonBlockNumber().ifPresent(l -> builder.put("londonBlock", l)); getArrowGlacierBlockNumber().ifPresent(l -> builder.put("arrowGlacierBlock", l)); getGrayGlacierBlockNumber().ifPresent(l -> builder.put("grayGlacierBlock", l)); - getParisBlockNumber().ifPresent(l -> builder.put("parisBlock", l)); + getMergeNetSplitBlockNumber().ifPresent(l -> builder.put("mergeNetSplitBlock", l)); getTerminalBlockNumber().ifPresent(l -> builder.put("terminalBlockNumber", l)); getTerminalBlockHash().ifPresent(h -> builder.put("terminalBlockHash", h.toHexString())); @@ -571,8 +564,7 @@ public List getForks() { getLondonBlockNumber(), getArrowGlacierBlockNumber(), getGrayGlacierBlockNumber(), - getParisBlockNumber(), - getTerminalBlockNumber(), + getMergeNetSplitBlockNumber(), getEcip1015BlockNumber(), getDieHardBlockNumber(), getGothamBlockNumber(), diff --git a/config/src/main/java/org/hyperledger/besu/config/StubGenesisConfigOptions.java b/config/src/main/java/org/hyperledger/besu/config/StubGenesisConfigOptions.java index d433ee3b8b49..000fa792bf1a 100644 --- a/config/src/main/java/org/hyperledger/besu/config/StubGenesisConfigOptions.java +++ b/config/src/main/java/org/hyperledger/besu/config/StubGenesisConfigOptions.java @@ -43,7 +43,7 @@ public class StubGenesisConfigOptions implements GenesisConfigOptions { private OptionalLong londonBlockNumber = OptionalLong.empty(); private OptionalLong arrowGlacierBlockNumber = OptionalLong.empty(); private OptionalLong grayGlacierBlockNumber = OptionalLong.empty(); - private OptionalLong parisBlockNumber = OptionalLong.empty(); + private OptionalLong mergeNetSplitBlockNumber = OptionalLong.empty(); private OptionalLong terminalBlockNumber = OptionalLong.empty(); private Optional terminalBlockHash = Optional.empty(); private Optional terminalTotalDifficulty = Optional.empty(); @@ -212,8 +212,8 @@ public OptionalLong getGrayGlacierBlockNumber() { } @Override - public OptionalLong getParisBlockNumber() { - return parisBlockNumber; + public OptionalLong getMergeNetSplitBlockNumber() { + return mergeNetSplitBlockNumber; } @Override @@ -348,7 +348,7 @@ public Map asMap() { getLondonBlockNumber().ifPresent(l -> builder.put("londonBlock", l)); getArrowGlacierBlockNumber().ifPresent(l -> builder.put("arrowGlacierBlock", l)); getGrayGlacierBlockNumber().ifPresent(l -> builder.put("grayGlacierBlock", l)); - getParisBlockNumber().ifPresent(l -> builder.put("parisBlock", l)); + getMergeNetSplitBlockNumber().ifPresent(l -> builder.put("mergeNetSplitBlock", l)); getTerminalBlockNumber().ifPresent(l -> builder.put("terminalBlockNumber", l)); getTerminalBlockHash().ifPresent(h -> builder.put("terminalBlockHash", h)); // classic fork blocks @@ -482,8 +482,8 @@ public StubGenesisConfigOptions grayGlacierBlock(final long blockNumber) { return this; } - public StubGenesisConfigOptions parisBlock(final long blockNumber) { - parisBlockNumber = OptionalLong.of(blockNumber); + public StubGenesisConfigOptions mergeNetSplitBlock(final long blockNumber) { + mergeNetSplitBlockNumber = OptionalLong.of(blockNumber); return this; } diff --git a/config/src/main/resources/kiln.json b/config/src/main/resources/kiln.json index e2b93d8cf9cd..9808a3b2de85 100644 --- a/config/src/main/resources/kiln.json +++ b/config/src/main/resources/kiln.json @@ -12,7 +12,7 @@ "istanbulBlock": 0, "berlinBlock": 0, "londonBlock": 0, - "parisBlock": 1000, + "mergeNetSplitBlock": 1000, "terminalTotalDifficulty": 20000000000000, "discovery": { "bootnodes": [ diff --git a/config/src/main/resources/sepolia.json b/config/src/main/resources/sepolia.json index d560a5e415e2..b1751b86e9dd 100644 --- a/config/src/main/resources/sepolia.json +++ b/config/src/main/resources/sepolia.json @@ -11,6 +11,7 @@ "istanbulBlock":0, "berlinBlock":0, "londonBlock":0, + "mergeNetSplitBlock": 1735371, "terminalTotalDifficulty": 17000000000000000, "ethash":{}, "discovery": { diff --git a/config/src/test/java/org/hyperledger/besu/config/GenesisConfigFileTest.java b/config/src/test/java/org/hyperledger/besu/config/GenesisConfigFileTest.java index 677d0e5152b9..3112f908377c 100644 --- a/config/src/test/java/org/hyperledger/besu/config/GenesisConfigFileTest.java +++ b/config/src/test/java/org/hyperledger/besu/config/GenesisConfigFileTest.java @@ -208,6 +208,16 @@ public void assertRopstenTerminalTotalDifficulty() { .isEqualTo(UInt256.valueOf(new BigInteger("50000000000000000"))); } + @Test + public void assertSepoliaTerminalTotalDifficulty() { + GenesisConfigOptions sepoliaOptions = + GenesisConfigFile.genesisFileFromResources("/sepolia.json").getConfigOptions(); + + assertThat(sepoliaOptions.getTerminalTotalDifficulty()).isPresent(); + assertThat(sepoliaOptions.getTerminalTotalDifficulty().get()) + .isEqualTo(UInt256.valueOf(new BigInteger("17000000000000000"))); + } + @Test public void assertGoerliTerminalTotalDifficulty() { GenesisConfigOptions goerliOptions = @@ -230,34 +240,20 @@ public void assertTerminalTotalDifficultyOverride() { } @Test - public void shouldFindParisForkAndAlias() { - GenesisConfigFile parisGenesis = - GenesisConfigFile.fromConfig("{\"config\":{\"parisBlock\":10},\"baseFeePerGas\":\"0xa\"}"); - assertThat(parisGenesis.getForks()).hasSize(1); - assertThat(parisGenesis.getConfigOptions().getParisBlockNumber()).isPresent(); - assertThat(parisGenesis.getConfigOptions().getParisBlockNumber().getAsLong()).isEqualTo(10L); - - GenesisConfigFile premergeForkGenesis = + public void shouldFindMergeNetSplitForkAndAlias() { + GenesisConfigFile mergeNetSplitGenesis = GenesisConfigFile.fromConfig( - "{\"config\":{\"preMergeForkBlock\":11},\"baseFeePerGas\":\"0xa\"}"); - assertThat(premergeForkGenesis.getForks()).hasSize(1); - assertThat(premergeForkGenesis.getConfigOptions().getParisBlockNumber()).isPresent(); - assertThat(premergeForkGenesis.getConfigOptions().getParisBlockNumber().getAsLong()) + "{\"config\":{\"mergeNetsplitBlock\":11},\"baseFeePerGas\":\"0xa\"}"); + assertThat(mergeNetSplitGenesis.getForks()).hasSize(1); + assertThat(mergeNetSplitGenesis.getConfigOptions().getMergeNetSplitBlockNumber()).isPresent(); + assertThat(mergeNetSplitGenesis.getConfigOptions().getMergeNetSplitBlockNumber().getAsLong()) .isEqualTo(11L); - // assert fail if both paris and alias are present - var dupeOptions = - GenesisConfigFile.fromConfig( - "{\"config\":{\"parisBlock\":10,\"preMergeForkBlock\":11},\"baseFeePerGas\":\"0xa\"}") - .getConfigOptions(); - assertThatThrownBy(() -> dupeOptions.getParisBlockNumber()) - .isInstanceOf(RuntimeException.class); - - // assert empty if neither are present: + // assert empty if not present: GenesisConfigFile londonGenesis = GenesisConfigFile.fromConfig("{\"config\":{\"londonBlock\":11},\"baseFeePerGas\":\"0xa\"}"); assertThat(londonGenesis.getForks()).hasSize(1); - assertThat(londonGenesis.getConfigOptions().getParisBlockNumber()).isEmpty(); + assertThat(londonGenesis.getConfigOptions().getMergeNetSplitBlockNumber()).isEmpty(); } @Test diff --git a/config/src/test/resources/all_forks.json b/config/src/test/resources/all_forks.json index 567d6aeac0d0..fee4fa4bda5a 100644 --- a/config/src/test/resources/all_forks.json +++ b/config/src/test/resources/all_forks.json @@ -13,7 +13,7 @@ "londonBlock": 11, "arrowGlacierBlock": 12, "grayGlacierBlock": 13, - "parisBlock": 14, + "mergeNetSplitBlock": 14, "ecip1015Block": 102, "dieHardBlock": 103, "gothamBlock": 104, diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolScheduleBuilder.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolScheduleBuilder.java index 3fccd7b6f43f..40d5f08a54ad 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolScheduleBuilder.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolScheduleBuilder.java @@ -233,7 +233,7 @@ private TreeMap buildMilestoneMap( specFactory.arrowGlacierDefinition(config)), create( config.getGrayGlacierBlockNumber(), specFactory.grayGlacierDefinition(config)), - create(config.getParisBlockNumber(), specFactory.parisDefinition(config)), + create(config.getMergeNetSplitBlockNumber(), specFactory.parisDefinition(config)), // Classic Milestones create(config.getEcip1015BlockNumber(), specFactory.tangerineWhistleDefinition()), create(config.getDieHardBlockNumber(), specFactory.dieHardDefinition()), diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/ForkIdTestUtil.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/ForkIdTestUtil.java index 0905aafe4957..e9c8b8dfb4f5 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/ForkIdTestUtil.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/ForkIdTestUtil.java @@ -52,6 +52,8 @@ public static class GenesisHash { "0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3"; public static final String ROPSTEN = "0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d"; + public static final String SEPOLIA = + "0x25a5cc106eea7138acab33231d7160d69cb777ee0c2c553fcddf5138993e6dd9"; public static final String RINKEBY = "0x6341fd3daf94b748c72ced5a5b26028f2474f5f00d824504e4fa37a75767e177"; public static final String GOERLI = @@ -67,6 +69,8 @@ public static class Forks { 9069000L, 9200000L, 12244000L, 12965000L, 13773000L, 15050000L); public static final List ROPSTEN = Arrays.asList(0L, 0L, 10L, 1700000L, 4230000L, 4939394L, 6485846L, 7117117L); + public static final List SEPOLIA = + Arrays.asList(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1735371L); public static final List RINKEBY = Arrays.asList(1L, 2L, 3L, 3L, 1035301L, 3660663L, 4321234L, 5435345L); public static final List GOERLI = Arrays.asList(0L, 0L, 0L, 0L, 0L, 0L, 0L, 1561651L); @@ -99,6 +103,10 @@ public static class ForkIds { new ForkId(Bytes.fromHexString("0xd6e2149b"), 6485846L), new ForkId(Bytes.fromHexString("0x4bc66396"), 7117117L), new ForkId(Bytes.fromHexString("0x6727ef90"), 0L)); + public static final List SEPOLIA = + Arrays.asList( + new ForkId(Bytes.fromHexString("0xfe3366e7"), 1735371L), + new ForkId(Bytes.fromHexString("0xb96cbd13"), 0L)); public static final List RINKEBY = Arrays.asList( new ForkId(Bytes.fromHexString("0x3b8e0691"), 1L), @@ -118,6 +126,7 @@ public static class ForkIds { public static class Network { public static final Network MAINNET = network(GenesisHash.MAINNET, Forks.MAINNET); public static final Network ROPSTEN = network(GenesisHash.ROPSTEN, Forks.ROPSTEN); + public static final Network SEPOLIA = network(GenesisHash.SEPOLIA, Forks.SEPOLIA); public static final Network RINKEBY = network(GenesisHash.RINKEBY, Forks.RINKEBY); public static final Network GOERLI = network(GenesisHash.GOERLI, Forks.GOERLI); public static final Network PRIVATE = network(GenesisHash.PRIVATE, Forks.PRIVATE); diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/manager/EIP2124Test.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/manager/EIP2124Test.java index 8b1df3f12a9f..90bff710043c 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/manager/EIP2124Test.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/manager/EIP2124Test.java @@ -353,6 +353,23 @@ public static Collection data() { Optional.of(ForkIds.ROPSTEN), empty() }, + // Sepolia test cases + { + "Sepolia // mergenetsplit block", + Network.SEPOLIA, + 0L, + ForkIdTestUtil.wantForkId("0xfe3366e7", 1735371L), + Optional.of(ForkIds.SEPOLIA), + empty() + }, + { + "Sepolia // Future", + Network.SEPOLIA, + 1735371L, + ForkIdTestUtil.wantForkId("0xb96cbd13", 0L), + Optional.of(ForkIds.SEPOLIA), + empty() + }, // Rinkeby test cases { "Rinkeby // Unsynced, last Frontier block", diff --git a/ethereum/referencetests/src/main/java/org/hyperledger/besu/ethereum/referencetests/ReferenceTestProtocolSchedules.java b/ethereum/referencetests/src/main/java/org/hyperledger/besu/ethereum/referencetests/ReferenceTestProtocolSchedules.java index c277f28e1e78..38cc3af14ef3 100644 --- a/ethereum/referencetests/src/main/java/org/hyperledger/besu/ethereum/referencetests/ReferenceTestProtocolSchedules.java +++ b/ethereum/referencetests/src/main/java/org/hyperledger/besu/ethereum/referencetests/ReferenceTestProtocolSchedules.java @@ -68,6 +68,8 @@ public static ReferenceTestProtocolSchedules create() { builder.put( "ArrowGlacier", createSchedule(new StubGenesisConfigOptions().arrowGlacierBlock(0))); builder.put("GrayGlacier", createSchedule(new StubGenesisConfigOptions().grayGlacierBlock(0))); + builder.put( + "MergeNetSplit", createSchedule(new StubGenesisConfigOptions().mergeNetSplitBlock(0))); return new ReferenceTestProtocolSchedules(builder.build()); } diff --git a/ethereum/retesteth/src/main/java/org/hyperledger/besu/ethereum/retesteth/methods/TestSetChainParams.java b/ethereum/retesteth/src/main/java/org/hyperledger/besu/ethereum/retesteth/methods/TestSetChainParams.java index 30de53effc17..e5c80595af23 100644 --- a/ethereum/retesteth/src/main/java/org/hyperledger/besu/ethereum/retesteth/methods/TestSetChainParams.java +++ b/ethereum/retesteth/src/main/java/org/hyperledger/besu/ethereum/retesteth/methods/TestSetChainParams.java @@ -125,6 +125,7 @@ private static String modifyGenesisFile(final String initialGenesis) { maybeMoveToNumber(params, "londonForkBlock", config, "londonBlock"); maybeMoveToNumber(params, "arrowGlacierForkBlock", config, "arrowGlacierBlock"); maybeMoveToNumber(params, "grayGlacierForkBlock", config, "grayGlacierBlock"); + maybeMoveToNumber(params, "mergeNetSplitForkBlock", config, "mergeNetSplitBlock"); maybeMoveToNumber(params, "chainID", config, "chainId", 1); maybeMove(genesis, "author", chainParamsJson, "coinbase");