Remove some unneeded types from the QBFT core (#8371)

Signed-off-by: Jason Frame <jason.frame@consensys.net>
This commit is contained in:
Jason Frame
2025-03-06 10:19:20 +10:00
committed by GitHub
parent e76ddc7bc7
commit d8844a6a29
26 changed files with 106 additions and 440 deletions

View File

@@ -52,7 +52,6 @@ import org.hyperledger.besu.consensus.qbft.adaptor.QbftBlockCodecAdaptor;
import org.hyperledger.besu.consensus.qbft.adaptor.QbftBlockCreatorFactoryAdaptor;
import org.hyperledger.besu.consensus.qbft.adaptor.QbftBlockInterfaceAdaptor;
import org.hyperledger.besu.consensus.qbft.adaptor.QbftBlockchainAdaptor;
import org.hyperledger.besu.consensus.qbft.adaptor.QbftExtraDataProviderAdaptor;
import org.hyperledger.besu.consensus.qbft.adaptor.QbftFinalStateImpl;
import org.hyperledger.besu.consensus.qbft.adaptor.QbftProtocolScheduleAdaptor;
import org.hyperledger.besu.consensus.qbft.adaptor.QbftValidatorModeTransitionLoggerAdaptor;
@@ -283,8 +282,7 @@ public class QbftBesuControllerBuilder extends BesuControllerBuilder {
minedBlockObservers,
messageValidatorFactory,
messageFactory,
qbftExtraDataCodec,
new QbftExtraDataProviderAdaptor(qbftExtraDataCodec));
qbftExtraDataCodec);
QbftBlockHeightManagerFactory qbftBlockHeightManagerFactory =
new QbftBlockHeightManagerFactory(
finalState,

View File

@@ -66,7 +66,6 @@ import org.hyperledger.besu.consensus.qbft.adaptor.QbftBlockCodecAdaptor;
import org.hyperledger.besu.consensus.qbft.adaptor.QbftBlockCreatorFactoryAdaptor;
import org.hyperledger.besu.consensus.qbft.adaptor.QbftBlockInterfaceAdaptor;
import org.hyperledger.besu.consensus.qbft.adaptor.QbftBlockchainAdaptor;
import org.hyperledger.besu.consensus.qbft.adaptor.QbftExtraDataProviderAdaptor;
import org.hyperledger.besu.consensus.qbft.adaptor.QbftFinalStateImpl;
import org.hyperledger.besu.consensus.qbft.adaptor.QbftProtocolScheduleAdaptor;
import org.hyperledger.besu.consensus.qbft.adaptor.QbftValidatorModeTransitionLoggerAdaptor;
@@ -81,7 +80,6 @@ import org.hyperledger.besu.consensus.qbft.core.types.QbftBlockCodec;
import org.hyperledger.besu.consensus.qbft.core.types.QbftBlockInterface;
import org.hyperledger.besu.consensus.qbft.core.types.QbftContext;
import org.hyperledger.besu.consensus.qbft.core.types.QbftEventHandler;
import org.hyperledger.besu.consensus.qbft.core.types.QbftExtraDataProvider;
import org.hyperledger.besu.consensus.qbft.core.types.QbftFinalState;
import org.hyperledger.besu.consensus.qbft.core.types.QbftMinedBlockObserver;
import org.hyperledger.besu.consensus.qbft.core.types.QbftValidatorProvider;
@@ -560,8 +558,6 @@ public class TestContextBuilder {
FUTURE_MESSAGES_MAX_DISTANCE,
FUTURE_MESSAGES_LIMIT,
blockChain.getChainHeadBlockNumber());
final QbftExtraDataProvider qbftExtraDataProvider =
new QbftExtraDataProviderAdaptor(BFT_EXTRA_DATA_ENCODER);
final QbftValidatorModeTransitionLoggerAdaptor validatorModeTransitionLogger =
new QbftValidatorModeTransitionLoggerAdaptor(
new ValidatorModeTransitionLogger(forksSchedule));
@@ -579,8 +575,7 @@ public class TestContextBuilder {
minedBlockObservers,
messageValidatorFactory,
messageFactory,
BFT_EXTRA_DATA_ENCODER,
qbftExtraDataProvider),
BFT_EXTRA_DATA_ENCODER),
messageValidatorFactory,
messageFactory,
validatorModeTransitionLogger),

View File

