Search in sources :

Example 6 with BFTHeader

use of com.radixdlt.consensus.BFTHeader in project radixdlt by radixdlt.

the class SafetyRulesTest method when_vote_with_qc_on_different_locked_view__then_exception_is_thrown.

@Test
public void when_vote_with_qc_on_different_locked_view__then_exception_is_thrown() {
    Hasher hasher = mock(Hasher.class);
    when(hasher.hash(any())).thenReturn(mock(HashCode.class));
    HashSigner hashSigner = mock(HashSigner.class);
    when(hashSigner.sign(any(HashCode.class))).thenReturn(ECDSASignature.zeroSignature());
    Vote lastVote = mock(Vote.class);
    when(lastVote.getView()).thenReturn(View.of(1));
    SafetyRules safetyRules = new SafetyRules(BFTNode.random(), new SafetyState(View.of(2), Optional.of(lastVote)), mock(PersistentSafetyStateStore.class), hasher, hashSigner);
    VerifiedVertex vertex = mock(VerifiedVertex.class);
    when(vertex.getView()).thenReturn(View.of(3));
    BFTHeader parent = mock(BFTHeader.class);
    when(parent.getView()).thenReturn(View.of(0));
    when(vertex.getParentHeader()).thenReturn(parent);
    assertThat(safetyRules.voteFor(vertex, mock(BFTHeader.class), 0L, mock(HighQC.class))).isEmpty();
}
Also used : VerifiedVertex(com.radixdlt.consensus.bft.VerifiedVertex) HighQC(com.radixdlt.consensus.HighQC) BFTHeader(com.radixdlt.consensus.BFTHeader) Hasher(com.radixdlt.crypto.Hasher) Vote(com.radixdlt.consensus.Vote) HashCode(com.google.common.hash.HashCode) HashSigner(com.radixdlt.consensus.HashSigner) Test(org.junit.Test)

Example 7 with BFTHeader

use of com.radixdlt.consensus.BFTHeader in project radixdlt by radixdlt.

the class SafetyRulesTest method when_vote_on_proposal_after_genesis__then_returned_vote_has_no_commit.

@Test
public void when_vote_on_proposal_after_genesis__then_returned_vote_has_no_commit() {
    when(safetyState.getLastVotedView()).thenReturn(View.of(0));
    when(safetyState.getLockedView()).thenReturn(View.of(0));
    when(safetyState.toBuilder()).thenReturn(mock(Builder.class));
    VerifiedVertex vertex = mock(VerifiedVertex.class);
    when(vertex.hasDirectParent()).thenReturn(true);
    when(vertex.touchesGenesis()).thenReturn(true);
    when(vertex.parentHasDirectParent()).thenReturn(true);
    when(vertex.getView()).thenReturn(View.of(1));
    BFTHeader parent = mock(BFTHeader.class);
    when(parent.getView()).thenReturn(View.of(0));
    when(vertex.getParentHeader()).thenReturn(parent);
    BFTHeader grandParent = mock(BFTHeader.class);
    when(grandParent.getView()).thenReturn(mock(View.class));
    when(vertex.getGrandParentHeader()).thenReturn(grandParent);
    BFTHeader header = mock(BFTHeader.class);
    Optional<Vote> voteMaybe = safetyRules.voteFor(vertex, header, 1L, mock(HighQC.class));
    assertThat(voteMaybe).isNotEmpty();
    Vote vote = voteMaybe.get();
    assertThat(vote.getVoteData().getProposed()).isEqualTo(header);
    assertThat(vote.getVoteData().getParent()).isEqualTo(parent);
    assertThat(vote.getVoteData().getCommitted()).isEmpty();
}
Also used : VerifiedVertex(com.radixdlt.consensus.bft.VerifiedVertex) HighQC(com.radixdlt.consensus.HighQC) BFTHeader(com.radixdlt.consensus.BFTHeader) Vote(com.radixdlt.consensus.Vote) Builder(com.radixdlt.consensus.safety.SafetyState.Builder) View(com.radixdlt.consensus.bft.View) Test(org.junit.Test)

Example 8 with BFTHeader

use of com.radixdlt.consensus.BFTHeader in project radixdlt by radixdlt.

the class Pacemaker method createAndSendTimeoutVote.

