diff --git a/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/IbftMessages.java b/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/IbftMessages.java index d729077a57..3eebbb8635 100644 --- a/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/IbftMessages.java +++ b/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/IbftMessages.java @@ -12,36 +12,36 @@ */ package tech.pegasys.pantheon.consensus.ibft; -import tech.pegasys.pantheon.consensus.ibft.ibftmessage.IbftCommitMessage; -import tech.pegasys.pantheon.consensus.ibft.ibftmessage.IbftNewRoundMessage; -import tech.pegasys.pantheon.consensus.ibft.ibftmessage.IbftPrePrepareMessage; -import tech.pegasys.pantheon.consensus.ibft.ibftmessage.IbftPrepareMessage; -import tech.pegasys.pantheon.consensus.ibft.ibftmessage.IbftRoundChangeMessage; +import tech.pegasys.pantheon.consensus.ibft.ibftmessage.CommitMessage; import tech.pegasys.pantheon.consensus.ibft.ibftmessage.IbftV2; -import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.IbftSignedMessageData; +import tech.pegasys.pantheon.consensus.ibft.ibftmessage.NewRoundMessage; +import tech.pegasys.pantheon.consensus.ibft.ibftmessage.PrepareMessage; +import tech.pegasys.pantheon.consensus.ibft.ibftmessage.ProposalMessage; +import tech.pegasys.pantheon.consensus.ibft.ibftmessage.RoundChangeMessage; +import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.SignedData; import tech.pegasys.pantheon.ethereum.p2p.api.Message; import tech.pegasys.pantheon.ethereum.p2p.api.MessageData; public class IbftMessages { - public static IbftSignedMessageData fromMessage(final Message message) { + public static SignedData fromMessage(final Message message) { final MessageData messageData = message.getData(); switch (messageData.getCode()) { - case IbftV2.PRE_PREPARE: - return IbftPrePrepareMessage.fromMessage(messageData).decode(); + case IbftV2.PROPOSAL: + return ProposalMessage.fromMessage(messageData).decode(); case IbftV2.PREPARE: - return IbftPrepareMessage.fromMessage(messageData).decode(); + return PrepareMessage.fromMessage(messageData).decode(); case IbftV2.COMMIT: - return IbftCommitMessage.fromMessage(messageData).decode(); + return CommitMessage.fromMessage(messageData).decode(); case IbftV2.ROUND_CHANGE: - return IbftRoundChangeMessage.fromMessage(messageData).decode(); + return RoundChangeMessage.fromMessage(messageData).decode(); case IbftV2.NEW_ROUND: - return IbftNewRoundMessage.fromMessage(messageData).decode(); + return NewRoundMessage.fromMessage(messageData).decode(); default: throw new IllegalArgumentException( diff --git a/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/blockcreation/ProposerSelector.java b/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/blockcreation/ProposerSelector.java index 43426ccb74..98b96dc483 100644 --- a/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/blockcreation/ProposerSelector.java +++ b/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/blockcreation/ProposerSelector.java @@ -33,7 +33,7 @@ import org.apache.logging.log4j.Logger; /** * Responsible for determining which member of the validator pool should propose the next block - * (i.e. send the Preprepare message). + * (i.e. send the Proposal message). * *

It does this by extracting the previous block's proposer from the ProposerSeal (stored in the * Blocks ExtraData) then iterating through the validator list (stored in {@link diff --git a/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessage/AbstractIbftMessage.java b/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessage/AbstractIbftMessage.java index 0943aefa57..212dc85bcc 100644 --- a/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessage/AbstractIbftMessage.java +++ b/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessage/AbstractIbftMessage.java @@ -12,7 +12,7 @@ */ package tech.pegasys.pantheon.consensus.ibft.ibftmessage; -import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.IbftSignedMessageData; +import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.SignedData; import tech.pegasys.pantheon.ethereum.p2p.api.MessageData; import tech.pegasys.pantheon.ethereum.p2p.wire.AbstractMessageData; import tech.pegasys.pantheon.util.bytes.BytesValue; @@ -24,7 +24,7 @@ public abstract class AbstractIbftMessage extends AbstractMessageData { super(data); } - public abstract IbftSignedMessageData decode(); + public abstract SignedData decode(); protected static T fromMessage( final MessageData message, diff --git a/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessage/IbftCommitMessage.java b/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessage/CommitMessage.java similarity index 54% rename from consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessage/IbftCommitMessage.java rename to consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessage/CommitMessage.java index 91449d6406..18aa65601e 100644 --- a/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessage/IbftCommitMessage.java +++ b/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessage/CommitMessage.java @@ -12,33 +12,32 @@ */ package tech.pegasys.pantheon.consensus.ibft.ibftmessage; -import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.IbftSignedMessageData; -import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.IbftUnsignedCommitMessageData; +import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.CommitPayload; +import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.SignedData; import tech.pegasys.pantheon.ethereum.p2p.api.MessageData; import tech.pegasys.pantheon.ethereum.rlp.RLP; import tech.pegasys.pantheon.util.bytes.BytesValue; -public class IbftCommitMessage extends AbstractIbftMessage { +public class CommitMessage extends AbstractIbftMessage { private static final int MESSAGE_CODE = IbftV2.COMMIT; - private IbftCommitMessage(final BytesValue data) { + private CommitMessage(final BytesValue data) { super(data); } - public static IbftCommitMessage fromMessage(final MessageData message) { - return fromMessage(message, MESSAGE_CODE, IbftCommitMessage.class, IbftCommitMessage::new); + public static CommitMessage fromMessage(final MessageData message) { + return fromMessage(message, MESSAGE_CODE, CommitMessage.class, CommitMessage::new); } @Override - public IbftSignedMessageData decode() { - return IbftSignedMessageData.readIbftSignedCommitMessageDataFrom(RLP.input(data)); + public SignedData decode() { + return SignedData.readSignedCommitPayloadFrom(RLP.input(data)); } - public static IbftCommitMessage create( - final IbftSignedMessageData ibftPrepareMessageDecoded) { + public static CommitMessage create(final SignedData signedPayload) { - return new IbftCommitMessage(ibftPrepareMessageDecoded.encode()); + return new CommitMessage(signedPayload.encode()); } @Override diff --git a/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessage/IbftPrePrepareMessage.java b/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessage/IbftPrePrepareMessage.java deleted file mode 100644 index 6d9328dbe9..0000000000 --- a/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessage/IbftPrePrepareMessage.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2018 ConsenSys AG. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package tech.pegasys.pantheon.consensus.ibft.ibftmessage; - -import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.IbftSignedMessageData; -import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.IbftUnsignedPrePrepareMessageData; -import tech.pegasys.pantheon.ethereum.p2p.api.MessageData; -import tech.pegasys.pantheon.ethereum.rlp.RLP; -import tech.pegasys.pantheon.util.bytes.BytesValue; - -public class IbftPrePrepareMessage extends AbstractIbftMessage { - - private static final int MESSAGE_CODE = IbftV2.PRE_PREPARE; - - private IbftPrePrepareMessage(final BytesValue data) { - super(data); - } - - public static IbftPrePrepareMessage fromMessage(final MessageData message) { - return fromMessage( - message, MESSAGE_CODE, IbftPrePrepareMessage.class, IbftPrePrepareMessage::new); - } - - @Override - public IbftSignedMessageData decode() { - return IbftSignedMessageData.readIbftSignedPrePrepareMessageDataFrom(RLP.input(data)); - } - - public static IbftPrePrepareMessage create( - final IbftSignedMessageData ibftPrepareMessageDecoded) { - - return new IbftPrePrepareMessage(ibftPrepareMessageDecoded.encode()); - } - - @Override - public int getCode() { - return MESSAGE_CODE; - } -} diff --git a/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessage/IbftV2.java b/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessage/IbftV2.java index 5ed334e2d7..e00f7c84b9 100644 --- a/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessage/IbftV2.java +++ b/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessage/IbftV2.java @@ -14,7 +14,7 @@ package tech.pegasys.pantheon.consensus.ibft.ibftmessage; /** Message codes for iBFT v2 messages */ public class IbftV2 { - public static final int PRE_PREPARE = 0; + public static final int PROPOSAL = 0; public static final int PREPARE = 1; public static final int COMMIT = 2; public static final int ROUND_CHANGE = 3; diff --git a/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessage/IbftNewRoundMessage.java b/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessage/NewRoundMessage.java similarity index 53% rename from consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessage/IbftNewRoundMessage.java rename to consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessage/NewRoundMessage.java index ddfe381f81..5a39f15726 100644 --- a/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessage/IbftNewRoundMessage.java +++ b/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessage/NewRoundMessage.java @@ -12,33 +12,32 @@ */ package tech.pegasys.pantheon.consensus.ibft.ibftmessage; -import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.IbftSignedMessageData; -import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.IbftUnsignedNewRoundMessageData; +import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.NewRoundPayload; +import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.SignedData; import tech.pegasys.pantheon.ethereum.p2p.api.MessageData; import tech.pegasys.pantheon.ethereum.rlp.RLP; import tech.pegasys.pantheon.util.bytes.BytesValue; -public class IbftNewRoundMessage extends AbstractIbftMessage { +public class NewRoundMessage extends AbstractIbftMessage { private static final int MESSAGE_CODE = IbftV2.NEW_ROUND; - private IbftNewRoundMessage(final BytesValue data) { + private NewRoundMessage(final BytesValue data) { super(data); } - public static IbftNewRoundMessage fromMessage(final MessageData message) { - return fromMessage(message, MESSAGE_CODE, IbftNewRoundMessage.class, IbftNewRoundMessage::new); + public static NewRoundMessage fromMessage(final MessageData message) { + return fromMessage(message, MESSAGE_CODE, NewRoundMessage.class, NewRoundMessage::new); } @Override - public IbftSignedMessageData decode() { - return IbftSignedMessageData.readIbftSignedNewRoundMessageDataFrom(RLP.input(data)); + public SignedData decode() { + return SignedData.readSignedNewRoundPayloadFrom(RLP.input(data)); } - public static IbftNewRoundMessage create( - final IbftSignedMessageData ibftPrepareMessageDecoded) { + public static NewRoundMessage create(final SignedData signedPayload) { - return new IbftNewRoundMessage(ibftPrepareMessageDecoded.encode()); + return new NewRoundMessage(signedPayload.encode()); } @Override diff --git a/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessage/IbftPrepareMessage.java b/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessage/PrepareMessage.java similarity index 53% rename from consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessage/IbftPrepareMessage.java rename to consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessage/PrepareMessage.java index 5707af605f..5549d85fe4 100644 --- a/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessage/IbftPrepareMessage.java +++ b/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessage/PrepareMessage.java @@ -12,33 +12,32 @@ */ package tech.pegasys.pantheon.consensus.ibft.ibftmessage; -import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.IbftSignedMessageData; -import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.IbftUnsignedPrepareMessageData; +import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.PreparePayload; +import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.SignedData; import tech.pegasys.pantheon.ethereum.p2p.api.MessageData; import tech.pegasys.pantheon.ethereum.rlp.RLP; import tech.pegasys.pantheon.util.bytes.BytesValue; -public class IbftPrepareMessage extends AbstractIbftMessage { +public class PrepareMessage extends AbstractIbftMessage { private static final int MESSAGE_CODE = IbftV2.PREPARE; - private IbftPrepareMessage(final BytesValue data) { + private PrepareMessage(final BytesValue data) { super(data); } - public static IbftPrepareMessage fromMessage(final MessageData message) { - return fromMessage(message, MESSAGE_CODE, IbftPrepareMessage.class, IbftPrepareMessage::new); + public static PrepareMessage fromMessage(final MessageData message) { + return fromMessage(message, MESSAGE_CODE, PrepareMessage.class, PrepareMessage::new); } @Override - public IbftSignedMessageData decode() { - return IbftSignedMessageData.readIbftSignedPrepareMessageDataFrom(RLP.input(data)); + public SignedData decode() { + return SignedData.readSignedPreparePayloadFrom(RLP.input(data)); } - public static IbftPrepareMessage create( - final IbftSignedMessageData ibftPrepareMessageDecoded) { + public static PrepareMessage create(final SignedData signedPayload) { - return new IbftPrepareMessage(ibftPrepareMessageDecoded.encode()); + return new PrepareMessage(signedPayload.encode()); } @Override diff --git a/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessage/ProposalMessage.java b/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessage/ProposalMessage.java new file mode 100644 index 0000000000..951e0562ad --- /dev/null +++ b/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessage/ProposalMessage.java @@ -0,0 +1,47 @@ +/* + * Copyright 2018 ConsenSys AG. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + */ +package tech.pegasys.pantheon.consensus.ibft.ibftmessage; + +import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.ProposalPayload; +import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.SignedData; +import tech.pegasys.pantheon.ethereum.p2p.api.MessageData; +import tech.pegasys.pantheon.ethereum.rlp.RLP; +import tech.pegasys.pantheon.util.bytes.BytesValue; + +public class ProposalMessage extends AbstractIbftMessage { + + private static final int MESSAGE_CODE = IbftV2.PROPOSAL; + + private ProposalMessage(final BytesValue data) { + super(data); + } + + public static ProposalMessage fromMessage(final MessageData message) { + return fromMessage(message, MESSAGE_CODE, ProposalMessage.class, ProposalMessage::new); + } + + @Override + public SignedData decode() { + return SignedData.readSignedProposalPayloadFrom(RLP.input(data)); + } + + public static ProposalMessage create(final SignedData signedPayload) { + + return new ProposalMessage(signedPayload.encode()); + } + + @Override + public int getCode() { + return MESSAGE_CODE; + } +} diff --git a/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessage/IbftRoundChangeMessage.java b/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessage/RoundChangeMessage.java similarity index 52% rename from consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessage/IbftRoundChangeMessage.java rename to consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessage/RoundChangeMessage.java index 5a65b95dcb..6fcf934c91 100644 --- a/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessage/IbftRoundChangeMessage.java +++ b/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessage/RoundChangeMessage.java @@ -12,34 +12,32 @@ */ package tech.pegasys.pantheon.consensus.ibft.ibftmessage; -import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.IbftSignedMessageData; -import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.IbftUnsignedRoundChangeMessageData; +import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.RoundChangePayload; +import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.SignedData; import tech.pegasys.pantheon.ethereum.p2p.api.MessageData; import tech.pegasys.pantheon.ethereum.rlp.RLP; import tech.pegasys.pantheon.util.bytes.BytesValue; -public class IbftRoundChangeMessage extends AbstractIbftMessage { +public class RoundChangeMessage extends AbstractIbftMessage { private static final int MESSAGE_CODE = IbftV2.ROUND_CHANGE; - private IbftRoundChangeMessage(final BytesValue data) { + private RoundChangeMessage(final BytesValue data) { super(data); } - public static IbftRoundChangeMessage fromMessage(final MessageData message) { - return fromMessage( - message, MESSAGE_CODE, IbftRoundChangeMessage.class, IbftRoundChangeMessage::new); + public static RoundChangeMessage fromMessage(final MessageData message) { + return fromMessage(message, MESSAGE_CODE, RoundChangeMessage.class, RoundChangeMessage::new); } @Override - public IbftSignedMessageData decode() { - return IbftSignedMessageData.readIbftSignedRoundChangeMessageDataFrom(RLP.input(data)); + public SignedData decode() { + return SignedData.readSignedRoundChangePayloadFrom(RLP.input(data)); } - public static IbftRoundChangeMessage create( - final IbftSignedMessageData ibftPrepareMessageDecoded) { + public static RoundChangeMessage create(final SignedData signedPayload) { - return new IbftRoundChangeMessage(ibftPrepareMessageDecoded.encode()); + return new RoundChangeMessage(signedPayload.encode()); } @Override diff --git a/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/AbstractIbftUnsignedMessageData.java b/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/AbstractPayload.java similarity index 95% rename from consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/AbstractIbftUnsignedMessageData.java rename to consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/AbstractPayload.java index d178643bfd..e8f9a566b3 100644 --- a/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/AbstractIbftUnsignedMessageData.java +++ b/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/AbstractPayload.java @@ -18,7 +18,7 @@ import tech.pegasys.pantheon.ethereum.rlp.RLPInput; import tech.pegasys.pantheon.ethereum.rlp.RLPOutput; import tech.pegasys.pantheon.util.bytes.BytesValue; -public abstract class AbstractIbftUnsignedMessageData { +public abstract class AbstractPayload { public abstract void writeTo(final RLPOutput rlpOutput); diff --git a/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/IbftUnsignedCommitMessageData.java b/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/CommitPayload.java similarity index 87% rename from consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/IbftUnsignedCommitMessageData.java rename to consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/CommitPayload.java index 314ebf62ec..e7c48e1594 100644 --- a/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/IbftUnsignedCommitMessageData.java +++ b/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/CommitPayload.java @@ -19,12 +19,12 @@ import tech.pegasys.pantheon.ethereum.core.Hash; import tech.pegasys.pantheon.ethereum.rlp.RLPInput; import tech.pegasys.pantheon.ethereum.rlp.RLPOutput; -public class IbftUnsignedCommitMessageData extends AbstractIbftUnsignedInRoundMessageData { +public class CommitPayload extends InRoundPayload { private static final int TYPE = IbftV2.COMMIT; private final Hash digest; private final Signature commitSeal; - public IbftUnsignedCommitMessageData( + public CommitPayload( final ConsensusRoundIdentifier roundIdentifier, final Hash digest, final Signature commitSeal) { @@ -33,7 +33,7 @@ public class IbftUnsignedCommitMessageData extends AbstractIbftUnsignedInRoundMe this.commitSeal = commitSeal; } - public static IbftUnsignedCommitMessageData readFrom(final RLPInput rlpInput) { + public static CommitPayload readFrom(final RLPInput rlpInput) { rlpInput.enterList(); final ConsensusRoundIdentifier roundIdentifier = ConsensusRoundIdentifier.readFrom(rlpInput); @@ -41,7 +41,7 @@ public class IbftUnsignedCommitMessageData extends AbstractIbftUnsignedInRoundMe final Signature commitSeal = rlpInput.readBytesValue(Signature::decode); rlpInput.leaveList(); - return new IbftUnsignedCommitMessageData(roundIdentifier, digest, commitSeal); + return new CommitPayload(roundIdentifier, digest, commitSeal); } @Override diff --git a/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/IbftMessageFactory.java b/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/IbftMessageFactory.java deleted file mode 100644 index 09396a8193..0000000000 --- a/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/IbftMessageFactory.java +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright 2018 ConsenSys AG. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package tech.pegasys.pantheon.consensus.ibft.ibftmessagedata; - -import tech.pegasys.pantheon.consensus.ibft.ConsensusRoundIdentifier; -import tech.pegasys.pantheon.crypto.SECP256K1; -import tech.pegasys.pantheon.crypto.SECP256K1.KeyPair; -import tech.pegasys.pantheon.crypto.SECP256K1.Signature; -import tech.pegasys.pantheon.ethereum.core.Block; -import tech.pegasys.pantheon.ethereum.core.Hash; -import tech.pegasys.pantheon.ethereum.core.Util; -import tech.pegasys.pantheon.util.bytes.BytesValues; - -import java.util.Optional; - -public class IbftMessageFactory { - private final KeyPair validatorKeyPair; - - public IbftMessageFactory(final KeyPair validatorKeyPair) { - this.validatorKeyPair = validatorKeyPair; - } - - public IbftSignedMessageData - createIbftSignedPrePrepareMessageData( - final ConsensusRoundIdentifier roundIdentifier, final Block block) { - - IbftUnsignedPrePrepareMessageData prePrepareUnsignedMessageData = - new IbftUnsignedPrePrepareMessageData(roundIdentifier, block); - - return createSignedMessage(prePrepareUnsignedMessageData); - } - - public IbftSignedMessageData createIbftSignedPrepareMessageData( - final ConsensusRoundIdentifier roundIdentifier, final Hash digest) { - - IbftUnsignedPrepareMessageData prepareUnsignedMessageData = - new IbftUnsignedPrepareMessageData(roundIdentifier, digest); - - return createSignedMessage(prepareUnsignedMessageData); - } - - public IbftSignedMessageData createIbftSignedCommitMessageData( - final ConsensusRoundIdentifier roundIdentifier, - final Hash digest, - final Signature commitSeal) { - - IbftUnsignedCommitMessageData commitUnsignedMessageData = - new IbftUnsignedCommitMessageData(roundIdentifier, digest, commitSeal); - - return createSignedMessage(commitUnsignedMessageData); - } - - public IbftSignedMessageData - createIbftSignedRoundChangeMessageData( - final ConsensusRoundIdentifier roundIdentifier, - final Optional preparedCertificate) { - - IbftUnsignedRoundChangeMessageData prepareUnsignedMessageData = - new IbftUnsignedRoundChangeMessageData(roundIdentifier, preparedCertificate); - - return createSignedMessage(prepareUnsignedMessageData); - } - - public IbftSignedMessageData - createIbftSignedNewRoundChangeMessageData( - final ConsensusRoundIdentifier roundIdentifier, - final IbftRoundChangeCertificate roundChangeCertificate, - final IbftSignedMessageData - ibftPrePrepareMessageData) { - - IbftUnsignedNewRoundMessageData newRoundUnsignedMessageData = - new IbftUnsignedNewRoundMessageData( - roundIdentifier, roundChangeCertificate, ibftPrePrepareMessageData); - - return createSignedMessage(newRoundUnsignedMessageData); - } - - private IbftSignedMessageData createSignedMessage( - final M ibftUnsignedMessage) { - final Signature signature = sign(ibftUnsignedMessage, validatorKeyPair); - - return new IbftSignedMessageData<>( - ibftUnsignedMessage, Util.publicKeyToAddress(validatorKeyPair.getPublicKey()), signature); - } - - static Hash hashForSignature(final AbstractIbftUnsignedMessageData unsignedMessageData) { - return Hash.hash( - BytesValues.concatenate( - BytesValues.ofUnsignedByte(unsignedMessageData.getMessageType()), - unsignedMessageData.encoded())); - } - - private static Signature sign( - final AbstractIbftUnsignedMessageData unsignedMessageData, final KeyPair nodeKeys) { - - return SECP256K1.sign(hashForSignature(unsignedMessageData), nodeKeys); - } -} diff --git a/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/IbftPreparedCertificate.java b/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/IbftPreparedCertificate.java deleted file mode 100644 index f99d70ed7b..0000000000 --- a/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/IbftPreparedCertificate.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright 2018 ConsenSys AG. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package tech.pegasys.pantheon.consensus.ibft.ibftmessagedata; - -import tech.pegasys.pantheon.ethereum.rlp.RLPInput; -import tech.pegasys.pantheon.ethereum.rlp.RLPOutput; - -import java.util.Collection; - -public class IbftPreparedCertificate { - - private final IbftSignedMessageData ibftPrePrepareMessage; - private final Collection> - ibftPrepareMessages; - - public IbftPreparedCertificate( - final IbftSignedMessageData ibftPrePrepareMessage, - final Collection> ibftPrepareMessages) { - this.ibftPrePrepareMessage = ibftPrePrepareMessage; - this.ibftPrepareMessages = ibftPrepareMessages; - } - - public static IbftPreparedCertificate readFrom(final RLPInput rlpInput) { - final IbftSignedMessageData ibftPrePreparedMessage; - final Collection> ibftPrepareMessages; - - rlpInput.enterList(); - ibftPrePreparedMessage = - IbftSignedMessageData.readIbftSignedPrePrepareMessageDataFrom(rlpInput); - ibftPrepareMessages = - rlpInput.readList(IbftSignedMessageData::readIbftSignedPrepareMessageDataFrom); - rlpInput.leaveList(); - - return new IbftPreparedCertificate(ibftPrePreparedMessage, ibftPrepareMessages); - } - - public void writeTo(final RLPOutput rlpOutput) { - rlpOutput.startList(); - ibftPrePrepareMessage.writeTo(rlpOutput); - rlpOutput.writeList(ibftPrepareMessages, IbftSignedMessageData::writeTo); - rlpOutput.endList(); - } - - public IbftSignedMessageData getIbftPrePrepareMessage() { - return ibftPrePrepareMessage; - } - - public Collection> - getIbftPrepareMessages() { - return ibftPrepareMessages; - } -} diff --git a/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/IbftRoundChangeCertificate.java b/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/IbftRoundChangeCertificate.java deleted file mode 100644 index cdda90b9c3..0000000000 --- a/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/IbftRoundChangeCertificate.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright 2018 ConsenSys AG. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package tech.pegasys.pantheon.consensus.ibft.ibftmessagedata; - -import tech.pegasys.pantheon.ethereum.rlp.RLPInput; -import tech.pegasys.pantheon.ethereum.rlp.RLPOutput; - -import java.util.Collection; - -public class IbftRoundChangeCertificate { - - private final Collection> - ibftRoundChangeMessages; - - public IbftRoundChangeCertificate( - final Collection> - ibftRoundChangeMessages) { - this.ibftRoundChangeMessages = ibftRoundChangeMessages; - } - - public static IbftRoundChangeCertificate readFrom(final RLPInput rlpInput) { - final Collection> - ibftRoundChangeMessages; - - rlpInput.enterList(); - ibftRoundChangeMessages = - rlpInput.readList(IbftSignedMessageData::readIbftSignedRoundChangeMessageDataFrom); - rlpInput.leaveList(); - - return new IbftRoundChangeCertificate(ibftRoundChangeMessages); - } - - public void writeTo(final RLPOutput rlpOutput) { - rlpOutput.startList(); - rlpOutput.writeList(ibftRoundChangeMessages, IbftSignedMessageData::writeTo); - rlpOutput.endList(); - } - - public Collection> - getIbftRoundChangeMessages() { - return ibftRoundChangeMessages; - } -} diff --git a/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/AbstractIbftUnsignedInRoundMessageData.java b/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/InRoundPayload.java similarity index 81% rename from consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/AbstractIbftUnsignedInRoundMessageData.java rename to consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/InRoundPayload.java index de4a8f8007..119fc50fa9 100644 --- a/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/AbstractIbftUnsignedInRoundMessageData.java +++ b/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/InRoundPayload.java @@ -14,11 +14,10 @@ package tech.pegasys.pantheon.consensus.ibft.ibftmessagedata; import tech.pegasys.pantheon.consensus.ibft.ConsensusRoundIdentifier; -public abstract class AbstractIbftUnsignedInRoundMessageData - extends AbstractIbftUnsignedMessageData { +public abstract class InRoundPayload extends AbstractPayload { protected final ConsensusRoundIdentifier roundIdentifier; - protected AbstractIbftUnsignedInRoundMessageData(final ConsensusRoundIdentifier roundIdentifier) { + protected InRoundPayload(final ConsensusRoundIdentifier roundIdentifier) { this.roundIdentifier = roundIdentifier; } diff --git a/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/MessageFactory.java b/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/MessageFactory.java new file mode 100644 index 0000000000..839504aa57 --- /dev/null +++ b/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/MessageFactory.java @@ -0,0 +1,98 @@ +/* + * Copyright 2018 ConsenSys AG. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + */ +package tech.pegasys.pantheon.consensus.ibft.ibftmessagedata; + +import tech.pegasys.pantheon.consensus.ibft.ConsensusRoundIdentifier; +import tech.pegasys.pantheon.crypto.SECP256K1; +import tech.pegasys.pantheon.crypto.SECP256K1.KeyPair; +import tech.pegasys.pantheon.crypto.SECP256K1.Signature; +import tech.pegasys.pantheon.ethereum.core.Block; +import tech.pegasys.pantheon.ethereum.core.Hash; +import tech.pegasys.pantheon.ethereum.core.Util; +import tech.pegasys.pantheon.util.bytes.BytesValues; + +import java.util.Optional; + +public class MessageFactory { + + private final KeyPair validatorKeyPair; + + public MessageFactory(final KeyPair validatorKeyPair) { + this.validatorKeyPair = validatorKeyPair; + } + + public SignedData createSignedProposalPayload( + final ConsensusRoundIdentifier roundIdentifier, final Block block) { + + final ProposalPayload payload = new ProposalPayload(roundIdentifier, block); + + return createSignedMessage(payload); + } + + public SignedData createSignedPreparePayload( + final ConsensusRoundIdentifier roundIdentifier, final Hash digest) { + + final PreparePayload payload = new PreparePayload(roundIdentifier, digest); + + return createSignedMessage(payload); + } + + public SignedData createSignedCommitPayload( + final ConsensusRoundIdentifier roundIdentifier, + final Hash digest, + final Signature commitSeal) { + + final CommitPayload payload = new CommitPayload(roundIdentifier, digest, commitSeal); + + return createSignedMessage(payload); + } + + public SignedData createSignedRoundChangePayload( + final ConsensusRoundIdentifier roundIdentifier, + final Optional preparedCertificate) { + + final RoundChangePayload payload = new RoundChangePayload(roundIdentifier, preparedCertificate); + + return createSignedMessage(payload); + } + + public SignedData createSignedNewRoundPayload( + final ConsensusRoundIdentifier roundIdentifier, + final RoundChangeCertificate roundChangeCertificate, + final SignedData proposalPayload) { + + final NewRoundPayload payload = + new NewRoundPayload(roundIdentifier, roundChangeCertificate, proposalPayload); + + return createSignedMessage(payload); + } + + private SignedData createSignedMessage(final M payload) { + final Signature signature = sign(payload, validatorKeyPair); + + return new SignedData<>( + payload, Util.publicKeyToAddress(validatorKeyPair.getPublicKey()), signature); + } + + static Hash hashForSignature(final AbstractPayload unsignedMessageData) { + return Hash.hash( + BytesValues.concatenate( + BytesValues.ofUnsignedByte(unsignedMessageData.getMessageType()), + unsignedMessageData.encoded())); + } + + private static Signature sign(final AbstractPayload unsignedMessageData, final KeyPair nodeKeys) { + + return SECP256K1.sign(hashForSignature(unsignedMessageData), nodeKeys); + } +} diff --git a/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/IbftUnsignedNewRoundMessageData.java b/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/NewRoundPayload.java similarity index 59% rename from consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/IbftUnsignedNewRoundMessageData.java rename to consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/NewRoundPayload.java index cf451f4f92..894dba7b7a 100644 --- a/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/IbftUnsignedNewRoundMessageData.java +++ b/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/NewRoundPayload.java @@ -17,35 +17,35 @@ import tech.pegasys.pantheon.consensus.ibft.ibftmessage.IbftV2; import tech.pegasys.pantheon.ethereum.rlp.RLPInput; import tech.pegasys.pantheon.ethereum.rlp.RLPOutput; -public class IbftUnsignedNewRoundMessageData extends AbstractIbftUnsignedMessageData { +public class NewRoundPayload extends AbstractPayload { private static final int TYPE = IbftV2.NEW_ROUND; private final ConsensusRoundIdentifier roundChangeIdentifier; - private final IbftRoundChangeCertificate roundChangeCertificate; + private final RoundChangeCertificate roundChangeCertificate; - private final IbftSignedMessageData ibftPrePrepareMessage; + private final SignedData proposalPayload; - public IbftUnsignedNewRoundMessageData( + public NewRoundPayload( final ConsensusRoundIdentifier roundIdentifier, - final IbftRoundChangeCertificate roundChangeCertificate, - final IbftSignedMessageData ibftPrePrepareMessage) { + final RoundChangeCertificate roundChangeCertificate, + final SignedData proposalPayload) { this.roundChangeIdentifier = roundIdentifier; this.roundChangeCertificate = roundChangeCertificate; - this.ibftPrePrepareMessage = ibftPrePrepareMessage; + this.proposalPayload = proposalPayload; } public ConsensusRoundIdentifier getRoundChangeIdentifier() { return roundChangeIdentifier; } - public IbftRoundChangeCertificate getRoundChangeCertificate() { + public RoundChangeCertificate getRoundChangeCertificate() { return roundChangeCertificate; } - public IbftSignedMessageData getIbftPrePrepareMessage() { - return ibftPrePrepareMessage; + public SignedData getProposalPayload() { + return proposalPayload; } @Override @@ -54,22 +54,20 @@ public class IbftUnsignedNewRoundMessageData extends AbstractIbftUnsignedMessage rlpOutput.startList(); roundChangeIdentifier.writeTo(rlpOutput); roundChangeCertificate.writeTo(rlpOutput); - ibftPrePrepareMessage.writeTo(rlpOutput); + proposalPayload.writeTo(rlpOutput); rlpOutput.endList(); } - public static IbftUnsignedNewRoundMessageData readFrom(final RLPInput rlpInput) { + public static NewRoundPayload readFrom(final RLPInput rlpInput) { rlpInput.enterList(); final ConsensusRoundIdentifier roundIdentifier = ConsensusRoundIdentifier.readFrom(rlpInput); - final IbftRoundChangeCertificate roundChangeCertificate = - IbftRoundChangeCertificate.readFrom(rlpInput); - final IbftSignedMessageData ibftPrePrepareMessage = - IbftSignedMessageData.readIbftSignedPrePrepareMessageDataFrom(rlpInput); + final RoundChangeCertificate roundChangeCertificate = RoundChangeCertificate.readFrom(rlpInput); + final SignedData proposalPayload = + SignedData.readSignedProposalPayloadFrom(rlpInput); rlpInput.leaveList(); - return new IbftUnsignedNewRoundMessageData( - roundIdentifier, roundChangeCertificate, ibftPrePrepareMessage); + return new NewRoundPayload(roundIdentifier, roundChangeCertificate, proposalPayload); } @Override diff --git a/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/IbftUnsignedPrepareMessageData.java b/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/PreparePayload.java similarity index 81% rename from consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/IbftUnsignedPrepareMessageData.java rename to consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/PreparePayload.java index 6d28cf270d..02310b929b 100644 --- a/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/IbftUnsignedPrepareMessageData.java +++ b/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/PreparePayload.java @@ -18,24 +18,23 @@ import tech.pegasys.pantheon.ethereum.core.Hash; import tech.pegasys.pantheon.ethereum.rlp.RLPInput; import tech.pegasys.pantheon.ethereum.rlp.RLPOutput; -public class IbftUnsignedPrepareMessageData extends AbstractIbftUnsignedInRoundMessageData { +public class PreparePayload extends InRoundPayload { private static final int TYPE = IbftV2.PREPARE; private final Hash digest; - public IbftUnsignedPrepareMessageData( - final ConsensusRoundIdentifier roundIdentifier, final Hash digest) { + public PreparePayload(final ConsensusRoundIdentifier roundIdentifier, final Hash digest) { super(roundIdentifier); this.digest = digest; } - public static IbftUnsignedPrepareMessageData readFrom(final RLPInput rlpInput) { + public static PreparePayload readFrom(final RLPInput rlpInput) { rlpInput.enterList(); final ConsensusRoundIdentifier roundIdentifier = ConsensusRoundIdentifier.readFrom(rlpInput); final Hash digest = readDigest(rlpInput); rlpInput.leaveList(); - return new IbftUnsignedPrepareMessageData(roundIdentifier, digest); + return new PreparePayload(roundIdentifier, digest); } @Override diff --git a/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/PreparedCertificate.java b/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/PreparedCertificate.java new file mode 100644 index 0000000000..796952a450 --- /dev/null +++ b/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/PreparedCertificate.java @@ -0,0 +1,58 @@ +/* + * Copyright 2018 ConsenSys AG. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + */ +package tech.pegasys.pantheon.consensus.ibft.ibftmessagedata; + +import tech.pegasys.pantheon.ethereum.rlp.RLPInput; +import tech.pegasys.pantheon.ethereum.rlp.RLPOutput; + +import java.util.Collection; + +public class PreparedCertificate { + + private final SignedData proposalPayload; + private final Collection> preparePayloads; + + public PreparedCertificate( + final SignedData proposalPayload, + final Collection> preparePayloads) { + this.proposalPayload = proposalPayload; + this.preparePayloads = preparePayloads; + } + + public static PreparedCertificate readFrom(final RLPInput rlpInput) { + final SignedData proposalMessage; + final Collection> prepareMessages; + + rlpInput.enterList(); + proposalMessage = SignedData.readSignedProposalPayloadFrom(rlpInput); + prepareMessages = rlpInput.readList(SignedData::readSignedPreparePayloadFrom); + rlpInput.leaveList(); + + return new PreparedCertificate(proposalMessage, prepareMessages); + } + + public void writeTo(final RLPOutput rlpOutput) { + rlpOutput.startList(); + proposalPayload.writeTo(rlpOutput); + rlpOutput.writeList(preparePayloads, SignedData::writeTo); + rlpOutput.endList(); + } + + public SignedData getProposalPayload() { + return proposalPayload; + } + + public Collection> getPreparePayloads() { + return preparePayloads; + } +} diff --git a/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/IbftUnsignedPrePrepareMessageData.java b/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/ProposalPayload.java similarity index 73% rename from consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/IbftUnsignedPrePrepareMessageData.java rename to consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/ProposalPayload.java index 11c2541132..b82490f39a 100644 --- a/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/IbftUnsignedPrePrepareMessageData.java +++ b/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/ProposalPayload.java @@ -19,20 +19,17 @@ import tech.pegasys.pantheon.ethereum.core.Block; import tech.pegasys.pantheon.ethereum.rlp.RLPInput; import tech.pegasys.pantheon.ethereum.rlp.RLPOutput; -// NOTE: Implementation of all methods of this class is still pending. This class was added to show -// how a PreparedCertificate is encoded and decoded inside a RoundChange message -public class IbftUnsignedPrePrepareMessageData extends AbstractIbftUnsignedInRoundMessageData { +public class ProposalPayload extends InRoundPayload { - private static final int TYPE = IbftV2.PRE_PREPARE; + private static final int TYPE = IbftV2.PROPOSAL; private final Block block; - public IbftUnsignedPrePrepareMessageData( - final ConsensusRoundIdentifier roundIdentifier, final Block block) { + public ProposalPayload(final ConsensusRoundIdentifier roundIdentifier, final Block block) { super(roundIdentifier); this.block = block; } - public static IbftUnsignedPrePrepareMessageData readFrom(final RLPInput rlpInput) { + public static ProposalPayload readFrom(final RLPInput rlpInput) { rlpInput.enterList(); final ConsensusRoundIdentifier roundIdentifier = ConsensusRoundIdentifier.readFrom(rlpInput); @@ -40,7 +37,7 @@ public class IbftUnsignedPrePrepareMessageData extends AbstractIbftUnsignedInRou Block.readFrom(rlpInput, IbftBlockHashing::calculateDataHashForCommittedSeal); rlpInput.leaveList(); - return new IbftUnsignedPrePrepareMessageData(roundIdentifier, block); + return new ProposalPayload(roundIdentifier, block); } @Override diff --git a/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/RoundChangeCertificate.java b/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/RoundChangeCertificate.java new file mode 100644 index 0000000000..ef170b2d28 --- /dev/null +++ b/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/RoundChangeCertificate.java @@ -0,0 +1,48 @@ +/* + * Copyright 2018 ConsenSys AG. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + */ +package tech.pegasys.pantheon.consensus.ibft.ibftmessagedata; + +import tech.pegasys.pantheon.ethereum.rlp.RLPInput; +import tech.pegasys.pantheon.ethereum.rlp.RLPOutput; + +import java.util.Collection; + +public class RoundChangeCertificate { + + private final Collection> roundChangePayloads; + + public RoundChangeCertificate( + final Collection> roundChangePayloads) { + this.roundChangePayloads = roundChangePayloads; + } + + public static RoundChangeCertificate readFrom(final RLPInput rlpInput) { + final Collection> roundChangePayloads; + + rlpInput.enterList(); + roundChangePayloads = rlpInput.readList(SignedData::readSignedRoundChangePayloadFrom); + rlpInput.leaveList(); + + return new RoundChangeCertificate(roundChangePayloads); + } + + public void writeTo(final RLPOutput rlpOutput) { + rlpOutput.startList(); + rlpOutput.writeList(roundChangePayloads, SignedData::writeTo); + rlpOutput.endList(); + } + + public Collection> getRoundChangePayloads() { + return roundChangePayloads; + } +} diff --git a/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/IbftUnsignedRoundChangeMessageData.java b/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/RoundChangePayload.java similarity index 77% rename from consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/IbftUnsignedRoundChangeMessageData.java rename to consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/RoundChangePayload.java index 5701cc9eb4..317c2b6e43 100644 --- a/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/IbftUnsignedRoundChangeMessageData.java +++ b/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/RoundChangePayload.java @@ -20,18 +20,18 @@ import tech.pegasys.pantheon.ethereum.rlp.RLPOutput; import java.util.Optional; -public class IbftUnsignedRoundChangeMessageData extends AbstractIbftUnsignedMessageData { +public class RoundChangePayload extends AbstractPayload { private static final int TYPE = IbftV2.PREPARE; private final ConsensusRoundIdentifier roundChangeIdentifier; // The validator may not hae any prepared certificate - private final Optional preparedCertificate; + private final Optional preparedCertificate; - public IbftUnsignedRoundChangeMessageData( + public RoundChangePayload( final ConsensusRoundIdentifier roundIdentifier, - final Optional preparedCertificate) { + final Optional preparedCertificate) { this.roundChangeIdentifier = roundIdentifier; this.preparedCertificate = preparedCertificate; } @@ -40,7 +40,7 @@ public class IbftUnsignedRoundChangeMessageData extends AbstractIbftUnsignedMess return roundChangeIdentifier; } - public Optional getPreparedCertificate() { + public Optional getPreparedCertificate() { return preparedCertificate; } @@ -59,21 +59,21 @@ public class IbftUnsignedRoundChangeMessageData extends AbstractIbftUnsignedMess ibftMessage.endList(); } - public static IbftUnsignedRoundChangeMessageData readFrom(final RLPInput rlpInput) { + public static RoundChangePayload readFrom(final RLPInput rlpInput) { rlpInput.enterList(); final ConsensusRoundIdentifier roundIdentifier = ConsensusRoundIdentifier.readFrom(rlpInput); - final Optional preparedCertificate; + final Optional preparedCertificate; if (rlpInput.nextIsNull()) { rlpInput.skipNext(); preparedCertificate = Optional.empty(); } else { - preparedCertificate = Optional.of(IbftPreparedCertificate.readFrom(rlpInput)); + preparedCertificate = Optional.of(PreparedCertificate.readFrom(rlpInput)); } rlpInput.leaveList(); - return new IbftUnsignedRoundChangeMessageData(roundIdentifier, preparedCertificate); + return new RoundChangePayload(roundIdentifier, preparedCertificate); } @Override diff --git a/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/IbftSignedMessageData.java b/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/SignedData.java similarity index 56% rename from consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/IbftSignedMessageData.java rename to consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/SignedData.java index 209d02d889..6d8bb1a26f 100644 --- a/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/IbftSignedMessageData.java +++ b/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/ibftmessagedata/SignedData.java @@ -20,15 +20,14 @@ import tech.pegasys.pantheon.ethereum.rlp.RLPInput; import tech.pegasys.pantheon.ethereum.rlp.RLPOutput; import tech.pegasys.pantheon.util.bytes.BytesValue; -public class IbftSignedMessageData { +public class SignedData { protected final Address sender; protected final Signature signature; - protected final M ibftUnsignedMessageData; + protected final M unsignedPayload; - public IbftSignedMessageData( - final M ibftUnsignedMessageData, final Address sender, final Signature signature) { - this.ibftUnsignedMessageData = ibftUnsignedMessageData; + public SignedData(final M unsignedPayload, final Address sender, final Signature signature) { + this.unsignedPayload = unsignedPayload; this.sender = sender; this.signature = signature; } @@ -41,14 +40,14 @@ public class IbftSignedMessageData { return signature; } - public M getUnsignedMessageData() { - return ibftUnsignedMessageData; + public M getPayload() { + return unsignedPayload; } public void writeTo(final RLPOutput output) { output.startList(); - ibftUnsignedMessageData.writeTo(output); + unsignedPayload.writeTo(output); output.writeBytesValue(getSignature().encodedBytes()); output.endList(); } @@ -59,72 +58,63 @@ public class IbftSignedMessageData { return rlpEncode.encoded(); } - public static IbftSignedMessageData - readIbftSignedPrePrepareMessageDataFrom(final RLPInput rlpInput) { + public static SignedData readSignedProposalPayloadFrom(final RLPInput rlpInput) { rlpInput.enterList(); - final IbftUnsignedPrePrepareMessageData unsignedMessageData = - IbftUnsignedPrePrepareMessageData.readFrom(rlpInput); + final ProposalPayload unsignedMessageData = ProposalPayload.readFrom(rlpInput); final Signature signature = readSignature(rlpInput); rlpInput.leaveList(); return from(unsignedMessageData, signature); } - public static IbftSignedMessageData - readIbftSignedPrepareMessageDataFrom(final RLPInput rlpInput) { + public static SignedData readSignedPreparePayloadFrom(final RLPInput rlpInput) { rlpInput.enterList(); - final IbftUnsignedPrepareMessageData unsignedMessageData = - IbftUnsignedPrepareMessageData.readFrom(rlpInput); + final PreparePayload unsignedMessageData = PreparePayload.readFrom(rlpInput); final Signature signature = readSignature(rlpInput); rlpInput.leaveList(); return from(unsignedMessageData, signature); } - public static IbftSignedMessageData - readIbftSignedCommitMessageDataFrom(final RLPInput rlpInput) { + public static SignedData readSignedCommitPayloadFrom(final RLPInput rlpInput) { rlpInput.enterList(); - final IbftUnsignedCommitMessageData unsignedMessageData = - IbftUnsignedCommitMessageData.readFrom(rlpInput); + final CommitPayload unsignedMessageData = CommitPayload.readFrom(rlpInput); final Signature signature = readSignature(rlpInput); rlpInput.leaveList(); return from(unsignedMessageData, signature); } - public static IbftSignedMessageData - readIbftSignedRoundChangeMessageDataFrom(final RLPInput rlpInput) { + public static SignedData readSignedRoundChangePayloadFrom( + final RLPInput rlpInput) { rlpInput.enterList(); - final IbftUnsignedRoundChangeMessageData unsignedMessageData = - IbftUnsignedRoundChangeMessageData.readFrom(rlpInput); + final RoundChangePayload unsignedMessageData = RoundChangePayload.readFrom(rlpInput); final Signature signature = readSignature(rlpInput); rlpInput.leaveList(); return from(unsignedMessageData, signature); } - public static IbftSignedMessageData - readIbftSignedNewRoundMessageDataFrom(final RLPInput rlpInput) { + public static SignedData readSignedNewRoundPayloadFrom(final RLPInput rlpInput) { rlpInput.enterList(); - final IbftUnsignedNewRoundMessageData unsignedMessageData = - IbftUnsignedNewRoundMessageData.readFrom(rlpInput); + final NewRoundPayload unsignedMessageData = NewRoundPayload.readFrom(rlpInput); final Signature signature = readSignature(rlpInput); rlpInput.leaveList(); return from(unsignedMessageData, signature); } - protected static IbftSignedMessageData from( + protected static SignedData from( final M unsignedMessageData, final Signature signature) { final Address sender = recoverSender(unsignedMessageData, signature); - return new IbftSignedMessageData<>(unsignedMessageData, sender, signature); + return new SignedData<>(unsignedMessageData, sender, signature); } protected static Signature readSignature(final RLPInput signedMessage) { @@ -132,9 +122,8 @@ public class IbftSignedMessageData { } protected static Address recoverSender( - final AbstractIbftUnsignedMessageData unsignedMessageData, final Signature signature) { + final AbstractPayload unsignedMessageData, final Signature signature) { - return Util.signatureToAddress( - signature, IbftMessageFactory.hashForSignature(unsignedMessageData)); + return Util.signatureToAddress(signature, MessageFactory.hashForSignature(unsignedMessageData)); } } diff --git a/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/protocol/IbftSubProtocol.java b/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/protocol/IbftSubProtocol.java index 37ad419c97..d140b08980 100644 --- a/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/protocol/IbftSubProtocol.java +++ b/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/protocol/IbftSubProtocol.java @@ -40,7 +40,7 @@ public class IbftSubProtocol implements SubProtocol { @Override public boolean isValidMessageCode(final int protocolVersion, final int code) { switch (code) { - case IbftV2.PRE_PREPARE: + case IbftV2.PROPOSAL: case IbftV2.PREPARE: case IbftV2.COMMIT: case IbftV2.ROUND_CHANGE: diff --git a/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/validation/MessageValidator.java b/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/validation/MessageValidator.java index 5aa66f52f3..4cc2ba3c99 100644 --- a/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/validation/MessageValidator.java +++ b/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/validation/MessageValidator.java @@ -17,11 +17,11 @@ import static tech.pegasys.pantheon.ethereum.mainnet.HeaderValidationMode.FULL; import tech.pegasys.pantheon.consensus.ibft.ConsensusRoundIdentifier; import tech.pegasys.pantheon.consensus.ibft.IbftContext; import tech.pegasys.pantheon.consensus.ibft.IbftExtraData; -import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.AbstractIbftUnsignedInRoundMessageData; -import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.IbftSignedMessageData; -import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.IbftUnsignedCommitMessageData; -import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.IbftUnsignedPrePrepareMessageData; -import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.IbftUnsignedPrepareMessageData; +import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.CommitPayload; +import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.InRoundPayload; +import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.PreparePayload; +import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.ProposalPayload; +import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.SignedData; import tech.pegasys.pantheon.ethereum.ProtocolContext; import tech.pegasys.pantheon.ethereum.core.Address; import tech.pegasys.pantheon.ethereum.core.Block; @@ -47,8 +47,7 @@ public class MessageValidator { private final ProtocolContext protocolContext; private final BlockHeader parentHeader; - private Optional> preprepareMessage = - Optional.empty(); + private Optional> proposal = Optional.empty(); public MessageValidator( final Collection

validators, @@ -65,41 +64,39 @@ public class MessageValidator { this.parentHeader = parentHeader; } - public boolean addPreprepareMessage( - final IbftSignedMessageData msg) { + public boolean addSignedProposalPayload(final SignedData msg) { - if (preprepareMessage.isPresent()) { - return handleSubsequentPreprepareMessage(preprepareMessage.get(), msg); + if (proposal.isPresent()) { + return handleSubsequentProposal(proposal.get(), msg); } - if (!validatePreprepareMessage(msg)) { + if (!validateSignedProposalPayload(msg)) { return false; } - if (!validateBlocKMatchesPrepareMessageRound(msg.getUnsignedMessageData())) { + if (!validateBlockMatchesProposalRound(msg.getPayload())) { return false; } - preprepareMessage = Optional.of(msg); + proposal = Optional.of(msg); return true; } - private boolean validatePreprepareMessage( - final IbftSignedMessageData msg) { + private boolean validateSignedProposalPayload(final SignedData msg) { - if (!msg.getUnsignedMessageData().getRoundIdentifier().equals(roundIdentifier)) { - LOG.info("Invalid Preprepare message, does not match current round."); + if (!msg.getPayload().getRoundIdentifier().equals(roundIdentifier)) { + LOG.info("Invalid Proposal message, does not match current round."); return false; } if (!msg.getSender().equals(expectedProposer)) { LOG.info( - "Invalid Preprepare message, was not created by the proposer expected for the " + "Invalid Proposal message, was not created by the proposer expected for the " + "associated round."); return false; } - final Block proposedBlock = msg.getUnsignedMessageData().getBlock(); + final Block proposedBlock = msg.getPayload().getBlock(); if (!headerValidator.validateHeader( proposedBlock.getHeader(), parentHeader, protocolContext, FULL)) { LOG.info("Invalid Prepare message, block did not pass header validation."); @@ -109,30 +106,28 @@ public class MessageValidator { return true; } - private boolean handleSubsequentPreprepareMessage( - final IbftSignedMessageData existingMsg, - final IbftSignedMessageData newMsg) { + private boolean handleSubsequentProposal( + final SignedData existingMsg, final SignedData newMsg) { if (!existingMsg.getSender().equals(newMsg.getSender())) { - LOG.debug("Received subsequent invalid Preprepare message; sender differs from original."); + LOG.debug("Received subsequent invalid Proposal message; sender differs from original."); return false; } - final IbftUnsignedPrePrepareMessageData existingData = existingMsg.getUnsignedMessageData(); - final IbftUnsignedPrePrepareMessageData newData = newMsg.getUnsignedMessageData(); + final ProposalPayload existingData = existingMsg.getPayload(); + final ProposalPayload newData = newMsg.getPayload(); - if (!preprepareMessagesAreIdentical(existingData, newData)) { - LOG.debug("Received subsequent invalid Preprepare message; content differs from original."); + if (!proposalMessagesAreIdentical(existingData, newData)) { + LOG.debug("Received subsequent invalid Proposal message; content differs from original."); return false; } return true; } - public boolean validatePrepareMessage( - final IbftSignedMessageData msg) { + public boolean validatePrepareMessage(final SignedData msg) { final String msgType = "Prepare"; - if (!isMessageForCurrentRoundFromValidatorAndPreprareMessageAvailable(msg, msgType)) { + if (!isMessageForCurrentRoundFromValidatorAndProposalAvailable(msg, msgType)) { return false; } @@ -141,35 +136,32 @@ public class MessageValidator { return false; } - return validateDigestMatchesPreprepareBlock(msg.getUnsignedMessageData().getDigest(), msgType); + return validateDigestMatchesProposal(msg.getPayload().getDigest(), msgType); } - public boolean validateCommmitMessage( - final IbftSignedMessageData msg) { + public boolean validateCommmitMessage(final SignedData msg) { final String msgType = "Commit"; - if (!isMessageForCurrentRoundFromValidatorAndPreprareMessageAvailable(msg, msgType)) { + if (!isMessageForCurrentRoundFromValidatorAndProposalAvailable(msg, msgType)) { return false; } - final Block proposedBlock = preprepareMessage.get().getUnsignedMessageData().getBlock(); + final Block proposedBlock = proposal.get().getPayload().getBlock(); final Address commitSealCreator = - Util.signatureToAddress( - msg.getUnsignedMessageData().getCommitSeal(), proposedBlock.getHash()); + Util.signatureToAddress(msg.getPayload().getCommitSeal(), proposedBlock.getHash()); if (!commitSealCreator.equals(msg.getSender())) { LOG.info("Invalid Commit message. Seal was not created by the message transmitter."); return false; } - return validateDigestMatchesPreprepareBlock(msg.getUnsignedMessageData().getDigest(), msgType); + return validateDigestMatchesProposal(msg.getPayload().getDigest(), msgType); } - private boolean isMessageForCurrentRoundFromValidatorAndPreprareMessageAvailable( - final IbftSignedMessageData msg, - final String msgType) { + private boolean isMessageForCurrentRoundFromValidatorAndProposalAvailable( + final SignedData msg, final String msgType) { - if (!msg.getUnsignedMessageData().getRoundIdentifier().equals(roundIdentifier)) { + if (!msg.getPayload().getRoundIdentifier().equals(roundIdentifier)) { LOG.info("Invalid {} message, does not match current round.", msgType); return false; } @@ -181,18 +173,18 @@ public class MessageValidator { return false; } - if (!preprepareMessage.isPresent()) { + if (!proposal.isPresent()) { LOG.info( - "Unable to validate {} message. No Preprepare message exists against " - + "which to validate block digest.", + "Unable to validate {} message. No Proposal exists against which to validate " + + "block digest.", msgType); return false; } return true; } - private boolean validateDigestMatchesPreprepareBlock(final Hash digest, final String msgType) { - final Block proposedBlock = preprepareMessage.get().getUnsignedMessageData().getBlock(); + private boolean validateDigestMatchesProposal(final Hash digest, final String msgType) { + final Block proposedBlock = proposal.get().getPayload().getBlock(); if (!digest.equals(proposedBlock.getHash())) { LOG.info( "Illegal {} message, digest does not match the block in the Prepare Message.", msgType); @@ -201,19 +193,18 @@ public class MessageValidator { return true; } - private boolean preprepareMessagesAreIdentical( - final IbftUnsignedPrePrepareMessageData right, final IbftUnsignedPrePrepareMessageData left) { + private boolean proposalMessagesAreIdentical( + final ProposalPayload right, final ProposalPayload left) { return right.getBlock().getHash().equals(left.getBlock().getHash()) && right.getRoundIdentifier().equals(left.getRoundIdentifier()); } - private boolean validateBlocKMatchesPrepareMessageRound( - final IbftUnsignedPrePrepareMessageData msgData) { - final ConsensusRoundIdentifier msgRound = msgData.getRoundIdentifier(); + private boolean validateBlockMatchesProposalRound(final ProposalPayload payload) { + final ConsensusRoundIdentifier msgRound = payload.getRoundIdentifier(); final IbftExtraData extraData = - IbftExtraData.decode(msgData.getBlock().getHeader().getExtraData()); + IbftExtraData.decode(payload.getBlock().getHeader().getExtraData()); if (extraData.getRound() != msgRound.getRoundNumber()) { - LOG.info("Invalid Preprepare message, round number in block does not match that in message."); + LOG.info("Invalid Proposal message, round number in block does not match that in message."); return false; } return true; diff --git a/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/validation/RoundChangeMessageValidator.java b/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/validation/RoundChangeMessageValidator.java index 72cf1aa00c..3812cd7efb 100644 --- a/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/validation/RoundChangeMessageValidator.java +++ b/consensus/ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/validation/RoundChangeMessageValidator.java @@ -13,11 +13,11 @@ package tech.pegasys.pantheon.consensus.ibft.validation; import tech.pegasys.pantheon.consensus.ibft.ConsensusRoundIdentifier; -import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.IbftPreparedCertificate; -import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.IbftSignedMessageData; -import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.IbftUnsignedPrePrepareMessageData; -import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.IbftUnsignedPrepareMessageData; -import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.IbftUnsignedRoundChangeMessageData; +import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.PreparePayload; +import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.PreparedCertificate; +import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.ProposalPayload; +import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.RoundChangePayload; +import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.SignedData; import tech.pegasys.pantheon.ethereum.core.Address; import java.util.Collection; @@ -45,8 +45,7 @@ public class RoundChangeMessageValidator { this.currentRound = currentRound; } - public boolean validateMessage( - final IbftSignedMessageData msg) { + public boolean validateMessage(final SignedData msg) { if (!validators.contains(msg.getSender())) { LOG.info( @@ -55,33 +54,30 @@ public class RoundChangeMessageValidator { return false; } - final ConsensusRoundIdentifier roundChangeTarget = - msg.getUnsignedMessageData().getRoundChangeIdentifier(); + final ConsensusRoundIdentifier targetRound = msg.getPayload().getRoundChangeIdentifier(); - if (roundChangeTarget.getSequenceNumber() != currentRound.getSequenceNumber()) { + if (targetRound.getSequenceNumber() != currentRound.getSequenceNumber()) { LOG.info("Invalid RoundChange message, not valid for local chain height."); return false; } - if (msg.getUnsignedMessageData().getPreparedCertificate().isPresent()) { - final IbftPreparedCertificate certificate = - msg.getUnsignedMessageData().getPreparedCertificate().get(); + if (msg.getPayload().getPreparedCertificate().isPresent()) { + final PreparedCertificate certificate = msg.getPayload().getPreparedCertificate().get(); - return validatePrepareCertificate(certificate, roundChangeTarget); + return validatePrepareCertificate(certificate, targetRound); } return true; } private boolean validatePrepareCertificate( - final IbftPreparedCertificate certificate, final ConsensusRoundIdentifier roundChangeTarget) { - final IbftSignedMessageData preprepareMessage = - certificate.getIbftPrePrepareMessage(); + final PreparedCertificate certificate, final ConsensusRoundIdentifier roundChangeTarget) { + final SignedData proposalMessage = certificate.getProposalPayload(); final ConsensusRoundIdentifier prepareCertRound = - preprepareMessage.getUnsignedMessageData().getRoundIdentifier(); + proposalMessage.getPayload().getRoundIdentifier(); - if (!validatePreprepareCertificateRound(prepareCertRound, roundChangeTarget)) { + if (!validatePreparedCertificateRound(prepareCertRound, roundChangeTarget)) { return false; } @@ -90,22 +86,21 @@ public class RoundChangeMessageValidator { } private boolean validateConsistencyOfPrepareCertificateMessages( - final IbftPreparedCertificate certificate, final MessageValidator messageValidator) { + final PreparedCertificate certificate, final MessageValidator messageValidator) { - if (!messageValidator.addPreprepareMessage(certificate.getIbftPrePrepareMessage())) { - LOG.info("Invalid RoundChange message, embedded Preprepare message failed validation."); + if (!messageValidator.addSignedProposalPayload(certificate.getProposalPayload())) { + LOG.info("Invalid RoundChange message, embedded Proposal message failed validation."); return false; } - if (certificate.getIbftPrepareMessages().size() < minimumPrepareMessages) { + if (certificate.getPreparePayloads().size() < minimumPrepareMessages) { LOG.info( - "Invalid RoundChange message, insufficient prepare messages exist to justify " + "Invalid RoundChange message, insufficient Prepare messages exist to justify " + "prepare certificate."); return false; } - for (final IbftSignedMessageData prepareMsg : - certificate.getIbftPrepareMessages()) { + for (final SignedData prepareMsg : certificate.getPreparePayloads()) { if (!messageValidator.validatePrepareMessage(prepareMsg)) { LOG.info("Invalid RoundChange message, embedded Prepare message failed validation."); return false; @@ -115,18 +110,18 @@ public class RoundChangeMessageValidator { return true; } - private boolean validatePreprepareCertificateRound( + private boolean validatePreparedCertificateRound( final ConsensusRoundIdentifier prepareCertRound, final ConsensusRoundIdentifier roundChangeTarget) { if (prepareCertRound.getSequenceNumber() != roundChangeTarget.getSequenceNumber()) { - LOG.info("Invalid RoundChange message, PreprepareCertificate is not for local chain height."); + LOG.info("Invalid RoundChange message, PreparedCertificate is not for local chain height."); return false; } if (prepareCertRound.getRoundNumber() >= roundChangeTarget.getRoundNumber()) { LOG.info( - "Invalid RoundChange message, PreprepareCertificate is newer than RoundChange target."); + "Invalid RoundChange message, PreparedCertificate is newer than RoundChange target."); return false; } return true; diff --git a/consensus/ibft/src/test/java/tech/pegasys/pantheon/consensus/ibft/validation/MessageValidatorTest.java b/consensus/ibft/src/test/java/tech/pegasys/pantheon/consensus/ibft/validation/MessageValidatorTest.java index 79bbbf1113..7a4b594fff 100644 --- a/consensus/ibft/src/test/java/tech/pegasys/pantheon/consensus/ibft/validation/MessageValidatorTest.java +++ b/consensus/ibft/src/test/java/tech/pegasys/pantheon/consensus/ibft/validation/MessageValidatorTest.java @@ -20,11 +20,11 @@ import static org.mockito.Mockito.when; import tech.pegasys.pantheon.consensus.ibft.ConsensusRoundIdentifier; import tech.pegasys.pantheon.consensus.ibft.IbftContext; import tech.pegasys.pantheon.consensus.ibft.IbftExtraData; -import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.IbftMessageFactory; -import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.IbftSignedMessageData; -import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.IbftUnsignedCommitMessageData; -import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.IbftUnsignedPrePrepareMessageData; -import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.IbftUnsignedPrepareMessageData; +import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.CommitPayload; +import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.MessageFactory; +import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.PreparePayload; +import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.ProposalPayload; +import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.SignedData; import tech.pegasys.pantheon.crypto.SECP256K1; import tech.pegasys.pantheon.crypto.SECP256K1.KeyPair; import tech.pegasys.pantheon.ethereum.ProtocolContext; @@ -55,10 +55,9 @@ public class MessageValidatorTest { private final KeyPair proposerKey = KeyPair.generate(); private final KeyPair validatorKey = KeyPair.generate(); private final KeyPair nonValidatorKey = KeyPair.generate(); - private final IbftMessageFactory proposerMessageFactory = new IbftMessageFactory(proposerKey); - private final IbftMessageFactory validatorMessageFactory = new IbftMessageFactory(validatorKey); - private final IbftMessageFactory nonValidatorMessageFactory = - new IbftMessageFactory(nonValidatorKey); + private final MessageFactory proposerMessageFactory = new MessageFactory(proposerKey); + private final MessageFactory validatorMessageFactory = new MessageFactory(validatorKey); + private final MessageFactory nonValidatorMessageFactory = new MessageFactory(nonValidatorKey); private final List
validators = Lists.newArrayList(); @@ -107,16 +106,16 @@ public class MessageValidatorTest { @Test public void receivingAPrepareMessageBeforePrePrepareFails() { - final IbftSignedMessageData prepareMsg = - proposerMessageFactory.createIbftSignedPrepareMessageData(roundIdentifier, Hash.ZERO); + final SignedData prepareMsg = + proposerMessageFactory.createSignedPreparePayload(roundIdentifier, Hash.ZERO); assertThat(validator.validatePrepareMessage(prepareMsg)).isFalse(); } @Test public void receivingACommitMessageBeforePreprepareFails() { - final IbftSignedMessageData commitMsg = - proposerMessageFactory.createIbftSignedCommitMessageData( + final SignedData commitMsg = + proposerMessageFactory.createSignedCommitPayload( roundIdentifier, Hash.ZERO, SECP256K1.sign(Hash.ZERO, proposerKey)); assertThat(validator.validateCommmitMessage(commitMsg)).isFalse(); @@ -124,48 +123,46 @@ public class MessageValidatorTest { @Test public void receivingPreprepareMessageFromNonProposerFails() { - final IbftSignedMessageData preprepareMsg = - validatorMessageFactory.createIbftSignedPrePrepareMessageData( - roundIdentifier, mock(Block.class)); + final SignedData preprepareMsg = + validatorMessageFactory.createSignedProposalPayload(roundIdentifier, mock(Block.class)); - assertThat(validator.addPreprepareMessage(preprepareMsg)).isFalse(); + assertThat(validator.addSignedProposalPayload(preprepareMsg)).isFalse(); } @Test public void receivingPreprepareMessageWithIllegalBlockFails() { when(headerValidator.validateHeader(any(), any(), any(), any())).thenReturn(false); - final IbftSignedMessageData preprepareMsg = - proposerMessageFactory.createIbftSignedPrePrepareMessageData( - roundIdentifier, mock(Block.class)); + final SignedData preprepareMsg = + proposerMessageFactory.createSignedProposalPayload(roundIdentifier, mock(Block.class)); - assertThat(validator.addPreprepareMessage(preprepareMsg)).isFalse(); + assertThat(validator.addSignedProposalPayload(preprepareMsg)).isFalse(); } @Test public void receivingPrepareFromProposerFails() { when(headerValidator.validateHeader(any(), any(), any(), any())).thenReturn(true); - final IbftSignedMessageData preprepareMsg = - proposerMessageFactory.createIbftSignedPrePrepareMessageData(roundIdentifier, block); + final SignedData preprepareMsg = + proposerMessageFactory.createSignedProposalPayload(roundIdentifier, block); - final IbftSignedMessageData prepareMsg = - proposerMessageFactory.createIbftSignedPrepareMessageData(roundIdentifier, block.getHash()); + final SignedData prepareMsg = + proposerMessageFactory.createSignedPreparePayload(roundIdentifier, block.getHash()); - assertThat(validator.addPreprepareMessage(preprepareMsg)).isTrue(); + assertThat(validator.addSignedProposalPayload(preprepareMsg)).isTrue(); assertThat(validator.validatePrepareMessage(prepareMsg)).isFalse(); } @Test public void receivingPrepareFromNonValidatorFails() { when(headerValidator.validateHeader(any(), any(), any(), any())).thenReturn(true); - final IbftSignedMessageData preprepareMsg = - proposerMessageFactory.createIbftSignedPrePrepareMessageData(roundIdentifier, block); - final IbftSignedMessageData prepareMsg = - nonValidatorMessageFactory.createIbftSignedPrepareMessageData( - roundIdentifier, block.getHash()); + final SignedData preprepareMsg = + proposerMessageFactory.createSignedProposalPayload(roundIdentifier, block); - assertThat(validator.addPreprepareMessage(preprepareMsg)).isTrue(); + final SignedData prepareMsg = + nonValidatorMessageFactory.createSignedPreparePayload(roundIdentifier, block.getHash()); + + assertThat(validator.addSignedProposalPayload(preprepareMsg)).isTrue(); assertThat(validator.validatePrepareMessage(prepareMsg)).isFalse(); } @@ -173,20 +170,19 @@ public class MessageValidatorTest { public void receivingMessagesWithDifferentRoundIdFromPreprepareFails() { when(headerValidator.validateHeader(any(), any(), any(), any())).thenReturn(true); - final IbftSignedMessageData preprepareMsg = - proposerMessageFactory.createIbftSignedPrePrepareMessageData(roundIdentifier, block); + final SignedData preprepareMsg = + proposerMessageFactory.createSignedProposalPayload(roundIdentifier, block); final ConsensusRoundIdentifier invalidRoundIdentifier = new ConsensusRoundIdentifier( roundIdentifier.getSequenceNumber(), roundIdentifier.getRoundNumber() + 1); - final IbftSignedMessageData prepareMsg = - validatorMessageFactory.createIbftSignedPrepareMessageData( - invalidRoundIdentifier, block.getHash()); - final IbftSignedMessageData commitMsg = - validatorMessageFactory.createIbftSignedCommitMessageData( + final SignedData prepareMsg = + validatorMessageFactory.createSignedPreparePayload(invalidRoundIdentifier, block.getHash()); + final SignedData commitMsg = + validatorMessageFactory.createSignedCommitPayload( invalidRoundIdentifier, block.getHash(), SECP256K1.sign(block.getHash(), proposerKey)); - assertThat(validator.addPreprepareMessage(preprepareMsg)).isTrue(); + assertThat(validator.addSignedProposalPayload(preprepareMsg)).isTrue(); assertThat(validator.validatePrepareMessage(prepareMsg)).isFalse(); assertThat(validator.validateCommmitMessage(commitMsg)).isFalse(); } @@ -195,13 +191,12 @@ public class MessageValidatorTest { public void receivingPrepareNonProposerValidatorWithCorrectRoundIsSuccessful() { when(headerValidator.validateHeader(any(), any(), any(), any())).thenReturn(true); - final IbftSignedMessageData preprepareMsg = - proposerMessageFactory.createIbftSignedPrePrepareMessageData(roundIdentifier, block); - final IbftSignedMessageData prepareMsg = - validatorMessageFactory.createIbftSignedPrepareMessageData( - roundIdentifier, block.getHash()); + final SignedData preprepareMsg = + proposerMessageFactory.createSignedProposalPayload(roundIdentifier, block); + final SignedData prepareMsg = + validatorMessageFactory.createSignedPreparePayload(roundIdentifier, block.getHash()); - assertThat(validator.addPreprepareMessage(preprepareMsg)).isTrue(); + assertThat(validator.addSignedProposalPayload(preprepareMsg)).isTrue(); assertThat(validator.validatePrepareMessage(prepareMsg)).isTrue(); } @@ -209,14 +204,14 @@ public class MessageValidatorTest { public void receivingACommitMessageWithAnInvalidCommitSealFails() { when(headerValidator.validateHeader(any(), any(), any(), any())).thenReturn(true); - final IbftSignedMessageData preprepareMsg = - proposerMessageFactory.createIbftSignedPrePrepareMessageData(roundIdentifier, block); + final SignedData preprepareMsg = + proposerMessageFactory.createSignedProposalPayload(roundIdentifier, block); - final IbftSignedMessageData commitMsg = - proposerMessageFactory.createIbftSignedCommitMessageData( + final SignedData commitMsg = + proposerMessageFactory.createSignedCommitPayload( roundIdentifier, block.getHash(), SECP256K1.sign(block.getHash(), nonValidatorKey)); - assertThat(validator.addPreprepareMessage(preprepareMsg)).isTrue(); + assertThat(validator.addSignedProposalPayload(preprepareMsg)).isTrue(); assertThat(validator.validateCommmitMessage(commitMsg)).isFalse(); } @@ -224,18 +219,18 @@ public class MessageValidatorTest { public void commitMessageContainingValidSealFromValidatorIsSuccessful() { when(headerValidator.validateHeader(any(), any(), any(), any())).thenReturn(true); - final IbftSignedMessageData preprepareMsg = - proposerMessageFactory.createIbftSignedPrePrepareMessageData(roundIdentifier, block); + final SignedData preprepareMsg = + proposerMessageFactory.createSignedProposalPayload(roundIdentifier, block); - final IbftSignedMessageData proposerCommitMsg = - proposerMessageFactory.createIbftSignedCommitMessageData( + final SignedData proposerCommitMsg = + proposerMessageFactory.createSignedCommitPayload( roundIdentifier, block.getHash(), SECP256K1.sign(block.getHash(), proposerKey)); - final IbftSignedMessageData validatorCommitMsg = - validatorMessageFactory.createIbftSignedCommitMessageData( + final SignedData validatorCommitMsg = + validatorMessageFactory.createSignedCommitPayload( roundIdentifier, block.getHash(), SECP256K1.sign(block.getHash(), validatorKey)); - assertThat(validator.addPreprepareMessage(preprepareMsg)).isTrue(); + assertThat(validator.addSignedProposalPayload(preprepareMsg)).isTrue(); assertThat(validator.validateCommmitMessage(proposerCommitMsg)).isTrue(); assertThat(validator.validateCommmitMessage(validatorCommitMsg)).isTrue(); } @@ -244,39 +239,39 @@ public class MessageValidatorTest { public void subsequentPreprepareHasDifferentSenderFails() { when(headerValidator.validateHeader(any(), any(), any(), any())).thenReturn(true); - final IbftSignedMessageData preprepareMsg = - proposerMessageFactory.createIbftSignedPrePrepareMessageData(roundIdentifier, block); - assertThat(validator.addPreprepareMessage(preprepareMsg)).isTrue(); + final SignedData preprepareMsg = + proposerMessageFactory.createSignedProposalPayload(roundIdentifier, block); + assertThat(validator.addSignedProposalPayload(preprepareMsg)).isTrue(); - final IbftSignedMessageData secondPreprepareMsg = - validatorMessageFactory.createIbftSignedPrePrepareMessageData(roundIdentifier, block); - assertThat(validator.addPreprepareMessage(secondPreprepareMsg)).isFalse(); + final SignedData secondPreprepareMsg = + validatorMessageFactory.createSignedProposalPayload(roundIdentifier, block); + assertThat(validator.addSignedProposalPayload(secondPreprepareMsg)).isFalse(); } @Test public void subsequentPreprepareHasDifferentContentFails() { - final IbftSignedMessageData preprepareMsg = - proposerMessageFactory.createIbftSignedPrePrepareMessageData(roundIdentifier, block); - assertThat(validator.addPreprepareMessage(preprepareMsg)).isTrue(); + final SignedData preprepareMsg = + proposerMessageFactory.createSignedProposalPayload(roundIdentifier, block); + assertThat(validator.addSignedProposalPayload(preprepareMsg)).isTrue(); final ConsensusRoundIdentifier newRoundIdentifier = new ConsensusRoundIdentifier(3, 0); - final IbftSignedMessageData secondPreprepareMsg = - proposerMessageFactory.createIbftSignedPrePrepareMessageData(newRoundIdentifier, block); - assertThat(validator.addPreprepareMessage(secondPreprepareMsg)).isFalse(); + final SignedData secondPreprepareMsg = + proposerMessageFactory.createSignedProposalPayload(newRoundIdentifier, block); + assertThat(validator.addSignedProposalPayload(secondPreprepareMsg)).isFalse(); } @Test public void subsequentPreprepareHasIdenticalSenderAndContentIsSuccessful() { when(headerValidator.validateHeader(any(), any(), any(), any())).thenReturn(true); - final IbftSignedMessageData preprepareMsg = - proposerMessageFactory.createIbftSignedPrePrepareMessageData(roundIdentifier, block); - assertThat(validator.addPreprepareMessage(preprepareMsg)).isTrue(); + final SignedData preprepareMsg = + proposerMessageFactory.createSignedProposalPayload(roundIdentifier, block); + assertThat(validator.addSignedProposalPayload(preprepareMsg)).isTrue(); - final IbftSignedMessageData secondPreprepareMsg = - proposerMessageFactory.createIbftSignedPrePrepareMessageData(roundIdentifier, block); - assertThat(validator.addPreprepareMessage(secondPreprepareMsg)).isTrue(); + final SignedData secondPreprepareMsg = + proposerMessageFactory.createSignedProposalPayload(roundIdentifier, block); + assertThat(validator.addSignedProposalPayload(secondPreprepareMsg)).isTrue(); } @Test @@ -284,9 +279,9 @@ public class MessageValidatorTest { insertRoundToBlockHeader(roundIdentifier.getRoundNumber() + 1); when(headerValidator.validateHeader(any(), any(), any(), any())).thenReturn(true); - final IbftSignedMessageData preprepareMsg = - proposerMessageFactory.createIbftSignedPrePrepareMessageData(roundIdentifier, block); + final SignedData preprepareMsg = + proposerMessageFactory.createSignedProposalPayload(roundIdentifier, block); - assertThat(validator.addPreprepareMessage(preprepareMsg)).isFalse(); + assertThat(validator.addSignedProposalPayload(preprepareMsg)).isFalse(); } } diff --git a/consensus/ibft/src/test/java/tech/pegasys/pantheon/consensus/ibft/validation/RoundChangeMessageValidatorTest.java b/consensus/ibft/src/test/java/tech/pegasys/pantheon/consensus/ibft/validation/RoundChangeMessageValidatorTest.java index 404b1ae504..d2f04bd725 100644 --- a/consensus/ibft/src/test/java/tech/pegasys/pantheon/consensus/ibft/validation/RoundChangeMessageValidatorTest.java +++ b/consensus/ibft/src/test/java/tech/pegasys/pantheon/consensus/ibft/validation/RoundChangeMessageValidatorTest.java @@ -21,11 +21,11 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import tech.pegasys.pantheon.consensus.ibft.ConsensusRoundIdentifier; -import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.IbftMessageFactory; -import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.IbftPreparedCertificate; -import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.IbftSignedMessageData; -import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.IbftUnsignedPrepareMessageData; -import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.IbftUnsignedRoundChangeMessageData; +import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.MessageFactory; +import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.PreparePayload; +import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.PreparedCertificate; +import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.RoundChangePayload; +import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.SignedData; import tech.pegasys.pantheon.consensus.ibft.validation.RoundChangeMessageValidator.MessageValidatorFactory; import tech.pegasys.pantheon.crypto.SECP256K1.KeyPair; import tech.pegasys.pantheon.ethereum.core.Address; @@ -46,10 +46,9 @@ public class RoundChangeMessageValidatorTest { private final KeyPair proposerKey = KeyPair.generate(); private final KeyPair validatorKey = KeyPair.generate(); private final KeyPair nonValidatorKey = KeyPair.generate(); - private final IbftMessageFactory proposerMessageFactory = new IbftMessageFactory(proposerKey); - private final IbftMessageFactory validatorMessageFactory = new IbftMessageFactory(validatorKey); - private final IbftMessageFactory nonValidatorMessageFactory = - new IbftMessageFactory(nonValidatorKey); + private final MessageFactory proposerMessageFactory = new MessageFactory(proposerKey); + private final MessageFactory validatorMessageFactory = new MessageFactory(validatorKey); + private final MessageFactory nonValidatorMessageFactory = new MessageFactory(nonValidatorKey); private final ConsensusRoundIdentifier currentRound = new ConsensusRoundIdentifier(2, 3); private final ConsensusRoundIdentifier targetRound = new ConsensusRoundIdentifier(2, 4); @@ -73,82 +72,76 @@ public class RoundChangeMessageValidatorTest { // By default, have all basic messages being valid thus any failures are attributed to logic // in the RoundChangeMessageValidator - when(basicValidator.addPreprepareMessage(any())).thenReturn(true); + when(basicValidator.addSignedProposalPayload(any())).thenReturn(true); when(basicValidator.validatePrepareMessage(any())).thenReturn(true); } @Test public void roundChangeSentByNonValidatorFails() { - final IbftSignedMessageData msg = - nonValidatorMessageFactory.createIbftSignedRoundChangeMessageData( - targetRound, Optional.empty()); + final SignedData msg = + nonValidatorMessageFactory.createSignedRoundChangePayload(targetRound, Optional.empty()); assertThat(validator.validateMessage(msg)).isFalse(); } @Test public void roundChangeContainingNoCertificateIsSuccessful() { - final IbftSignedMessageData msg = - proposerMessageFactory.createIbftSignedRoundChangeMessageData( - targetRound, Optional.empty()); + final SignedData msg = + proposerMessageFactory.createSignedRoundChangePayload(targetRound, Optional.empty()); assertThat(validator.validateMessage(msg)).isTrue(); } @Test public void roundChangeContainingInvalidPreprepareFails() { - final IbftPreparedCertificate prepareCertificate = - new IbftPreparedCertificate( - proposerMessageFactory.createIbftSignedPrePrepareMessageData(currentRound, block), + final PreparedCertificate prepareCertificate = + new PreparedCertificate( + proposerMessageFactory.createSignedProposalPayload(currentRound, block), Collections.emptyList()); - final IbftSignedMessageData msg = - proposerMessageFactory.createIbftSignedRoundChangeMessageData( + final SignedData msg = + proposerMessageFactory.createSignedRoundChangePayload( targetRound, Optional.of(prepareCertificate)); - when(basicValidator.addPreprepareMessage(any())).thenReturn(false); + when(basicValidator.addSignedProposalPayload(any())).thenReturn(false); assertThat(validator.validateMessage(msg)).isFalse(); verify(validatorFactory, times(1)) - .createAt( - prepareCertificate - .getIbftPrePrepareMessage() - .getUnsignedMessageData() - .getRoundIdentifier()); + .createAt(prepareCertificate.getProposalPayload().getPayload().getRoundIdentifier()); verify(basicValidator, times(1)) - .addPreprepareMessage(prepareCertificate.getIbftPrePrepareMessage()); + .addSignedProposalPayload(prepareCertificate.getProposalPayload()); verify(basicValidator, never()).validatePrepareMessage(any()); verify(basicValidator, never()).validateCommmitMessage(any()); } @Test public void roundChangeContainingValidPreprepareButNoPrepareMessagesFails() { - final IbftPreparedCertificate prepareCertificate = - new IbftPreparedCertificate( - proposerMessageFactory.createIbftSignedPrePrepareMessageData(currentRound, block), + final PreparedCertificate prepareCertificate = + new PreparedCertificate( + proposerMessageFactory.createSignedProposalPayload(currentRound, block), Collections.emptyList()); - final IbftSignedMessageData msg = - proposerMessageFactory.createIbftSignedRoundChangeMessageData( + final SignedData msg = + proposerMessageFactory.createSignedRoundChangePayload( targetRound, Optional.of(prepareCertificate)); - when(basicValidator.addPreprepareMessage(any())).thenReturn(true); + when(basicValidator.addSignedProposalPayload(any())).thenReturn(true); assertThat(validator.validateMessage(msg)).isFalse(); } @Test public void roundChangeInvalidPrepareMessageFromProposerFails() { - final IbftSignedMessageData prepareMsg = - validatorMessageFactory.createIbftSignedPrepareMessageData(currentRound, block.getHash()); - final IbftPreparedCertificate prepareCertificate = - new IbftPreparedCertificate( - proposerMessageFactory.createIbftSignedPrePrepareMessageData(currentRound, block), + final SignedData prepareMsg = + validatorMessageFactory.createSignedPreparePayload(currentRound, block.getHash()); + final PreparedCertificate prepareCertificate = + new PreparedCertificate( + proposerMessageFactory.createSignedProposalPayload(currentRound, block), Lists.newArrayList(prepareMsg)); - when(basicValidator.addPreprepareMessage(any())).thenReturn(true); + when(basicValidator.addSignedProposalPayload(any())).thenReturn(true); when(basicValidator.validatePrepareMessage(any())).thenReturn(false); - final IbftSignedMessageData msg = - proposerMessageFactory.createIbftSignedRoundChangeMessageData( + final SignedData msg = + proposerMessageFactory.createSignedRoundChangePayload( targetRound, Optional.of(prepareCertificate)); assertThat(validator.validateMessage(msg)).isFalse(); @@ -162,8 +155,8 @@ public class RoundChangeMessageValidatorTest { final ConsensusRoundIdentifier latterRoundIdentifier = new ConsensusRoundIdentifier(currentRound.getSequenceNumber() + 1, 1); - final IbftSignedMessageData msg = - proposerMessageFactory.createIbftSignedRoundChangeMessageData( + final SignedData msg = + proposerMessageFactory.createSignedRoundChangePayload( latterRoundIdentifier, Optional.empty()); assertThat(validator.validateMessage(msg)).isFalse(); @@ -176,15 +169,15 @@ public class RoundChangeMessageValidatorTest { new ConsensusRoundIdentifier( currentRound.getSequenceNumber(), currentRound.getRoundNumber() + 2); - final IbftSignedMessageData prepareMsg = - validatorMessageFactory.createIbftSignedPrepareMessageData(futureRound, block.getHash()); - final IbftPreparedCertificate prepareCertificate = - new IbftPreparedCertificate( - proposerMessageFactory.createIbftSignedPrePrepareMessageData(futureRound, block), + final SignedData prepareMsg = + validatorMessageFactory.createSignedPreparePayload(futureRound, block.getHash()); + final PreparedCertificate prepareCertificate = + new PreparedCertificate( + proposerMessageFactory.createSignedProposalPayload(futureRound, block), Lists.newArrayList(prepareMsg)); - final IbftSignedMessageData msg = - proposerMessageFactory.createIbftSignedRoundChangeMessageData( + final SignedData msg = + proposerMessageFactory.createSignedRoundChangePayload( targetRound, Optional.of(prepareCertificate)); assertThat(validator.validateMessage(msg)).isFalse(); @@ -195,30 +188,26 @@ public class RoundChangeMessageValidatorTest { @Test public void roudnChangeWithPastPreprepareForCurrentHeightIsSuccessful() { - final IbftSignedMessageData prepareMsg = - validatorMessageFactory.createIbftSignedPrepareMessageData(currentRound, block.getHash()); - final IbftPreparedCertificate prepareCertificate = - new IbftPreparedCertificate( - proposerMessageFactory.createIbftSignedPrePrepareMessageData(currentRound, block), + final SignedData prepareMsg = + validatorMessageFactory.createSignedPreparePayload(currentRound, block.getHash()); + final PreparedCertificate prepareCertificate = + new PreparedCertificate( + proposerMessageFactory.createSignedProposalPayload(currentRound, block), Lists.newArrayList(prepareMsg)); - final IbftSignedMessageData msg = - proposerMessageFactory.createIbftSignedRoundChangeMessageData( + final SignedData msg = + proposerMessageFactory.createSignedRoundChangePayload( targetRound, Optional.of(prepareCertificate)); - when(basicValidator.addPreprepareMessage(prepareCertificate.getIbftPrePrepareMessage())) + when(basicValidator.addSignedProposalPayload(prepareCertificate.getProposalPayload())) .thenReturn(true); when(basicValidator.validatePrepareMessage(prepareMsg)).thenReturn(true); assertThat(validator.validateMessage(msg)).isTrue(); verify(validatorFactory, times(1)) - .createAt( - prepareCertificate - .getIbftPrePrepareMessage() - .getUnsignedMessageData() - .getRoundIdentifier()); + .createAt(prepareCertificate.getProposalPayload().getPayload().getRoundIdentifier()); verify(basicValidator, times(1)) - .addPreprepareMessage(prepareCertificate.getIbftPrePrepareMessage()); + .addSignedProposalPayload(prepareCertificate.getProposalPayload()); verify(basicValidator, times(1)).validatePrepareMessage(prepareMsg); } }