Skip to main content

reth_eth_wire_types/
state.rs

1//! Implements the `GetNodeData` and `NodeData` message types.
2
3use alloc::vec::Vec;
4use alloy_primitives::{Bytes, B256};
5use alloy_rlp::{RlpDecodableWrapper, RlpEncodableWrapper};
6use derive_more::{Deref, IntoIterator};
7use reth_codecs_derive::add_arbitrary_tests;
8
9/// A request for state tree nodes corresponding to the given hashes.
10/// This message was removed in `eth/67`, only clients running `eth/66` or earlier will respond to
11/// this message.
12#[derive(
13    Clone,
14    Debug,
15    PartialEq,
16    Eq,
17    RlpEncodableWrapper,
18    RlpDecodableWrapper,
19    Default,
20    Deref,
21    IntoIterator,
22)]
23#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
24#[cfg_attr(any(test, feature = "arbitrary"), derive(arbitrary::Arbitrary))]
25#[add_arbitrary_tests(rlp)]
26pub struct GetNodeData(pub Vec<B256>);
27
28/// The response to [`GetNodeData`], containing the state tree nodes or contract bytecode
29/// corresponding to the requested hashes.
30///
31/// Not all nodes are guaranteed to be returned by the peer.
32/// This message was removed in `eth/67`.
33#[derive(
34    Clone,
35    Debug,
36    PartialEq,
37    Eq,
38    RlpEncodableWrapper,
39    RlpDecodableWrapper,
40    Default,
41    Deref,
42    IntoIterator,
43)]
44#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
45#[cfg_attr(any(test, feature = "arbitrary"), derive(arbitrary::Arbitrary))]
46#[add_arbitrary_tests(rlp)]
47pub struct NodeData(pub Vec<Bytes>);
48
49#[cfg(test)]
50mod tests {
51    use alloy_primitives::hex;
52
53    use crate::{message::RequestPair, GetNodeData, NodeData};
54    use alloy_rlp::{Decodable, Encodable};
55
56    #[test]
57    // Test vector from: https://eips.ethereum.org/EIPS/eip-2481
58    fn encode_get_node_data() {
59        let expected = hex!(
60            "f847820457f842a000000000000000000000000000000000000000000000000000000000deadc0dea000000000000000000000000000000000000000000000000000000000feedbeef"
61        );
62        let mut data = vec![];
63        let request = RequestPair {
64            request_id: 1111,
65            message: GetNodeData(vec![
66                hex!("00000000000000000000000000000000000000000000000000000000deadc0de").into(),
67                hex!("00000000000000000000000000000000000000000000000000000000feedbeef").into(),
68            ]),
69        };
70        request.encode(&mut data);
71        assert_eq!(data, expected);
72    }
73
74    #[test]
75    // Test vector from: https://eips.ethereum.org/EIPS/eip-2481
76    fn decode_get_node_data() {
77        let data = hex!(
78            "f847820457f842a000000000000000000000000000000000000000000000000000000000deadc0dea000000000000000000000000000000000000000000000000000000000feedbeef"
79        );
80        let request = RequestPair::<GetNodeData>::decode(&mut &data[..]).unwrap();
81        assert_eq!(
82            request,
83            RequestPair {
84                request_id: 1111,
85                message: GetNodeData(vec![
86                    hex!("00000000000000000000000000000000000000000000000000000000deadc0de").into(),
87                    hex!("00000000000000000000000000000000000000000000000000000000feedbeef").into(),
88                ])
89            }
90        );
91    }
92
93    #[test]
94    // Test vector from: https://eips.ethereum.org/EIPS/eip-2481
95    fn encode_node_data() {
96        let expected = hex!("ce820457ca84deadc0de84feedbeef");
97        let mut data = vec![];
98        let request = RequestPair {
99            request_id: 1111,
100            message: NodeData(vec![
101                hex!("deadc0de").as_slice().into(),
102                hex!("feedbeef").as_slice().into(),
103            ]),
104        };
105        request.encode(&mut data);
106        assert_eq!(data, expected);
107    }
108
109    #[test]
110    // Test vector from: https://eips.ethereum.org/EIPS/eip-2481
111    fn decode_node_data() {
112        let data = hex!("ce820457ca84deadc0de84feedbeef");
113        let request = RequestPair::<NodeData>::decode(&mut &data[..]).unwrap();
114        assert_eq!(
115            request,
116            RequestPair {
117                request_id: 1111,
118                message: NodeData(vec![
119                    hex!("deadc0de").as_slice().into(),
120                    hex!("feedbeef").as_slice().into(),
121                ])
122            }
123        );
124    }
125}