Rework Ibft's MessageValidatorFactory (#785)

With a prior change swapping header validation for block
validation in the IBFT messages, the necessity to pass in the block
header was removed - though the code remained.

This change simplifies the MessageValidatorFactory interface to only
take the chain height (rather than the full parent header).
Signed-off-by: Adrian Sutton <adrian.sutton@consensys.net>
pull/2/head
Trent Mohay 6 years ago committed by GitHub
parent c04101e59a
commit e6729b23a0
  1. 4
      consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/statemachine/IbftBlockHeightManager.java
  2. 3
      consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/statemachine/IbftBlockHeightManagerFactory.java
  3. 11
      consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/validation/MessageValidatorFactory.java
  4. 2
      consensus/ibft/src/test/java/tech/pegasys/pantheon/consensus/ibft/statemachine/IbftBlockHeightManagerTest.java

@ -90,7 +90,7 @@ public class IbftBlockHeightManager implements BlockHeightManager {
this.roundChangeManager = roundChangeManager; this.roundChangeManager = roundChangeManager;
this.finalState = finalState; this.finalState = finalState;
newRoundMessageValidator = messageValidatorFactory.createNewRoundValidator(parentHeader); newRoundMessageValidator = messageValidatorFactory.createNewRoundValidator(getChainHeight());
roundStateCreator = roundStateCreator =
(roundIdentifier) -> (roundIdentifier) ->
@ -255,7 +255,7 @@ public class IbftBlockHeightManager implements BlockHeightManager {
@Override @Override
public long getChainHeight() { public long getChainHeight() {
return currentRound.getRoundIdentifier().getSequenceNumber(); return parentHeader.getNumber() + 1;
} }
@Override @Override

@ -49,7 +49,8 @@ public class IbftBlockHeightManagerFactory {
finalState, finalState,
new RoundChangeManager( new RoundChangeManager(
IbftHelpers.calculateRequiredValidatorQuorum(finalState.getValidators().size()), IbftHelpers.calculateRequiredValidatorQuorum(finalState.getValidators().size()),
messageValidatorFactory.createRoundChangeMessageValidator(parentHeader)), messageValidatorFactory.createRoundChangeMessageValidator(
parentHeader.getNumber() + 1L)),
roundFactory, roundFactory,
finalState.getClock(), finalState.getClock(),
messageValidatorFactory); messageValidatorFactory);

@ -21,7 +21,6 @@ import tech.pegasys.pantheon.consensus.ibft.blockcreation.ProposerSelector;
import tech.pegasys.pantheon.ethereum.BlockValidator; import tech.pegasys.pantheon.ethereum.BlockValidator;
import tech.pegasys.pantheon.ethereum.ProtocolContext; import tech.pegasys.pantheon.ethereum.ProtocolContext;
import tech.pegasys.pantheon.ethereum.core.Address; import tech.pegasys.pantheon.ethereum.core.Address;
import tech.pegasys.pantheon.ethereum.core.BlockHeader;
import tech.pegasys.pantheon.ethereum.mainnet.ProtocolSchedule; import tech.pegasys.pantheon.ethereum.mainnet.ProtocolSchedule;
import java.util.Collection; import java.util.Collection;
@ -58,20 +57,20 @@ public class MessageValidatorFactory {
return new MessageValidator(createSignedDataValidator(roundIdentifier)); return new MessageValidator(createSignedDataValidator(roundIdentifier));
} }
public RoundChangeMessageValidator createRoundChangeMessageValidator( public RoundChangeMessageValidator createRoundChangeMessageValidator(final long chainHeight) {
final BlockHeader parentHeader) {
final Collection<Address> validators = final Collection<Address> validators =
protocolContext.getConsensusState().getVoteTally().getValidators(); protocolContext.getConsensusState().getVoteTally().getValidators();
return new RoundChangeMessageValidator( return new RoundChangeMessageValidator(
new RoundChangePayloadValidator( new RoundChangePayloadValidator(
this::createSignedDataValidator, this::createSignedDataValidator,
validators, validators,
prepareMessageCountForQuorum( prepareMessageCountForQuorum(
IbftHelpers.calculateRequiredValidatorQuorum(validators.size())), IbftHelpers.calculateRequiredValidatorQuorum(validators.size())),
parentHeader.getNumber() + 1)); chainHeight));
} }
public NewRoundMessageValidator createNewRoundValidator(final BlockHeader parentHeader) { public NewRoundMessageValidator createNewRoundValidator(final long chainHeight) {
final Collection<Address> validators = final Collection<Address> validators =
protocolContext.getConsensusState().getVoteTally().getValidators(); protocolContext.getConsensusState().getVoteTally().getValidators();
return new NewRoundMessageValidator( return new NewRoundMessageValidator(
@ -80,6 +79,6 @@ public class MessageValidatorFactory {
proposerSelector, proposerSelector,
this::createSignedDataValidator, this::createSignedDataValidator,
IbftHelpers.calculateRequiredValidatorQuorum(validators.size()), IbftHelpers.calculateRequiredValidatorQuorum(validators.size()),
parentHeader.getNumber() + 1)); chainHeight));
} }
} }

@ -135,7 +135,7 @@ public class IbftBlockHeightManagerTest {
when(finalState.getMessageFactory()).thenReturn(messageFactory); when(finalState.getMessageFactory()).thenReturn(messageFactory);
when(blockCreator.createBlock(anyLong())).thenReturn(createdBlock); when(blockCreator.createBlock(anyLong())).thenReturn(createdBlock);
when(newRoundPayloadValidator.validateNewRoundMessage(any())).thenReturn(true); when(newRoundPayloadValidator.validateNewRoundMessage(any())).thenReturn(true);
when(messageValidatorFactory.createNewRoundValidator(any())) when(messageValidatorFactory.createNewRoundValidator(anyLong()))
.thenReturn(newRoundPayloadValidator); .thenReturn(newRoundPayloadValidator);
when(messageValidatorFactory.createMessageValidator(any())).thenReturn(messageValidator); when(messageValidatorFactory.createMessageValidator(any())).thenReturn(messageValidator);

Loading…
Cancel
Save