saito_core/core/msg/
block_request.rs

1use 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}