lib.rs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. use std::{io, net::SocketAddr};
  2. use borsh::{BorshDeserialize, BorshSerialize};
  3. use darkfi::util::serial::{serialize, Decodable, Encodable, SerialDecodable, SerialEncodable};
  4. pub mod datastore;
  5. pub mod p2p;
  6. pub mod raft;
  7. pub use datastore::DataStore;
  8. pub use p2p::ProtocolRaft;
  9. #[derive(PartialEq, Eq)]
  10. pub enum Role {
  11. Follower,
  12. Candidate,
  13. Leader,
  14. }
  15. #[derive(BorshSerialize, BorshDeserialize, Clone, Debug)]
  16. pub struct VoteRequest {
  17. node_id: NodeId,
  18. current_term: u64,
  19. log_length: u64,
  20. last_term: u64,
  21. }
  22. #[derive(BorshSerialize, BorshDeserialize, Clone, Debug)]
  23. pub struct VoteResponse {
  24. node_id: NodeId,
  25. current_term: u64,
  26. ok: bool,
  27. }
  28. #[derive(BorshSerialize, BorshDeserialize, Clone, Debug)]
  29. pub struct LogRequest {
  30. leader_id: NodeId,
  31. current_term: u64,
  32. prefix_len: u64,
  33. prefix_term: u64,
  34. commit_length: u64,
  35. suffix: VecR<Log>,
  36. }
  37. #[derive(BorshSerialize, BorshDeserialize, Clone, Debug)]
  38. pub struct LogResponse {
  39. node_id: NodeId,
  40. current_term: u64,
  41. ack: u64,
  42. ok: bool,
  43. }
  44. impl VoteResponse {
  45. pub fn set_ok(&mut self, ok: bool) {
  46. self.ok = ok;
  47. }
  48. }
  49. #[derive(BorshSerialize, BorshDeserialize, Clone, Debug, SerialDecodable, SerialEncodable)]
  50. pub struct Log {
  51. term: u64,
  52. msg: Vec<u8>,
  53. }
  54. #[derive(
  55. BorshSerialize,
  56. BorshDeserialize,
  57. Clone,
  58. Debug,
  59. Eq,
  60. PartialEq,
  61. Hash,
  62. SerialDecodable,
  63. SerialEncodable,
  64. )]
  65. pub struct NodeId(pub Vec<u8>);
  66. impl From<SocketAddr> for NodeId {
  67. fn from(addr: SocketAddr) -> Self {
  68. let ser = serialize(&addr);
  69. let hash = blake3::hash(&ser).as_bytes().to_vec();
  70. Self(hash)
  71. }
  72. }
  73. #[derive(BorshSerialize, BorshDeserialize, Clone, Debug)]
  74. pub struct VecR<T: BorshSerialize + BorshDeserialize>(pub Vec<T>);
  75. impl<T: BorshSerialize + BorshDeserialize + Clone> VecR<T> {
  76. pub fn len(&self) -> u64 {
  77. self.0.len() as u64
  78. }
  79. pub fn push(&mut self, d: &T) {
  80. self.0.push(d.clone());
  81. }
  82. pub fn slice_from(&self, start: u64) -> Self {
  83. Self(self.0[start as usize..].to_vec())
  84. }
  85. pub fn slice_to(&self, end: u64) -> Self {
  86. Self(self.0[..end as usize].to_vec())
  87. }
  88. pub fn get(&self, index: u64) -> T {
  89. self.0[index as usize].clone()
  90. }
  91. pub fn to_vec(&self) -> Vec<T> {
  92. self.0[..].to_vec()
  93. }
  94. }
  95. #[derive(
  96. BorshSerialize, BorshDeserialize, SerialDecodable, SerialEncodable, Clone, Debug, PartialEq, Eq,
  97. )]
  98. pub struct NetMsg {
  99. id: u64,
  100. recipient_id: Option<NodeId>,
  101. method: NetMsgMethod,
  102. payload: Vec<u8>,
  103. }
  104. #[derive(BorshSerialize, BorshDeserialize, Clone, Debug, PartialEq, Eq)]
  105. #[repr(u8)]
  106. pub enum NetMsgMethod {
  107. LogResponse = 0,
  108. LogRequest = 1,
  109. VoteResponse = 2,
  110. VoteRequest = 3,
  111. }
  112. impl Encodable for NetMsgMethod {
  113. fn encode<S: io::Write>(&self, s: S) -> darkfi::Result<usize> {
  114. let len: usize = match self {
  115. Self::LogResponse => 0,
  116. Self::LogRequest => 1,
  117. Self::VoteResponse => 2,
  118. Self::VoteRequest => 3,
  119. };
  120. (len as u8).encode(s)
  121. }
  122. }
  123. impl Decodable for NetMsgMethod {
  124. fn decode<D: io::Read>(d: D) -> darkfi::Result<Self> {
  125. let com: u8 = Decodable::decode(d)?;
  126. Ok(match com {
  127. 0 => Self::LogResponse,
  128. 1 => Self::LogRequest,
  129. 2 => Self::VoteResponse,
  130. _ => Self::VoteRequest,
  131. })
  132. }
  133. }
  134. pub fn try_from_slice_unchecked<T: BorshDeserialize>(data: &[u8]) -> Result<T, io::Error> {
  135. let mut data_mut = data;
  136. let result = T::deserialize(&mut data_mut)?;
  137. Ok(result)
  138. }
  139. #[cfg(test)]
  140. mod tests {
  141. #[test]
  142. fn it_works() {}
  143. }