public void startRoundWith(
      final RoundChangeArtifacts roundChangeArtifacts, final long headerTimestamp) {
    final Optional<PreparedCertificate> bestPreparedCertificate =
        roundChangeArtifacts.getBestPreparedPeer();

    final QbftBlock blockToPublish;
    if (bestPreparedCertificate.isEmpty()) {
      LOG.debug("Sending proposal with new block. round={}", roundState.getRoundIdentifier());
      blockToPublish = blockCreator.createBlock(headerTimestamp, this.parentHeader);
    } else {
      LOG.debug(
          "Sending proposal from PreparedCertificate. round={}", roundState.getRoundIdentifier());
      QbftBlock preparedBlock = bestPreparedCertificate.get().getBlock();
      blockToPublish =
          blockInterface.replaceRoundInBlock(
              preparedBlock, roundState.getRoundIdentifier().getRoundNumber());
    }

    LOG.debug(" proposal - new/prepared block hash : {}", blockToPublish.getHash());

    updateStateWithProposalAndTransmit(
        blockToPublish,
        roundChangeArtifacts.getRoundChanges(),
        bestPreparedCertificate.map(PreparedCertificate::getPrepares).orElse(emptyList()));
  }
Start round with.

@param roundChangeArtifacts the round change artifacts
@param headerTimestamp the header timestamp
consensus/qbft-core/src/main/java/org/hyperledger/besu/consensus/qbft/core/statemachine/QbftRound.java