reth_execution_errors/
trie.rs
1use 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, PartialEq, Eq, Clone, Debug)]
11pub enum StateRootError {
12 #[error(transparent)]
14 Database(#[from] DatabaseError),
15 #[error(transparent)]
17 StorageRootError(#[from] StorageRootError),
18}
19
20impl From<StateRootError> for DatabaseError {
21 fn from(err: StateRootError) -> Self {
22 match err {
23 StateRootError::Database(err) |
24 StateRootError::StorageRootError(StorageRootError::Database(err)) => err,
25 }
26 }
27}
28
29#[derive(Error, PartialEq, Eq, Clone, Debug)]
31pub enum StorageRootError {
32 #[error(transparent)]
34 Database(#[from] DatabaseError),
35}
36
37impl From<StorageRootError> for DatabaseError {
38 fn from(err: StorageRootError) -> Self {
39 match err {
40 StorageRootError::Database(err) => err,
41 }
42 }
43}
44
45#[derive(Error, PartialEq, Eq, Clone, Debug)]
47pub enum StateProofError {
48 #[error(transparent)]
50 Database(#[from] DatabaseError),
51 #[error(transparent)]
53 Rlp(#[from] alloy_rlp::Error),
54}
55
56impl From<StateProofError> for ProviderError {
57 fn from(value: StateProofError) -> Self {
58 match value {
59 StateProofError::Database(error) => Self::Database(error),
60 StateProofError::Rlp(error) => Self::Rlp(error),
61 }
62 }
63}
64
65pub type SparseStateTrieResult<Ok> = Result<Ok, SparseStateTrieError>;
67
68#[derive(Error, Debug)]
70#[error(transparent)]
71pub struct SparseStateTrieError(#[from] Box<SparseStateTrieErrorKind>);
72
73impl<T: Into<SparseStateTrieErrorKind>> From<T> for SparseStateTrieError {
74 #[cold]
75 fn from(value: T) -> Self {
76 Self(Box::new(value.into()))
77 }
78}
79
80impl From<SparseTrieError> for SparseStateTrieErrorKind {
81 #[cold]
82 fn from(value: SparseTrieError) -> Self {
83 Self::Sparse(*value.0)
84 }
85}
86
87impl SparseStateTrieError {
88 pub const fn kind(&self) -> &SparseStateTrieErrorKind {
90 &self.0
91 }
92
93 pub fn into_kind(self) -> SparseStateTrieErrorKind {
95 *self.0
96 }
97}
98
99#[derive(Error, Debug)]
101pub enum SparseStateTrieErrorKind {
102 #[error("invalid root node at {path:?}: {node:?}")]
104 InvalidRootNode {
105 path: Nibbles,
107 node: Bytes,
109 },
110 #[error("error in storage trie for address {0:?}: {1:?}")]
112 SparseStorageTrie(B256, SparseTrieErrorKind),
113 #[error(transparent)]
115 Sparse(#[from] SparseTrieErrorKind),
116 #[error(transparent)]
118 Rlp(#[from] alloy_rlp::Error),
119}
120
121pub type SparseTrieResult<Ok> = Result<Ok, SparseTrieError>;
123
124#[derive(Error, Debug)]
126#[error(transparent)]
127pub struct SparseTrieError(#[from] Box<SparseTrieErrorKind>);
128
129impl<T: Into<SparseTrieErrorKind>> From<T> for SparseTrieError {
130 #[cold]
131 fn from(value: T) -> Self {
132 Self(Box::new(value.into()))
133 }
134}
135
136impl SparseTrieError {
137 pub const fn kind(&self) -> &SparseTrieErrorKind {
139 &self.0
140 }
141
142 pub fn into_kind(self) -> SparseTrieErrorKind {
144 *self.0
145 }
146}
147
148#[derive(Error, Debug)]
150pub enum SparseTrieErrorKind {
151 #[error("sparse trie is blind")]
153 Blind,
154 #[error("attempted to update blind node at {path:?}: {hash}")]
156 BlindedNode {
157 path: Nibbles,
159 hash: B256,
161 },
162 #[error("encountered an invalid node at path {path:?} when revealing: {node:?}")]
164 Reveal {
165 path: Nibbles,
167 node: Box<dyn core::fmt::Debug + Send>,
169 },
170 #[error(transparent)]
172 Rlp(#[from] alloy_rlp::Error),
173 #[error(transparent)]
175 Other(#[from] Box<dyn core::error::Error + Send>),
176}
177
178#[derive(Error, Debug)]
180pub enum TrieWitnessError {
181 #[error(transparent)]
183 Proof(#[from] StateProofError),
184 #[error(transparent)]
186 Rlp(#[from] alloy_rlp::Error),
187 #[error(transparent)]
189 Sparse(#[from] SparseStateTrieError),
190 #[error("missing account {_0}")]
192 MissingAccount(B256),
193}
194
195impl From<SparseStateTrieErrorKind> for TrieWitnessError {
196 fn from(error: SparseStateTrieErrorKind) -> Self {
197 Self::Sparse(error.into())
198 }
199}
200
201impl From<TrieWitnessError> for ProviderError {
202 fn from(error: TrieWitnessError) -> Self {
203 Self::TrieWitnessError(error.to_string())
204 }
205}