# QBFT emptyBlockPeriodSeconds Testing Testing https://github.com/hyperledger/besu/pull/6965 ## Acceptance Criteria - 1 node network - When no txs and no emptyBlockPeriodSeconds, empty blocks produced on block period - When txs and no emptyBlockPeriodSeconds, blocks produced on block period - When no txs and emptyBlockPeriodSeconds, empty blocks produced on empty block period - When txs and emptyBlockPeriodSeconds, blocks produced on block period - Block -> EmptyBlock produces after empty block period - EmptyBlock -> Block produces after block period - blockPeriodSeconds transitions are respected - transition for emptyBlockPeriodSeconds? - 2 node network - As above - round robin - every other node and even distribution - When no txs and round timer expires, node2 proposes - When txs and round timer expires, node2 proposes - node2 can sync to node1 - < 300 blocks - \> 300 blocks (also with sync-mode=FAST?) - 4+ node network - As above ## Manual Testing (Round 1) Using this commit https://github.com/hyperledger/besu/pull/6965/commits/fc515973e0bddf92063bc924dd49f437ec2d9049 besu --version `besu/v24.5-develop-fc51597/osx-aarch_64/openjdk-java-17` ### 1 node network #### no emptyBlockPeriodSeconds ``` "qbft": { "blockperiodseconds": 5, "epochlength": 30000, "requesttimeoutseconds": 10 }, ``` - [PASS] When no txs and no emptyBlockPeriodSeconds, empty blocks produced every 5 seconds ``` 2024-05-10 15:24:29.725+10:00 | BftProcessorExecutor-QBFT-0 | INFO | QbftBesuControllerBuilder | Produced empty block #1 / 0 tx / 0 pending / 0 (0.0%) gas / (0xd3f92596d1e081725c67157235484b1d01e655ced7e26b96c6e10943e3d81322) 2024-05-10 15:24:35.019+10:00 | BftProcessorExecutor-QBFT-0 | INFO | QbftBesuControllerBuilder | Produced empty block #2 / 0 tx / 0 pending / 0 (0.0%) gas / (0x1b2938e52491c15513889f2e775fcdf2f464b49804fe64765f1582e626d0f33a) 2024-05-10 15:24:40.015+10:00 | BftProcessorExecutor-QBFT-0 | INFO | QbftBesuControllerBuilder | Produced empty block #3 / 0 tx / 0 pending / 0 (0.0%) gas / (0x5dbb5f7dadb32b251d4085563bfb263e1e685b998ed4893c69f51f7414351aaf) ``` - [PASS] When txs and no emptyBlockPeriodSeconds, blocks produced every 5 seconds ``` 2024-05-10 16:39:07.087+10:00 | BftProcessorExecutor-QBFT-0 | INFO | QbftBesuControllerBuilder | Produced block #2 / 10 tx / 0 pending / 210,000 (0.0%) gas / (0xd368992769449b7ced126885565f73d7f9af9803a1cdc9fd27376398f7d91448) 2024-05-10 16:39:12.543+10:00 | BftProcessorExecutor-QBFT-0 | INFO | QbftBesuControllerBuilder | Produced block #3 / 2000 tx / 0 pending / 106,000,000 (2.8%) gas / (0xf22bfb0dc1dccf543caf899ccf333afc99370b6b88f5bea258dc271c9303847e) 2024-05-10 16:39:17.326+10:00 | BftProcessorExecutor-QBFT-0 | INFO | QbftBesuControllerBuilder | Produced block #4 / 2000 tx / 0 pending / 106,000,000 (2.8%) gas / (0xd391145f0216b960ec8c5ca2e5f1b98fca34885174272dd5e45c6c78b88d7e6e) ``` #### emptyBlockPeriodSeconds ``` "qbft": { "blockperiodseconds": 5, "emptyblockperiodseconds": 30, "epochlength": 30000, "requesttimeoutseconds": 10 }, ``` * [PASS] When no txs and emptyBlockPeriodSeconds: 60, empty blocks produced every 30 seconds ``` 2024-05-10 16:42:09.244+10:00 | BftProcessorExecutor-QBFT-0 | INFO | QbftBesuControllerBuilder | Produced empty block #1 / 0 tx / 0 pending / 0 (0.0%) gas / (0x450fcd7332d0880c796e0e527375295d49583a35e6de5879fd2236606d8bb2cf) 2024-05-10 16:42:39.027+10:00 | BftProcessorExecutor-QBFT-0 | INFO | QbftBesuControllerBuilder | Produced empty block #2 / 0 tx / 0 pending / 0 (0.0%) gas / (0x0a96c263fdf792f41dc35fa70f6b1790f50b17e086a8f320cb1144f2d4fc0066) 2024-05-10 16:43:09.023+10:00 | BftProcessorExecutor-QBFT-0 | INFO | QbftBesuControllerBuilder | Produced empty block #3 / 0 tx / 0 pending / 0 (0.0%) gas / (0xa9cee75842d9e7f7800aada342ebd98b0d6c1ceda213f1d7378348ca5c66fd94) ``` * [PASS] When txs and emptyBlockPeriodSeconds: 60, empty blocks produced every 5 seconds ``` 2024-05-10 16:45:13.045+10:00 | BftProcessorExecutor-QBFT-0 | INFO | QbftBesuControllerBuilder | Produced block #2 / 10 tx / 0 pending / 210,000 (0.0%) gas / (0xc7d44669f176e4a71268590b50b4b95373d0aa94e4874fb4583ef04e9ed68674) 2024-05-10 16:45:18.477+10:00 | BftProcessorExecutor-QBFT-0 | INFO | QbftBesuControllerBuilder | Produced block #3 / 2000 tx / 1801 pending / 106,017,600 (2.8%) gas / (0x735c191171259c9d9df3eb633d6e70c53828a24948a24290d52aa5be031bd40d) 2024-05-10 16:45:23.350+10:00 | BftProcessorExecutor-QBFT-0 | INFO | QbftBesuControllerBuilder | Produced block #4 / 2000 tx / 0 pending / 106,000,000 (2.8%) gas / (0xdb328c5574a56df849d2edb655cd908e33154a3156970d23f832cb4eaa8009f7) ``` * [PASS] Block -> EmptyBlock produces block after 30 seconds ``` 2024-05-10 16:48:55.266+10:00 | BftProcessorExecutor-QBFT-0 | INFO | QbftBesuControllerBuilder | Produced block #10 / 1694 tx / 0 pending / 89,782,000 (2.4%) gas / (0xb30ed593fbf472bf4f4bfe3b75aaeb388cf574f7eb3be0bb5df4d36b50c940e4) 2024-05-10 16:49:25.010+10:00 | BftProcessorExecutor-QBFT-0 | INFO | QbftBesuControllerBuilder | Produced empty block #11 / 0 tx / 0 pending / 0 (0.0%) gas / (0x73ed8769749d9c93edf753ef4ff9fada6a23d538cf1625096ce5fcf69e6b45ff) ``` * [PASS] EmptyBlock -> tx @ < 5 seconds, produces block after 5 seconds ``` 2024-05-10 17:34:23.027+10:00 | BftProcessorExecutor-QBFT-0 | INFO | QbftBesuControllerBuilder | Produced empty block #2 / 0 tx / 0 pending / 0 (0.0%) gas / (0x21c30c642499e2da23d35c0ae9ac2c3b15bde11256b879ddced54b1d2689629d) 2024-05-10 17:34:28.043+10:00 | BftProcessorExecutor-QBFT-0 | INFO | QbftBesuControllerBuilder | Produced block #3 / 10 tx / 0 pending / 210,000 (0.0%) gas / (0x1a35625f62f8ec874058e53dbfaca833cd045419d12f43ab7829b96390c7297d) ``` * [???] EmptyBlock -> tx @ 6 seconds, produces block after 30 seconds (24 seconds after tx sent) ``` 2024-05-10 17:34:58.035+10:00 | BftProcessorExecutor-QBFT-0 | INFO | QbftBesuControllerBuilder | Produced empty block #4 / 0 tx / 0 pending / 0 (0.0%) gas / (0xb4c288ffa5f6fe14bb179f6348872413c961a13ae444c133b9cbbad7a890b317) 2024-05-10 17:35:28.039+10:00 | BftProcessorExecutor-QBFT-0 | INFO | QbftBesuControllerBuilder | Produced block #5 / 10 tx / 0 pending / 210,000 (0.0%) gas / (0x0ccc3c570208fcf40203695de6721047cb54638583d70a071b76019eb5c694b0) ``` * [PASS] EmptyBlock -> tx @ 29 seconds, produces block after 30 seconds (1 second after tx sent) ``` 2024-05-10 17:35:58.022+10:00 | BftProcessorExecutor-QBFT-0 | INFO | QbftBesuControllerBuilder | Produced empty block #6 / 0 tx / 0 pending / 0 (0.0%) gas / (0x20c1c554e09e6304d48a8fb022d131763f8aeb0ad97c51716c4e7cc92a1f7087) 2024-05-10 17:36:28.021+10:00 | BftProcessorExecutor-QBFT-0 | INFO | QbftBesuControllerBuilder | Produced block #7 / 10 tx / 0 pending / 210,000 (0.0%) gas / (0x26fe1fd76fc2ec9e4dd3ee2dd362daf38f09a54b51bf160639cebb3aa501c8b1) ``` ## Manual Testing (Round 2) Using this commit https://github.com/hyperledger/besu/pull/6965/commits/3a6d41d7105d2f213ed1e2ae035abb369f8fffee besu --version `besu/v24.7-develop-3a6d41d/osx-aarch_64/openjdk-java-21` ### 1 node network #### no emptyBlockPeriodSeconds ``` "qbft": { "blockperiodseconds": 5, "epochlength": 30000, "requesttimeoutseconds": 10 }, ``` - [PASS] When no txs and no emptyBlockPeriodSeconds, empty blocks produced every 5 seconds - [PASS] When txs and no emptyBlockPeriodSeconds, blocks produced every 5 seconds #### emptyBlockPeriodSeconds ``` "qbft": { "blockperiodseconds": 5, "emptyblockperiodseconds": 30, "epochlength": 30000, "requesttimeoutseconds": 10 }, ``` * [PASS] When no txs and emptyBlockPeriodSeconds: 30, empty blocks produced every 30 seconds * [PASS] When txs and emptyBlockPeriodSeconds: 30, empty blocks produced every 5 seconds * [PASS] Block -> EmptyBlock produces block after 30 seconds * [PASS] EmptyBlock -> tx @ < 5 seconds, produces block after 5 seconds * [PASS] EmptyBlock -> tx @ 6 seconds, produces block after 10 seconds (4 seconds after tx sent) * [PASS] EmptyBlock -> tx @ 29 seconds, produces block after 30 seconds (1 second after tx sent) #### blockPeriodSeconds transition ``` "qbft": { "blockperiodseconds": 5, "emptyblockperiodseconds": 10, "epochlength": 30000, "requesttimeoutseconds": 10 }, "transitions": { "qbft": [ { "block": 4, "blockperiodseconds": 1 } ] } ``` * [PASS] When txs and transition -> blockperiodseconds: 1 @ block 4, blocks produced every 1 second ``` 2024-07-11 10:41:47.052+10:00 | BftProcessorExecutor-QBFT-0 | INFO | QbftBesuControllerBuilder | Produced block #2 / 10 tx / 0 pending / 210,000 (0.0%) gas / (0x71126edfc976e7022226746ee01c9e4d3dae8d948e9185a7d61bd3a70d381788) 2024-07-11 10:41:52.476+10:00 | BftProcessorExecutor-QBFT-0 | INFO | QbftBesuControllerBuilder | Produced block #3 / 2000 tx / 1801 pending / 106,000,000 (2.8%) gas / (0x6da9e8703116e737b939674d6d3b4f36016349fd0ddc7d50eb0437683362b90d) 2024-07-11 10:41:53.069+10:00 | BftProcessorExecutor-QBFT-0 | INFO | QbftBesuControllerBuilder | Produced block #4 / 300 tx / 42 pending / 15,900,000 (0.4%) gas / (0x51da263b796621e7c2075ebd6035e24ce3a1ca825da4095f47335f0893d7f185) 2024-07-11 10:41:54.111+10:00 | BftProcessorExecutor-QBFT-0 | INFO | QbftBesuControllerBuilder | Produced block #5 / 605 tx / 62 pending / 32,065,000 (0.9%) gas / (0x0d80bcaf1dafa81fd7f21457609d9faeb2bcc0f7d985d1e9f889af052049aca9) ``` * [PASS] When no txs and transition -> blockperiodseconds: 1 @ block 4, empty block produced after 10 seconds ``` 2024-07-11 10:46:48.025+10:00 | BftProcessorExecutor-QBFT-0 | INFO | QbftBesuControllerBuilder | Produced empty block #3 / 0 tx / 0 pending / 0 (0.0%) gas / (0x70728876e982e3520a7fd186165a32406ec6abb97ebe6f332964e3da993f6eb8) 2024-07-11 10:46:58.036+10:00 | BftProcessorExecutor-QBFT-0 | INFO | QbftBesuControllerBuilder | Produced empty block #4 / 0 tx / 0 pending / 0 (0.0%) gas / (0x6774abc52bbcb080002978811fc7e8853faa27c24a08977d5aba61804c220b20) ``` #### emptyBlockPeriodSeconds transition ``` "qbft": { "blockperiodseconds": 5, "emptyblockperiodseconds": 10, "epochlength": 30000, "requesttimeoutseconds": 10 }, "transitions": { "qbft": [ { "block": 4, "blockperiodseconds": 1, "emptyblockperiodseconds": 3 } ] } ``` * [PASS] When no txs and transition -> emptyblockperiodseconds: 3 @ block 4, empty block produced after 3 seconds ``` 2024-07-11 10:54:35.025+10:00 | BftProcessorExecutor-QBFT-0 | INFO | QbftBesuControllerBuilder | Produced empty block #2 / 0 tx / 0 pending / 0 (0.0%) gas / (0x7a5c56468903c827972433c078b72f5a50ccf5c807542bbac10e1d01865e5cef) 2024-07-11 10:54:45.025+10:00 | BftProcessorExecutor-QBFT-0 | INFO | QbftBesuControllerBuilder | Produced empty block #3 / 0 tx / 0 pending / 0 (0.0%) gas / (0xe766dd8061c6a417edf886e342f4ab3cb10d8bf63a7fbb13e307eb856ff19bd8) 2024-07-11 10:54:48.040+10:00 | BftProcessorExecutor-QBFT-0 | INFO | QbftBesuControllerBuilder | Produced empty block #4 / 0 tx / 0 pending / 0 (0.0%) gas / (0xdc0b81eaa7268dbbf8c7b55aba32a65851d570612d07679ca5d59260af3fc592) 2024-07-11 10:54:51.036+10:00 | BftProcessorExecutor-QBFT-0 | INFO | QbftBesuControllerBuilder | Produced empty block #5 / 0 tx / 0 pending / 0 (0.0%) gas / (0xd6076e56e4f0f2ecd5349c72c4d2661bd9bafb2a0c26e0596976c330b6fa77df) ``` * [???] When emptyBlockPeriodSeconds < blockPeriodSeconds, empty blocks are produced every block period? ``` "qbft": { "blockperiodseconds": 10, "emptyblockperiodseconds": 1, "epochlength": 30000, "requesttimeoutseconds": 10 } ``` ``` 2024-07-11 11:04:48.567+10:00 | BftProcessorExecutor-QBFT-0 | INFO | QbftBesuControllerBuilder | Produced empty block #1 / 0 tx / 0 pending / 0 (0.0%) gas / (0x1af3c809a6794a3a23f6c204a20393ec956b32aa3faf9d4ca046402c04078055) 2024-07-11 11:04:59.040+10:00 | BftProcessorExecutor-QBFT-0 | INFO | QbftBesuControllerBuilder | Produced empty block #2 / 0 tx / 0 pending / 0 (0.0%) gas / (0x3d7021cc4c505a0d2e60cd6a21abf66efb706ed5ea341f561e319aca6ddd3a4b) 2024-07-11 11:05:09.029+10:00 | BftProcessorExecutor-QBFT-0 | INFO | QbftBesuControllerBuilder | Produced empty block #3 / 0 tx / 0 pending / 0 (0.0%) gas / (0x7bdd5aa6a5582ef2c4c8f1740e87853e12789bf70820b6d02091015280717898) ``` ### 2-node network * [PASS] Same tests as 1-node network - spot checked various tests * [PASS] round robin - every other node and even distribution, tested using qbft_getSignerMetrics ### 3 node network * [PASS] Same tests as 2-node network - spot checked various tests * [PASS] node2 can sync to node1 - [PASS] < 300 blocks with sync-mode=FULL - [PASS] < 300 blocks with sync-mode=FAST - [PASS] \> 300 blocks with sync-mode=FULL - [PASS] \> 300 blocks with sync-mode=FAST * [???] When no txs and round timer expires, node2 proposes - missing `QbftBlockHeightManager | Round change from 0x...` log messages ``` 2024-07-11 17:19:19.040+10:00 | BftProcessorExecutor-QBFT-0 | INFO | QbftBesuControllerBuilder | Imported empty block #8 / 0 tx / 0 pending / 0 (0.0%) gas / (0x58c6e7646a806c4a631b33d7168975a60821f2f0c2c98971a9274c9ea40fd08a) 2024-07-11 17:19:19.040+10:00 | BftProcessorExecutor-QBFT-0 | DEBUG | QbftBlockHeightManagerFactory | Local node is a validator 2024-07-11 17:19:22.014+10:00 | BftProcessorExecutor-QBFT-0 | DEBUG | QbftBlockHeightManager | Starting new round 0 2024-07-11 17:19:22.015+10:00 | BftProcessorExecutor-QBFT-0 | DEBUG | QbftRound | Creating proposed block. round=ConsensusRoundIdentifier{Sequence=9, Round=0} 2024-07-11 17:19:22.015+10:00 | BftProcessorExecutor-QBFT-0 | DEBUG | QbftBlockHeightManager | Block has no transactions but emptyBlockPeriodSeconds did not expired yet: ConsensusRoundIdentifier{Sequence=9, Round=0} 2024-07-11 17:19:24.009+10:00 | BftProcessorExecutor-QBFT-0 | DEBUG | QbftBlockHeightManager | Starting new round 0 2024-07-11 17:19:24.023+10:00 | BftProcessorExecutor-QBFT-0 | DEBUG | QbftRound | Creating proposed block. round=ConsensusRoundIdentifier{Sequence=9, Round=0} 2024-07-11 17:19:24.024+10:00 | BftProcessorExecutor-QBFT-0 | DEBUG | QbftBlockHeightManager | Block has no transactions but this node is not a proposer so it will not send a proposal: ConsensusRoundIdentifier{Sequence=9, Round=0} 2024-07-11 17:19:26.032+10:00 | BftProcessorExecutor-QBFT-0 | DEBUG | QbftBlockHeightManager | Round has expired, creating PreparedCertificate and notifying peers. round=ConsensusRoundIdentifier{Sequence=9, Round=0} 2024-07-11 17:19:26.032+10:00 | BftProcessorExecutor-QBFT-0 | DEBUG | QbftBlockHeightManager | Starting new round 1 2024-07-11 17:19:26.036+10:00 | BftProcessorExecutor-QBFT-0 | DEBUG | QbftBlockHeightManager | Received sufficient RoundChange messages to change round to targetRound=ConsensusRoundIdentifier{Sequence=9, Round=1} 2024-07-11 17:19:26.037+10:00 | BftProcessorExecutor-QBFT-0 | DEBUG | QbftRound | Sending proposal with new block. round=ConsensusRoundIdentifier{Sequence=9, Round=1} 2024-07-11 17:19:26.037+10:00 | BftProcessorExecutor-QBFT-0 | DEBUG | QbftRound | Creating proposed block. round=ConsensusRoundIdentifier{Sequence=9, Round=1} 2024-07-11 17:19:26.043+10:00 | BftProcessorExecutor-QBFT-0 | DEBUG | QbftRound | Sending prepare message. round=ConsensusRoundIdentifier{Sequence=9, Round=1} 2024-07-11 17:19:26.047+10:00 | BftProcessorExecutor-QBFT-0 | DEBUG | QbftRound | Received a prepare message. round=ConsensusRoundIdentifier{Sequence=9, Round=1}. author=0xc034a089fed7d660b0762de6a81da3e40ada7039 2024-07-11 17:19:26.047+10:00 | BftProcessorExecutor-QBFT-0 | DEBUG | QbftRound | Sending commit message. round=ConsensusRoundIdentifier{Sequence=9, Round=1} 2024-07-11 17:19:26.049+10:00 | BftProcessorExecutor-QBFT-0 | DEBUG | QbftRound | Received a commit message. round=ConsensusRoundIdentifier{Sequence=9, Round=1}. author=0xc034a089fed7d660b0762de6a81da3e40ada7039 2024-07-11 17:19:26.050+10:00 | BftProcessorExecutor-QBFT-0 | INFO | QbftRound | Importing proposed block to chain. round=ConsensusRoundIdentifier{Sequence=9, Round=1}, hash=0xb5db91c48ec136e6273dacf7b67b3aee8697d20021c414f423c814bb2b76f4a9 2024-07-11 17:19:26.053+10:00 | BftProcessorExecutor-QBFT-0 | INFO | QbftBesuControllerBuilder | Produced empty block #9 / 0 tx / 0 pending / 0 (0.0%) gas / (0xb5db91c48ec136e6273dacf7b67b3aee8697d20021c414f423c814bb2b76f4a9) ``` compared to `main` branch: ``` 2024-07-11 17:27:03.039+10:00 | BftProcessorExecutor-QBFT-0 | INFO | QbftBesuControllerBuilder | Imported #8 / 0 tx / 0 pending / 0 (0.0%) gas / (0x46cddd841acc407e29d45d637b8fe0a21af57e16e06e2a8df487816dd45678a3) 2024-07-11 17:27:03.039+10:00 | BftProcessorExecutor-QBFT-0 | DEBUG | QbftBlockHeightManagerFactory | Local node is a validator 2024-07-11 17:27:06.004+10:00 | BftProcessorExecutor-QBFT-0 | DEBUG | QbftBlockHeightManager | Starting new round 0 2024-07-11 17:27:08.011+10:00 | BftProcessorExecutor-QBFT-0 | DEBUG | QbftBlockHeightManager | Round has expired, creating PreparedCertificate and notifying peers. round=ConsensusRoundIdentifier{Sequence=9, Round=0} 2024-07-11 17:27:08.011+10:00 | BftProcessorExecutor-QBFT-0 | DEBUG | QbftBlockHeightManager | Starting new round 1 2024-07-11 17:27:08.013+10:00 | BftProcessorExecutor-QBFT-0 | DEBUG | QbftBlockHeightManager | Round change from 0x96a0495677e7227db792ffee7978557300c017ef: block 9, round 1 2024-07-11 17:27:08.020+10:00 | BftProcessorExecutor-QBFT-0 | DEBUG | QbftBlockHeightManager | Round change from 0xc034a089fed7d660b0762de6a81da3e40ada7039: block 9, round 1 2024-07-11 17:27:08.022+10:00 | BftProcessorExecutor-QBFT-0 | DEBUG | QbftBlockHeightManager | Received sufficient RoundChange messages to change round to targetRound=ConsensusRoundIdentifier{Sequence=9, Round=1} 2024-07-11 17:27:08.023+10:00 | BftProcessorExecutor-QBFT-0 | DEBUG | QbftRound | Sending proposal with new block. round=ConsensusRoundIdentifier{Sequence=9, Round=1} 2024-07-11 17:27:08.030+10:00 | BftProcessorExecutor-QBFT-0 | DEBUG | QbftRound | Sending prepare message. round=ConsensusRoundIdentifier{Sequence=9, Round=1} 2024-07-11 17:27:08.039+10:00 | BftProcessorExecutor-QBFT-0 | DEBUG | QbftRound | Received a prepare message. round=ConsensusRoundIdentifier{Sequence=9, Round=1}. author=0xc034a089fed7d660b0762de6a81da3e40ada7039 2024-07-11 17:27:08.040+10:00 | BftProcessorExecutor-QBFT-0 | DEBUG | QbftRound | Sending commit message. round=ConsensusRoundIdentifier{Sequence=9, Round=1} 2024-07-11 17:27:08.042+10:00 | BftProcessorExecutor-QBFT-0 | DEBUG | QbftRound | Received a commit message. round=ConsensusRoundIdentifier{Sequence=9, Round=1}. author=0xc034a089fed7d660b0762de6a81da3e40ada7039 2024-07-11 17:27:08.042+10:00 | BftProcessorExecutor-QBFT-0 | INFO | QbftRound | Importing proposed block to chain. round=ConsensusRoundIdentifier{Sequence=9, Round=1}, hash=0x786dc2d256c3f5ac762449b4a6e6b9674de684b7b6433702706bc2ae93a1be5e 2024-07-11 17:27:08.044+10:00 | BftProcessorExecutor-QBFT-0 | INFO | QbftBesuControllerBuilder | Produced #9 / 0 tx / 0 pending / 0 (0.0%) gas / (0x786dc2d256c3f5ac762449b4a6e6b9674de684b7b6433702706bc2ae93a1be5e) ``` * [???] When txs and round timer expires, node2 proposes - same issue as above