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