Skip to main content

reth_trie/proof_v2/
value.rs

1//! Generic value encoder types for proof calculation with lazy evaluation.
2
3use alloy_primitives::{B256, U256};
4use alloy_rlp::Encodable;
5use reth_execution_errors::trie::StateProofError;
6
7/// A trait for deferred RLP-encoding of leaf values.
8pub trait DeferredValueEncoder {
9    /// RLP encodes the value into the provided buffer.
10    ///
11    /// # Arguments
12    ///
13    /// * `buf` - A mutable buffer to encode the data into
14    fn encode(self, buf: &mut Vec<u8>) -> Result<(), StateProofError>;
15}
16
17/// A trait for RLP-encoding values for proof calculation. This trait is designed to allow the lazy
18/// computation of leaf values in a generic way.
19///
20/// When calculating a leaf value in a storage trie the [`DeferredValueEncoder`] simply holds onto
21/// the slot value, and the `encode` method synchronously RLP-encodes it.
22///
23/// When calculating a leaf value in the accounts trie we create a [`DeferredValueEncoder`] to
24/// initiate any asynchronous computation of the account's storage root we want to do. Later we call
25/// [`DeferredValueEncoder::encode`] to obtain the result of that computation and RLP-encode it.
26pub trait LeafValueEncoder {
27    /// The type of value being encoded (e.g., U256 for storage, Account for accounts).
28    type Value;
29
30    /// The type that will compute and encode the value when needed.
31    type DeferredEncoder: DeferredValueEncoder;
32
33    /// Returns an encoder that will RLP-encode the value when its `encode` method is called.
34    ///
35    /// # Arguments
36    ///
37    /// * `key` - The key the value was stored at in the DB
38    /// * `value` - The value to encode
39    ///
40    /// The returned deferred encoder will be called as late as possible in the algorithm to
41    /// maximize the time available for parallel computation (e.g., storage root calculation).
42    fn deferred_encoder(&mut self, key: B256, value: Self::Value) -> Self::DeferredEncoder;
43}
44
45/// An encoder for storage slot values.
46///
47/// This encoder simply RLP-encodes U256 storage values directly.
48#[derive(Debug, Clone, Copy, Default)]
49pub struct StorageValueEncoder;
50
51/// The deferred encoder for a storage slot value.
52#[derive(Debug, Clone, Copy)]
53pub struct StorageDeferredValueEncoder(U256);
54
55impl DeferredValueEncoder for StorageDeferredValueEncoder {
56    fn encode(self, buf: &mut Vec<u8>) -> Result<(), StateProofError> {
57        self.0.encode(buf);
58        Ok(())
59    }
60}
61
62impl LeafValueEncoder for StorageValueEncoder {
63    type Value = U256;
64    type DeferredEncoder = StorageDeferredValueEncoder;
65
66    fn deferred_encoder(&mut self, _key: B256, value: Self::Value) -> Self::DeferredEncoder {
67        StorageDeferredValueEncoder(value)
68    }
69}