Skip to content
This repository was archived by the owner on Jul 1, 2025. It is now read-only.

Commit f130196

Browse files
jframegaryschulte
authored andcommitted
Move the core of qbft into a qbft core module (#8043)
Move the core of QBFT into a qbft core module so it can be reused outside Besu Signed-off-by: Jason Frame <[email protected]>
1 parent de178ac commit f130196

File tree

88 files changed

+586
-475
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

88 files changed

+586
-475
lines changed

besu/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ dependencies {
3939
implementation project(':consensus:ibft')
4040
implementation project(':consensus:merge')
4141
implementation project(':consensus:qbft')
42+
implementation project(':consensus:qbft-core')
4243
implementation project(':crypto:services')
4344
implementation project(':datatypes')
4445
implementation project(':enclave')

besu/src/main/java/org/hyperledger/besu/controller/QbftBesuControllerBuilder.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -47,20 +47,20 @@
4747
import org.hyperledger.besu.consensus.common.validator.blockbased.BlockValidatorProvider;
4848
import org.hyperledger.besu.consensus.qbft.QbftExtraDataCodec;
4949
import org.hyperledger.besu.consensus.qbft.QbftForksSchedulesFactory;
50-
import org.hyperledger.besu.consensus.qbft.QbftGossip;
5150
import org.hyperledger.besu.consensus.qbft.QbftProtocolScheduleBuilder;
5251
import org.hyperledger.besu.consensus.qbft.blockcreation.QbftBlockCreatorFactory;
52+
import org.hyperledger.besu.consensus.qbft.core.network.QbftGossip;
53+
import org.hyperledger.besu.consensus.qbft.core.payload.MessageFactory;
54+
import org.hyperledger.besu.consensus.qbft.core.statemachine.QbftBlockHeightManagerFactory;
55+
import org.hyperledger.besu.consensus.qbft.core.statemachine.QbftController;
56+
import org.hyperledger.besu.consensus.qbft.core.statemachine.QbftRoundFactory;
57+
import org.hyperledger.besu.consensus.qbft.core.validation.MessageValidatorFactory;
58+
import org.hyperledger.besu.consensus.qbft.core.validator.ValidatorModeTransitionLogger;
5359
import org.hyperledger.besu.consensus.qbft.jsonrpc.QbftJsonRpcMethods;
54-
import org.hyperledger.besu.consensus.qbft.payload.MessageFactory;
5560
import org.hyperledger.besu.consensus.qbft.protocol.Istanbul100SubProtocol;
56-
import org.hyperledger.besu.consensus.qbft.statemachine.QbftBlockHeightManagerFactory;
57-
import org.hyperledger.besu.consensus.qbft.statemachine.QbftController;
58-
import org.hyperledger.besu.consensus.qbft.statemachine.QbftRoundFactory;
59-
import org.hyperledger.besu.consensus.qbft.validation.MessageValidatorFactory;
6061
import org.hyperledger.besu.consensus.qbft.validator.ForkingValidatorProvider;
6162
import org.hyperledger.besu.consensus.qbft.validator.TransactionValidatorProvider;
6263
import org.hyperledger.besu.consensus.qbft.validator.ValidatorContractController;
63-
import org.hyperledger.besu.consensus.qbft.validator.ValidatorModeTransitionLogger;
6464
import org.hyperledger.besu.datatypes.Address;
6565
import org.hyperledger.besu.ethereum.ProtocolContext;
6666
import org.hyperledger.besu.ethereum.api.jsonrpc.methods.JsonRpcMethods;

consensus/common/src/test-support/java/org/hyperledger/besu/consensus/common/bft/BftContextBuilder.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,12 +73,20 @@ public static <T extends BftContext> T setupContextWithBftExtraDataEncoder(
7373
final Class<T> contextClazz,
7474
final Collection<Address> validators,
7575
final BftExtraDataCodec bftExtraDataCodec) {
76+
return setupContextWithBftBlockInterface(
77+
contextClazz, validators, new BftBlockInterface(bftExtraDataCodec));
78+
}
79+
80+
public static <T extends BftContext> T setupContextWithBftBlockInterface(
81+
final Class<T> contextClazz,
82+
final Collection<Address> validators,
83+
final BftBlockInterface bftBlockInterface) {
7684
final T bftContext = mock(contextClazz, withSettings().strictness(Strictness.LENIENT));
7785
final ValidatorProvider mockValidatorProvider =
7886
mock(ValidatorProvider.class, withSettings().strictness(Strictness.LENIENT));
7987
when(bftContext.getValidatorProvider()).thenReturn(mockValidatorProvider);
8088
when(mockValidatorProvider.getValidatorsAfterBlock(any())).thenReturn(validators);
81-
when(bftContext.getBlockInterface()).thenReturn(new BftBlockInterface(bftExtraDataCodec));
89+
when(bftContext.getBlockInterface()).thenReturn(bftBlockInterface);
8290
when(bftContext.as(any())).thenReturn(bftContext);
8391

8492
return bftContext;

consensus/qbft-core/build.gradle

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
/*
2+
* Copyright Besu Contributors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
5+
* the License. You may obtain a copy of the License at
6+
*
7+
* http://www.apache.org/licenses/LICENSE-2.0
8+
*
9+
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
10+
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
11+
* specific language governing permissions and limitations under the License.
12+
*
13+
* SPDX-License-Identifier: Apache-2.0
14+
*/
15+
16+
apply plugin: 'java-library'
17+
18+
jar {
19+
archiveBaseName = 'besu-qbft-core'
20+
manifest {
21+
attributes(
22+
'Specification-Title': archiveBaseName,
23+
'Specification-Version': project.version,
24+
'Implementation-Title': archiveBaseName,
25+
'Implementation-Version': calculateVersion(),
26+
'Commit-Hash': getGitCommitDetails(40).hash
27+
)
28+
}
29+
}
30+
31+
dependencies {
32+
implementation project(':config')
33+
implementation project(':consensus:common')
34+
implementation project(':crypto:services')
35+
implementation project(':datatypes')
36+
implementation project(':ethereum:blockcreation')
37+
implementation project(':ethereum:core')
38+
implementation project(':ethereum:eth')
39+
implementation project(':ethereum:p2p')
40+
implementation project(':ethereum:rlp')
41+
implementation project(':evm')
42+
43+
implementation 'com.google.guava:guava'
44+
implementation 'io.tmio:tuweni-bytes'
45+
46+
integrationTestImplementation project(path: ':config', configuration: 'testSupportArtifacts')
47+
integrationTestImplementation project(path: ':ethereum:core', configuration: 'testSupportArtifacts')
48+
49+
testImplementation project(path: ':crypto:services', configuration: 'testSupportArtifacts')
50+
testImplementation project(path: ':config', configuration: 'testSupportArtifacts')
51+
testImplementation project(path: ':consensus:common', configuration: 'testArtifacts')
52+
testImplementation project(path: ':consensus:common', configuration: 'testSupportArtifacts')
53+
testImplementation project(':ethereum:core')
54+
testImplementation project(path: ':ethereum:core', configuration: 'testSupportArtifacts')
55+
testImplementation project(':crypto:algorithms')
56+
testImplementation project(':evm')
57+
testImplementation project(':metrics:core')
58+
testImplementation project(':testutil')
59+
60+
testImplementation 'org.assertj:assertj-core'
61+
testImplementation 'org.awaitility:awaitility'
62+
testImplementation 'org.junit.jupiter:junit-jupiter'
63+
testImplementation 'org.mockito:mockito-core'
64+
testImplementation 'org.mockito:mockito-junit-jupiter'
65+
66+
integrationTestImplementation project(':crypto:algorithms')
67+
integrationTestImplementation project(path: ':crypto:services', configuration: 'testSupportArtifacts')
68+
integrationTestImplementation project(path: ':consensus:common', configuration: 'testSupportArtifacts')
69+
integrationTestImplementation project(':consensus:qbft')
70+
integrationTestImplementation project(':evm')
71+
integrationTestImplementation project(':metrics:core')
72+
integrationTestImplementation project(':testutil')
73+
74+
integrationTestImplementation 'org.assertj:assertj-core'
75+
integrationTestImplementation 'org.junit.jupiter:junit-jupiter-api'
76+
integrationTestImplementation 'org.mockito:mockito-core'
77+
integrationTestImplementation 'org.mockito:mockito-junit-jupiter'
78+
79+
integrationTestRuntimeOnly 'org.junit.jupiter:junit-jupiter'
80+
81+
testSupportImplementation 'org.mockito:mockito-core'
82+
}

consensus/qbft/src/integration-test/java/org/hyperledger/besu/consensus/qbft/support/IntegrationTestHelpers.java renamed to consensus/qbft-core/src/integration-test/java/org/hyperledger/besu/consensus/qbft/core/support/IntegrationTestHelpers.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,17 @@
1212
*
1313
* SPDX-License-Identifier: Apache-2.0
1414
*/
15-
package org.hyperledger.besu.consensus.qbft.support;
15+
package org.hyperledger.besu.consensus.qbft.core.support;
1616

1717
import org.hyperledger.besu.consensus.common.bft.BftBlockHashing;
1818
import org.hyperledger.besu.consensus.common.bft.BftBlockHeaderFunctions;
1919
import org.hyperledger.besu.consensus.common.bft.BftBlockInterface;
2020
import org.hyperledger.besu.consensus.common.bft.ConsensusRoundIdentifier;
2121
import org.hyperledger.besu.consensus.common.bft.payload.SignedData;
2222
import org.hyperledger.besu.consensus.qbft.QbftExtraDataCodec;
23-
import org.hyperledger.besu.consensus.qbft.payload.CommitPayload;
24-
import org.hyperledger.besu.consensus.qbft.payload.MessageFactory;
25-
import org.hyperledger.besu.consensus.qbft.statemachine.PreparedCertificate;
23+
import org.hyperledger.besu.consensus.qbft.core.payload.CommitPayload;
24+
import org.hyperledger.besu.consensus.qbft.core.payload.MessageFactory;
25+
import org.hyperledger.besu.consensus.qbft.core.statemachine.PreparedCertificate;
2626
import org.hyperledger.besu.crypto.SECPSignature;
2727
import org.hyperledger.besu.cryptoservices.NodeKey;
2828
import org.hyperledger.besu.ethereum.core.Block;

consensus/qbft/src/integration-test/java/org/hyperledger/besu/consensus/qbft/support/RoundSpecificPeers.java renamed to consensus/qbft-core/src/integration-test/java/org/hyperledger/besu/consensus/qbft/core/support/RoundSpecificPeers.java

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
*
1313
* SPDX-License-Identifier: Apache-2.0
1414
*/
15-
package org.hyperledger.besu.consensus.qbft.support;
15+
package org.hyperledger.besu.consensus.qbft.core.support;
1616

1717
import static java.util.Optional.empty;
1818
import static org.assertj.core.api.Assertions.assertThat;
@@ -23,15 +23,15 @@
2323
import org.hyperledger.besu.consensus.common.bft.messagewrappers.BftMessage;
2424
import org.hyperledger.besu.consensus.common.bft.payload.Payload;
2525
import org.hyperledger.besu.consensus.common.bft.payload.SignedData;
26-
import org.hyperledger.besu.consensus.qbft.messagedata.CommitMessageData;
27-
import org.hyperledger.besu.consensus.qbft.messagedata.PrepareMessageData;
28-
import org.hyperledger.besu.consensus.qbft.messagedata.ProposalMessageData;
29-
import org.hyperledger.besu.consensus.qbft.messagedata.QbftV1;
30-
import org.hyperledger.besu.consensus.qbft.messagedata.RoundChangeMessageData;
31-
import org.hyperledger.besu.consensus.qbft.messagewrappers.RoundChange;
32-
import org.hyperledger.besu.consensus.qbft.payload.PreparePayload;
33-
import org.hyperledger.besu.consensus.qbft.payload.RoundChangePayload;
34-
import org.hyperledger.besu.consensus.qbft.statemachine.PreparedCertificate;
26+
import org.hyperledger.besu.consensus.qbft.core.messagedata.CommitMessageData;
27+
import org.hyperledger.besu.consensus.qbft.core.messagedata.PrepareMessageData;
28+
import org.hyperledger.besu.consensus.qbft.core.messagedata.ProposalMessageData;
29+
import org.hyperledger.besu.consensus.qbft.core.messagedata.QbftV1;
30+
import org.hyperledger.besu.consensus.qbft.core.messagedata.RoundChangeMessageData;
31+
import org.hyperledger.besu.consensus.qbft.core.messagewrappers.RoundChange;
32+
import org.hyperledger.besu.consensus.qbft.core.payload.PreparePayload;
33+
import org.hyperledger.besu.consensus.qbft.core.payload.RoundChangePayload;
34+
import org.hyperledger.besu.consensus.qbft.core.statemachine.PreparedCertificate;
3535
import org.hyperledger.besu.crypto.SECPSignature;
3636
import org.hyperledger.besu.datatypes.Hash;
3737
import org.hyperledger.besu.ethereum.core.Block;

consensus/qbft/src/integration-test/java/org/hyperledger/besu/consensus/qbft/support/TestContext.java renamed to consensus/qbft-core/src/integration-test/java/org/hyperledger/besu/consensus/qbft/core/support/TestContext.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
*
1313
* SPDX-License-Identifier: Apache-2.0
1414
*/
15-
package org.hyperledger.besu.consensus.qbft.support;
15+
package org.hyperledger.besu.consensus.qbft.core.support;
1616

1717
import org.hyperledger.besu.consensus.common.bft.BftBlockHeaderFunctions;
1818
import org.hyperledger.besu.consensus.common.bft.BftExecutors;
@@ -23,7 +23,7 @@
2323
import org.hyperledger.besu.consensus.common.bft.statemachine.BftEventHandler;
2424
import org.hyperledger.besu.consensus.common.bft.statemachine.BftFinalState;
2525
import org.hyperledger.besu.consensus.common.validator.ValidatorProvider;
26-
import org.hyperledger.besu.consensus.qbft.payload.MessageFactory;
26+
import org.hyperledger.besu.consensus.qbft.core.payload.MessageFactory;
2727
import org.hyperledger.besu.datatypes.Address;
2828
import org.hyperledger.besu.ethereum.chain.MutableBlockchain;
2929
import org.hyperledger.besu.ethereum.core.Block;

consensus/qbft/src/integration-test/java/org/hyperledger/besu/consensus/qbft/support/TestContextBuilder.java renamed to consensus/qbft-core/src/integration-test/java/org/hyperledger/besu/consensus/qbft/core/support/TestContextBuilder.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
*
1313
* SPDX-License-Identifier: Apache-2.0
1414
*/
15-
package org.hyperledger.besu.consensus.qbft.support;
15+
package org.hyperledger.besu.consensus.qbft.core.support;
1616

1717
import static java.nio.charset.StandardCharsets.UTF_8;
1818
import static org.hyperledger.besu.ethereum.core.InMemoryKeyValueStorageProvider.createInMemoryBlockchain;
@@ -64,18 +64,18 @@
6464
import org.hyperledger.besu.consensus.qbft.MutableQbftConfigOptions;
6565
import org.hyperledger.besu.consensus.qbft.QbftExtraDataCodec;
6666
import org.hyperledger.besu.consensus.qbft.QbftForksSchedulesFactory;
67-
import org.hyperledger.besu.consensus.qbft.QbftGossip;
6867
import org.hyperledger.besu.consensus.qbft.QbftProtocolScheduleBuilder;
6968
import org.hyperledger.besu.consensus.qbft.blockcreation.QbftBlockCreatorFactory;
70-
import org.hyperledger.besu.consensus.qbft.payload.MessageFactory;
71-
import org.hyperledger.besu.consensus.qbft.statemachine.QbftBlockHeightManagerFactory;
72-
import org.hyperledger.besu.consensus.qbft.statemachine.QbftController;
73-
import org.hyperledger.besu.consensus.qbft.statemachine.QbftRoundFactory;
74-
import org.hyperledger.besu.consensus.qbft.validation.MessageValidatorFactory;
69+
import org.hyperledger.besu.consensus.qbft.core.network.QbftGossip;
70+
import org.hyperledger.besu.consensus.qbft.core.payload.MessageFactory;
71+
import org.hyperledger.besu.consensus.qbft.core.statemachine.QbftBlockHeightManagerFactory;
72+
import org.hyperledger.besu.consensus.qbft.core.statemachine.QbftController;
73+
import org.hyperledger.besu.consensus.qbft.core.statemachine.QbftRoundFactory;
74+
import org.hyperledger.besu.consensus.qbft.core.validation.MessageValidatorFactory;
75+
import org.hyperledger.besu.consensus.qbft.core.validator.ValidatorModeTransitionLogger;
7576
import org.hyperledger.besu.consensus.qbft.validator.ForkingValidatorProvider;
7677
import org.hyperledger.besu.consensus.qbft.validator.TransactionValidatorProvider;
7778
import org.hyperledger.besu.consensus.qbft.validator.ValidatorContractController;
78-
import org.hyperledger.besu.consensus.qbft.validator.ValidatorModeTransitionLogger;
7979
import org.hyperledger.besu.cryptoservices.NodeKey;
8080
import org.hyperledger.besu.datatypes.Address;
8181
import org.hyperledger.besu.datatypes.Hash;

consensus/qbft/src/integration-test/java/org/hyperledger/besu/consensus/qbft/support/ValidatorPeer.java renamed to consensus/qbft-core/src/integration-test/java/org/hyperledger/besu/consensus/qbft/core/support/ValidatorPeer.java

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,27 +12,27 @@
1212
*
1313
* SPDX-License-Identifier: Apache-2.0
1414
*/
15-
package org.hyperledger.besu.consensus.qbft.support;
15+
package org.hyperledger.besu.consensus.qbft.core.support;
1616

17-
import static org.hyperledger.besu.consensus.qbft.support.IntegrationTestHelpers.createCommitBlockFromProposalBlock;
17+
import static org.hyperledger.besu.consensus.qbft.core.support.IntegrationTestHelpers.createCommitBlockFromProposalBlock;
1818

1919
import org.hyperledger.besu.consensus.common.bft.ConsensusRoundIdentifier;
2020
import org.hyperledger.besu.consensus.common.bft.EventMultiplexer;
2121
import org.hyperledger.besu.consensus.common.bft.inttest.DefaultValidatorPeer;
2222
import org.hyperledger.besu.consensus.common.bft.inttest.NodeParams;
2323
import org.hyperledger.besu.consensus.common.bft.payload.SignedData;
24-
import org.hyperledger.besu.consensus.qbft.messagedata.CommitMessageData;
25-
import org.hyperledger.besu.consensus.qbft.messagedata.PrepareMessageData;
26-
import org.hyperledger.besu.consensus.qbft.messagedata.ProposalMessageData;
27-
import org.hyperledger.besu.consensus.qbft.messagedata.RoundChangeMessageData;
28-
import org.hyperledger.besu.consensus.qbft.messagewrappers.Commit;
29-
import org.hyperledger.besu.consensus.qbft.messagewrappers.Prepare;
30-
import org.hyperledger.besu.consensus.qbft.messagewrappers.Proposal;
31-
import org.hyperledger.besu.consensus.qbft.messagewrappers.RoundChange;
32-
import org.hyperledger.besu.consensus.qbft.payload.MessageFactory;
33-
import org.hyperledger.besu.consensus.qbft.payload.PreparePayload;
34-
import org.hyperledger.besu.consensus.qbft.payload.RoundChangePayload;
35-
import org.hyperledger.besu.consensus.qbft.statemachine.PreparedCertificate;
24+
import org.hyperledger.besu.consensus.qbft.core.messagedata.CommitMessageData;
25+
import org.hyperledger.besu.consensus.qbft.core.messagedata.PrepareMessageData;
26+
import org.hyperledger.besu.consensus.qbft.core.messagedata.ProposalMessageData;
27+
import org.hyperledger.besu.consensus.qbft.core.messagedata.RoundChangeMessageData;
28+
import org.hyperledger.besu.consensus.qbft.core.messagewrappers.Commit;
29+
import org.hyperledger.besu.consensus.qbft.core.messagewrappers.Prepare;
30+
import org.hyperledger.besu.consensus.qbft.core.messagewrappers.Proposal;
31+
import org.hyperledger.besu.consensus.qbft.core.messagewrappers.RoundChange;
32+
import org.hyperledger.besu.consensus.qbft.core.payload.MessageFactory;
33+
import org.hyperledger.besu.consensus.qbft.core.payload.PreparePayload;
34+
import org.hyperledger.besu.consensus.qbft.core.payload.RoundChangePayload;
35+
import org.hyperledger.besu.consensus.qbft.core.statemachine.PreparedCertificate;
3636
import org.hyperledger.besu.crypto.SECPSignature;
3737
import org.hyperledger.besu.datatypes.Hash;
3838
import org.hyperledger.besu.ethereum.core.Block;

consensus/qbft/src/integration-test/java/org/hyperledger/besu/consensus/qbft/test/FutureHeightTest.java renamed to consensus/qbft-core/src/integration-test/java/org/hyperledger/besu/consensus/qbft/core/test/FutureHeightTest.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,23 +12,23 @@
1212
*
1313
* SPDX-License-Identifier: Apache-2.0
1414
*/
15-
package org.hyperledger.besu.consensus.qbft.test;
15+
package org.hyperledger.besu.consensus.qbft.core.test;
1616

1717
import static org.assertj.core.api.Assertions.assertThat;
1818
import static org.assertj.core.util.Lists.emptyList;
19-
import static org.hyperledger.besu.consensus.qbft.support.IntegrationTestHelpers.createSignedCommitPayload;
19+
import static org.hyperledger.besu.consensus.qbft.core.support.IntegrationTestHelpers.createSignedCommitPayload;
2020

2121
import org.hyperledger.besu.consensus.common.bft.BftExtraDataCodec;
2222
import org.hyperledger.besu.consensus.common.bft.BftHelpers;
2323
import org.hyperledger.besu.consensus.common.bft.ConsensusRoundIdentifier;
2424
import org.hyperledger.besu.consensus.common.bft.events.NewChainHead;
2525
import org.hyperledger.besu.consensus.qbft.QbftExtraDataCodec;
26-
import org.hyperledger.besu.consensus.qbft.messagewrappers.Commit;
27-
import org.hyperledger.besu.consensus.qbft.messagewrappers.Prepare;
28-
import org.hyperledger.besu.consensus.qbft.payload.MessageFactory;
29-
import org.hyperledger.besu.consensus.qbft.support.RoundSpecificPeers;
30-
import org.hyperledger.besu.consensus.qbft.support.TestContext;
31-
import org.hyperledger.besu.consensus.qbft.support.TestContextBuilder;
26+
import org.hyperledger.besu.consensus.qbft.core.messagewrappers.Commit;
27+
import org.hyperledger.besu.consensus.qbft.core.messagewrappers.Prepare;
28+
import org.hyperledger.besu.consensus.qbft.core.payload.MessageFactory;
29+
import org.hyperledger.besu.consensus.qbft.core.support.RoundSpecificPeers;
30+
import org.hyperledger.besu.consensus.qbft.core.support.TestContext;
31+
import org.hyperledger.besu.consensus.qbft.core.support.TestContextBuilder;
3232
import org.hyperledger.besu.ethereum.core.Block;
3333

3434
import java.time.Clock;

0 commit comments

Comments
 (0)