reth_eth_wire_types/
state.rs

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