@@ -21,18 +21,18 @@ import org.hyperledger.besu.config.BftFork;
import org.hyperledger.besu.config.JsonUtil;
import org.hyperledger.besu.config.QbftFork;
import org.hyperledger.besu.config.QbftFork.VALIDATOR_SELECTION_MODE;
import org.hyperledger.besu.consensus.common.bft.BftExtraData;
import org.hyperledger.besu.consensus.common.bft.ConsensusRoundIdentifier;
import org.hyperledger.besu.consensus.common.bft.events.BlockTimerExpiry;
import org.hyperledger.besu.consensus.common.bft.inttest.NodeParams;
import org.hyperledger.besu.consensus.qbft.QbftExtraDataCodec;
import org.hyperledger.besu.consensus.qbft.adaptor.QbftExtraDataProviderAdaptor;
import org.hyperledger.besu.consensus.qbft.adaptor.BlockUtil;
import org.hyperledger.besu.consensus.qbft.core.support.RoundSpecificPeers;
import org.hyperledger.besu.consensus.qbft.core.support.TestContext;
import org.hyperledger.besu.consensus.qbft.core.support.TestContextBuilder;
import org.hyperledger.besu.consensus.qbft.core.support.ValidatorPeer;
import org.hyperledger.besu.consensus.qbft.core.types.QbftBlock;
import org.hyperledger.besu.consensus.qbft.core.types.QbftBlockHeader;
import org.hyperledger.besu.consensus.qbft.core.types.QbftExtraDataProvider;
import org.hyperledger.besu.consensus.qbft.core.types.QbftNewChainHead;
import org.hyperledger.besu.consensus.qbft.core.types.QbftValidatorProvider;
import org.hyperledger.besu.cryptoservices.NodeKeyUtils;
@@ -67,9 +67,7 @@ public class ValidatorContractTest {
Address.fromHexString("0x0000000000000000000000000000000000009999");
private TestClock clock;
private final QbftExtraDataProvider extraDataProvider =
new QbftExtraDataProviderAdaptor(new QbftExtraDataCodec());
private final QbftExtraDataCodec qbftExtraDataCodec = new QbftExtraDataCodec();
@BeforeEach
public void setup() {
@@ -252,13 +250,12 @@ public class ValidatorContractTest {
final QbftBlockHeader block1 = context.getBlockHeader(1);
assertThat(validatorProvider.getValidatorsForBlock(genesisBlock)).isEqualTo(block0Addresses);
assertThat(extraDataProvider.getExtraData(genesisBlock).getValidators())
.containsExactly(NODE_ADDRESS);
assertThat(getExtraData(genesisBlock).getValidators()).containsExactly(NODE_ADDRESS);
// contract block extra data cannot contain validators or vote
assertThat(validatorProvider.getValidatorsForBlock(block1)).isEqualTo(block1Addresses);
assertThat(extraDataProvider.getExtraData(block1).getValidators()).isEmpty();
assertThat(extraDataProvider.getExtraData(block1).getVote()).isEmpty();
assertThat(getExtraData(block1).getValidators()).isEmpty();
assertThat(getExtraData(block1).getVote()).isEmpty();
}
@Test
@@ -292,13 +289,13 @@ public class ValidatorContractTest {
// contract block extra data cannot contain validators or vote
assertThat(validatorProvider.getValidatorsForBlock(genesisBlock)).isEqualTo(block0Addresses);
assertThat(extraDataProvider.getExtraData(genesisBlock).getValidators()).isEmpty();
assertThat(extraDataProvider.getExtraData(genesisBlock).getVote()).isEmpty();
assertThat(getExtraData(genesisBlock).getValidators()).isEmpty();
assertThat(getExtraData(genesisBlock).getVote()).isEmpty();
// contract block extra data cannot contain validators or vote
assertThat(validatorProvider.getValidatorsForBlock(block1)).isEqualTo(block1Addresses);
assertThat(extraDataProvider.getExtraData(block1).getValidators()).isEmpty();
assertThat(extraDataProvider.getExtraData(block1).getVote()).isEmpty();
assertThat(getExtraData(block1).getValidators()).isEmpty();
assertThat(getExtraData(block1).getVote()).isEmpty();
}
@Test
@@ -336,18 +333,16 @@ public class ValidatorContractTest {
// contract block extra data cannot contain validators or vote
assertThat(validatorProvider.getValidatorsForBlock(genesisBlock)).isEqualTo(block0Addresses);
assertThat(extraDataProvider.getExtraData(genesisBlock).getValidators()).isEmpty();
assertThat(extraDataProvider.getExtraData(genesisBlock).getVote()).isEmpty();
assertThat(getExtraData(genesisBlock).getValidators()).isEmpty();
assertThat(getExtraData(genesisBlock).getVote()).isEmpty();
// uses overridden validators
assertThat(validatorProvider.getValidatorsForBlock(block1)).isEqualTo(block1Addresses);
assertThat(extraDataProvider.getExtraData(block1).getValidators())
.containsExactly(NODE_2_ADDRESS, NODE_ADDRESS);
assertThat(getExtraData(block1).getValidators()).containsExactly(NODE_2_ADDRESS, NODE_ADDRESS);
// uses cached validators
assertThat(validatorProvider.getValidatorsForBlock(block2)).isEqualTo(block1Addresses);
assertThat(extraDataProvider.getExtraData(block2).getValidators())
.containsExactly(NODE_2_ADDRESS, NODE_ADDRESS);
assertThat(getExtraData(block2).getValidators()).containsExactly(NODE_2_ADDRESS, NODE_ADDRESS);
}
@Test
@@ -392,23 +387,20 @@ public class ValidatorContractTest {
final QbftBlockHeader block3 = context.getBlockHeader(3);
assertThat(validatorProvider.getValidatorsForBlock(genesisBlock)).isEqualTo(block0Addresses);
assertThat(extraDataProvider.getExtraData(genesisBlock).getValidators())
.containsExactly(NODE_ADDRESS);
assertThat(getExtraData(genesisBlock).getValidators()).containsExactly(NODE_ADDRESS);
// contract block extra data cannot contain validators or vote
assertThat(validatorProvider.getValidatorsForBlock(block1)).isEqualTo(block1Addresses);
assertThat(extraDataProvider.getExtraData(block1).getValidators()).isEmpty();
assertThat(extraDataProvider.getExtraData(block1).getVote()).isEmpty();
assertThat(getExtraData(block1).getValidators()).isEmpty();
assertThat(getExtraData(block1).getVote()).isEmpty();
// uses overridden validators
assertThat(validatorProvider.getValidatorsForBlock(block2)).isEqualTo(block1Addresses);
assertThat(extraDataProvider.getExtraData(block2).getValidators())
.containsExactly(NODE_2_ADDRESS, NODE_ADDRESS);
assertThat(getExtraData(block2).getValidators()).containsExactly(NODE_2_ADDRESS, NODE_ADDRESS);
// uses cached validators
assertThat(validatorProvider.getValidatorsForBlock(block3)).isEqualTo(block1Addresses);
assertThat(extraDataProvider.getExtraData(block3).getValidators())
.containsExactly(NODE_2_ADDRESS, NODE_ADDRESS);
assertThat(getExtraData(block3).getValidators()).containsExactly(NODE_2_ADDRESS, NODE_ADDRESS);
}
@Test
@@ -450,17 +442,16 @@ public class ValidatorContractTest {
// contract block extra data cannot contain validators or vote
assertThat(validatorProvider.getValidatorsForBlock(genesisBlock)).isEqualTo(block0Addresses);
assertThat(extraDataProvider.getExtraData(genesisBlock).getValidators()).isEmpty();
assertThat(extraDataProvider.getExtraData(genesisBlock).getVote()).isEmpty();
assertThat(getExtraData(genesisBlock).getValidators()).isEmpty();
assertThat(getExtraData(genesisBlock).getVote()).isEmpty();
assertThat(validatorProvider.getValidatorsForBlock(block1)).isEqualTo(block1Addresses);
assertThat(extraDataProvider.getExtraData(block1).getValidators())
.containsExactly(NODE_2_ADDRESS);
assertThat(getExtraData(block1).getValidators()).containsExactly(NODE_2_ADDRESS);
// contract block extra data cannot contain validators or vote
assertThat(validatorProvider.getValidatorsForBlock(block2)).isEqualTo(block2Addresses);
assertThat(extraDataProvider.getExtraData(block2).getValidators()).isEmpty();
assertThat(extraDataProvider.getExtraData(block2).getVote()).isEmpty();
assertThat(getExtraData(block2).getValidators()).isEmpty();
assertThat(getExtraData(block2).getVote()).isEmpty();
}
private void createNewBlockAsProposer(final TestContext context, final long blockNumber) {
@@ -545,4 +536,8 @@ public class ValidatorContractTest {
BftFork.VALIDATORS_KEY,
JsonUtil.getObjectMapper().createArrayNode().addAll(jsonValidators))));
}
private BftExtraData getExtraData(final QbftBlockHeader blockHeader) {
return qbftExtraDataCodec.decode(BlockUtil.toBesuBlockHeader(blockHeader));
}
}

View File

