diff --git a/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java b/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java index 49fe22131a2..d5501b0b1a7 100644 --- a/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java +++ b/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java @@ -3510,7 +3510,7 @@ private void validatePostMergeCheckpointBlockRequirements() { if (synchronizerConfiguration.isCheckpointPostMergeEnabled()) { if (!checkpointConfigOptions.isValid()) { throw new InvalidConfigurationException( - "Near head checkpoint sync requires a checkpoint block configured in the genesis file"); + "PoS checkpoint sync requires a checkpoint block configured in the genesis file"); } terminalTotalDifficulty.ifPresentOrElse( ttd -> { @@ -3519,18 +3519,18 @@ private void validatePostMergeCheckpointBlockRequirements() { .equals(UInt256.ZERO) && ttd.equals(UInt256.ZERO)) { throw new InvalidConfigurationException( - "Post Merge checkpoint sync can't be used with TTD = 0 and checkpoint totalDifficulty = 0"); + "PoS checkpoint sync can't be used with TTD = 0 and checkpoint totalDifficulty = 0"); } if (UInt256.fromHexString( genesisOptions.getCheckpointOptions().getTotalDifficulty().get()) - .lessOrEqualThan(ttd)) { + .lessThan(ttd)) { throw new InvalidConfigurationException( - "Near head checkpoint sync requires a block with total difficulty greater than the TTD"); + "PoS checkpoint sync requires a block with total difficulty greater or equal than the TTD"); } }, () -> { throw new InvalidConfigurationException( - "Near head checkpoint sync requires TTD in the genesis file"); + "PoS checkpoint sync requires TTD in the genesis file"); }); } } diff --git a/besu/src/test/java/org/hyperledger/besu/cli/BesuCommandTest.java b/besu/src/test/java/org/hyperledger/besu/cli/BesuCommandTest.java index f1ea5aabe22..99c376ceaa2 100644 --- a/besu/src/test/java/org/hyperledger/besu/cli/BesuCommandTest.java +++ b/besu/src/test/java/org/hyperledger/besu/cli/BesuCommandTest.java @@ -5518,7 +5518,7 @@ public void checkpointPostMergeShouldFailWhenGenesisHasNoTTD() throws IOExceptio assertThat(commandOutput.toString(UTF_8)).isEmpty(); assertThat(commandErrorOutput.toString(UTF_8)) - .contains("Near head checkpoint sync requires TTD in the genesis file"); + .contains("PoS checkpoint sync requires TTD in the genesis file"); } @Test @@ -5529,7 +5529,7 @@ public void checkpointPostMergeShouldFailWhenGenesisUsesCheckpointFromPreMerge() assertThat(commandOutput.toString(UTF_8)).isEmpty(); assertThat(commandErrorOutput.toString(UTF_8)) .contains( - "Near head checkpoint sync requires a block with total difficulty greater than the TTD"); + "PoS checkpoint sync requires a block with total difficulty greater or equal than the TTD"); } @Test @@ -5559,6 +5559,25 @@ public void checkpointPostMergeWithPostMergeBlockSucceeds() throws IOException { assertThat(commandErrorOutput.toString(UTF_8)).isEmpty(); } + @Test + public void checkpointPostMergeWithPostMergeBlockTDEqualsTTDSucceeds() throws IOException { + final String configText = + Resources.toString( + Resources.getResource("valid_pos_checkpoint_pos_TD_equals_TTD.json"), + StandardCharsets.UTF_8); + final Path genesisFile = createFakeGenesisFile(new JsonObject(configText)); + + parseCommand( + "--genesis-file", + genesisFile.toString(), + "--sync-mode", + "X_CHECKPOINT", + "--Xcheckpoint-post-merge-enabled"); + + assertThat(commandOutput.toString(UTF_8)).isEmpty(); + assertThat(commandErrorOutput.toString(UTF_8)).isEmpty(); + } + @Test public void checkpointMergeAtGenesisWithGenesisBlockDifficultyZeroFails() throws IOException { final String configText = @@ -5577,6 +5596,6 @@ public void checkpointMergeAtGenesisWithGenesisBlockDifficultyZeroFails() throws assertThat(commandOutput.toString(UTF_8)).isEmpty(); assertThat(commandErrorOutput.toString(UTF_8)) .contains( - "Post Merge checkpoint sync can't be used with TTD = 0 and checkpoint totalDifficulty = 0"); + "PoS checkpoint sync can't be used with TTD = 0 and checkpoint totalDifficulty = 0"); } } diff --git a/besu/src/test/resources/valid_pos_checkpoint_pos_TD_equals_TTD.json b/besu/src/test/resources/valid_pos_checkpoint_pos_TD_equals_TTD.json new file mode 100644 index 00000000000..eb7c419fed9 --- /dev/null +++ b/besu/src/test/resources/valid_pos_checkpoint_pos_TD_equals_TTD.json @@ -0,0 +1,56 @@ +{ + "config": { + "chainId": 1337, + "homesteadBlock": 0, + "daoForkBlock": 0, + "eip150Block": 0, + "eip158Block": 0, + "byzantiumBlock": 0, + "petersburgBlock": 0, + "istanbulBlock": 0, + "muirGlacierBlock": 0, + "berlinBlock": 0, + "londonBlock": 0, + "arrowGlacierBlock": 0, + "grayGlacierBlock": 0, + "terminalTotalDifficulty": 10, + "ethash": { + }, + "discovery": { + "dns": "enrtree://AKA3AM6LPBYEUDMVNU3BSVQJ5AD45Y7YPOHJLEF6W26QOE4VTUDPE@all.mainnet.ethdisco.net", + "bootnodes": [ + "enode://d860a01f9722d78051619d1e2351aba3f43f943f6f00718d1b9baa4101932a1f5011f16bb2b1bb35db20d6fe28fa0bf09636d26a87d31de9ec6203eeedb1f666@18.138.108.67:30303", + "enode://22a8232c3abc76a16ae9d6c3b164f98775fe226f0917b0ca871128a74a8e9630b458460865bab457221f1d448dd9791d24c4e5d88786180ac185df813a68d4de@3.209.45.79:30303", + "enode://8499da03c47d637b20eee24eec3c356c9a2e6148d6fe25ca195c7949ab8ec2c03e3556126b0d7ed644675e78c4318b08691b7b57de10e5f0d40d05b09238fa0a@52.187.207.27:30303", + "enode://103858bdb88756c71f15e9b5e09b56dc1be52f0a5021d46301dbbfb7e130029cc9d0d6f73f693bc29b665770fff7da4d34f3c6379fe12721b5d7a0bcb5ca1fc1@191.234.162.198:30303", + "enode://715171f50508aba88aecd1250af392a45a330af91d7b90701c436b618c86aaa1589c9184561907bebbb56439b8f8787bc01f49a7c77276c58c1b09822d75e8e8@52.231.165.108:30303", + "enode://5d6d7cd20d6da4bb83a1d28cadb5d409b64edf314c0335df658c1a54e32c7c4a7ab7823d57c39b6a757556e68ff1df17c748b698544a55cb488b52479a92b60f@104.42.217.25:30303", + "enode://2b252ab6a1d0f971d9722cb839a42cb81db019ba44c08754628ab4a823487071b5695317c8ccd085219c3a03af063495b2f1da8d18218da2d6a82981b45e6ffc@65.108.70.101:30303", + "enode://4aeb4ab6c14b23e2c4cfdce879c04b0748a20d8e9b59e25ded2a08143e265c6c25936e74cbc8e641e3312ca288673d91f2f93f8e277de3cfa444ecdaaf982052@157.90.35.166:30303", + "enode://a979fb575495b8d6db44f750317d0f4622bf4c2aa3365d6af7c284339968eef29b69ad0dce72a4d8db5ebb4968de0e3bec910127f134779fbcb0cb6d3331163c@52.16.188.185:30303", + "enode://3f1d12044546b76342d59d4a05532c14b85aa669704bfe1f864fe079415aa2c02d743e03218e57a33fb94523adb54032871a6c51b2cc5514cb7c7e35b3ed0a99@13.93.211.84:30303", + "enode://78de8a0916848093c73790ead81d1928bec737d565119932b98c6b100d944b7a95e94f847f689fc723399d2e31129d182f7ef3863f2b4c820abbf3ab2722344d@191.235.84.50:30303", + "enode://158f8aab45f6d19c6cbf4a089c2670541a8da11978a2f90dbf6a502a4a3bab80d288afdbeb7ec0ef6d92de563767f3b1ea9e8e334ca711e9f8e2df5a0385e8e6@13.75.154.138:30303", + "enode://1118980bf48b0a3640bdba04e0fe78b1add18e1cd99bf22d53daac1fd9972ad650df52176e7c7d89d1114cfef2bc23a2959aa54998a46afcf7d91809f0855082@52.74.57.123:30303", + "enode://979b7fa28feeb35a4741660a16076f1943202cb72b6af70d327f053e248bab9ba81760f39d0701ef1d8f89cc1fbd2cacba0710a12cd5314d5e0c9021aa3637f9@5.1.83.226:30303" + ] + }, + "checkpoint": { + "hash": "0x186642d6084eb7799cb01c7eb69c1a7f3b2c32cd141e62d309f30081a1ea3c91", + "number": 3, + "totalDifficulty": "0x0a" + } + }, + "nonce": "0x42", + "timestamp": "0x0", + "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa", + "gasLimit": "0x1388", + "difficulty": "0x400000000", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "0x0000000000000000000000000000000000000000", + "alloc": { + "000d836201318ec6899a67540690382780743280": { + "balance": "0xad78ebc5ac6200000" + } + } +}