use of org.hyperledger.besu.consensus.common.bft.BftBlockHashing in project besu by hyperledger.
the class QbftRoundTest method localNodeProposesToNetworkOfTwoValidatorsImportsOnReceptionOfCommitFromPeer.
@Test
public void localNodeProposesToNetworkOfTwoValidatorsImportsOnReceptionOfCommitFromPeer() {
final RoundState roundState = new RoundState(roundIdentifier, 2, messageValidator);
final QbftRound round = new QbftRound(roundState, blockCreator, protocolContext, blockImporter, subscribers, nodeKey, messageFactory, transmitter, roundTimer, bftExtraDataCodec);
final Hash commitSealHash = new BftBlockHashing(new QbftExtraDataCodec()).calculateDataHashForCommittedSeal(proposedBlock.getHeader(), proposedExtraData);
final SECPSignature localCommitSeal = nodeKey.sign(commitSealHash);
round.createAndSendProposalMessage(15);
verify(transmitter, never()).multicastCommit(any(), any(), any());
verify(blockImporter, never()).importBlock(any(), any(), any());
round.handlePrepareMessage(messageFactory2.createPrepare(roundIdentifier, proposedBlock.getHash()));
verify(transmitter, times(1)).multicastCommit(roundIdentifier, proposedBlock.getHash(), localCommitSeal);
verify(blockImporter, never()).importBlock(any(), any(), any());
round.handleCommitMessage(messageFactory.createCommit(roundIdentifier, proposedBlock.getHash(), remoteCommitSeal));
verify(blockImporter, times(1)).importBlock(any(), any(), any());
}
use of org.hyperledger.besu.consensus.common.bft.BftBlockHashing in project besu by hyperledger.
the class IntegrationTestHelpers method createSignedCommitPayload.
public static SignedData<CommitPayload> createSignedCommitPayload(final ConsensusRoundIdentifier roundId, final Block block, final NodeKey nodeKey) {
final QbftExtraDataCodec qbftExtraDataEncoder = new QbftExtraDataCodec();
final Block commitBlock = createCommitBlockFromProposalBlock(block, roundId.getRoundNumber());
final SECPSignature commitSeal = nodeKey.sign(new BftBlockHashing(qbftExtraDataEncoder).calculateDataHashForCommittedSeal(commitBlock.getHeader()));
final MessageFactory messageFactory = new MessageFactory(nodeKey);
return messageFactory.createCommit(roundId, block.getHash(), commitSeal).getSignedPayload();
}
use of org.hyperledger.besu.consensus.common.bft.BftBlockHashing in project besu by hyperledger.
the class IbftRoundTest method twoValidatorNetworkSendsPrepareOnProposalReceptionThenSendsCommitOnCommitReceive.
@Test
public void twoValidatorNetworkSendsPrepareOnProposalReceptionThenSendsCommitOnCommitReceive() {
final RoundState roundState = new RoundState(roundIdentifier, 2, messageValidator);
final IbftRound round = new IbftRound(roundState, blockCreator, protocolContext, blockImporter, subscribers, nodeKey, messageFactory, transmitter, roundTimer, bftExtraDataCodec);
final Hash commitSealHash = new BftBlockHashing(new IbftExtraDataCodec()).calculateDataHashForCommittedSeal(proposedBlock.getHeader(), proposedExtraData);
final SECPSignature localCommitSeal = nodeKey.sign(commitSealHash);
// Receive Proposal Message
round.handleProposalMessage(messageFactory.createProposal(roundIdentifier, proposedBlock, Optional.empty()));
verify(transmitter, times(1)).multicastPrepare(roundIdentifier, proposedBlock.getHash());
verify(transmitter, times(1)).multicastCommit(roundIdentifier, proposedBlock.getHash(), localCommitSeal);
verify(blockImporter, never()).importBlock(any(), any(), any());
// Receive Commit Message
round.handleCommitMessage(messageFactory.createCommit(roundIdentifier, proposedBlock.getHash(), remoteCommitSeal));
// Should import block when both commit seals are available.
final ArgumentCaptor<Block> capturedBlock = ArgumentCaptor.forClass(Block.class);
verify(blockImporter, times(1)).importBlock(any(), capturedBlock.capture(), any());
// Ensure imported block contains both commit seals.
final BftExtraData importedExtraData = new IbftExtraDataCodec().decode(capturedBlock.getValue().getHeader());
assertThat(importedExtraData.getSeals()).containsOnly(remoteCommitSeal, localCommitSeal);
}
use of org.hyperledger.besu.consensus.common.bft.BftBlockHashing in project besu by hyperledger.
the class BftBlockCreatorTest method createdBlockPassesValidationRulesAndHasAppropriateHashAndMixHash.
@Test
public void createdBlockPassesValidationRulesAndHasAppropriateHashAndMixHash() {
// Construct a parent block.
final BlockHeaderTestFixture blockHeaderBuilder = new BlockHeaderTestFixture();
// required to pass validation rule checks.
blockHeaderBuilder.gasLimit(5000);
final BlockHeader parentHeader = blockHeaderBuilder.buildHeader();
final Optional<BlockHeader> optionalHeader = Optional.of(parentHeader);
// Construct a block chain and world state
final MutableBlockchain blockchain = mock(MutableBlockchain.class);
when(blockchain.getChainHeadHash()).thenReturn(parentHeader.getHash());
when(blockchain.getBlockHeader(any())).thenReturn(optionalHeader);
final BlockHeader blockHeader = mock(BlockHeader.class);
when(blockHeader.getBaseFee()).thenReturn(Optional.empty());
when(blockchain.getChainHeadHeader()).thenReturn(blockHeader);
final List<Address> initialValidatorList = Lists.newArrayList();
for (int i = 0; i < 4; i++) {
initialValidatorList.add(AddressHelpers.ofValue(i));
}
final IbftExtraDataCodec bftExtraDataEncoder = new IbftExtraDataCodec();
final BaseBftProtocolSchedule bftProtocolSchedule = new BaseBftProtocolSchedule() {
@Override
public BlockHeaderValidator.Builder createBlockHeaderRuleset(final BftConfigOptions config, final FeeMarket feeMarket) {
return IbftBlockHeaderValidationRulesetFactory.blockHeaderValidator(5, Optional.empty());
}
};
final GenesisConfigOptions configOptions = GenesisConfigFile.fromConfig("{\"config\": {\"spuriousDragonBlock\":0}}").getConfigOptions();
final ForksSchedule<BftConfigOptions> forksSchedule = new ForksSchedule<>(List.of(new ForkSpec<>(0, configOptions.getBftConfigOptions())));
final ProtocolSchedule protocolSchedule = bftProtocolSchedule.createProtocolSchedule(configOptions, forksSchedule, PrivacyParameters.DEFAULT, false, bftExtraDataEncoder, EvmConfiguration.DEFAULT);
final ProtocolContext protContext = new ProtocolContext(blockchain, createInMemoryWorldStateArchive(), setupContextWithBftExtraDataEncoder(initialValidatorList, bftExtraDataEncoder));
final GasPricePendingTransactionsSorter pendingTransactions = new GasPricePendingTransactionsSorter(TransactionPoolConfiguration.DEFAULT_TX_RETENTION_HOURS, 1, TestClock.fixed(), metricsSystem, blockchain::getChainHeadHeader, TransactionPoolConfiguration.DEFAULT_PRICE_BUMP);
final BftBlockCreator blockCreator = new BftBlockCreator(forksSchedule, initialValidatorList.get(0), () -> Optional.of(10_000_000L), parent -> bftExtraDataEncoder.encode(new BftExtraData(Bytes.wrap(new byte[32]), Collections.emptyList(), Optional.empty(), 0, initialValidatorList)), pendingTransactions, protContext, protocolSchedule, Wei.ZERO, 0.8, parentHeader, bftExtraDataEncoder);
final int secondsBetweenBlocks = 1;
final Block block = blockCreator.createBlock(parentHeader.getTimestamp() + 1);
final BlockHeaderValidator rules = IbftBlockHeaderValidationRulesetFactory.blockHeaderValidator(secondsBetweenBlocks, Optional.empty()).build();
// NOTE: The header will not contain commit seals, so can only do light validation on header.
final boolean validationResult = rules.validateHeader(block.getHeader(), parentHeader, protContext, HeaderValidationMode.LIGHT);
assertThat(validationResult).isTrue();
final BlockHeader header = block.getHeader();
final BftExtraData extraData = bftExtraDataEncoder.decode(header);
assertThat(block.getHash()).isEqualTo(new BftBlockHashing(bftExtraDataEncoder).calculateDataHashForCommittedSeal(header, extraData));
}
use of org.hyperledger.besu.consensus.common.bft.BftBlockHashing in project besu by hyperledger.
the class IbftRound method createCommitSeal.
private SECPSignature createCommitSeal(final Block block) {
final BlockHeader proposedHeader = block.getHeader();
final BftExtraData extraData = bftExtraDataCodec.decode(proposedHeader);
final Hash commitHash = new BftBlockHashing(bftExtraDataCodec).calculateDataHashForCommittedSeal(proposedHeader, extraData);
return nodeKey.sign(commitHash);
}
Aggregations