reth_db_api/models/
blocks.rs

1//! Block related models and types.
2
3use alloy_consensus::Header;
4use alloy_primitives::B256;
5use reth_codecs::{add_arbitrary_tests, Compact};
6use serde::{Deserialize, Serialize};
7
8/// The storage representation of a block's ommers.
9///
10/// It is stored as the headers of the block's uncles.
11#[derive(Debug, Default, Eq, PartialEq, Clone, Serialize, Deserialize)]
12#[cfg_attr(any(test, feature = "arbitrary"), derive(arbitrary::Arbitrary))]
13#[add_arbitrary_tests(compact)]
14pub struct StoredBlockOmmers<H = Header> {
15    /// The block headers of this block's uncles.
16    pub ommers: Vec<H>,
17}
18
19impl<H: Compact> Compact for StoredBlockOmmers<H> {
20    fn to_compact<B>(&self, buf: &mut B) -> usize
21    where
22        B: bytes::BufMut + AsMut<[u8]>,
23    {
24        let mut buffer = bytes::BytesMut::new();
25        self.ommers.to_compact(&mut buffer);
26        let total_length = buffer.len();
27        buf.put(buffer);
28        total_length
29    }
30
31    fn from_compact(buf: &[u8], _len: usize) -> (Self, &[u8]) {
32        let (ommers, new_buf) = Vec::from_compact(buf, buf.len());
33        (Self { ommers }, new_buf)
34    }
35}
36
37/// Hash of the block header.
38pub type HeaderHash = B256;
39
40#[cfg(test)]
41mod tests {
42    use super::*;
43    use crate::table::{Compress, Decompress};
44
45    #[test]
46    fn test_ommer() {
47        let mut ommer = StoredBlockOmmers::default();
48        ommer.ommers.push(Header::default());
49        ommer.ommers.push(Header::default());
50        assert_eq!(ommer.clone(), StoredBlockOmmers::decompress(&ommer.compress()).unwrap());
51    }
52
53    #[test]
54    fn fuzz_stored_block_ommers() {
55        fuzz_test_stored_block_ommers(StoredBlockOmmers::default())
56    }
57
58    #[test_fuzz::test_fuzz]
59    fn fuzz_test_stored_block_ommers(obj: StoredBlockOmmers) {
60        use reth_codecs::Compact;
61        let mut buf = vec![];
62        let len = obj.to_compact(&mut buf);
63        let (same_obj, _) = StoredBlockOmmers::from_compact(buf.as_ref(), len);
64        assert_eq!(obj, same_obj);
65    }
66}