Skip to content

Commit 400bea5

Browse files
authored
Merge 1740679 into 417aafc
2 parents 417aafc + 1740679 commit 400bea5

12 files changed

Lines changed: 124 additions & 246 deletions

File tree

crates/blockchain/blockchain.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -347,7 +347,7 @@ impl Blockchain {
347347
if used_trie_nodes.is_empty()
348348
&& let Some(root) = root_node
349349
{
350-
used_trie_nodes.push(root.encode_raw());
350+
used_trie_nodes.push(root.encode_to_vec());
351351
}
352352

353353
let mut needed_block_numbers = block_hashes.keys().collect::<Vec<_>>();

crates/common/trie/logger.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use std::{
33
sync::{Arc, Mutex},
44
};
55

6-
use ethrex_rlp::decode::RLPDecode;
6+
use ethrex_rlp::{decode::RLPDecode, encode::RLPEncode};
77

88
use crate::{Nibbles, Node, Trie, TrieDB, TrieError};
99

@@ -39,7 +39,7 @@ impl TrieDB for TrieLogger {
3939
&& let Ok(decoded) = Node::decode(result)
4040
{
4141
let mut lock = self.witness.lock().map_err(|_| TrieError::LockError)?;
42-
lock.insert(decoded.encode_raw());
42+
lock.insert(decoded.encode_to_vec());
4343
}
4444
Ok(result)
4545
}

crates/common/trie/node.rs

Lines changed: 7 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,10 @@ mod branch;
22
mod extension;
33
mod leaf;
44

5-
use std::{
6-
array,
7-
sync::{Arc, OnceLock},
8-
};
5+
use std::sync::{Arc, OnceLock};
96

107
pub use branch::BranchNode;
11-
use ethrex_rlp::{
12-
decode::{RLPDecode, decode_bytes},
13-
encode::RLPEncode,
14-
error::RLPDecodeError,
15-
structs::Decoder,
16-
};
8+
use ethrex_rlp::{decode::RLPDecode, encode::RLPEncode};
179
pub use extension::ExtensionNode;
1810
pub use leaf::LeafNode;
1911

@@ -35,7 +27,7 @@ impl NodeRef {
3527
match *self {
3628
NodeRef::Node(ref node, _) => Ok(Some(node.as_ref().clone())),
3729
NodeRef::Hash(NodeHash::Inline((data, len))) => {
38-
Ok(Some(Node::decode_raw(&data[..len as usize])?))
30+
Ok(Some(Node::decode(&data[..len as usize])?))
3931
}
4032
NodeRef::Hash(hash) => db
4133
.get(path)?
@@ -69,11 +61,13 @@ impl NodeRef {
6961
}
7062
Node::Leaf(_) => {}
7163
}
72-
let hash = *hash.get_or_init(|| node.compute_hash());
64+
let mut buf = Vec::new();
65+
node.encode(&mut buf);
66+
let hash = *hash.get_or_init(|| NodeHash::from_encoded(&buf));
67+
acc.push((path.clone(), buf));
7368
if let Node::Leaf(leaf) = node.as_ref() {
7469
acc.push((path.concat(&leaf.partial), leaf.value.clone()));
7570
}
76-
acc.push((path.clone(), node.encode_to_vec()));
7771

7872
*self = hash.into();
7973

@@ -218,70 +212,6 @@ impl Node {
218212
}
219213
}
220214

221-
/// Encodes the node
222-
pub fn encode_raw(&self) -> Vec<u8> {
223-
match self {
224-
Node::Branch(n) => n.encode_raw(),
225-
Node::Extension(n) => n.encode_raw(),
226-
Node::Leaf(n) => n.encode_raw(),
227-
}
228-
}
229-
230-
/// Decodes the node
231-
pub fn decode_raw(rlp: &[u8]) -> Result<Self, RLPDecodeError> {
232-
let mut rlp_items = vec![];
233-
let mut decoder = Decoder::new(rlp)?;
234-
let mut item;
235-
// Get encoded fields
236-
loop {
237-
(item, decoder) = decoder.get_encoded_item()?;
238-
rlp_items.push(item);
239-
// Check if we reached the end or if we decoded more items than the ones we need
240-
if decoder.is_done() || rlp_items.len() > 17 {
241-
break;
242-
}
243-
}
244-
// Deserialize into node depending on the available fields
245-
Ok(match rlp_items.len() {
246-
// Leaf or Extension Node
247-
2 => {
248-
let (path, _) = decode_bytes(&rlp_items[0])?;
249-
let path = Nibbles::decode_compact(path);
250-
if path.is_leaf() {
251-
// Decode as Leaf
252-
let (value, _) = decode_bytes(&rlp_items[1])?;
253-
LeafNode {
254-
partial: path,
255-
value: value.to_vec(),
256-
}
257-
.into()
258-
} else {
259-
// Decode as Extension
260-
ExtensionNode {
261-
prefix: path,
262-
child: decode_child(&rlp_items[1]).into(),
263-
}
264-
.into()
265-
}
266-
}
267-
// Branch Node
268-
17 => {
269-
let choices = array::from_fn(|i| decode_child(&rlp_items[i]).into());
270-
let (value, _) = decode_bytes(&rlp_items[16])?;
271-
BranchNode {
272-
choices,
273-
value: value.to_vec(),
274-
}
275-
.into()
276-
}
277-
n => {
278-
return Err(RLPDecodeError::Custom(format!(
279-
"Invalid arg count for Node, expected 2 or 17, got {n}"
280-
)));
281-
}
282-
})
283-
}
284-
285215
/// Computes the node's hash
286216
pub fn compute_hash(&self) -> NodeHash {
287217
match self {
@@ -291,11 +221,3 @@ impl Node {
291221
}
292222
}
293223
}
294-
295-
fn decode_child(rlp: &[u8]) -> NodeHash {
296-
match decode_bytes(rlp) {
297-
Ok((hash, &[])) if hash.len() == 32 => NodeHash::from_slice(hash),
298-
Ok((&[], &[])) => NodeHash::default(),
299-
_ => NodeHash::from_slice(rlp),
300-
}
301-
}

crates/common/trie/node/branch.rs

Lines changed: 7 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use ethrex_rlp::structs::Encoder;
1+
use ethrex_rlp::encode::RLPEncode;
22

33
use crate::{
44
InconsistentTreeError, TrieDB, ValueRLP, error::TrieError, nibbles::Nibbles,
@@ -248,25 +248,7 @@ impl BranchNode {
248248

249249
/// Computes the node's hash
250250
pub fn compute_hash(&self) -> NodeHash {
251-
NodeHash::from_encoded_raw(&self.encode_raw())
252-
}
253-
254-
/// Encodes the node
255-
pub fn encode_raw(&self) -> Vec<u8> {
256-
let mut buf = vec![];
257-
let mut encoder = Encoder::new(&mut buf);
258-
for child in self.choices.iter() {
259-
match child.compute_hash() {
260-
NodeHash::Hashed(hash) => encoder = encoder.encode_bytes(&hash.0),
261-
child @ NodeHash::Inline(raw) if raw.1 != 0 => {
262-
encoder = encoder.encode_raw(child.as_ref())
263-
}
264-
_ => encoder = encoder.encode_bytes(&[]),
265-
}
266-
}
267-
encoder = encoder.encode_bytes(&self.value);
268-
encoder.finish();
269-
buf
251+
NodeHash::from_encoded(&self.encode_to_vec())
270252
}
271253

272254
/// Traverses own subtrie until reaching the node containing `path`
@@ -279,7 +261,7 @@ impl BranchNode {
279261
node_path: &mut Vec<Vec<u8>>,
280262
) -> Result<(), TrieError> {
281263
// Add self to node_path (if not inlined in parent)
282-
let encoded = self.encode_raw();
264+
let encoded = self.encode_to_vec();
283265
if encoded.len() >= 32 {
284266
node_path.push(encoded);
285267
};
@@ -307,6 +289,7 @@ impl BranchNode {
307289
#[cfg(test)]
308290
mod test {
309291
use ethereum_types::H256;
292+
use ethrex_rlp::{decode::RLPDecode, encode::RLPEncode};
310293

311294
use super::*;
312295

@@ -654,7 +637,7 @@ mod test {
654637
}
655638
}
656639
.into();
657-
assert_eq!(Node::decode_raw(&node.encode_raw()).unwrap(), node)
640+
assert_eq!(Node::decode(&node.encode_to_vec()).unwrap(), node)
658641
}
659642

660643
#[test]
@@ -670,7 +653,7 @@ mod test {
670653
}
671654
}
672655
.into();
673-
assert_eq!(Node::decode_raw(&node.encode_raw()).unwrap(), node)
656+
assert_eq!(Node::decode(&node.encode_to_vec()).unwrap(), node)
674657
}
675658

676659
#[test]
@@ -696,6 +679,6 @@ mod test {
696679
} with_leaf { &[0x1] => vec![0x1] }
697680
}
698681
.into();
699-
assert_eq!(Node::decode_raw(&node.encode_raw()).unwrap(), node)
682+
assert_eq!(Node::decode(&node.encode_to_vec()).unwrap(), node)
700683
}
701684
}

