reth_db_api/models/
blocks.rs
1use alloy_consensus::Header;
4use alloy_primitives::B256;
5use reth_codecs::{add_arbitrary_tests, Compact};
6use serde::{Deserialize, Serialize};
7
8#[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 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
37pub 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}