saito_core/core/msg/
block_request.rs1use crate::core::defs::SaitoHash;
2use std::io::{Error, ErrorKind};
3
4use crate::core::util::serialize::Serialize;
5
6#[derive(Debug)]
7pub struct BlockchainRequest {
8 pub(crate) latest_block_id: u64,
9 pub(crate) latest_block_hash: SaitoHash,
10 pub(crate) fork_id: SaitoHash,
11}
12
13impl Serialize<Self> for BlockchainRequest {
14 fn serialize(&self) -> Vec<u8> {
15 [
16 self.latest_block_id.to_be_bytes().as_slice(),
17 self.latest_block_hash.as_slice(),
18 self.fork_id.as_slice(),
19 ]
20 .concat()
21 }
22
23 fn deserialize(buffer: &Vec<u8>) -> Result<Self, Error> {
24 if buffer.len() != 72 {
25 return Err(Error::from(ErrorKind::InvalidData));
26 }
27 Ok(BlockchainRequest {
28 latest_block_id: u64::from_be_bytes(buffer[0..8].to_vec().try_into().unwrap()),
29 latest_block_hash: buffer[8..40].to_vec().try_into().unwrap(),
30 fork_id: buffer[40..72].to_vec().try_into().unwrap(),
31 })
32 }
33}
34
35#[cfg(test)]
36mod tests {
37 use crate::core::msg::block_request::BlockchainRequest;
38 use crate::core::util::crypto::generate_random_bytes;
39 use crate::core::util::serialize::Serialize;
40
41 #[tokio::test]
42 async fn test_serialize_with_full_fork_id() {
43 let request = BlockchainRequest {
44 latest_block_id: 10,
45 latest_block_hash: generate_random_bytes(32).await.try_into().unwrap(),
46 fork_id: generate_random_bytes(32).await.try_into().unwrap(),
47 };
48 let buffer = request.serialize();
49 assert_eq!(buffer.len(), 72);
50 let new_request = BlockchainRequest::deserialize(&buffer);
51 assert!(new_request.is_ok());
52 let new_request = new_request.unwrap();
53 assert_eq!(request.latest_block_id, new_request.latest_block_id);
54 assert_eq!(request.latest_block_hash, new_request.latest_block_hash);
55 assert_eq!(request.fork_id, new_request.fork_id);
56 }
57}