@Override
  public void start() {
    if (started.compareAndSet(false, true)) {
      startNewHeightManager(blockchain.getChainHeadHeader());
    } else {
      // In normal circumstances the height manager should only be started once. If the caller
      // has stopped the height manager (e.g. while sync completes) they must call stop() before
      // starting the height manager again.
      throw new IllegalStateException(
          "Attempt to start new height manager without stopping previous manager");
    }
  }
Instantiates a new Qbft controller.

@param blockchain the blockchain
@param finalState the qbft final state
@param qbftBlockHeightManagerFactory the qbft block height manager factory
@param gossiper the gossiper
@param duplicateMessageTracker the duplicate message tracker
@param futureMessageBuffer the future message buffer
@param blockEncoder the block encoder
consensus/qbft-core/src/main/java/org/hyperledger/besu/consensus/qbft/core/statemachine/QbftController.java