reth_execution_errors/
trie.rs1use alloc::{boxed::Box, string::ToString};
4use alloy_primitives::{Bytes, B256};
5use nybbles::Nibbles;
6use reth_storage_errors::{db::DatabaseError, provider::ProviderError};
7use thiserror::Error;
8
9#[derive(Error, Clone, Debug)]
11pub enum StateRootError {
12 #[error(transparent)]
14 Database(#[from] DatabaseError),
15 #[error(transparent)]
17 StorageRootError(#[from] StorageRootError),
18 #[error(transparent)]
20 PrefixSetLoadError(#[from] ProviderError),
21}
22
23impl From<StateRootError> for ProviderError {
24 fn from(value: StateRootError) -> Self {
25 match value {
26 StateRootError::Database(err) |
27 StateRootError::StorageRootError(StorageRootError::Database(err)) => {
28 Self::Database(err)
29 }
30 StateRootError::PrefixSetLoadError(err) => err,
31 }
32 }
33}
34
35#[derive(Error, Clone, Debug)]
37pub enum StorageRootError {
38 #[error(transparent)]
40 Database(#[from] DatabaseError),
41}
42
43impl From<StorageRootError> for DatabaseError {
44 fn from(err: StorageRootError) -> Self {
45 match err {
46 StorageRootError::Database(err) => err,
47 }
48 }
49}
50
51#[derive(Error, Clone, Debug)]
53pub enum StateProofError {
54 #[error(transparent)]
56 Database(#[from] DatabaseError),
57 #[error(transparent)]
59 Rlp(#[from] alloy_rlp::Error),
60}
61
62impl From<StateProofError> for ProviderError {
63 fn from(value: StateProofError) -> Self {
64 match value {
65 StateProofError::Database(error) => Self::Database(error),
66 StateProofError::Rlp(error) => Self::Rlp(error),
67 }
68 }
69}
70
71pub type SparseStateTrieResult<Ok> = Result<Ok, SparseStateTrieError>;
73
74#[derive(Error, Debug)]
76#[error(transparent)]
77pub struct SparseStateTrieError(#[from] Box<SparseStateTrieErrorKind>);
78
79impl<T: Into<SparseStateTrieErrorKind>> From<T> for SparseStateTrieError {
80 #[cold]
81 fn from(value: T) -> Self {
82 Self(Box::new(value.into()))
83 }
84}
85
86impl From<SparseTrieError> for SparseStateTrieErrorKind {
87 #[cold]
88 fn from(value: SparseTrieError) -> Self {
89 Self::Sparse(*value.0)
90 }
91}
92
93impl SparseStateTrieError {
94 pub const fn kind(&self) -> &SparseStateTrieErrorKind {
96 &self.0
97 }
98
99 pub fn into_kind(self) -> SparseStateTrieErrorKind {
101 *self.0
102 }
103}
104
105#[derive(Error, Debug)]
107pub enum SparseStateTrieErrorKind {
108 #[error("invalid root node at {path:?}: {node:?}")]
110 InvalidRootNode {
111 path: Nibbles,
113 node: Bytes,
115 },
116 #[error("error in storage trie for address {0:?}: {1:?}")]
118 SparseStorageTrie(B256, SparseTrieErrorKind),
119 #[error(transparent)]
121 Sparse(#[from] SparseTrieErrorKind),
122 #[error(transparent)]
124 Rlp(#[from] alloy_rlp::Error),
125}
126
127pub type SparseTrieResult<Ok> = Result<Ok, SparseTrieError>;
129
130#[derive(Error, Debug)]
132#[error(transparent)]
133pub struct SparseTrieError(#[from] Box<SparseTrieErrorKind>);
134
135impl<T: Into<SparseTrieErrorKind>> From<T> for SparseTrieError {
136 #[cold]
137 fn from(value: T) -> Self {
138 Self(Box::new(value.into()))
139 }
140}
141
142impl SparseTrieError {
143 pub const fn kind(&self) -> &SparseTrieErrorKind {
145 &self.0
146 }
147
148 pub fn into_kind(self) -> SparseTrieErrorKind {
150 *self.0
151 }
152}
153
154#[derive(Error, Debug)]
156pub enum SparseTrieErrorKind {
157 #[error("sparse trie is blind")]
159 Blind,
160 #[error("attempted to update blind node at {path:?}: {hash}")]
162 BlindedNode {
163 path: Nibbles,
165 hash: B256,
167 },
168 #[error("encountered an invalid node at path {path:?} when revealing: {node:?}")]
170 Reveal {
171 path: Nibbles,
173 node: Box<dyn core::fmt::Debug + Send>,
175 },
176 #[error(transparent)]
178 Rlp(#[from] alloy_rlp::Error),
179 #[error("node {path:?} not found in provider during revealing")]
181 NodeNotFoundInProvider {
182 path: Nibbles,
184 },
185 #[error(transparent)]
187 Other(#[from] Box<dyn core::error::Error + Send>),
188}
189
190#[derive(Error, Debug)]
192pub enum TrieWitnessError {
193 #[error(transparent)]
195 Proof(#[from] StateProofError),
196 #[error(transparent)]
198 Rlp(#[from] alloy_rlp::Error),
199 #[error(transparent)]
201 Sparse(#[from] SparseStateTrieError),
202 #[error("missing account {_0}")]
204 MissingAccount(B256),
205}
206
207impl From<SparseStateTrieErrorKind> for TrieWitnessError {
208 fn from(error: SparseStateTrieErrorKind) -> Self {
209 Self::Sparse(error.into())
210 }
211}
212
213impl From<TrieWitnessError> for ProviderError {
214 fn from(error: TrieWitnessError) -> Self {
215 Self::TrieWitnessError(error.to_string())
216 }
217}