public static Address selectProposerForRound(
      final ConsensusRoundIdentifier roundIdentifier,
      final Address prevBlockProposer,
      final Collection<Address> validatorsForRound,
      final boolean changeEachBlock) {
    if (!validatorsForRound.contains(prevBlockProposer)) {
      return handleMissingProposer(prevBlockProposer, validatorsForRound, roundIdentifier);
    } else {
      return handleWithExistingProposer(
          prevBlockProposer, validatorsForRound, roundIdentifier, changeEachBlock);
    }
  }
Determines which validator should be acting as the proposer for a given sequence/round.

@param roundIdentifier The round for which a proposer is required.
@param prevBlockProposer The proposer of the previous block.
@param validatorsForRound The validators for the round.
@param changeEachBlock Whether the proposer should change each block.
@return The address of the node which is to propose a block for the provided Round.
consensus/common/src/main/java/org/hyperledger/besu/consensus/common/bft/blockcreation/BftProposerSelector.java