Skip to main content

ethrex_common/
rkyv_utils.rs

1use bytes::Bytes;
2use ethereum_types::{Bloom, H160, H256, U256};
3use rkyv::{
4    Archive, Archived, Deserialize, Serialize,
5    rancor::{Fallible, Source},
6    ser::{Allocator, Writer},
7    vec::{ArchivedVec, VecResolver},
8    with::{ArchiveWith, DeserializeWith, SerializeWith},
9};
10use std::{
11    collections::HashMap,
12    hash::{Hash, Hasher},
13};
14
15// Re-export H256Wrapper from ethrex-trie to avoid duplication
16pub use ethrex_trie::rkyv_utils::H256Wrapper;
17
18#[derive(Archive, Serialize, Deserialize)]
19#[rkyv(remote = Vec<Vec<u8>>)]
20pub struct VecVecWrapper {
21    #[rkyv(getter = vec_vec_to_vec)]
22    vec_vec: Vec<Vec<u8>>,
23}
24
25fn vec_vec_to_vec(vec_vec: &[Vec<u8>]) -> Vec<Vec<u8>> {
26    vec_vec.iter().map(|b| b.to_vec()).collect()
27}
28
29impl From<VecVecWrapper> for Vec<Vec<u8>> {
30    fn from(value: VecVecWrapper) -> Self {
31        value.vec_vec
32    }
33}
34
35#[derive(Archive, Serialize, Deserialize)]
36#[rkyv(remote = U256)]
37pub struct U256Wrapper([u64; 4]);
38
39impl From<U256Wrapper> for U256 {
40    fn from(value: U256Wrapper) -> Self {
41        Self(value.0)
42    }
43}
44
45#[derive(Archive, Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq, Hash)]
46#[rkyv(remote = H160)]
47#[rkyv(derive(Ord, PartialOrd))]
48pub struct H160Wrapper([u8; 20]);
49
50impl From<H160Wrapper> for H160 {
51    fn from(value: H160Wrapper) -> Self {
52        Self(value.0)
53    }
54}
55
56impl PartialEq for ArchivedH160Wrapper {
57    fn eq(&self, other: &Self) -> bool {
58        self.0 == other.0
59    }
60}
61
62impl Eq for ArchivedH160Wrapper {}
63
64impl Hash for ArchivedH160Wrapper {
65    fn hash<H: Hasher>(&self, state: &mut H) {
66        self.0.hash(state);
67    }
68}
69
70#[derive(Archive, Serialize, Deserialize)]
71#[rkyv(remote = Option<H160>)]
72pub enum OptionH160Wrapper {
73    Some(#[rkyv(with = H160Wrapper)] H160),
74    None,
75}
76
77impl From<OptionH160Wrapper> for Option<H160> {
78    fn from(value: OptionH160Wrapper) -> Self {
79        if let OptionH160Wrapper::Some(x) = value {
80            Some(x)
81        } else {
82            None
83        }
84    }
85}
86
87#[derive(Archive, Serialize, Deserialize)]
88#[rkyv(remote = Bytes)]
89pub struct BytesWrapper {
90    #[rkyv(getter = bytes_to_vec)]
91    bytes: Vec<u8>,
92}
93
94fn bytes_to_vec(bytes: &Bytes) -> Vec<u8> {
95    bytes.to_vec()
96}
97
98impl From<BytesWrapper> for Bytes {
99    fn from(value: BytesWrapper) -> Self {
100        Self::copy_from_slice(&value.bytes)
101    }
102}
103
104#[derive(Archive, Serialize, Deserialize)]
105#[rkyv(remote = Bloom)]
106pub struct BloomWrapper {
107    #[rkyv(getter = bloom_to_bytes)]
108    bloom_bytes: [u8; 256],
109}
110
111fn bloom_to_bytes(bloom: &Bloom) -> [u8; 256] {
112    bloom.0
113}
114
115impl From<BloomWrapper> for Bloom {
116    fn from(value: BloomWrapper) -> Self {
117        Self::from_slice(&value.bloom_bytes)
118    }
119}
120
121#[derive(Archive, Serialize, Deserialize)]
122#[rkyv(remote = Option<H256>)]
123pub enum OptionH256Wrapper {
124    Some(#[rkyv(with = H256Wrapper)] H256),
125    None,
126}
127
128impl From<OptionH256Wrapper> for Option<H256> {
129    fn from(value: OptionH256Wrapper) -> Self {
130        if let OptionH256Wrapper::Some(x) = value {
131            Some(x)
132        } else {
133            None
134        }
135    }
136}
137
138#[derive(Archive, Serialize, Deserialize)]
139#[rkyv(remote = Option<HashMap<H160, Vec<Vec<u8>>>>)]
140pub enum OptionStorageWrapper {
141    Some(
142        #[rkyv(with = rkyv::with::MapKV<H160Wrapper, rkyv::with::AsBox>)]
143        HashMap<H160, Vec<Vec<u8>>>,
144    ),
145    None,
146}
147
148impl From<OptionStorageWrapper> for Option<HashMap<H160, Vec<Vec<u8>>>> {
149    fn from(value: OptionStorageWrapper) -> Self {
150        if let OptionStorageWrapper::Some(x) = value {
151            Some(x)
152        } else {
153            None
154        }
155    }
156}
157pub struct AccessListItemWrapper;
158
159pub struct AccessListItemWrapperResolver {
160    len: usize,
161    inner: VecResolver,
162}
163
164impl ArchiveWith<(H160, Vec<H256>)> for AccessListItemWrapper {
165    type Archived = ArchivedVec<u8>;
166    type Resolver = AccessListItemWrapperResolver;
167    fn resolve_with(
168        _: &(H160, Vec<H256>),
169        resolver: Self::Resolver,
170        out: rkyv::Place<Self::Archived>,
171    ) {
172        ArchivedVec::resolve_from_len(resolver.len, resolver.inner, out);
173    }
174}
175
176impl<S> SerializeWith<(H160, Vec<H256>), S> for AccessListItemWrapper
177where
178    S: Fallible + Allocator + Writer + ?Sized,
179{
180    fn serialize_with(
181        field: &(H160, Vec<H256>),
182        serializer: &mut S,
183    ) -> Result<Self::Resolver, S::Error> {
184        let mut encoded: Vec<u8> = Vec::new();
185        // Encode Address
186        encoded.extend_from_slice(&field.0.0);
187        // Encode length of access list keys
188        encoded.extend_from_slice(&(field.1.len() as u64).to_le_bytes());
189        for slot in field.1.iter() {
190            // Encode access list key
191            encoded.extend_from_slice(&slot.0);
192        }
193
194        Ok(AccessListItemWrapperResolver {
195            len: encoded.len(),
196            inner: ArchivedVec::serialize_from_slice(encoded.as_slice(), serializer)?,
197        })
198    }
199}
200
201impl<D> DeserializeWith<Archived<Vec<u8>>, (H160, Vec<H256>), D> for AccessListItemWrapper
202where
203    D: Fallible<Error = rkyv::rancor::Error> + ?Sized,
204{
205    fn deserialize_with(
206        field: &Archived<Vec<u8>>,
207        _: &mut D,
208    ) -> Result<(H160, Vec<H256>), D::Error> {
209        let address = H160::from_slice(&field[0..20]);
210
211        let access_list_length =
212            u64::from_le_bytes(field[20..28].try_into().map_err(rkyv::rancor::Error::new)?)
213                as usize;
214
215        let mut access_list_keys = Vec::with_capacity(access_list_length);
216        let mut start = 28_usize;
217        let mut end = start + 32_usize; // 60
218        for _ in 0..access_list_length {
219            access_list_keys.push(H256::from_slice(&field[start..end]));
220            start = end;
221            end = start + 32_usize;
222        }
223        Ok((address, access_list_keys))
224    }
225}