1use bigint::H256;
2use rlp::{self, Rlp};
3use sha3::{Digest, Keccak256};
4
5use std::marker::PhantomData;
6
7pub trait TrieMut {
9 fn root(&self) -> H256;
11 fn insert(&mut self, key: &[u8], value: &[u8]);
13 fn delete(&mut self, key: &[u8]);
15 fn get(&self, key: &[u8]) -> Option<Vec<u8>>;
17}
18
19#[derive(Clone, Debug)]
21pub struct AnyTrieMut<T: TrieMut>(T);
22
23impl<T: TrieMut + Default> Default for AnyTrieMut<T> {
24 fn default() -> Self {
25 AnyTrieMut::new(T::default())
26 }
27}
28
29impl<T: TrieMut> AnyTrieMut<T> {
30 pub fn to_trie(self) -> T {
32 self.0
33 }
34
35 pub fn new(trie: T) -> Self {
37 AnyTrieMut(trie)
38 }
39
40 pub fn root(&self) -> H256 {
42 self.0.root()
43 }
44
45 pub fn insert<K: rlp::Encodable, V: rlp::Encodable>(&mut self, key: &K, value: &V) {
47 let key = rlp::encode(key).to_vec();
48 let value = rlp::encode(value).to_vec();
49
50 self.0.insert(&key, &value)
51 }
52
53 pub fn delete<K: rlp::Encodable>(&mut self, key: &K) {
55 let key = rlp::encode(key).to_vec();
56
57 self.0.delete(&key)
58 }
59
60 pub fn get<K: rlp::Encodable, V: rlp::Decodable>(&self, key: &K) -> Option<V> {
62 let key = rlp::encode(key).to_vec();
63 let value = self.0.get(&key);
64
65 match value {
66 Some(value) => Some(rlp::decode(&value)),
67 None => None,
68 }
69 }
70}
71
72#[derive(Clone, Debug)]
74pub struct FixedTrieMut<T: TrieMut, K: rlp::Encodable, V: rlp::Encodable + rlp::Decodable>(AnyTrieMut<T>, PhantomData<(K, V)>);
75
76impl<T: TrieMut + Default, K: rlp::Encodable, V: rlp::Encodable + rlp::Decodable> Default for FixedTrieMut<T, K, V> {
77 fn default() -> Self {
78 FixedTrieMut::new(T::default())
79 }
80}
81
82impl<T: TrieMut, K: rlp::Encodable, V: rlp::Encodable + rlp::Decodable> FixedTrieMut<T, K, V> {
83 pub fn to_trie(self) -> T {
85 self.0.to_trie()
86 }
87
88 pub fn new(trie: T) -> Self {
90 FixedTrieMut(AnyTrieMut::new(trie), PhantomData)
91 }
92
93 pub fn root(&self) -> H256 {
95 self.0.root()
96 }
97
98 pub fn insert(&mut self, key: &K, value: &V) {
100 self.0.insert(key, value)
101 }
102
103 pub fn delete(&mut self, key: &K) {
105 self.0.delete(key)
106 }
107
108 pub fn get(&self, key: &K) -> Option<V> {
110 self.0.get(key)
111 }
112}
113
114#[derive(Clone, Debug)]
116pub struct SecureTrieMut<T: TrieMut>(T);
117
118impl<T: TrieMut + Default> Default for SecureTrieMut<T> {
119 fn default() -> Self {
120 SecureTrieMut::new(T::default())
121 }
122}
123
124impl<T: TrieMut> SecureTrieMut<T> {
125 pub fn to_trie(self) -> T {
127 self.0
128 }
129
130 pub fn new(trie: T) -> Self {
132 SecureTrieMut(trie)
133 }
134
135 fn secure_key<K: AsRef<[u8]>>(key: &K) -> Vec<u8> {
136 Keccak256::digest(key.as_ref()).as_slice().into()
137 }
138
139 pub fn root(&self) -> H256 {
141 self.0.root()
142 }
143
144 pub fn insert<K: AsRef<[u8]>>(&mut self, key: &K, value: &[u8]) {
146 self.0.insert(&Self::secure_key(key), value)
147 }
148
149 pub fn delete<K: AsRef<[u8]>>(&mut self, key: &K) {
151 self.0.delete(&Self::secure_key(key))
152 }
153
154 pub fn get<K: AsRef<[u8]>>(&self, key: &K) -> Option<Vec<u8>> {
156 self.0.get(&Self::secure_key(key))
157 }
158}
159
160#[derive(Clone, Debug)]
163pub struct AnySecureTrieMut<T: TrieMut>(SecureTrieMut<T>);
164
165impl<T: TrieMut + Default> Default for AnySecureTrieMut<T> {
166 fn default() -> Self {
167 AnySecureTrieMut::new(T::default())
168 }
169}
170
171impl<T: TrieMut> AnySecureTrieMut<T> {
172 pub fn to_trie(self) -> T {
174 self.0.to_trie()
175 }
176
177 pub fn new(trie: T) -> Self {
179 AnySecureTrieMut(SecureTrieMut::new(trie))
180 }
181
182 pub fn root(&self) -> H256 {
184 self.0.root()
185 }
186
187 pub fn insert<K: AsRef<[u8]>, V: rlp::Encodable>(&mut self, key: &K, value: &V) {
189 self.0.insert(&key, &rlp::encode(value).to_vec())
190 }
191
192 pub fn delete<K: AsRef<[u8]>>(&mut self, key: &K) {
194 self.0.delete(&key)
195 }
196
197 pub fn get<K: AsRef<[u8]>, V: rlp::Decodable>(&self, key: &K) -> Option<V> {
199 let value = self.0.get(&key);
200
201 match value {
202 Some(value) => Some(rlp::decode(&value)),
203 None => None,
204 }
205 }
206}
207
208#[derive(Clone, Debug)]
211pub struct FixedSecureTrieMut<T: TrieMut, K: AsRef<[u8]>, V: rlp::Encodable + rlp::Decodable>(AnySecureTrieMut<T>, PhantomData<(K, V)>);
212
213impl<T: TrieMut + Default, K: AsRef<[u8]>, V: rlp::Encodable + rlp::Decodable> Default for FixedSecureTrieMut<T, K, V> {
214 fn default() -> Self {
215 FixedSecureTrieMut::new(T::default())
216 }
217}
218
219impl<T: TrieMut, K: AsRef<[u8]>, V: rlp::Encodable + rlp::Decodable> FixedSecureTrieMut<T, K, V> {
220 pub fn to_trie(self) -> T {
222 self.0.to_trie()
223 }
224
225 pub fn new(trie: T) -> Self {
227 FixedSecureTrieMut(AnySecureTrieMut::new(trie), PhantomData)
228 }
229
230 pub fn root(&self) -> H256 {
232 self.0.root()
233 }
234
235 pub fn insert(&mut self, key: &K, value: &V) {
237 self.0.insert(key, value)
238 }
239
240 pub fn delete(&mut self, key: &K) {
242 self.0.delete(key)
243 }
244
245 pub fn get(&self, key: &K) -> Option<V> {
247 self.0.get(key)
248 }
249}