Skip to main content

hotmint_types/
message.rs

1use serde::{Deserialize, Serialize};
2
3use crate::block::Block;
4use crate::certificate::{DoubleCertificate, QuorumCertificate, TimeoutCertificate};
5use crate::crypto::Signature;
6use crate::evidence::EquivocationProof;
7use crate::validator::ValidatorId;
8use crate::view::ViewNumber;
9use crate::vote::Vote;
10
11#[derive(Debug, Clone, Serialize, Deserialize)]
12pub enum ConsensusMessage {
13    /// Leader broadcasts proposal
14    Propose {
15        block: Box<Block>,
16        justify: Box<QuorumCertificate>,
17        double_cert: Option<Box<DoubleCertificate>>,
18        signature: Signature,
19    },
20
21    /// First-phase vote → current leader
22    VoteMsg(Vote),
23
24    /// Leader broadcasts QC after collecting 2f+1 votes
25    Prepare {
26        certificate: QuorumCertificate,
27        signature: Signature,
28    },
29
30    /// Second-phase vote → next leader
31    Vote2Msg(Vote),
32
33    /// Timeout wish: validator wants to advance to target_view
34    Wish {
35        target_view: ViewNumber,
36        validator: ValidatorId,
37        highest_qc: Option<QuorumCertificate>,
38        signature: Signature,
39    },
40
41    /// Timeout certificate broadcast
42    TimeoutCert(TimeoutCertificate),
43
44    /// Status message: replica sends locked_qc to new leader
45    StatusCert {
46        locked_qc: Option<QuorumCertificate>,
47        validator: ValidatorId,
48        signature: Signature,
49    },
50
51    /// Evidence of validator equivocation (gossip)
52    Evidence(EquivocationProof),
53}