@@ -30,7 +30,6 @@ import org.hyperledger.besu.consensus.common.bft.RoundTimer;
import org.hyperledger.besu.consensus.common.bft.inttest.StubValidatorMulticaster;
import org.hyperledger.besu.consensus.qbft.QbftExtraDataCodec;
import org.hyperledger.besu.consensus.qbft.adaptor.QbftBlockAdaptor;
import org.hyperledger.besu.consensus.qbft.adaptor.QbftBlockHeaderAdaptor;
import org.hyperledger.besu.consensus.qbft.adaptor.QbftBlockInterfaceAdaptor;
import org.hyperledger.besu.consensus.qbft.core.network.QbftMessageTransmitter;
import org.hyperledger.besu.consensus.qbft.core.payload.MessageFactory;
@@ -42,10 +41,8 @@ import org.hyperledger.besu.consensus.qbft.core.types.QbftBlockCreator;
import org.hyperledger.besu.consensus.qbft.core.types.QbftBlockHeader;
import org.hyperledger.besu.consensus.qbft.core.types.QbftBlockImporter;
import org.hyperledger.besu.consensus.qbft.core.types.QbftContext;
import org.hyperledger.besu.consensus.qbft.core.types.QbftExtraDataProvider;
import org.hyperledger.besu.consensus.qbft.core.types.QbftMinedBlockObserver;
import org.hyperledger.besu.consensus.qbft.core.types.QbftProtocolSchedule;
import org.hyperledger.besu.consensus.qbft.core.types.QbftProtocolSpec;
import org.hyperledger.besu.consensus.qbft.core.validation.MessageValidator;
import org.hyperledger.besu.crypto.SECPSignature;
import org.hyperledger.besu.crypto.SignatureAlgorithmFactory;
@@ -87,7 +84,6 @@ public class QbftRoundIntegrationTest {
private ProtocolContext protocolContext;
@Mock private QbftProtocolSchedule protocolSchedule;
@Mock private QbftProtocolSpec protocolSpec;
@Mock private MutableBlockchain blockChain;
@Mock private WorldStateArchive worldStateArchive;
@Mock private QbftBlockImporter blockImporter;
@@ -101,7 +97,6 @@ public class QbftRoundIntegrationTest {
@Mock private StubValidatorMulticaster multicaster;
@Mock private QbftBlockHeader parentHeader;
@Mock private QbftBlockCodec blockEncoder;
@Mock private QbftExtraDataProvider qbftExtraDataProvider;
private QbftBlock proposedBlock;
@@ -131,12 +126,9 @@ public class QbftRoundIntegrationTest {
headerTestFixture.number(1);
final BlockHeader header = headerTestFixture.buildHeader();
final Block block = new Block(header, new BlockBody(emptyList(), emptyList()));
final QbftBlockHeader qbftBlockHeader = new QbftBlockHeaderAdaptor(header);
proposedBlock = new QbftBlockAdaptor(block);
when(qbftExtraDataProvider.getExtraData(qbftBlockHeader)).thenReturn(proposedExtraData);
when(protocolSchedule.getByBlockHeader(any())).thenReturn(protocolSpec);
when(protocolSpec.getBlockImporter()).thenReturn(blockImporter);
when(protocolSchedule.getBlockImporter(any())).thenReturn(blockImporter);
when(blockImporter.importBlock(any())).thenReturn(true);
@@ -165,7 +157,6 @@ public class QbftRoundIntegrationTest {
transmitter,
roundTimer,
bftExtraDataCodec,
qbftExtraDataProvider,
parentHeader);
round.handleProposalMessage(
@@ -185,7 +176,6 @@ public class QbftRoundIntegrationTest {
final Block sealedBesuBlock = new Block(header, new BlockBody(emptyList(), emptyList()));
final QbftBlock sealedBlock = new QbftBlockAdaptor(sealedBesuBlock);
when(blockCreator.createSealedBlock(
qbftExtraDataProvider,
proposedBlock,
roundIdentifier.getRoundNumber(),
List.of(remoteCommitSeal, remoteCommitSeal)))
@@ -205,7 +195,6 @@ public class QbftRoundIntegrationTest {
transmitter,
roundTimer,
bftExtraDataCodec,
qbftExtraDataProvider,
parentHeader);
// inject a block first, then a prepare on it.

View File

@@ -16,7 +16,6 @@ package org.hyperledger.besu.consensus.qbft.core.statemachine;
import static java.util.Collections.emptyList;
import org.hyperledger.besu.consensus.common.bft.BftExtraData;
import org.hyperledger.besu.consensus.common.bft.BftExtraDataCodec;
import org.hyperledger.besu.consensus.common.bft.ConsensusRoundIdentifier;
import org.hyperledger.besu.consensus.common.bft.RoundTimer;
@@ -34,7 +33,6 @@ import org.hyperledger.besu.consensus.qbft.core.types.QbftBlockHeader;
import org.hyperledger.besu.consensus.qbft.core.types.QbftBlockImporter;
import org.hyperledger.besu.consensus.qbft.core.types.QbftBlockInterface;
import org.hyperledger.besu.consensus.qbft.core.types.QbftContext;
import org.hyperledger.besu.consensus.qbft.core.types.QbftExtraDataProvider;
import org.hyperledger.besu.consensus.qbft.core.types.QbftMinedBlockObserver;
import org.hyperledger.besu.consensus.qbft.core.types.QbftProtocolSchedule;
import org.hyperledger.besu.crypto.SECPSignature;
@@ -76,9 +74,6 @@ public class QbftRound {
/** The Bft extra data codec. */
protected final BftExtraDataCodec bftExtraDataCodec;
/** The Bft extra data provider */
protected final QbftExtraDataProvider qbftExtraDataProvider;
private final QbftBlockHeader parentHeader;
/**
@@ -94,7 +89,6 @@ public class QbftRound {
* @param transmitter the transmitter
* @param roundTimer the round timer
* @param bftExtraDataCodec the bft extra data codec
* @param qbftExtraDataProvider the qbft extra data provider
* @param parentHeader the parent header
*/
public QbftRound(
@@ -108,7 +102,6 @@ public class QbftRound {
final QbftMessageTransmitter transmitter,
final RoundTimer roundTimer,
final BftExtraDataCodec bftExtraDataCodec,
final QbftExtraDataProvider qbftExtraDataProvider,
final QbftBlockHeader parentHeader) {
this.roundState = roundState;
this.blockCreator = blockCreator;
@@ -119,7 +112,6 @@ public class QbftRound {
this.messageFactory = messageFactory;
this.transmitter = transmitter;
this.bftExtraDataCodec = bftExtraDataCodec;
this.qbftExtraDataProvider = qbftExtraDataProvider;
this.parentHeader = parentHeader;
roundTimer.startTimer(getRoundIdentifier());
}
@@ -351,13 +343,11 @@ public class QbftRound {
final QbftBlock blockToImport =
blockCreator.createSealedBlock(
qbftExtraDataProvider,
roundState.getProposedBlock().get(),
roundState.getRoundIdentifier().getRoundNumber(),
roundState.getCommitSeals());
final long blockNumber = blockToImport.getHeader().getNumber();
final BftExtraData extraData = qbftExtraDataProvider.getExtraData(blockToImport.getHeader());
if (getRoundIdentifier().getRoundNumber() > 0) {
LOG.info(
"Importing proposed block to chain. round={}, hash={}",
@@ -370,15 +360,13 @@ public class QbftRound {
blockToImport.getHash());
}
LOG.trace("Importing proposed block with extraData={}", extraData);
final QbftBlockImporter blockImporter =
protocolSchedule.getByBlockHeader(blockToImport.getHeader()).getBlockImporter();
protocolSchedule.getBlockImporter(blockToImport.getHeader());
final boolean result = blockImporter.importBlock(blockToImport);
if (!result) {
LOG.error(
"Failed to import proposed block to chain. block={} extraData={} blockHeader={}",
"Failed to import proposed block to chain. block={} blockHeader={}",
blockNumber,
extraData,
blockToImport.getHeader());
} else {
notifyNewBlockListeners(blockToImport);

View File

@@ -21,7 +21,6 @@ import org.hyperledger.besu.consensus.qbft.core.payload.MessageFactory;
import org.hyperledger.besu.consensus.qbft.core.types.QbftBlockCreator;
import org.hyperledger.besu.consensus.qbft.core.types.QbftBlockCreatorFactory;
import org.hyperledger.besu.consensus.qbft.core.types.QbftBlockHeader;
import org.hyperledger.besu.consensus.qbft.core.types.QbftExtraDataProvider;
import org.hyperledger.besu.consensus.qbft.core.types.QbftFinalState;
import org.hyperledger.besu.consensus.qbft.core.types.QbftMinedBlockObserver;
import org.hyperledger.besu.consensus.qbft.core.types.QbftProtocolSchedule;
@@ -40,7 +39,6 @@ public class QbftRoundFactory {
private final MessageValidatorFactory messageValidatorFactory;
private final MessageFactory messageFactory;
private final BftExtraDataCodec bftExtraDataCodec;
private final QbftExtraDataProvider qbftExtraDataProvider;
/**
* Instantiates a new Qbft round factory.
@@ -52,7 +50,6 @@ public class QbftRoundFactory {
* @param messageValidatorFactory the message validator factory
* @param messageFactory the message factory
* @param bftExtraDataCodec the bft extra data codec
* @param qbftExtraDataProvider the bft extra data codec
*/
public QbftRoundFactory(
final QbftFinalState finalState,
@@ -61,8 +58,7 @@ public class QbftRoundFactory {
final Subscribers<QbftMinedBlockObserver> minedBlockObservers,
final MessageValidatorFactory messageValidatorFactory,
final MessageFactory messageFactory,
final BftExtraDataCodec bftExtraDataCodec,
final QbftExtraDataProvider qbftExtraDataProvider) {
final BftExtraDataCodec bftExtraDataCodec) {
this.finalState = finalState;
this.blockCreatorFactory = finalState.getBlockCreatorFactory();
this.protocolContext = protocolContext;
@@ -71,7 +67,6 @@ public class QbftRoundFactory {
this.messageValidatorFactory = messageValidatorFactory;
this.messageFactory = messageFactory;
this.bftExtraDataCodec = bftExtraDataCodec;
this.qbftExtraDataProvider = qbftExtraDataProvider;
}
/**
@@ -122,7 +117,6 @@ public class QbftRoundFactory {
messageTransmitter,
finalState.getRoundTimer(),
bftExtraDataCodec,
qbftExtraDataProvider,
parentHeader);
}
}

View File

@@ -33,15 +33,11 @@ public interface QbftBlockCreator {
/**
* Create sealed block.
*
* @param qbftExtraDataProvider the extra data provider
* @param block the block
* @param roundNumber the round number
* @param commitSeals the commit seals
* @return the block
*/
QbftBlock createSealedBlock(
final QbftExtraDataProvider qbftExtraDataProvider,
final QbftBlock block,
final int roundNumber,
final Collection<SECPSignature> commitSeals);
final QbftBlock block, final int roundNumber, final Collection<SECPSignature> commitSeals);
}

View File

@@ -21,10 +21,18 @@ package org.hyperledger.besu.consensus.qbft.core.types;
public interface QbftProtocolSchedule {
/**
* Returns the QbftProtocolSpec for the supplied block header.
* Returns the appropriate block importer for the supplied block header.
*
* @param header The block header to select the appropriate QbftProtocolSpec for
* @return The QbftProtocolSpec for the supplied block header
* @param header the block header
* @return the block importer
*/
QbftProtocolSpec getByBlockHeader(QbftBlockHeader header);
QbftBlockImporter getBlockImporter(QbftBlockHeader header);
/**
* Returns the appropriate block validator for the supplied block header.
*
* @param header the block header
* @return the block validator
*/
QbftBlockValidator getBlockValidator(QbftBlockHeader header);
}

View File

@@ -1,35 +0,0 @@
/*
* Copyright contributors to Besu.
*
* 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.core.types;
/**
* Provides the ability to select the appropriate QbftProtocolSpec containing the validation and
* import for the supplied block header.
*/
public interface QbftProtocolSpec {
/**
* Gets the block importer.
*
* @return the block importer
*/
QbftBlockImporter getBlockImporter();
/**
* Gets the block validator.
*
* @return the block validator
*/
QbftBlockValidator getBlockValidator();
}

View File

@@ -14,13 +14,9 @@
*/
package org.hyperledger.besu.consensus.qbft.core.types;
import org.hyperledger.besu.consensus.common.validator.VoteProvider;
import org.hyperledger.besu.cryptoservices.NodeKey;
import org.hyperledger.besu.datatypes.Address;
import org.hyperledger.besu.ethereum.core.Util;
import java.util.Collection;
import java.util.Optional;
/** The interface Validator provider. */
public interface QbftValidatorProvider {
@@ -47,36 +43,4 @@ public interface QbftValidatorProvider {
* @return the validators for block
*/
Collection<Address> getValidatorsForBlock(QbftBlockHeader header);
/**
* Gets vote provider at head.
*
* @return the vote provider at head
*/
Optional<VoteProvider> getVoteProviderAtHead();
/**
* Gets vote provider after block.
*
* @param header the header
* @return the vote provider after block
*/
/*
* ForkingValidatorProvider has a specific implementation but we don't want the client code to
* know it's using a ForkingValidatorProvider. ForkingValidatorProvider's voteProvider can be
* different per block. Other ValidatorProviders yield the same voteProvider at every block.
*/
default Optional<VoteProvider> getVoteProviderAfterBlock(final QbftBlockHeader header) {
return getVoteProviderAtHead();
}
/**
* Determines if this node is a validator
*
* @param nodekey our node key
* @return true if this node is a validator
*/
default boolean nodeIsValidator(final NodeKey nodekey) {
return this.getValidatorsAtHead().contains(Util.publicKeyToAddress(nodekey.getPublicKey()));
}
}

View File

@@ -87,7 +87,7 @@ public class ProposalValidator {
*/
public boolean validate(final Proposal msg) {
final QbftBlockValidator blockValidator =
protocolSchedule.getByBlockHeader(msg.getBlock().getHeader()).getBlockValidator();
protocolSchedule.getBlockValidator(msg.getBlock().getHeader());
final ProposalPayloadValidator payloadValidator =
new ProposalPayloadValidator(expectedProposer, roundIdentifier, blockValidator);

View File

@@ -90,8 +90,7 @@ public class RoundChangeMessageValidator {
private boolean validateBlock(final QbftBlock block) {
final QbftBlockValidator blockValidator =
protocolSchedule.getByBlockHeader(block.getHeader()).getBlockValidator();
final QbftBlockValidator blockValidator = protocolSchedule.getBlockValidator(block.getHeader());
final var validationResult = blockValidator.validateBlock(block);

View File

@@ -52,10 +52,8 @@ import org.hyperledger.besu.consensus.qbft.core.types.QbftBlockHeader;
import org.hyperledger.besu.consensus.qbft.core.types.QbftBlockImporter;
import org.hyperledger.besu.consensus.qbft.core.types.QbftBlockInterface;
import org.hyperledger.besu.consensus.qbft.core.types.QbftContext;
import org.hyperledger.besu.consensus.qbft.core.types.QbftExtraDataProvider;
import org.hyperledger.besu.consensus.qbft.core.types.QbftFinalState;
import org.hyperledger.besu.consensus.qbft.core.types.QbftProtocolSchedule;
import org.hyperledger.besu.consensus.qbft.core.types.QbftProtocolSpec;
import org.hyperledger.besu.consensus.qbft.core.types.QbftValidatorProvider;
import org.hyperledger.besu.consensus.qbft.core.validation.FutureRoundProposalMessageValidator;
import org.hyperledger.besu.consensus.qbft.core.validation.MessageValidator;
@@ -114,10 +112,8 @@ public class QbftBlockHeightManagerTest {
@Mock private QbftBlockHeader parentHeader;
@Mock private BftExtraDataCodec bftExtraDataCodec;
@Mock private QbftBlockCodec blockEncoder;
@Mock private QbftExtraDataProvider qbftExtraDataProvider;
@Mock private QbftBlockInterface blockInterface;
@Mock private QbftValidatorProvider validatorProvider;
@Mock private QbftProtocolSpec protocolSpec;
@Mock private QbftBlockImporter blockImporter;
@Captor private ArgumentCaptor<MessageData> sentMessageArgCaptor;
@@ -175,7 +171,6 @@ public class QbftBlockHeightManagerTest {
messageTransmitter,
roundTimer,
bftExtraDataCodec,
qbftExtraDataProvider,
parentHeader);
});
@@ -194,14 +189,9 @@ public class QbftBlockHeightManagerTest {
messageTransmitter,
roundTimer,
bftExtraDataCodec,
qbftExtraDataProvider,
parentHeader);
});
when(qbftExtraDataProvider.getExtraData(any()))
.thenReturn(
new BftExtraData(
Bytes.wrap(new byte[32]), emptyList(), Optional.empty(), 0, validators));
when(bftExtraDataCodec.decode(any()))
.thenReturn(
new BftExtraData(
@@ -402,9 +392,8 @@ public class QbftBlockHeightManagerTest {
public void messagesForFutureRoundsAreBufferedAndUsedToPreloadNewRoundWhenItIsStarted() {
when(finalState.getQuorum()).thenReturn(1);
when(blockInterface.replaceRoundInBlock(eq(createdBlock), eq(2))).thenReturn(createdBlock);
when(blockCreator.createSealedBlock(any(), any(), anyInt(), any())).thenReturn(createdBlock);
when(protocolSchedule.getByBlockHeader(any())).thenReturn(protocolSpec);
when(protocolSpec.getBlockImporter()).thenReturn(blockImporter);
when(blockCreator.createSealedBlock(any(), anyInt(), any())).thenReturn(createdBlock);
when(protocolSchedule.getBlockImporter(any())).thenReturn(blockImporter);
final ConsensusRoundIdentifier futureRoundIdentifier = createFrom(roundIdentifier, 0, +2);
@@ -451,9 +440,8 @@ public class QbftBlockHeightManagerTest {
when(finalState.isLocalNodeProposerForRound(roundIdentifier)).thenReturn(true);
when(blockTimer.checkEmptyBlockExpired(any(), eq(0L))).thenReturn(true);
when(blockInterface.replaceRoundInBlock(eq(createdBlock), eq(0))).thenReturn(createdBlock);
when(blockCreator.createSealedBlock(any(), any(), anyInt(), any())).thenReturn(createdBlock);
when(protocolSchedule.getByBlockHeader(any())).thenReturn(protocolSpec);
when(protocolSpec.getBlockImporter()).thenReturn(blockImporter);
when(blockCreator.createSealedBlock(any(), anyInt(), any())).thenReturn(createdBlock);
when(protocolSchedule.getBlockImporter(any())).thenReturn(blockImporter);
final QbftBlockHeightManager manager =
new QbftBlockHeightManager(

View File

@@ -46,10 +46,8 @@ import org.hyperledger.besu.consensus.qbft.core.types.QbftBlockHeader;
import org.hyperledger.besu.consensus.qbft.core.types.QbftBlockImporter;
import org.hyperledger.besu.consensus.qbft.core.types.QbftBlockInterface;
import org.hyperledger.besu.consensus.qbft.core.types.QbftContext;
import org.hyperledger.besu.consensus.qbft.core.types.QbftExtraDataProvider;
import org.hyperledger.besu.consensus.qbft.core.types.QbftMinedBlockObserver;
import org.hyperledger.besu.consensus.qbft.core.types.QbftProtocolSchedule;
import org.hyperledger.besu.consensus.qbft.core.types.QbftProtocolSpec;
import org.hyperledger.besu.consensus.qbft.core.validation.MessageValidator;
import org.hyperledger.besu.consensus.qbft.core.validation.QbftBlockHeaderTestFixture;
import org.hyperledger.besu.crypto.SECPSignature;
@@ -99,13 +97,11 @@ public class QbftRoundTest {
@Mock private QbftBlockCreator blockCreator;
@Mock private MessageValidator messageValidator;
@Mock private RoundTimer roundTimer;
@Mock private QbftProtocolSpec protocolSpec;
@Mock private QbftBlockImporter blockImporter;
@Mock private QbftBlockHeader parentHeader;
@Mock private BftExtraDataCodec bftExtraDataCodec;
@Mock private QbftBlockInterface blockInteface;
@Mock private QbftBlockCodec blockEncoder;
@Mock private QbftExtraDataProvider qbftExtraDataProvider;
@Captor private ArgumentCaptor<QbftBlock> blockCaptor;
@@ -137,8 +133,7 @@ public class QbftRoundTest {
when(blockCreator.createBlock(anyLong(), any())).thenReturn(proposedBlock);
when(protocolSchedule.getByBlockHeader(any())).thenReturn(protocolSpec);
when(protocolSpec.getBlockImporter()).thenReturn(blockImporter);
when(protocolSchedule.getBlockImporter(any())).thenReturn(blockImporter);
when(blockImporter.importBlock(any())).thenReturn(true);
@@ -166,7 +161,6 @@ public class QbftRoundTest {
transmitter,
roundTimer,
bftExtraDataCodec,
qbftExtraDataProvider,
parentHeader);
verify(roundTimer, times(1)).startTimer(roundIdentifier);
}
@@ -186,7 +180,6 @@ public class QbftRoundTest {
transmitter,
roundTimer,
bftExtraDataCodec,
qbftExtraDataProvider,
parentHeader);
when(blockInteface.replaceRoundInBlock(eq(proposedBlock), eq(0))).thenReturn(proposedBlock);
@@ -218,7 +211,6 @@ public class QbftRoundTest {
transmitter,
roundTimer,
bftExtraDataCodec,
qbftExtraDataProvider,
parentHeader);
round.startRoundWith(new RoundChangeArtifacts(emptyList(), Optional.empty()), 15);
@@ -254,7 +246,6 @@ public class QbftRoundTest {
transmitter,
roundTimer,
bftExtraDataCodec,
qbftExtraDataProvider,
parentHeader);
final SignedData<PreparePayload> preparedPayload =
@@ -306,7 +297,6 @@ public class QbftRoundTest {
transmitter,
roundTimer,
bftExtraDataCodec,
qbftExtraDataProvider,
parentHeader);
final RoundChange roundChange =
@@ -349,12 +339,10 @@ public class QbftRoundTest {
transmitter,
roundTimer,
bftExtraDataCodec,
qbftExtraDataProvider,
parentHeader);
when(blockInteface.replaceRoundInBlock(proposedBlock, 0)).thenReturn(proposedBlock);
when(blockCreator.createSealedBlock(eq(qbftExtraDataProvider), eq(proposedBlock), eq(0), any()))
.thenReturn(proposedBlock);
when(blockCreator.createSealedBlock(eq(proposedBlock), eq(0), any())).thenReturn(proposedBlock);
round.handleCommitMessage(
messageFactory.createCommit(roundIdentifier, proposedBlock.getHash(), remoteCommitSeal));
@@ -382,12 +370,10 @@ public class QbftRoundTest {
transmitter,
roundTimer,
bftExtraDataCodec,
qbftExtraDataProvider,
parentHeader);
when(blockInteface.replaceRoundInBlock(eq(proposedBlock), eq(0))).thenReturn(proposedBlock);
when(blockCreator.createSealedBlock(eq(qbftExtraDataProvider), eq(proposedBlock), eq(0), any()))
.thenReturn(proposedBlock);
when(blockCreator.createSealedBlock(eq(proposedBlock), eq(0), any())).thenReturn(proposedBlock);
round.handleCommitMessage(
messageFactory.createCommit(roundIdentifier, proposedBlock.getHash(), remoteCommitSeal));
@@ -419,7 +405,6 @@ public class QbftRoundTest {
transmitter,
roundTimer,
bftExtraDataCodec,
qbftExtraDataProvider,
parentHeader);
when(blockInteface.replaceRoundInBlock(eq(proposedBlock), eq(0))).thenReturn(proposedBlock);

View File

@@ -41,7 +41,6 @@ import org.hyperledger.besu.consensus.qbft.core.types.QbftBlockInterface;
import org.hyperledger.besu.consensus.qbft.core.types.QbftBlockValidator;
import org.hyperledger.besu.consensus.qbft.core.types.QbftContext;
import org.hyperledger.besu.consensus.qbft.core.types.QbftProtocolSchedule;
import org.hyperledger.besu.consensus.qbft.core.types.QbftProtocolSpec;
import org.hyperledger.besu.consensus.qbft.core.types.QbftValidatorProvider;
import org.hyperledger.besu.datatypes.Hash;
import org.hyperledger.besu.ethereum.ProtocolContext;
@@ -84,7 +83,6 @@ public class ProposalValidatorTest {
private static final int VALIDATOR_COUNT = 4;
@Mock private QbftBlockValidator blockValidator;
@Mock private QbftProtocolSchedule protocolSchedule;
@Mock private QbftProtocolSpec protocolSpec;
@Mock private QbftBlockCodec blockEncoder;
@Mock private QbftBlockInterface blockInterface;
@Mock private QbftValidatorProvider validatorProvider;
@@ -103,9 +101,7 @@ public class ProposalValidatorTest {
QbftContext qbftContext = new QbftContext(validatorProvider, blockInterface);
lenient().when(protocolContext.getConsensusContext(QbftContext.class)).thenReturn(qbftContext);
when(protocolSchedule.getByBlockHeader(any())).thenReturn(protocolSpec);
when(protocolSpec.getBlockValidator()).thenReturn(blockValidator);
when(protocolSchedule.getBlockValidator(any())).thenReturn(blockValidator);
roundItems.put(ROUND_ID.ZERO, createRoundSpecificItems(0));
roundItems.put(ROUND_ID.ONE, createRoundSpecificItems(1));

View File

@@ -38,7 +38,6 @@ import org.hyperledger.besu.consensus.qbft.core.types.QbftBlockHeader;
import org.hyperledger.besu.consensus.qbft.core.types.QbftBlockValidator;
import org.hyperledger.besu.consensus.qbft.core.types.QbftBlockValidator.ValidationResult;
import org.hyperledger.besu.consensus.qbft.core.types.QbftProtocolSchedule;
import org.hyperledger.besu.consensus.qbft.core.types.QbftProtocolSpec;
import org.hyperledger.besu.crypto.SECPSignature;
import org.hyperledger.besu.datatypes.Hash;
@@ -57,7 +56,6 @@ public class RoundChangeMessageValidatorTest {
@Mock private RoundChangePayloadValidator payloadValidator;
@Mock private QbftProtocolSchedule protocolSchedule;
@Mock private QbftBlockValidator blockValidator;
@Mock private QbftProtocolSpec protocolSpec;
@Mock private QbftBlockCodec blockEncoder;
private RoundChangeMessageValidator messageValidator;
@@ -73,8 +71,7 @@ public class RoundChangeMessageValidatorTest {
public void setup() {
validators = QbftNodeList.createNodes(VALIDATOR_COUNT, blockEncoder);
lenient().when(protocolSchedule.getByBlockHeader(any())).thenReturn(protocolSpec);
lenient().when(protocolSpec.getBlockValidator()).thenReturn(blockValidator);
lenient().when(protocolSchedule.getBlockValidator(any())).thenReturn(blockValidator);
}
@Test

View File

@@ -20,7 +20,6 @@ import org.hyperledger.besu.consensus.common.bft.BftExtraDataCodec;
import org.hyperledger.besu.consensus.qbft.core.types.QbftBlock;
import org.hyperledger.besu.consensus.qbft.core.types.QbftBlockCreator;
import org.hyperledger.besu.consensus.qbft.core.types.QbftBlockHeader;
import org.hyperledger.besu.consensus.qbft.core.types.QbftExtraDataProvider;
import org.hyperledger.besu.crypto.SECPSignature;
import org.hyperledger.besu.ethereum.blockcreation.BlockCreator;
import org.hyperledger.besu.ethereum.core.Block;
@@ -58,13 +57,11 @@ public class QbftBlockCreatorAdaptor implements QbftBlockCreator {
@Override
public QbftBlock createSealedBlock(
final QbftExtraDataProvider bftQbftExtraDataProvider,
final QbftBlock block,
final int roundNumber,
final Collection<SECPSignature> commitSeals) {
final QbftBlock block, final int roundNumber, final Collection<SECPSignature> commitSeals) {
final Block besuBlock = BlockUtil.toBesuBlock(block);
final QbftBlockHeader initialHeader = block.getHeader();
final BftExtraData initialExtraData = bftQbftExtraDataProvider.getExtraData(initialHeader);
final BftExtraData initialExtraData =
bftExtraDataCodec.decode(BlockUtil.toBesuBlockHeader(initialHeader));
final BftExtraData sealedExtraData =
new BftExtraData(

View File

@@ -1,41 +0,0 @@
/*
* Copyright contributors to Besu.
*
* 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.adaptor;
import org.hyperledger.besu.consensus.common.bft.BftExtraData;
import org.hyperledger.besu.consensus.common.bft.BftExtraDataCodec;
import org.hyperledger.besu.consensus.qbft.core.types.QbftBlockHeader;
import org.hyperledger.besu.consensus.qbft.core.types.QbftExtraDataProvider;
/**
* Adaptor class to allow a {@link BftExtraDataCodec} to be used as a {@link QbftExtraDataProvider}.
*/
public class QbftExtraDataProviderAdaptor implements QbftExtraDataProvider {
private final BftExtraDataCodec bftExtraDataCodec;
/**
* Constructs a new QbftExtraDataProvider
*
* @param bftExtraDataCodec the bftExtraDataCodec used to decode the extra data from the header
*/
public QbftExtraDataProviderAdaptor(final BftExtraDataCodec bftExtraDataCodec) {
this.bftExtraDataCodec = bftExtraDataCodec;
}
@Override
public BftExtraData getExtraData(final QbftBlockHeader header) {
return bftExtraDataCodec.decode(BlockUtil.toBesuBlockHeader(header));
}
}

View File

@@ -15,8 +15,9 @@
package org.hyperledger.besu.consensus.qbft.adaptor;
import org.hyperledger.besu.consensus.qbft.core.types.QbftBlockHeader;
import org.hyperledger.besu.consensus.qbft.core.types.QbftBlockImporter;
import org.hyperledger.besu.consensus.qbft.core.types.QbftBlockValidator;
import org.hyperledger.besu.consensus.qbft.core.types.QbftProtocolSchedule;
import org.hyperledger.besu.consensus.qbft.core.types.QbftProtocolSpec;
import org.hyperledger.besu.ethereum.ProtocolContext;
import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule;
import org.hyperledger.besu.ethereum.mainnet.ProtocolSpec;
@@ -42,9 +43,18 @@ public class QbftProtocolScheduleAdaptor implements QbftProtocolSchedule {
}
@Override
public QbftProtocolSpec getByBlockHeader(final QbftBlockHeader header) {
final ProtocolSpec protocolSpec =
besuProtocolSchedule.getByBlockHeader(BlockUtil.toBesuBlockHeader(header));
return new QbftProtocolSpecAdaptor(protocolSpec, context);
public QbftBlockImporter getBlockImporter(final QbftBlockHeader header) {
return new QbftBlockImporterAdaptor(
getProtocolSpecByBlockHeader(header).getBlockImporter(), context);
}
@Override
public QbftBlockValidator getBlockValidator(final QbftBlockHeader header) {
return new QbftBlockValidatorAdaptor(
getProtocolSpecByBlockHeader(header).getBlockValidator(), context);
}
private ProtocolSpec getProtocolSpecByBlockHeader(final QbftBlockHeader header) {
return besuProtocolSchedule.getByBlockHeader(BlockUtil.toBesuBlockHeader(header));
}
}

View File

@@ -1,49 +0,0 @@
/*
* Copyright contributors to Besu.
*
* 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.adaptor;
import org.hyperledger.besu.consensus.qbft.core.types.QbftBlockImporter;
import org.hyperledger.besu.consensus.qbft.core.types.QbftBlockValidator;
import org.hyperledger.besu.consensus.qbft.core.types.QbftProtocolSpec;
import org.hyperledger.besu.ethereum.ProtocolContext;
import org.hyperledger.besu.ethereum.mainnet.ProtocolSpec;
/** Adaptor class to allow a {@link ProtocolSpec} to be used as a {@link QbftProtocolSpec}. */
public class QbftProtocolSpecAdaptor implements QbftProtocolSpec {
private final ProtocolSpec besuProtocolSpec;
private final ProtocolContext context;
/**
* Constructs a new Qbft protocol spec.
*
* @param besuProtocolSpec The Besu protocol spec.
* @param context The protocol context.
*/
public QbftProtocolSpecAdaptor(
final ProtocolSpec besuProtocolSpec, final ProtocolContext context) {
this.besuProtocolSpec = besuProtocolSpec;
this.context = context;
}
@Override
public QbftBlockImporter getBlockImporter() {
return new QbftBlockImporterAdaptor(besuProtocolSpec.getBlockImporter(), context);
}
@Override
public QbftBlockValidator getBlockValidator() {
return new QbftBlockValidatorAdaptor(besuProtocolSpec.getBlockValidator(), context);
}
}

View File

@@ -15,13 +15,11 @@
package org.hyperledger.besu.consensus.qbft.adaptor;
import org.hyperledger.besu.consensus.common.validator.ValidatorProvider;
import org.hyperledger.besu.consensus.common.validator.VoteProvider;
import org.hyperledger.besu.consensus.qbft.core.types.QbftBlockHeader;
import org.hyperledger.besu.consensus.qbft.core.types.QbftValidatorProvider;
import org.hyperledger.besu.datatypes.Address;
import java.util.Collection;
import java.util.Optional;
/**
* Adaptor class to allow the {@link ValidatorProvider} to be used as a {@link
@@ -54,9 +52,4 @@ public class QbftValidatorProviderAdaptor implements QbftValidatorProvider {
public Collection<Address> getValidatorsForBlock(final QbftBlockHeader header) {
return validatorProvider.getValidatorsForBlock(BlockUtil.toBesuBlockHeader(header));
}
@Override
public Optional<VoteProvider> getVoteProviderAtHead() {
return validatorProvider.getVoteProviderAtHead();
}
}

View File

@@ -23,7 +23,6 @@ import org.hyperledger.besu.consensus.common.bft.Vote;
import org.hyperledger.besu.consensus.qbft.QbftExtraDataCodec;
import org.hyperledger.besu.consensus.qbft.core.types.QbftBlock;
import org.hyperledger.besu.consensus.qbft.core.types.QbftBlockHeader;
import org.hyperledger.besu.consensus.qbft.core.types.QbftExtraDataProvider;
import org.hyperledger.besu.crypto.SECPSignature;
import org.hyperledger.besu.datatypes.Address;
import org.hyperledger.besu.ethereum.blockcreation.BlockCreator;
@@ -46,7 +45,6 @@ import org.mockito.junit.jupiter.MockitoExtension;
class QbftBlockCreatorAdaptorTest {
@Mock private BlockCreator blockCreator;
@Mock private Block besuBlock;
@Mock private QbftExtraDataProvider qbftExtraDataProvider;
private final QbftExtraDataCodec qbftExtraDataCodec = new QbftExtraDataCodec();
@Test
@@ -72,17 +70,15 @@ class QbftBlockCreatorAdaptorTest {
Optional.of(Vote.authVote(Address.ZERO)),
0,
List.of(Address.ZERO));
BlockHeader header = new BlockHeaderTestFixture().buildHeader();
Bytes extraDataBytes = qbftExtraDataCodec.encode(bftExtraData);
BlockHeader header = new BlockHeaderTestFixture().extraData(extraDataBytes).buildHeader();
Block besuBlock = new Block(header, BlockBody.empty());
QbftBlock block = new QbftBlockAdaptor(besuBlock);
SECPSignature seal = new SECPSignature(BigInteger.ONE, BigInteger.ONE, (byte) 1);
when(qbftExtraDataProvider.getExtraData(new QbftBlockHeaderAdaptor(header)))
.thenReturn(bftExtraData);
QbftBlockCreatorAdaptor qbftBlockCreator =
new QbftBlockCreatorAdaptor(blockCreator, qbftExtraDataCodec);
QbftBlock sealedBlock =
qbftBlockCreator.createSealedBlock(qbftExtraDataProvider, block, 1, List.of(seal));
QbftBlock sealedBlock = qbftBlockCreator.createSealedBlock(block, 1, List.of(seal));
BftExtraData sealedExtraData =
qbftExtraDataCodec.decode(BlockUtil.toBesuBlockHeader(sealedBlock.getHeader()));
assertThat(sealedExtraData.getVanityData()).isEqualTo(Bytes.wrap(new byte[32]));

View File

@@ -1,48 +0,0 @@
/*
* Copyright contributors to Besu.
*
* 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.adaptor;
import static java.util.Collections.emptyList;
import static org.assertj.core.api.Assertions.assertThat;
import org.hyperledger.besu.consensus.common.bft.BftExtraData;
import org.hyperledger.besu.consensus.qbft.QbftExtraDataCodec;
import org.hyperledger.besu.consensus.qbft.core.types.QbftBlockHeader;
import org.hyperledger.besu.ethereum.core.BlockHeader;
import org.hyperledger.besu.ethereum.core.BlockHeaderTestFixture;
import java.util.Optional;
import org.apache.tuweni.bytes.Bytes;
import org.junit.jupiter.api.Test;
class QbftExtraDataProviderAdaptorTest {
@Test
void retrievesExtraDataFromBlockHeader() {
final QbftExtraDataCodec qbftExtraDataCodec = new QbftExtraDataCodec();
final BftExtraData bftExtraData =
new BftExtraData(Bytes.wrap(new byte[32]), emptyList(), Optional.empty(), 0, emptyList());
final Bytes encoded = qbftExtraDataCodec.encode(bftExtraData);
final BlockHeader besuHeader =
new BlockHeaderTestFixture().number(1).extraData(encoded).buildHeader();
final QbftBlockHeader qbftHeader = new QbftBlockHeaderAdaptor(besuHeader);
final QbftExtraDataProviderAdaptor qbftExtraDataProvider =
new QbftExtraDataProviderAdaptor(new QbftExtraDataCodec());
final BftExtraData retrievedExtraData = qbftExtraDataProvider.getExtraData(qbftHeader);
assertThat(retrievedExtraData).isEqualToComparingFieldByField(bftExtraData);
}
}

View File

@@ -18,17 +18,21 @@ import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.when;
import org.hyperledger.besu.consensus.qbft.core.types.QbftBlockHeader;
import org.hyperledger.besu.consensus.qbft.core.types.QbftBlockImporter;
import org.hyperledger.besu.consensus.qbft.core.types.QbftBlockValidator;
import org.hyperledger.besu.consensus.qbft.core.types.QbftProtocolSchedule;
import org.hyperledger.besu.consensus.qbft.core.types.QbftProtocolSpec;
import org.hyperledger.besu.ethereum.BlockValidator;
import org.hyperledger.besu.ethereum.ProtocolContext;
import org.hyperledger.besu.ethereum.core.BlockHeader;
import org.hyperledger.besu.ethereum.core.BlockHeaderTestFixture;
import org.hyperledger.besu.ethereum.core.BlockImporter;
import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule;
import org.hyperledger.besu.ethereum.mainnet.ProtocolSpec;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoExtension;
@ExtendWith(MockitoExtension.class)
@@ -38,15 +42,34 @@ class QbftProtocolScheduleAdaptorTest {
@Mock private ProtocolContext besuProtocolContext;
@Test
void createsAProtocolSpecUsingBesuProtocolSpec() {
void createsBlockValidatorUsingBesuBlockValidator() {
final BlockHeader besuHeader = new BlockHeaderTestFixture().number(1).buildHeader();
final QbftBlockHeader qbftHeader = new QbftBlockHeaderAdaptor(besuHeader);
final BlockValidator besuBlockValidator = Mockito.mock(BlockValidator.class);
when(besuProtocolSchedule.getByBlockHeader(besuHeader)).thenReturn(besuProtocolSpec);
when(besuProtocolSpec.getBlockValidator()).thenReturn(besuBlockValidator);
final QbftProtocolSchedule qbftProtocolSchedule =
new QbftProtocolScheduleAdaptor(besuProtocolSchedule, besuProtocolContext);
final QbftProtocolSpec protocolSpec = qbftProtocolSchedule.getByBlockHeader(qbftHeader);
assertThat(protocolSpec).hasFieldOrPropertyWithValue("besuProtocolSpec", besuProtocolSpec);
final QbftBlockValidator qbftBlockValidator =
qbftProtocolSchedule.getBlockValidator(qbftHeader);
assertThat(qbftBlockValidator)
.hasFieldOrPropertyWithValue("blockValidator", besuBlockValidator);
}
@Test
void createsBlockImporterUsingBesuBlockImporter() {
final BlockHeader besuHeader = new BlockHeaderTestFixture().number(1).buildHeader();
final QbftBlockHeader qbftHeader = new QbftBlockHeaderAdaptor(besuHeader);
final BlockImporter besuBlockImporter = Mockito.mock(BlockImporter.class);
when(besuProtocolSchedule.getByBlockHeader(besuHeader)).thenReturn(besuProtocolSpec);
when(besuProtocolSpec.getBlockImporter()).thenReturn(besuBlockImporter);
final QbftProtocolSchedule qbftProtocolSchedule =
new QbftProtocolScheduleAdaptor(besuProtocolSchedule, besuProtocolContext);
final QbftBlockImporter qbftBlockImporter = qbftProtocolSchedule.getBlockImporter(qbftHeader);
assertThat(qbftBlockImporter).hasFieldOrPropertyWithValue("blockImporter", besuBlockImporter);
}
}

View File

@@ -1,60 +0,0 @@
/*
* Copyright contributors to Besu.
*
* 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.adaptor;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.when;
import org.hyperledger.besu.consensus.qbft.core.types.QbftBlockImporter;
import org.hyperledger.besu.consensus.qbft.core.types.QbftBlockValidator;
import org.hyperledger.besu.ethereum.BlockValidator;
import org.hyperledger.besu.ethereum.ProtocolContext;
import org.hyperledger.besu.ethereum.core.BlockImporter;
import org.hyperledger.besu.ethereum.mainnet.ProtocolSpec;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoExtension;
@ExtendWith(MockitoExtension.class)
class QbftProtocolSpecAdaptorTest {
@Mock private ProtocolSpec besuProtocolSpec;
@Mock private ProtocolContext besuProtocolContext;
@Test
void createsBlockImporterUsingBesuBlockImporter() {
final BlockImporter besuBlockImporter = Mockito.mock(BlockImporter.class);
when(besuProtocolSpec.getBlockImporter()).thenReturn(besuBlockImporter);
final QbftProtocolSpecAdaptor qbftProtocolSpec =
new QbftProtocolSpecAdaptor(besuProtocolSpec, besuProtocolContext);
final QbftBlockImporter qbftBlockImporter = qbftProtocolSpec.getBlockImporter();
assertThat(qbftBlockImporter).hasFieldOrPropertyWithValue("blockImporter", besuBlockImporter);
}
@Test
void createsBlockValidatorUsingBesuBlockValidator() {
final BlockValidator besuBlockValidator = Mockito.mock(BlockValidator.class);
when(besuProtocolSpec.getBlockValidator()).thenReturn(besuBlockValidator);
final QbftProtocolSpecAdaptor qbftProtocolSpec =
new QbftProtocolSpecAdaptor(besuProtocolSpec, besuProtocolContext);
final QbftBlockValidator qbftBlockValidator = qbftProtocolSpec.getBlockValidator();
assertThat(qbftBlockValidator)
.hasFieldOrPropertyWithValue("blockValidator", besuBlockValidator);
}
}

View File

@@ -18,14 +18,12 @@ import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.when;
import org.hyperledger.besu.consensus.common.validator.ValidatorProvider;
import org.hyperledger.besu.consensus.common.validator.VoteProvider;
import org.hyperledger.besu.consensus.qbft.core.types.QbftBlockHeader;
import org.hyperledger.besu.datatypes.Address;
import org.hyperledger.besu.ethereum.core.BlockHeader;
import org.hyperledger.besu.ethereum.core.BlockHeaderTestFixture;
import java.util.List;
import java.util.Optional;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
@@ -35,7 +33,6 @@ import org.mockito.junit.jupiter.MockitoExtension;
@ExtendWith(MockitoExtension.class)
class QbftValidatorProviderAdaptorTest {
@Mock private ValidatorProvider validatorProvider;
@Mock private VoteProvider voteProvider;
@Test
void returnsValidatorsAtHead() {
@@ -75,13 +72,4 @@ class QbftValidatorProviderAdaptorTest {
assertThat(qbftValidatorProviderAdaptor.getValidatorsForBlock(qbftBlockHeader))
.isEqualTo(validatorsForBlock);
}
@Test
void returnsVoteProviderAtHead() {
when(validatorProvider.getVoteProviderAtHead()).thenReturn(Optional.of(voteProvider));
QbftValidatorProviderAdaptor qbftValidatorProviderAdaptor =
new QbftValidatorProviderAdaptor(validatorProvider);
assertThat(qbftValidatorProviderAdaptor.getVoteProviderAtHead()).contains(voteProvider);
}
}