Skip to main content

vrf_pbft/pbft/
message.rs

1use serde::{Deserialize, Serialize};
2
3use crate::types::{hash, Block, Hash, NodeId};
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
6pub enum MessageType {
7    PrePrepare,
8    Prepare,
9    Commit,
10    Reply,
11}
12
13#[derive(Debug, Clone, Serialize, Deserialize)]
14pub struct Vote {
15    pub voter: NodeId,
16    pub approve: bool,
17}
18
19impl Vote {
20    pub fn approve(voter: NodeId) -> Self {
21        Self {
22            voter,
23            approve: true,
24        }
25    }
26
27    pub fn reject(voter: NodeId) -> Self {
28        Self {
29            voter,
30            approve: false,
31        }
32    }
33}
34
35#[derive(Debug, Clone, Serialize, Deserialize)]
36pub struct Message {
37    pub source: NodeId,
38    pub round: u64,
39    pub msg_type: MessageType,
40    pub block_hash: Hash,
41    pub vote: Option<Vote>,
42    pub block: Option<Block>,
43}
44
45impl Message {
46    pub fn pre_prepare(source: NodeId, round: u64, block: Block) -> Self {
47        let block_hash = block.hash();
48        Self {
49            source,
50            round,
51            msg_type: MessageType::PrePrepare,
52            block_hash,
53            vote: None,
54            block: Some(block),
55        }
56    }
57
58    pub fn prepare(source: NodeId, round: u64, block_hash: Hash, approve: bool) -> Self {
59        let vote = if approve {
60            Vote::approve(source)
61        } else {
62            Vote::reject(source)
63        };
64        Self {
65            source,
66            round,
67            msg_type: MessageType::Prepare,
68            block_hash,
69            vote: Some(vote),
70            block: None,
71        }
72    }
73
74    pub fn commit(source: NodeId, round: u64, block_hash: Hash, approve: bool) -> Self {
75        let vote = if approve {
76            Vote::approve(source)
77        } else {
78            Vote::reject(source)
79        };
80        Self {
81            source,
82            round,
83            msg_type: MessageType::Commit,
84            block_hash,
85            vote: Some(vote),
86            block: None,
87        }
88    }
89
90    pub fn reply(source: NodeId, round: u64, block: Block) -> Self {
91        let block_hash = block.hash();
92        Self {
93            source,
94            round,
95            msg_type: MessageType::Reply,
96            block_hash,
97            vote: None,
98            block: Some(block),
99        }
100    }
101
102    pub fn hash(&self) -> Hash {
103        let bytes = bincode::serialize(self).expect("message serialization failed");
104        hash(&bytes)
105    }
106}