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}