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 #[error("trie inconsistency: {0}")]
65 TrieInconsistency(alloc::string::String),
66}
67
68impl From<StateProofError> for ProviderError {
69 fn from(value: StateProofError) -> Self {
70 match value {
71 StateProofError::Database(error) => Self::Database(error),
72 StateProofError::Rlp(error) => Self::Rlp(error),
73 StateProofError::TrieInconsistency(msg) => Self::Database(DatabaseError::Other(msg)),
74 }
75 }
76}
77
78pub type SparseStateTrieResult<Ok> = Result<Ok, SparseStateTrieError>;
80
81#[derive(Error, Debug)]
83#[error(transparent)]
84pub struct SparseStateTrieError(#[from] Box<SparseStateTrieErrorKind>);
85
86impl<T: Into<SparseStateTrieErrorKind>> From<T> for SparseStateTrieError {
87 #[cold]
88 fn from(value: T) -> Self {
89 Self(Box::new(value.into()))
90 }
91}
92
93impl From<SparseTrieError> for SparseStateTrieErrorKind {
94 #[cold]
95 fn from(value: SparseTrieError) -> Self {
96 Self::Sparse(*value.0)
97 }
98}
99
100impl SparseStateTrieError {
101 pub const fn kind(&self) -> &SparseStateTrieErrorKind {
103 &self.0
104 }
105
106 pub fn into_kind(self) -> SparseStateTrieErrorKind {
108 *self.0
109 }
110}
111
112#[derive(Error, Debug)]
114pub enum SparseStateTrieErrorKind {
115 #[error("invalid root node at {path:?}: {node:?}")]
117 InvalidRootNode {
118 path: Nibbles,
120 node: Bytes,
122 },
123 #[error("error in storage trie for address {0:?}: {1:?}")]
125 SparseStorageTrie(B256, SparseTrieErrorKind),
126 #[error(transparent)]
128 Sparse(#[from] SparseTrieErrorKind),
129 #[error(transparent)]
131 Rlp(#[from] alloy_rlp::Error),
132}
133
134pub type SparseTrieResult<Ok> = Result<Ok, SparseTrieError>;
136
137#[derive(Error, Debug)]
139#[error(transparent)]
140pub struct SparseTrieError(#[from] Box<SparseTrieErrorKind>);
141
142impl<T: Into<SparseTrieErrorKind>> From<T> for SparseTrieError {
143 #[cold]
144 fn from(value: T) -> Self {
145 Self(Box::new(value.into()))
146 }
147}
148
149impl SparseTrieError {
150 pub const fn kind(&self) -> &SparseTrieErrorKind {
152 &self.0
153 }
154
155 pub fn into_kind(self) -> SparseTrieErrorKind {
157 *self.0
158 }
159}
160
161#[derive(Error, Debug)]
163pub enum SparseTrieErrorKind {
164 #[error("sparse trie is blind")]
166 Blind,
167 #[error("attempted to update blind node at {path:?}: {hash}")]
169 BlindedNode {
170 path: Nibbles,
172 hash: B256,
174 },
175 #[error("encountered an invalid node at path {path:?} when revealing: {node:?}")]
177 Reveal {
178 path: Nibbles,
180 node: Box<dyn core::fmt::Debug + Send + Sync>,
182 },
183 #[error(transparent)]
185 Rlp(#[from] alloy_rlp::Error),
186 #[error("node {path:?} not found in provider during revealing")]
188 NodeNotFoundInProvider {
189 path: Nibbles,
191 },
192 #[error(transparent)]
194 Other(#[from] Box<dyn core::error::Error + Send + Sync>),
195}
196
197#[derive(Error, Debug)]
199pub enum TrieWitnessError {
200 #[error(transparent)]
202 Proof(#[from] StateProofError),
203 #[error(transparent)]
205 Rlp(#[from] alloy_rlp::Error),
206 #[error(transparent)]
208 Sparse(#[from] SparseStateTrieError),
209 #[error("missing account {_0}")]
211 MissingAccount(B256),
212}
213
214impl From<SparseStateTrieErrorKind> for TrieWitnessError {
215 fn from(error: SparseStateTrieErrorKind) -> Self {
216 Self::Sparse(error.into())
217 }
218}
219
220impl From<TrieWitnessError> for ProviderError {
221 fn from(error: TrieWitnessError) -> Self {
222 Self::TrieWitnessError(error.to_string())
223 }
224}