forked from hyperledger/besu
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Create Qbft Prepare and Commit messages (hyperledger#1691)
This adds the Prepare and Commit messages used in the QBFT protocol, this is an incremental movement toward QBFT - and does not offer new functionality. Signed-off-by: Trent Mohay <trent.mohay@consensys.net>
- Loading branch information
Showing
13 changed files
with
707 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,71 @@ | ||
/* | ||
* Copyright 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. | ||
* | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
|
||
apply plugin: 'java-library' | ||
|
||
jar { | ||
archiveBaseName = 'besu-qbft' | ||
manifest { | ||
attributes( | ||
'Specification-Title': archiveBaseName, | ||
'Specification-Version': project.version, | ||
'Implementation-Title': archiveBaseName, | ||
'Implementation-Version': calculateVersion() | ||
) | ||
} | ||
} | ||
|
||
dependencies { | ||
implementation project(':config') | ||
implementation project(':consensus:common') | ||
implementation project(':crypto') | ||
implementation project(':ethereum:api') | ||
implementation project(':ethereum:blockcreation') | ||
implementation project(':ethereum:core') | ||
implementation project(':ethereum:eth') | ||
implementation project(':ethereum:p2p') | ||
implementation project(':ethereum:rlp') | ||
implementation project(':services:kvstore') | ||
|
||
implementation 'com.google.guava:guava' | ||
implementation 'io.vertx:vertx-core' | ||
implementation 'org.apache.tuweni:bytes' | ||
implementation 'org.apache.tuweni:units' | ||
|
||
integrationTestImplementation project(path: ':config', configuration: 'testSupportArtifacts') | ||
integrationTestImplementation project(path: ':ethereum:core', configuration: 'testSupportArtifacts') | ||
|
||
testImplementation 'junit:junit' | ||
testImplementation 'org.awaitility:awaitility' | ||
testImplementation 'org.assertj:assertj-core' | ||
testImplementation 'org.mockito:mockito-core' | ||
testImplementation project(path: ':crypto', configuration: 'testSupportArtifacts') | ||
testImplementation project(path: ':config', configuration: 'testSupportArtifacts') | ||
testImplementation project(path: ':consensus:common', configuration: 'testArtifacts') | ||
testImplementation project(path: ':ethereum:core', configuration: 'testSupportArtifacts') | ||
testImplementation project(':metrics:core') | ||
testImplementation project(':testutil') | ||
testImplementation project(':crypto') | ||
|
||
integrationTestImplementation project(path: ':crypto', configuration: 'testSupportArtifacts') | ||
integrationTestImplementation project(':metrics:core') | ||
integrationTestImplementation project(':testutil') | ||
|
||
integrationTestImplementation 'junit:junit' | ||
integrationTestImplementation 'org.assertj:assertj-core' | ||
integrationTestImplementation 'org.mockito:mockito-core' | ||
|
||
testSupportImplementation 'org.mockito:mockito-core' | ||
} |
48 changes: 48 additions & 0 deletions
48
...qbft/src/main/java/org/hyperledger/besu/consensus/qbft/messagedata/CommitMessageData.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
/* | ||
* Copyright 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. | ||
* | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
package org.hyperledger.besu.consensus.qbft.messagedata; | ||
|
||
import org.hyperledger.besu.consensus.common.bft.messagedata.AbstractBftMessageData; | ||
import org.hyperledger.besu.consensus.qbft.messagewrappers.Commit; | ||
import org.hyperledger.besu.ethereum.p2p.rlpx.wire.MessageData; | ||
|
||
import org.apache.tuweni.bytes.Bytes; | ||
|
||
public class CommitMessageData extends AbstractBftMessageData { | ||
|
||
private static final int MESSAGE_CODE = QbftV1.COMMIT; | ||
|
||
private CommitMessageData(final Bytes data) { | ||
super(data); | ||
} | ||
|
||
public static CommitMessageData fromMessageData(final MessageData messageData) { | ||
return fromMessageData( | ||
messageData, MESSAGE_CODE, CommitMessageData.class, CommitMessageData::new); | ||
} | ||
|
||
public Commit decode() { | ||
return Commit.decode(data); | ||
} | ||
|
||
public static CommitMessageData create(final Commit commit) { | ||
return new CommitMessageData(commit.encode()); | ||
} | ||
|
||
@Override | ||
public int getCode() { | ||
return MESSAGE_CODE; | ||
} | ||
} |
48 changes: 48 additions & 0 deletions
48
...bft/src/main/java/org/hyperledger/besu/consensus/qbft/messagedata/PrepareMessageData.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
/* | ||
* Copyright 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. | ||
* | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
package org.hyperledger.besu.consensus.qbft.messagedata; | ||
|
||
import org.hyperledger.besu.consensus.common.bft.messagedata.AbstractBftMessageData; | ||
import org.hyperledger.besu.consensus.qbft.messagewrappers.Prepare; | ||
import org.hyperledger.besu.ethereum.p2p.rlpx.wire.MessageData; | ||
|
||
import org.apache.tuweni.bytes.Bytes; | ||
|
||
public class PrepareMessageData extends AbstractBftMessageData { | ||
|
||
private static final int MESSAGE_CODE = QbftV1.PREPARE; | ||
|
||
private PrepareMessageData(final Bytes data) { | ||
super(data); | ||
} | ||
|
||
public static PrepareMessageData fromMessageData(final MessageData messageData) { | ||
return fromMessageData( | ||
messageData, MESSAGE_CODE, PrepareMessageData.class, PrepareMessageData::new); | ||
} | ||
|
||
public Prepare decode() { | ||
return Prepare.decode(data); | ||
} | ||
|
||
public static PrepareMessageData create(final Prepare preapare) { | ||
return new PrepareMessageData(preapare.encode()); | ||
} | ||
|
||
@Override | ||
public int getCode() { | ||
return MESSAGE_CODE; | ||
} | ||
} |
25 changes: 25 additions & 0 deletions
25
consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/messagedata/QbftV1.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
/* | ||
* Copyright 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. | ||
* | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
package org.hyperledger.besu.consensus.qbft.messagedata; | ||
|
||
/** Message codes for QBFT v1 messages */ | ||
public class QbftV1 { | ||
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; | ||
|
||
public static final int MESSAGE_SPACE = 4; | ||
} |
44 changes: 44 additions & 0 deletions
44
consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/messagewrappers/Commit.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
/* | ||
* Copyright 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. | ||
* | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
package org.hyperledger.besu.consensus.qbft.messagewrappers; | ||
|
||
import org.hyperledger.besu.consensus.common.bft.messagewrappers.BftMessage; | ||
import org.hyperledger.besu.consensus.common.bft.payload.SignedData; | ||
import org.hyperledger.besu.consensus.qbft.payload.CommitPayload; | ||
import org.hyperledger.besu.consensus.qbft.payload.PayloadDeserializers; | ||
import org.hyperledger.besu.crypto.SECP256K1.Signature; | ||
import org.hyperledger.besu.ethereum.core.Hash; | ||
import org.hyperledger.besu.ethereum.rlp.RLP; | ||
|
||
import org.apache.tuweni.bytes.Bytes; | ||
|
||
public class Commit extends BftMessage<CommitPayload> { | ||
|
||
public Commit(final SignedData<CommitPayload> payload) { | ||
super(payload); | ||
} | ||
|
||
public Signature getCommitSeal() { | ||
return getPayload().getCommitSeal(); | ||
} | ||
|
||
public Hash getDigest() { | ||
return getPayload().getDigest(); | ||
} | ||
|
||
public static Commit decode(final Bytes data) { | ||
return new Commit(PayloadDeserializers.readSignedCommitPayloadFrom(RLP.input(data))); | ||
} | ||
} |
39 changes: 39 additions & 0 deletions
39
...ensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/messagewrappers/Prepare.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
/* | ||
* Copyright 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. | ||
* | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
package org.hyperledger.besu.consensus.qbft.messagewrappers; | ||
|
||
import org.hyperledger.besu.consensus.common.bft.messagewrappers.BftMessage; | ||
import org.hyperledger.besu.consensus.common.bft.payload.SignedData; | ||
import org.hyperledger.besu.consensus.qbft.payload.PayloadDeserializers; | ||
import org.hyperledger.besu.consensus.qbft.payload.PreparePayload; | ||
import org.hyperledger.besu.ethereum.core.Hash; | ||
import org.hyperledger.besu.ethereum.rlp.RLP; | ||
|
||
import org.apache.tuweni.bytes.Bytes; | ||
|
||
public class Prepare extends BftMessage<PreparePayload> { | ||
|
||
public Prepare(final SignedData<PreparePayload> payload) { | ||
super(payload); | ||
} | ||
|
||
public Hash getDigest() { | ||
return getPayload().getDigest(); | ||
} | ||
|
||
public static Prepare decode(final Bytes data) { | ||
return new Prepare(PayloadDeserializers.readSignedPreparePayloadFrom(RLP.input(data))); | ||
} | ||
} |
107 changes: 107 additions & 0 deletions
107
consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/payload/CommitPayload.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,107 @@ | ||
/* | ||
* Copyright 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. | ||
* | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
package org.hyperledger.besu.consensus.qbft.payload; | ||
|
||
import org.hyperledger.besu.consensus.common.bft.ConsensusRoundIdentifier; | ||
import org.hyperledger.besu.consensus.common.bft.payload.Payload; | ||
import org.hyperledger.besu.consensus.qbft.messagedata.QbftV1; | ||
import org.hyperledger.besu.crypto.SECP256K1.Signature; | ||
import org.hyperledger.besu.ethereum.core.Hash; | ||
import org.hyperledger.besu.ethereum.rlp.RLPInput; | ||
import org.hyperledger.besu.ethereum.rlp.RLPOutput; | ||
|
||
import java.util.Objects; | ||
import java.util.StringJoiner; | ||
|
||
public class CommitPayload implements Payload { | ||
private static final int TYPE = QbftV1.COMMIT; | ||
private final ConsensusRoundIdentifier roundIdentifier; | ||
private final Hash digest; | ||
private final Signature commitSeal; | ||
|
||
public CommitPayload( | ||
final ConsensusRoundIdentifier roundIdentifier, | ||
final Hash digest, | ||
final Signature commitSeal) { | ||
this.roundIdentifier = roundIdentifier; | ||
this.digest = digest; | ||
this.commitSeal = commitSeal; | ||
} | ||
|
||
public static CommitPayload readFrom(final RLPInput rlpInput) { | ||
rlpInput.enterList(); | ||
final ConsensusRoundIdentifier roundIdentifier = ConsensusRoundIdentifier.readFrom(rlpInput); | ||
final Hash digest = Payload.readDigest(rlpInput); | ||
final Signature commitSeal = rlpInput.readBytes(Signature::decode); | ||
rlpInput.leaveList(); | ||
|
||
return new CommitPayload(roundIdentifier, digest, commitSeal); | ||
} | ||
|
||
@Override | ||
public void writeTo(final RLPOutput rlpOutput) { | ||
rlpOutput.startList(); | ||
roundIdentifier.writeTo(rlpOutput); | ||
rlpOutput.writeBytes(digest); | ||
rlpOutput.writeBytes(commitSeal.encodedBytes()); | ||
rlpOutput.endList(); | ||
} | ||
|
||
@Override | ||
public int getMessageType() { | ||
return TYPE; | ||
} | ||
|
||
public Hash getDigest() { | ||
return digest; | ||
} | ||
|
||
public Signature getCommitSeal() { | ||
return commitSeal; | ||
} | ||
|
||
@Override | ||
public ConsensusRoundIdentifier getRoundIdentifier() { | ||
return roundIdentifier; | ||
} | ||
|
||
@Override | ||
public boolean equals(final Object o) { | ||
if (this == o) { | ||
return true; | ||
} | ||
if (o == null || getClass() != o.getClass()) { | ||
return false; | ||
} | ||
final CommitPayload that = (CommitPayload) o; | ||
return Objects.equals(roundIdentifier, that.roundIdentifier) | ||
&& Objects.equals(digest, that.digest) | ||
&& Objects.equals(commitSeal, that.commitSeal); | ||
} | ||
|
||
@Override | ||
public int hashCode() { | ||
return Objects.hash(roundIdentifier, digest, commitSeal); | ||
} | ||
|
||
@Override | ||
public String toString() { | ||
return new StringJoiner(", ", CommitPayload.class.getSimpleName() + "[", "]") | ||
.add("roundIdentifier=" + roundIdentifier) | ||
.add("digest=" + digest) | ||
.add("commitSeal=" + commitSeal) | ||
.toString(); | ||
} | ||
} |
Oops, something went wrong.