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