crates/common/trie/node/extension.rs

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use ethrex_rlp::structs::Encoder;
1+
use ethrex_rlp::encode::RLPEncode;
22

33
use crate::ValueRLP;
44
use crate::nibbles::Nibbles;
@@ -190,16 +190,7 @@ impl ExtensionNode {
190190

191191
/// Computes the node's hash
192192
pub fn compute_hash(&self) -> NodeHash {
193-
NodeHash::from_encoded_raw(&self.encode_raw())
194-
}
195-
196-
/// Encodes the node
197-
pub fn encode_raw(&self) -> Vec<u8> {
198-
let mut buf = vec![];
199-
let mut encoder = Encoder::new(&mut buf).encode_bytes(&self.prefix.encode_compact());
200-
encoder = self.child.compute_hash().encode(encoder);
201-
encoder.finish();
202-
buf
193+
NodeHash::from_encoded(&self.encode_to_vec())
203194
}
204195

205196
/// Traverses own subtrie until reaching the node containing `path`
@@ -212,7 +203,7 @@ impl ExtensionNode {
212203
node_path: &mut Vec<Vec<u8>>,
213204
) -> Result<(), TrieError> {
214205
// Add self to node_path (if not inlined in parent)
215-
let encoded = self.encode_raw();
206+
let encoded = self.encode_to_vec();
216207
if encoded.len() >= 32 {
217208
node_path.push(encoded);
218209
};
@@ -236,6 +227,8 @@ impl ExtensionNode {
236227

237228
#[cfg(test)]
238229
mod test {
230+
use ethrex_rlp::{decode::RLPDecode, encode::RLPEncode};
231+
239232
use super::*;
240233
use crate::{Trie, node::LeafNode, pmt_node};
241234

@@ -544,7 +537,7 @@ mod test {
544537
} }
545538
}
546539
.into();
547-
assert_eq!(Node::decode_raw(&node.encode_raw()).unwrap(), node)
540+
assert_eq!(Node::decode(&node.encode_to_vec()).unwrap(), node)
548541
}
549542

550543
#[test]
@@ -560,7 +553,7 @@ mod test {
560553
}
561554
.into();
562555

563-
assert_eq!(Node::decode_raw(&node.encode_raw()).unwrap(), node)
556+
assert_eq!(Node::decode(&node.encode_to_vec()).unwrap(), node)
564557
}
565558

