Try   HackMD

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