diff --git a/besu/src/main/java/org/hyperledger/besu/controller/BesuControllerBuilder.java b/besu/src/main/java/org/hyperledger/besu/controller/BesuControllerBuilder.java index c9da9fe9f22..71c912efc06 100644 --- a/besu/src/main/java/org/hyperledger/besu/controller/BesuControllerBuilder.java +++ b/besu/src/main/java/org/hyperledger/besu/controller/BesuControllerBuilder.java @@ -21,6 +21,7 @@ import org.hyperledger.besu.config.GenesisConfigOptions; import org.hyperledger.besu.consensus.merge.FinalizedBlockHashSupplier; import org.hyperledger.besu.consensus.merge.MergeContext; +import org.hyperledger.besu.consensus.merge.PandaPrinter; import org.hyperledger.besu.consensus.qbft.pki.PkiBlockCreationConfiguration; import org.hyperledger.besu.crypto.NodeKey; import org.hyperledger.besu.datatypes.Hash; @@ -421,6 +422,8 @@ public BesuController build() { ethProtocolManager, pivotBlockSelector); + synchronizer.subscribeInSync(new PandaPrinter()); + final MiningCoordinator miningCoordinator = createMiningCoordinator( protocolSchedule, diff --git a/besu/src/main/java/org/hyperledger/besu/controller/TransitionBesuControllerBuilder.java b/besu/src/main/java/org/hyperledger/besu/controller/TransitionBesuControllerBuilder.java index 3f83c2250c4..4106949c091 100644 --- a/besu/src/main/java/org/hyperledger/besu/controller/TransitionBesuControllerBuilder.java +++ b/besu/src/main/java/org/hyperledger/besu/controller/TransitionBesuControllerBuilder.java @@ -219,6 +219,7 @@ public BesuControllerBuilder storageProvider(final StorageProvider storageProvid @Override public BesuController build() { BesuController controller = super.build(); + PandaPrinter.hasTTD(); PostMergeContext.get().setSyncState(controller.getSyncState()); return controller; } diff --git a/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/PandaPrinter.java b/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/PandaPrinter.java index 5ec89fabcf4..b5340c70b5a 100644 --- a/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/PandaPrinter.java +++ b/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/PandaPrinter.java @@ -16,25 +16,37 @@ package org.hyperledger.besu.consensus.merge; +import org.hyperledger.besu.datatypes.Hash; +import org.hyperledger.besu.ethereum.core.Difficulty; +import org.hyperledger.besu.ethereum.core.Synchronizer.InSyncListener; + import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; +import java.util.Optional; import java.util.concurrent.atomic.AtomicBoolean; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class PandaPrinter { +public class PandaPrinter implements InSyncListener, ForkchoiceMessageListener, MergeStateHandler { private static final Logger LOG = LoggerFactory.getLogger(PandaPrinter.class); - private static final String pandaBanner = PandaPrinter.loadBanner(); - private static final AtomicBoolean beenDisplayed = new AtomicBoolean(); + private static final String readyBanner = PandaPrinter.loadBanner("/readyPanda.txt"); + private static final String ttdBanner = PandaPrinter.loadBanner("/ttdPanda.txt"); + private static final String finalizedBanner = PandaPrinter.loadBanner("/finalizedPanda.txt"); + + private static final AtomicBoolean hasTTD = new AtomicBoolean(false); + private static final AtomicBoolean inSync = new AtomicBoolean(false); + public static final AtomicBoolean readyBeenDisplayed = new AtomicBoolean(); + public static final AtomicBoolean ttdBeenDisplayed = new AtomicBoolean(); + public static final AtomicBoolean finalizedBeenDisplayed = new AtomicBoolean(); - private static String loadBanner() { + private static String loadBanner(final String filename) { Class c = PandaPrinter.class; - InputStream is = c.getResourceAsStream("/ProofOfPanda3.txt"); + InputStream is = c.getResourceAsStream(filename); StringBuilder resultStringBuilder = new StringBuilder(); try (BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8))) { @@ -48,19 +60,71 @@ private static String loadBanner() { return resultStringBuilder.toString(); } - public static boolean printOnFirstCrossing() { - boolean shouldPrint = beenDisplayed.compareAndSet(false, true); - if (shouldPrint) { - LOG.info("\n" + pandaBanner); + public static void hasTTD() { + PandaPrinter.hasTTD.getAndSet(true); + if (hasTTD.get() && inSync.get()) { + printReadyToMerge(); + } + } + + public static void inSync() { + PandaPrinter.inSync.getAndSet(true); + if (inSync.get() && hasTTD.get()) { + printReadyToMerge(); } - return shouldPrint; } - static boolean hasDisplayed() { - return beenDisplayed.get(); + public static void printOnFirstCrossing() { + if (!ttdBeenDisplayed.get()) { + LOG.info("\n" + ttdBanner); + } + ttdBeenDisplayed.compareAndSet(false, true); } static void resetForTesting() { - beenDisplayed.set(false); + ttdBeenDisplayed.set(false); + readyBeenDisplayed.set(false); + finalizedBeenDisplayed.set(false); + } + + public static void printReadyToMerge() { + if (!readyBeenDisplayed.get()) { + LOG.info("\n" + readyBanner); + } + readyBeenDisplayed.compareAndSet(false, true); + } + + public static void printFinalized() { + if (!finalizedBeenDisplayed.get()) { + LOG.info("\n" + finalizedBanner); + } + finalizedBeenDisplayed.compareAndSet(false, true); + } + + @Override + public void onInSyncStatusChange(final boolean newSyncStatus) { + if (newSyncStatus && hasTTD.get()) { + printReadyToMerge(); + } + } + + @Override + public void onNewForkchoiceMessage( + final Hash headBlockHash, + final Optional maybeFinalizedBlockHash, + final Hash safeBlockHash) { + if (maybeFinalizedBlockHash.isPresent() && !maybeFinalizedBlockHash.get().equals(Hash.ZERO)) { + printFinalized(); + } + } + + @Override + public void mergeStateChanged( + final boolean isPoS, + final Optional priorState, + final Optional difficultyStoppedAt) { + if (isPoS && priorState.isPresent() && !priorState.get()) { // just crossed from PoW to PoS + printOnFirstCrossing(); + } } } diff --git a/consensus/merge/src/main/resources/ProofOfPanda3.txt b/consensus/merge/src/main/resources/ProofOfPanda3.txt deleted file mode 100644 index 7855719bf68..00000000000 --- a/consensus/merge/src/main/resources/ProofOfPanda3.txt +++ /dev/null @@ -1,196 +0,0 @@ - - - - - - - - :. :. - #%% %#%= - =%*%% +%++#. =. - %%#*@#++==*##*%+*##= .:+ - -#%%@%#%%@@%%*@%##%= .- - =@@%%#%#@#@*%%@*++ - -@@@@@#*@@@%#%@%@#*. - .%@@%*%@#%%@#@#%%%@*# :: -+. - -#@%+-**#%%*@%+=*%%*%. -%#--..-%#: - :%#%*=%-#*+##%=#==%@%%= -: =. - -%+%*:**@%*####==##%%%#= .. . : - .#@#%###%%#-+*%**%#@@%@## :.. = :*#* .: - -%%%%%+%%%+-+%@%*#%%@%%*%- ..-. .. -#@#. - - *%%@@%*@**-%***@%#%%%@#*@@: . - .. %. - - %%%@@%+@%**@*=%@@#%%%%+*### ...- .. * .- . . : - :. :. .#%#@#%+%%%*%*@%@%*#%@*=%##%. : :. ..:-=*#:...+ - -*.=:=. - %#%%-+%# =-*@%%%#=*%@%%%@@@#++@%+##*%%+ .::+. .:.:=*+#+::....-. .=*= - =+##%#%..: :##:#%##@%*#%#**+*%*##%+%*=-.-% . .-:::.= ** . :: . ++.+... - #%*###%*%%**=+**%##+#**%@*#*#**+**##*+#-+*-+-*- . .:+:. ==-+:.. .%+=:*: - -%%*++##%%#%#%%%#@%#*#%+**+##%%##%*-+#+--*%%#+* . .-===--. .:-=- . #===.. - -###=+%@%%%%%%@@#@%##*=--++-+#***=--=-=**#*@### .:- . .#++==. - -+%++@@@@@@%@@@+@@%=+#*%--::-*+=:-=**#%%#%#@%@. .= .. .#+-:. - -%+*#@@@@@@@@@@+@@%=+%%@%%#+#%#+*###%%%@%%%%%%. . .- . .. ....:. - -*@@@@@@@@%@+%@%#-:#@@@@#%@%#%%%%%%@@@%@%@#% . . .* .... .. - %@@@@@@%*@**@%%#-#@@@@@@@@#%#%@%@%@%%@%@#%: .... .....-: ...... - =%@@@@@#%##@@%%==@@@@@@@@@@@%@@@%@@@@@%#%. . ...... ....*= .... - +@@@@%**%%@%%#=-%%@@@@@@@@@@@@@@@@%%#@@- . -...... .:+++=. . - =#@@%*@%%@%%##--%@@@@@@@@@@@@@@%@*%@%* .::=...:.::-+++=. . - --@@#@%%%#*=.-@@@@@@@@@@@%%@*#%@@% .. ...*..*=. . - =@@@%@@@%#*++-=%@@%@@@@@#+**%@@@* . --.. .. - -@@@%@@%%##**##+==:+-+**=+#%@%%@+ ... - -@@@@%@@#%%%%@@%#+#%%%@#+#%@@@#%= . .. - -%@@@@@@@@@%%%@+%@%@%%##%%#@@@%@- .. . ... - :%@@@%@@@@@%@@#%@%%#=-*++**+@%#@= -+=-.:=: .. - .@@@@@@@@@@@@%@@%*++*%%#%@%#*%%#- .. .= := . .... - #@@@@@@@@@@*@%*+@%@@#@%@@@%*%@. . + . .... - :#@@@@@@@%%%#=*@@%%@@@#%@@##*@:: .. ... :=... ..... - -%@@@@@@@@@%=@@%@%@%@@@@@%#+@# .. .... =.......... - ++%@@@@@@%@*%@%%@@@@@@@@%#**@+ ..: ... .==...... . - #*%@@@@%*+=%##@@@@@%@%%%###+. . :.... ..=+:..:= - *#*#@@@%=*==*##=+*#%@%##+#@+ .. ...+. -=+:--.=-.. - .*#=*%@%*%##@@#%%+#*%@*+#@+ .... . ...+.:.+:::. - *%*+##+#%%%%%%%#%%%%##%- : ... .-=+.:-=*.... - -@@%%%*-%%%%@%%@%@%*%% ....=..:*:.=.... - #@@%***+%+++*++@%%+- ..::=:**+#... - %%%%%%%=%%*+*%@%. .::**=+=:... - :%@@%%%%=##%%*= .:+=-+.... - *@@@@@@%#++ :=+::. - :*%@@@%@@+ :..... - #%@@@@%%# ....... - .#@@@@@@@#= ... .... - #%@%%@%%@@@. ..:..:.. - -###%%%%@@%- . .. . - #*#%#%@@*: - :+- - - - - - - :.-- - .-*+#=---:-*:::-: .-.-== . - -%%@%%%%@%#%@*+*+#* . ...*==+# . - -%%#%%@@@@%@%@%%+=**@:: .-*.*++= - .#%%@@@@@@%@%%@@##***##+ ...=:++%.. - :%%%%@@@@%%*=-+%@###++*%= --*+*:+*... .+=. - :%%@@@@@@%%@*%#*%-@@%*##+*## ...-.*-. .. .-. .- - .:.#@@@@@@@@@@#+%*#@=@@%%%%##%= . .-: ... . .:-=++- - #=@@@@%@%#*#**%@##%-@@++#*.- ......: --: - #%#@@@@@%#*@%%%%@@@%-:: : ..:-. +... - :::@%%@@@@@@=%@*#@%*@@%%. :. ..=: - :%=#@@@@%@%%%%%##*+#%%%+%= :.. - -%%*%%@@@%@#%@%%%%*-=+##=%%- :. :*. - =#%@%@%%@@%%#@@@%@**-#.**%%%@. .#* ..- - -%@@%#@@@@#%%%%%@#=##*-:*%%@@@%. *=. .-:. - -#@@@@%%@%@#@@%@@#*%%%%%##*%###%@: .:- .-. ::.. - ##@@@%#%@@@%@%@@###@%%#%%##%+#*##@@@= .. . +- .:.. - +#@@@@@%%@@@%@#%%%%@@#=:-%%-##*%#%*##%= :- - +% :: -... - :%%@@@@%%@@%@%%%#%%@@@%:%#-#*+-+#%%#+*%= = -=. +@* = .. - %%@@@@@@%%%@@#%*%%#*#%#=*#:%@=%+:%%%+=%= . .*#. %**: = + . - =%@@@@@@@@@%@@%#@#%%#%*+#*:+%@%:--@@%#%# .#:. .#@. = .. - .%@@@@@@@@@@%%@##@@@@%@*=###*%@%*##@@%=. = .+#. : - +@@@@@@@@@%%%*@@+%@@@%%%#+@%%%@*@%@%@% .= +=- .. - %%@@@@@@@@@@%*@%##@@@@%%%=%%%%#@%%@%%= ...:. .. - *@@@@@@@@@@@@%%#%%=%#@@@@@%+%@##%@##%: =.=.. - %@@@@@@@@@@@@@%#@%#*%@@@@%%#*%#@%@*=%* := :-. - +%@@@@@@%@@@@@@@%#%@%%%@@@%*%%##%%#**%. . -:::.: - -##@@@@@@@@@@@@@@@#%%@@%%###%##%@@@#*%- . - - *+#@@@@@@@@@%@@@%@#@@@%#%#%%%%#@##*#@+ . . - -%#%@@@@@@@@@@@@@@%%@@@@@@@@@@@#*%@%@%-+@+.+ . ... . - %@+%@@@@@@@@@@@@@@%@@@@@@@@@@#@%@%##+*##%==@%+. ... . = - -%%=#@@@@@@@@@@@@@@@@@@@@@@@%#@%**%#=%%#=#*#%%%. .. .. : - @@@+#@@@@@@@@@@@@@@@@@@@@@%%@@#:#%=#@@%*++#%### ... . - -@%%#*@@@@@@@@@@@@@@@@@@@%@@%@%-#@#%@@@@===%@@@= .... . :.. - *%%%#*@%@@@@@@@@@@@@@@@@@@@@%@*+@@+%@%%@+++#*=%- . . .. - :@@#%%*%@@@@@@@@@%@@@@@%@@@@@@@**@@*@@%@##+*%%%% .. .-. . ::. - *@%#@%=@@@@@@@@@@@@@@@@@@@@@@%%:%@@#@@@@%=+*+%%* :. . ...- :.. - %@@%%@#%@@@@@@@@@@@@@@@@@@@@@%#-@@@@@%%%%%##*-- .... .....::. . ...-: - -@%#@%@*#@@@@@@@@@@@@@@@@@@@@@%*:%@@@@@@@@%#*: ............ ... . .=. - %@%@@@%%%%@%@@@@@@@@@@@@@@@@@%###*@@@@@@@@@# . .... .:.. . . . .= - .@%%%@@%@#*@#@@@@@@@@@@@@@@@@@@*@-=%@@@@@@@#. .:=:. .. .:. - .@%%%@@@@@%#%@@@@@@@@@@@@@@@@@#***@*==#@%#: ::. ....... - -@@@@@@@@@@#%%@@@@@@@@@@@@@%%#%%%%@%#+.. .... .. ........ - *@@@@@@@@@@@##@@@@@@@@@@%@%*%@@@%%%%%*#% ..................... - :*@@@@@@@@@@@@%%@@@@@@@@@*+%@@@@@@@@#%%%+ .............:....... - .#@@@@%@@@@@@@-=:*#*+== =@%@@@@@@%%%@%@% ...-....... ... ...... . - .%@@@@@@@@@@@. -#@@@@@@@@@@%@% .... .... ......... .. - #@@@@@@@@@@- *@%@@@@@@@@# . . . ... .......... - #%@@@@@@@*: +**%%@@@@@@+ .......... ....... . - :#*#%@@@@= .%@@%@@%@@%=. ......... ........ - :+#+*#+#@# %@@@@@@@%=%= ........ .... . - :@%@*#+@%- @@@@@%%-%** :....... .. - -:==+=. .--+%-: ... - - - - - - - - - - - - - - - - - .. . - %@@# . %#@# - -@@%%- ........ -*@@@= - +@@%+.. ..=#@@% - +@@-. .*@* - .=+. .-. - ..=#%+. *@%+. . - . +@@@@# .@@@@# .. - . @@@@@# @@@@@* .. - . +@#-%@# %%-%@% .. - . %@@%@@- =*@+@@@. . - . #@@@%=. . -@@@@@... - :...+#-.. +*+ .-@@@* . - :. :@@@= -:. .. - :: :%- .-. - .*.-. + .:.. - :*%*- : +*. .. :*- - =@@%+= .:=**-+. . .. -###. - .-%% #@@@%:. +++**#::.. -%#@@+ - +@@@%.#@@@@@%. =*+***-: :.@%@@@@. +%* - :@@@@@#@@@@@@%-. =++*++. :-%@%@@@@@%-#@@%- - *@@@@@#@@@@@@@%:. .#+-+# . :#@@@@@@@@@#%@@@% - +@@@@@*@@@@@@@@# :-:+ ...#@@@@@@@@@@*@@@@@. - .@@@@%@@@@@@@@@@#== . =:@@@@@@@@@@@@#@@@@@. - +@@@@@@@@@@@@@@@%*=. .*%@@@@@@@@@@@@@@#@@@@. - #@@@@@@@@@@@@@@@@@%+--+%@@@@@@%@@%@@@@@@@@@@% - *%@@@@%+%====#%@@@@@@@@@@%%#%%%%%@@@@@@@@@@. - .:. %=:: .-#@@@@@%- ..-#*%@@@@@@#. - =::.. ... ...:-#---:. - .... ..... - ... ... - .. ... - ... .. - ... .:. - ... .. - . .. .. - #+:. .:=* - .*%#:.. ..:*@= - -@@#.-.. ..:%@%. - #@@%:... ..:-@@@: - .%@@@=:..... ....*@@@= - =@@@@%...... ...=@@@@+ - *@@@@@=:... ....:+@@@@* - %@@@@@@+-. . ....::#@@@@# - %@@@@@@@+-... . ...:=%@@@@@% - @@@@@@@@@*:.... .....:=%@@@@@@% - @@@@@@@@@@*-...............:*@@@@@@@@* - .@@@@@@@@@@@*............. :@@@@@@@@@+ - *@@@@@@@@*- . ...... .%@@@@@@@: - +@@@@@@@= .%@@@@@@: - .#@@@@@@+ :@@@@@@@* - -%@@@@@@@* -@@@@@@@@#. - :%@@@@@@@@@ .@@@%@%@@#+ - #-@#@*@@@@: .%@@=@+@%. - ..-=#*@*: .: :. - - - - - diff --git a/consensus/merge/src/main/resources/finalizedPanda.txt b/consensus/merge/src/main/resources/finalizedPanda.txt new file mode 100644 index 00000000000..f932683abbc --- /dev/null +++ b/consensus/merge/src/main/resources/finalizedPanda.txt @@ -0,0 +1,58 @@ + + .. . + %@@# . %#@# + -@@%%- ........ -*@@@= + +@@%+.. ..=#@@% + +@@-. .*@* + .=+. .-. + ..=#%+. *@%+. . + . +@@@@# .@@@@# .. + . @@@@@# @@@@@* .. + . +@#-%@# %%-%@% .. + . %@@%@@- =*@+@@@. . + . #@@@%=. . -@@@@@... + :...+#-.. +*+ .-@@@* . + :. :@@@= -:. .. + :: :%- .-. + .*.-. + .:.. + :*%*- : +*. .. :*- + =@@%+= .:=**-+. . .. -###. + .-%% #@@@%:. +++**#::.. -%#@@+ + +@@@%.#@@@@@%. =*+***-: :.@%@@@@. +%* + :@@@@@#@@@@@@%-. =++*++. :-%@%@@@@@%-#@@%- + *@@@@@#@@@@@@@%:. .#+-+# . :#@@@@@@@@@#%@@@% + +@@@@@*@@@@@@@@# :-:+ ...#@@@@@@@@@@*@@@@@. + .@@@@%@@@@@@@@@@#== . =:@@@@@@@@@@@@#@@@@@. + +@@@@@@@@@@@@@@@%*=. .*%@@@@@@@@@@@@@@#@@@@. + #@@@@@@@@@@@@@@@@@%+--+%@@@@@@%@@%@@@@@@@@@@% + *%@@@@%+%====#%@@@@@@@@@@%%#%%%%%@@@@@@@@@@. + .:. %=:: .-#@@@@@%- ..-#*%@@@@@@#. + =::.. ... ...:-#---:. + .... ..... + ... ... + .. ... + ... .. + ... .:. + ... .. + . .. .. + #+:. .:=* + .*%#:.. ..:*@= + -@@#.-.. ..:%@%. + #@@%:... ..:-@@@: + .%@@@=:..... ....*@@@= + =@@@@%...... ...=@@@@+ + *@@@@@=:... ....:+@@@@* + %@@@@@@+-. . ....::#@@@@# + %@@@@@@@+-... . ...:=%@@@@@% + @@@@@@@@@*:.... .....:=%@@@@@@% + @@@@@@@@@@*-...............:*@@@@@@@@* + .@@@@@@@@@@@*............. :@@@@@@@@@+ + *@@@@@@@@*- . ...... .%@@@@@@@: + +@@@@@@@= .%@@@@@@: + .#@@@@@@+ :@@@@@@@* + -%@@@@@@@* -@@@@@@@@#. + :%@@@@@@@@@ .@@@%@%@@#+ + #-@#@*@@@@: .%@@=@+@%. + ..-=#*@*: .: :. + + \ No newline at end of file diff --git a/consensus/merge/src/main/resources/readyPanda.txt b/consensus/merge/src/main/resources/readyPanda.txt new file mode 100644 index 00000000000..5700d5d26df --- /dev/null +++ b/consensus/merge/src/main/resources/readyPanda.txt @@ -0,0 +1,57 @@ + + + :. :. + #%% %#%= + =%*%% +%++#. =. + %%#*@#++==*##*%+*##= .:+ + -#%%@%#%%@@%%*@%##%= .- + =@@%%#%#@#@*%%@*++ + -@@@@@#*@@@%#%@%@#*. + .%@@%*%@#%%@#@#%%%@*# :: -+. + -#@%+-**#%%*@%+=*%%*%. -%#--..-%#: + :%#%*=%-#*+##%=#==%@%%= -: =. + -%+%*:**@%*####==##%%%#= .. . : + .#@#%###%%#-+*%**%#@@%@## :.. = :*#* .: + -%%%%%+%%%+-+%@%*#%%@%%*%- ..-. .. -#@#. - + *%%@@%*@**-%***@%#%%%@#*@@: . - .. %. - + %%%@@%+@%**@*=%@@#%%%%+*### ...- .. * .- . . : + :. :. .#%#@#%+%%%*%*@%@%*#%@*=%##%. : :. ..:-=*#:...+ - -*.=:=. + %#%%-+%# =-*@%%%#=*%@%%%@@@#++@%+##*%%+ .::+. .:.:=*+#+::....-. .=*= + =+##%#%..: :##:#%##@%*#%#**+*%*##%+%*=-.-% . .-:::.= ** . :: . ++.+... + #%*###%*%%**=+**%##+#**%@*#*#**+**##*+#-+*-+-*- . .:+:. ==-+:.. .%+=:*: + -%%*++##%%#%#%%%#@%#*#%+**+##%%##%*-+#+--*%%#+* . .-===--. .:-=- . #===.. + -###=+%@%%%%%%@@#@%##*=--++-+#***=--=-=**#*@### .:- . .#++==. + -+%++@@@@@@%@@@+@@%=+#*%--::-*+=:-=**#%%#%#@%@. .= .. .#+-:. + -%+*#@@@@@@@@@@+@@%=+%%@%%#+#%#+*###%%%@%%%%%%. . .- . .. ....:. + -*@@@@@@@@%@+%@%#-:#@@@@#%@%#%%%%%%@@@%@%@#% . . .* .... .. + %@@@@@@%*@**@%%#-#@@@@@@@@#%#%@%@%@%%@%@#%: .... .....-: ...... + =%@@@@@#%##@@%%==@@@@@@@@@@@%@@@%@@@@@%#%. . ...... ....*= .... + +@@@@%**%%@%%#=-%%@@@@@@@@@@@@@@@@%%#@@- . -...... .:+++=. . + =#@@%*@%%@%%##--%@@@@@@@@@@@@@@%@*%@%* .::=...:.::-+++=. . + --@@#@%%%#*=.-@@@@@@@@@@@%%@*#%@@% .. ...*..*=. . + =@@@%@@@%#*++-=%@@%@@@@@#+**%@@@* . --.. .. + -@@@%@@%%##**##+==:+-+**=+#%@%%@+ ... + -@@@@%@@#%%%%@@%#+#%%%@#+#%@@@#%= . .. + -%@@@@@@@@@%%%@+%@%@%%##%%#@@@%@- .. . ... + :%@@@%@@@@@%@@#%@%%#=-*++**+@%#@= -+=-.:=: .. + .@@@@@@@@@@@@%@@%*++*%%#%@%#*%%#- .. .= := . .... + #@@@@@@@@@@*@%*+@%@@#@%@@@%*%@. . + . .... + :#@@@@@@@%%%#=*@@%%@@@#%@@##*@:: .. ... :=... ..... + -%@@@@@@@@@%=@@%@%@%@@@@@%#+@# .. .... =.......... + ++%@@@@@@%@*%@%%@@@@@@@@%#**@+ ..: ... .==...... . + #*%@@@@%*+=%##@@@@@%@%%%###+. . :.... ..=+:..:= + *#*#@@@%=*==*##=+*#%@%##+#@+ .. ...+. -=+:--.=-.. + .*#=*%@%*%##@@#%%+#*%@*+#@+ .... . ...+.:.+:::. + *%*+##+#%%%%%%%#%%%%##%- : ... .-=+.:-=*.... + -@@%%%*-%%%%@%%@%@%*%% ....=..:*:.=.... + #@@%***+%+++*++@%%+- ..::=:**+#... + %%%%%%%=%%*+*%@%. .::**=+=:... + :%@@%%%%=##%%*= .:+=-+.... + *@@@@@@%#++ :=+::. + :*%@@@%@@+ :..... + #%@@@@%%# ....... + .#@@@@@@@#= ... .... + #%@%%@%%@@@. ..:..:.. + -###%%%%@@%- . .. . + #*#%#%@@*: + :+- diff --git a/consensus/merge/src/main/resources/ttdPanda.txt b/consensus/merge/src/main/resources/ttdPanda.txt new file mode 100644 index 00000000000..9ccdfb0ba81 --- /dev/null +++ b/consensus/merge/src/main/resources/ttdPanda.txt @@ -0,0 +1,57 @@ + + :.-- + .-*+#=---:-*:::-: .-.-== . + -%%@%%%%@%#%@*+*+#* . ...*==+# . + -%%#%%@@@@%@%@%%+=**@:: .-*.*++= + .#%%@@@@@@%@%%@@##***##+ ...=:++%.. + :%%%%@@@@%%*=-+%@###++*%= --*+*:+*... .+=. + :%%@@@@@@%%@*%#*%-@@%*##+*## ...-.*-. .. .-. .- + .:.#@@@@@@@@@@#+%*#@=@@%%%%##%= . .-: ... . .:-=++- + #=@@@@%@%#*#**%@##%-@@++#*.- ......: --: + #%#@@@@@%#*@%%%%@@@%-:: : ..:-. +... + :::@%%@@@@@@=%@*#@%*@@%%. :. ..=: + :%=#@@@@%@%%%%%##*+#%%%+%= :.. + -%%*%%@@@%@#%@%%%%*-=+##=%%- :. :*. + =#%@%@%%@@%%#@@@%@**-#.**%%%@. .#* ..- + -%@@%#@@@@#%%%%%@#=##*-:*%%@@@%. *=. .-:. + -#@@@@%%@%@#@@%@@#*%%%%%##*%###%@: .:- .-. ::.. + ##@@@%#%@@@%@%@@###@%%#%%##%+#*##@@@= .. . +- .:.. + +#@@@@@%%@@@%@#%%%%@@#=:-%%-##*%#%*##%= :- - +% :: -... + :%%@@@@%%@@%@%%%#%%@@@%:%#-#*+-+#%%#+*%= = -=. +@* = .. + %%@@@@@@%%%@@#%*%%#*#%#=*#:%@=%+:%%%+=%= . .*#. %**: = + . + =%@@@@@@@@@%@@%#@#%%#%*+#*:+%@%:--@@%#%# .#:. .#@. = .. + .%@@@@@@@@@@%%@##@@@@%@*=###*%@%*##@@%=. = .+#. : + +@@@@@@@@@%%%*@@+%@@@%%%#+@%%%@*@%@%@% .= +=- .. + %%@@@@@@@@@@%*@%##@@@@%%%=%%%%#@%%@%%= ...:. .. + *@@@@@@@@@@@@%%#%%=%#@@@@@%+%@##%@##%: =.=.. + %@@@@@@@@@@@@@%#@%#*%@@@@%%#*%#@%@*=%* := :-. + +%@@@@@@%@@@@@@@%#%@%%%@@@%*%%##%%#**%. . -:::.: + -##@@@@@@@@@@@@@@@#%%@@%%###%##%@@@#*%- . - + *+#@@@@@@@@@%@@@%@#@@@%#%#%%%%#@##*#@+ . . + -%#%@@@@@@@@@@@@@@%%@@@@@@@@@@@#*%@%@%-+@+.+ . ... . + %@+%@@@@@@@@@@@@@@%@@@@@@@@@@#@%@%##+*##%==@%+. ... . = + -%%=#@@@@@@@@@@@@@@@@@@@@@@@%#@%**%#=%%#=#*#%%%. .. .. : + @@@+#@@@@@@@@@@@@@@@@@@@@@%%@@#:#%=#@@%*++#%### ... . + -@%%#*@@@@@@@@@@@@@@@@@@@%@@%@%-#@#%@@@@===%@@@= .... . :.. + *%%%#*@%@@@@@@@@@@@@@@@@@@@@%@*+@@+%@%%@+++#*=%- . . .. + :@@#%%*%@@@@@@@@@%@@@@@%@@@@@@@**@@*@@%@##+*%%%% .. .-. . ::. + *@%#@%=@@@@@@@@@@@@@@@@@@@@@@%%:%@@#@@@@%=+*+%%* :. . ...- :.. + %@@%%@#%@@@@@@@@@@@@@@@@@@@@@%#-@@@@@%%%%%##*-- .... .....::. . ...-: + -@%#@%@*#@@@@@@@@@@@@@@@@@@@@@%*:%@@@@@@@@%#*: ............ ... . .=. + %@%@@@%%%%@%@@@@@@@@@@@@@@@@@%###*@@@@@@@@@# . .... .:.. . . . .= + .@%%%@@%@#*@#@@@@@@@@@@@@@@@@@@*@-=%@@@@@@@#. .:=:. .. .:. + .@%%%@@@@@%#%@@@@@@@@@@@@@@@@@#***@*==#@%#: ::. ....... + -@@@@@@@@@@#%%@@@@@@@@@@@@@%%#%%%%@%#+.. .... .. ........ + *@@@@@@@@@@@##@@@@@@@@@@%@%*%@@@%%%%%*#% ..................... + :*@@@@@@@@@@@@%%@@@@@@@@@*+%@@@@@@@@#%%%+ .............:....... + .#@@@@%@@@@@@@-=:*#*+== =@%@@@@@@%%%@%@% ...-....... ... ...... . + .%@@@@@@@@@@@. -#@@@@@@@@@@%@% .... .... ......... .. + #@@@@@@@@@@- *@%@@@@@@@@# . . . ... .......... + #%@@@@@@@*: +**%%@@@@@@+ .......... ....... . + :#*#%@@@@= .%@@%@@%@@%=. ......... ........ + :+#+*#+#@# %@@@@@@@%=%= ........ .... . + :@%@*#+@%- @@@@@%%-%** :....... .. + -:==+=. .--+%-: ... + + + diff --git a/consensus/merge/src/test/java/org/hyperledger/besu/consensus/merge/PandaPrinterTest.java b/consensus/merge/src/test/java/org/hyperledger/besu/consensus/merge/PandaPrinterTest.java index 1f5afbc075f..d81aa50e6e3 100644 --- a/consensus/merge/src/test/java/org/hyperledger/besu/consensus/merge/PandaPrinterTest.java +++ b/consensus/merge/src/test/java/org/hyperledger/besu/consensus/merge/PandaPrinterTest.java @@ -18,8 +18,11 @@ import static org.assertj.core.api.Assertions.assertThat; +import org.hyperledger.besu.datatypes.Hash; import org.hyperledger.besu.ethereum.core.Difficulty; +import java.util.Optional; + import org.junit.Test; public class PandaPrinterTest { @@ -33,8 +36,11 @@ public class PandaPrinterTest { @Test public void printsPanda() { PandaPrinter.resetForTesting(); - assertThat(PandaPrinter.printOnFirstCrossing()).isTrue(); - assertThat(PandaPrinter.printOnFirstCrossing()).isFalse(); + assertThat(PandaPrinter.ttdBeenDisplayed).isFalse(); + PandaPrinter.printOnFirstCrossing(); + assertThat(PandaPrinter.ttdBeenDisplayed).isTrue(); + assertThat(PandaPrinter.readyBeenDisplayed).isFalse(); + assertThat(PandaPrinter.finalizedBeenDisplayed).isFalse(); } @Test @@ -43,9 +49,11 @@ public void doesNotPrintAtInit() { var mergeContext = new PostMergeContext(Difficulty.ONE); mergeContext.observeNewIsPostMergeState(fauxTransitionHandler); - assertThat(PandaPrinter.hasDisplayed()).isFalse(); + assertThat(PandaPrinter.ttdBeenDisplayed).isFalse(); mergeContext.setIsPostMerge(Difficulty.ONE); - assertThat(PandaPrinter.hasDisplayed()).isFalse(); + assertThat(PandaPrinter.ttdBeenDisplayed).isFalse(); + assertThat(PandaPrinter.readyBeenDisplayed).isFalse(); + assertThat(PandaPrinter.finalizedBeenDisplayed).isFalse(); } @Test @@ -54,10 +62,40 @@ public void printsWhenCrossingOnly() { var mergeContext = new PostMergeContext(Difficulty.ONE); mergeContext.observeNewIsPostMergeState(fauxTransitionHandler); - assertThat(PandaPrinter.hasDisplayed()).isFalse(); + assertThat(PandaPrinter.ttdBeenDisplayed).isFalse(); mergeContext.setIsPostMerge(Difficulty.ZERO); - assertThat(PandaPrinter.hasDisplayed()).isFalse(); + assertThat(PandaPrinter.ttdBeenDisplayed).isFalse(); mergeContext.setIsPostMerge(Difficulty.ONE); - assertThat(PandaPrinter.hasDisplayed()).isTrue(); + assertThat(PandaPrinter.ttdBeenDisplayed).isTrue(); + assertThat(PandaPrinter.readyBeenDisplayed).isFalse(); + assertThat(PandaPrinter.finalizedBeenDisplayed).isFalse(); + } + + @Test + public void printsReadyOnStartupInSyncWithTTD() { + PandaPrinter.resetForTesting(); + PandaPrinter.inSync(); + PandaPrinter.hasTTD(); + assertThat(PandaPrinter.readyBeenDisplayed).isTrue(); + assertThat(PandaPrinter.ttdBeenDisplayed).isFalse(); + assertThat(PandaPrinter.finalizedBeenDisplayed).isFalse(); + } + + @Test + public void printsFinalized() { + PandaPrinter.resetForTesting(); + PandaPrinter pandaPrinter = new PandaPrinter(); + MergeContext mergeContext = new PostMergeContext(Difficulty.ZERO); + mergeContext.addNewForkchoiceMessageListener(pandaPrinter); + mergeContext.fireNewUnverifiedForkchoiceMessageEvent( + Hash.ZERO, Optional.of(Hash.ZERO), Hash.ZERO); + assertThat(PandaPrinter.readyBeenDisplayed).isFalse(); + assertThat(PandaPrinter.finalizedBeenDisplayed).isFalse(); + assertThat(PandaPrinter.ttdBeenDisplayed).isFalse(); + mergeContext.fireNewUnverifiedForkchoiceMessageEvent( + Hash.ZERO, Optional.of(Hash.fromHexStringLenient("0x1337")), Hash.ZERO); + assertThat(PandaPrinter.readyBeenDisplayed).isFalse(); + assertThat(PandaPrinter.ttdBeenDisplayed).isFalse(); + assertThat(PandaPrinter.finalizedBeenDisplayed).isTrue(); } }