566559
#[test]
@@ -585,6 +578,6 @@ mod test {
585578
} }
586579
}
587580
.into();
588-
assert_eq!(Node::decode_raw(&node.encode_raw()).unwrap(), node)
581+
assert_eq!(Node::decode(&node.encode_to_vec()).unwrap(), node)
589582
}
590583
}

crates/common/trie/node/leaf.rs

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use ethrex_rlp::structs::Encoder;
1+
use ethrex_rlp::encode::RLPEncode;
22

33
use crate::{ValueRLP, error::TrieError, nibbles::Nibbles, node::BranchNode, node_hash::NodeHash};
44

@@ -115,22 +115,12 @@ impl LeafNode {
115115

116116
/// Computes the node's hash
117117
pub fn compute_hash(&self) -> NodeHash {
118-
NodeHash::from_encoded_raw(&self.encode_raw())
119-
}
120-
121-
/// Encodes the node
122-
pub fn encode_raw(&self) -> Vec<u8> {
123-
let mut buf = vec![];
124-
Encoder::new(&mut buf)
125-
.encode_bytes(&self.partial.encode_compact())
126-
.encode_bytes(&self.value)
127-
.finish();
128-
buf
118+
NodeHash::from_encoded(&self.encode_to_vec())
129119
}
130120

131121
/// Encodes the node and appends it to `node_path` if the encoded node is 32 or more bytes long
132122
pub fn get_path(&self, node_path: &mut Vec<Vec<u8>>) -> Result<(), TrieError> {
133-
let encoded = self.encode_raw();
123+
let encoded = self.encode_to_vec();
134124
if encoded.len() >= 32 {
135125
node_path.push(encoded);
136126
}
@@ -140,6 +130,8 @@ impl LeafNode {
140130

141131
#[cfg(test)]
142132
mod test {
133+
use ethrex_rlp::{decode::RLPDecode, encode::RLPEncode};
134+
143135
use super::*;
144136
use crate::{Trie, pmt_node};
145137

@@ -321,7 +313,7 @@ mod test {
321313
b"a comparatively long value".to_vec(),
322314
)
323315
.into();
324-
assert_eq!(Node::decode_raw(&node.encode_raw()).unwrap(), node)
316+
assert_eq!(Node::decode(&node.encode_to_vec()).unwrap(), node)
325317
}
326318

327319
#[test]
@@ -331,7 +323,7 @@ mod test {
331323
vec![0x12, 0x34, 0x56, 0x78],
332324
)
333325
.into();
334-
assert_eq!(Node::decode_raw(&node.encode_raw()).unwrap(), node)
326+
assert_eq!(Node::decode(&node.encode_to_vec()).unwrap(), node)
335327
}
336328

337329
#[test]
@@ -341,6 +333,6 @@ mod test {
341333
vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 20],
342334
)
343335
.into();
344-
assert_eq!(Node::decode_raw(&node.encode_raw()).unwrap(), node)
336+
assert_eq!(Node::decode(&node.encode_to_vec()).unwrap(), node)
345337
}
346338
}

crates/common/trie/node_hash.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ impl AsRef<[u8]> for NodeHash {
2424

2525
impl NodeHash {
2626
/// Returns the `NodeHash` of an encoded node (encoded using the NodeEncoder)
27-
pub fn from_encoded_raw(encoded: &[u8]) -> NodeHash {
27+
pub fn from_encoded(encoded: &[u8]) -> NodeHash {
2828
if encoded.len() >= 32 {
2929
let hash = Keccak256::new_with_prefix(encoded).finalize();
3030
NodeHash::Hashed(H256::from_slice(hash.as_slice()))
@@ -35,7 +35,7 @@ impl NodeHash {
3535

3636
/// Converts a slice of an already hashed data (in case it's not inlineable) to a NodeHash.
3737
/// Panics if the slice is over 32 bytes
38-
/// If you need to hash it in case its len >= 32 see `from_encoded_raw`
38+
/// If you need to hash it in case its len >= 32 see `from_encoded`
3939
pub(crate) fn from_slice(slice: &[u8]) -> NodeHash {
4040
match slice.len() {
4141
0..32 => {

0 commit comments

Comments
 (0)