private void createAndSendTimeoutVote(PreparedVertex preparedVertex) {
    final BFTHeader bftHeader = new BFTHeader(preparedVertex.getView(), preparedVertex.getId(), preparedVertex.getLedgerHeader());
    final Vote baseVote = this.safetyRules.createVote(preparedVertex.getVertex(), bftHeader, this.timeSupplier.currentTime(), this.latestViewUpdate.getHighQC());
    final Vote timeoutVote = this.safetyRules.timeoutVote(baseVote);
    this.voteDispatcher.dispatch(this.validatorSet.nodes(), timeoutVote);
}
Also used : BFTHeader(com.radixdlt.consensus.BFTHeader) Vote(com.radixdlt.consensus.Vote)

Example 9 with BFTHeader

use of com.radixdlt.consensus.BFTHeader in project radixdlt by radixdlt.

the class ConsensusModuleTest method createNextVertex.

private Pair<QuorumCertificate, VerifiedVertex> createNextVertex(QuorumCertificate parent, BFTNode bftNode, Txn txn) {
    var unverifiedVertex = UnverifiedVertex.create(parent, View.of(1), List.of(txn), bftNode);
    var hash = hasher.hash(unverifiedVertex);
    var verifiedVertex = new VerifiedVertex(unverifiedVertex, hash);
    var next = new BFTHeader(View.of(1), verifiedVertex.getId(), LedgerHeader.create(1, View.of(1), new AccumulatorState(1, HashUtils.zero256()), 1));
    var voteData = new VoteData(next, parent.getProposed(), parent.getParent());
    var unsyncedQC = new QuorumCertificate(voteData, new TimestampedECDSASignatures(Map.of(bftNode, TimestampedECDSASignature.from(1, zeroSignature()))));
    return Pair.of(unsyncedQC, verifiedVertex);
}
Also used : VerifiedVertex(com.radixdlt.consensus.bft.VerifiedVertex) TimestampedECDSASignatures(com.radixdlt.consensus.TimestampedECDSASignatures) BFTHeader(com.radixdlt.consensus.BFTHeader) AccumulatorState(com.radixdlt.ledger.AccumulatorState) QuorumCertificate(com.radixdlt.consensus.QuorumCertificate) VoteData(com.radixdlt.consensus.VoteData)

Example 10 with BFTHeader

use of com.radixdlt.consensus.BFTHeader in project radixdlt by radixdlt.

the class SafetyRules method constructVoteData.

private static VoteData constructVoteData(VerifiedVertex proposedVertex, BFTHeader proposedHeader) {
    final BFTHeader parent = proposedVertex.getParentHeader();
    // Add a vertex to commit if creating a quorum for the proposed vertex would
    // create three consecutive qcs.
    final BFTHeader toCommit;
    if (proposedVertex.touchesGenesis() || !proposedVertex.hasDirectParent() || !proposedVertex.parentHasDirectParent()) {
        toCommit = null;
    } else {
        toCommit = proposedVertex.getGrandParentHeader();
    }
    return new VoteData(proposedHeader, parent, toCommit);
}
Also used : BFTHeader(com.radixdlt.consensus.BFTHeader) VoteData(com.radixdlt.consensus.VoteData)

Aggregations

BFTHeader (com.radixdlt.consensus.BFTHeader)16 Test (org.junit.Test)12 HighQC (com.radixdlt.consensus.HighQC)8 Vote (com.radixdlt.consensus.Vote)7 VerifiedVertex (com.radixdlt.consensus.bft.VerifiedVertex)7 QuorumCertificate (com.radixdlt.consensus.QuorumCertificate)6 VoteData (com.radixdlt.consensus.VoteData)6 TimestampedECDSASignatures (com.radixdlt.consensus.TimestampedECDSASignatures)5 View (com.radixdlt.consensus.bft.View)5 LedgerHeader (com.radixdlt.consensus.LedgerHeader)4 Builder (com.radixdlt.consensus.safety.SafetyState.Builder)4 HashCode (com.google.common.hash.HashCode)3 HashSigner (com.radixdlt.consensus.HashSigner)1 Ledger (com.radixdlt.consensus.Ledger)1 BFTInsertUpdate (com.radixdlt.consensus.bft.BFTInsertUpdate)1 BFTNode (com.radixdlt.consensus.bft.BFTNode)1 PreparedVertex (com.radixdlt.consensus.bft.PreparedVertex)1 VerifiedVertexStoreState (com.radixdlt.consensus.bft.VerifiedVertexStoreState)1 ViewUpdate (com.radixdlt.consensus.bft.ViewUpdate)1 Hasher (com.radixdlt.crypto.Hasher)1