Skip to content

Commit 5cf4e22

Browse files
refactor(data): make the merkle tree use the generic one
Making the MerkleTree be a type synonym for a Tree<LeafData, NodeData>
1 parent c13694e commit 5cf4e22

File tree

7 files changed

+76
-38
lines changed

7 files changed

+76
-38
lines changed

data/src/compressed_merkle_tree.rs

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ use crate::hash::Hash;
77
use crate::merkle_proof::proof_tree::MerkleProof;
88
use crate::merkle_proof::proof_tree::MerkleProofLeaf;
99
use crate::merkle_tree::MerkleTree;
10+
use crate::merkle_tree::MerkleTreeLeafData;
11+
use crate::merkle_tree::MerkleTreeNodeData;
1012
use crate::tree::Tree;
1113

1214
// TODO RV-322: Choose optimal Merkleisation parameters for main memory.
@@ -83,9 +85,12 @@ impl CompressedMerkleTree {
8385
pub fn merkle_tree_to_compressed_merkle_tree(merkle_tree: MerkleTree) -> CompressedMerkleTree {
8486
match merkle_tree {
8587
MerkleTree::Leaf {
86-
hash,
87-
access_info,
88-
data,
88+
data:
89+
MerkleTreeLeafData {
90+
hash,
91+
access_info,
92+
data,
93+
},
8994
} => {
9095
if access_info {
9196
CompressedMerkleTree::Leaf {
@@ -103,7 +108,10 @@ pub fn merkle_tree_to_compressed_merkle_tree(merkle_tree: MerkleTree) -> Compres
103108
}
104109
}
105110
}
106-
MerkleTree::Node(hash, children) => {
111+
MerkleTree::Node {
112+
data: MerkleTreeNodeData { hash },
113+
children,
114+
} => {
107115
let compressed_children: Vec<CompressedMerkleTree> = children
108116
.into_iter()
109117
.map(merkle_tree_to_compressed_merkle_tree)
@@ -209,6 +217,7 @@ mod tests {
209217
use crate::merkle_proof::proof_tree::MerkleProof;
210218
use crate::merkle_proof::proof_tree::MerkleProofLeaf;
211219
use crate::merkle_tree::MerkleTree;
220+
use crate::merkle_tree::MerkleTreeLeafData;
212221

213222
impl CompressedMerkleTree {
214223
/// Get the root hash of a compressed Merkle tree
@@ -265,9 +274,11 @@ mod tests {
265274
fn m_l(data: &[u8], access: bool) -> Result<MerkleTree, HashError> {
266275
let hash = Hash::blake3_hash_bytes(data);
267276
Ok(MerkleTree::Leaf {
268-
hash,
269-
access_info: access,
270-
data: data.to_vec(),
277+
data: MerkleTreeLeafData {
278+
hash,
279+
access_info: access,
280+
data: data.to_vec(),
281+
},
271282
})
272283
}
273284

data/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
// SPDX-License-Identifier: MIT
55

66
pub mod clone;
7-
pub mod foldable;
87
pub mod compressed_merkle_tree;
8+
pub mod foldable;
99
pub mod hash;
1010
pub mod merkle_proof;
1111
pub mod merkle_tree;

data/src/merkle_tree.rs

Lines changed: 43 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,26 @@ use crate::foldable::Fold;
77
use crate::foldable::Foldable;
88
use crate::foldable::NodeFold;
99
use crate::hash::Hash;
10+
use crate::tree::Tree;
11+
12+
#[derive(Debug, Clone, PartialEq)]
13+
pub struct MerkleTreeLeafData {
14+
pub hash: Hash,
15+
pub access_info: bool,
16+
pub data: Vec<u8>,
17+
}
18+
19+
#[derive(Debug, Clone, PartialEq)]
20+
pub struct MerkleTreeNodeData {
21+
pub hash: Hash,
22+
}
1023

1124
/// A variable-width Merkle tree with access metadata for leaves.
1225
///
1326
/// Values of this type are produced by the proof-generating backend to capture
1427
/// a snapshot of the machine state along with access information for leaves
1528
/// which hold data that was used in a particular evaluation step.
16-
#[derive(Debug, Clone)]
17-
pub enum MerkleTree {
18-
Leaf {
19-
hash: Hash,
20-
access_info: bool,
21-
data: Vec<u8>,
22-
},
23-
Node(Hash, Vec<Self>),
24-
}
29+
pub type MerkleTree = Tree<MerkleTreeLeafData, MerkleTreeNodeData>;
2530

2631
impl MerkleTree {
2732
/// Returns the precalculated root hash of the node.
@@ -41,27 +46,37 @@ impl MerkleTree {
4146
/// ```
4247
pub fn root_hash(&self) -> Hash {
4348
match self {
44-
Self::Node(hash, _) => *hash,
45-
Self::Leaf { hash, .. } => *hash,
49+
Self::Node {
50+
data: MerkleTreeNodeData { hash },
51+
..
52+
} => *hash,
53+
Self::Leaf {
54+
data: MerkleTreeLeafData { hash, .. },
55+
} => *hash,
4656
}
4757
}
4858

4959
/// Creates a merkle tree which is a single leaf
5060
pub fn make_merkle_leaf(data: Vec<u8>, access_info: bool) -> Self {
5161
let hash = Hash::blake3_hash_bytes(&data);
5262
MerkleTree::Leaf {
53-
hash,
54-
access_info,
55-
data,
63+
data: MerkleTreeLeafData {
64+
hash,
65+
access_info,
66+
data,
67+
},
5668
}
5769
}
5870

5971
/// Takes a list of children nodes and creates a
6072
/// new parent node on top of them.
6173
pub fn make_merkle_node(children: Vec<Self>) -> Self {
6274
let children_hashes = children.iter().map(|t| t.root_hash());
63-
let node_hash = Hash::combine(children_hashes);
64-
MerkleTree::Node(node_hash, children)
75+
let hash = Hash::combine(children_hashes);
76+
MerkleTree::Node {
77+
data: MerkleTreeNodeData { hash },
78+
children,
79+
}
6580
}
6681

6782
/// Recomputes the hashes for the whole tree
@@ -73,8 +88,18 @@ impl MerkleTree {
7388

7489
while let Some(node) = deque.pop_front() {
7590
let is_valid_hash = match node {
76-
Self::Leaf { hash, data, .. } => &Hash::blake3_hash_bytes(data) == hash,
77-
Self::Node(hash, children) => {
91+
Self::Leaf {
92+
data:
93+
MerkleTreeLeafData {
94+
hash,
95+
data: node_data,
96+
..
97+
},
98+
} => &Hash::blake3_hash_bytes(node_data) == hash,
99+
Self::Node {
100+
data: MerkleTreeNodeData { hash },
101+
children,
102+
} => {
78103
let children_hashes: Vec<Hash> = children
79104
.iter()
80105
.map(|child| {

src/riscv/lib/src/pvm/common.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@ use std::ops::ControlFlow;
1010
use bincode::Decode;
1111
use bincode::Encode;
1212
use octez_riscv_data::clone::CloneState;
13+
use octez_riscv_data::compressed_merkle_tree::CompressedMerkleTree;
14+
use octez_riscv_data::compressed_merkle_tree::merkle_tree_to_compressed_merkle_tree;
1315
use octez_riscv_data::foldable::Fold;
1416
use octez_riscv_data::foldable::Foldable;
1517
use octez_riscv_data::foldable::NodeFold;
16-
use octez_riscv_data::compressed_merkle_tree::CompressedMerkleTree;
17-
use octez_riscv_data::compressed_merkle_tree::merkle_tree_to_compressed_merkle_tree;
1818
use octez_riscv_data::hash::Hash;
1919
use octez_riscv_data::hash::HashError;
2020
use octez_riscv_data::hash::HashFold;

src/riscv/lib/src/state_backend/proof_backend.rs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -470,6 +470,7 @@ mod tests {
470470
use octez_riscv_data::compressed_merkle_tree::MERKLE_LEAF_SIZE;
471471
use octez_riscv_data::hash::Hash;
472472
use octez_riscv_data::merkle_tree::MerkleTree;
473+
use octez_riscv_data::merkle_tree::MerkleTreeLeafData;
473474
use octez_riscv_data::mode::Normal;
474475
use proptest::array;
475476
use proptest::prop_assert;
@@ -548,9 +549,11 @@ mod tests {
548549
merkle_tree.check_root_hash();
549550
match merkle_tree {
550551
MerkleTree::Leaf{
551-
hash,
552-
access_info,
553-
..
552+
data: MerkleTreeLeafData {
553+
hash,
554+
access_info,
555+
..
556+
}
554557
} => {
555558
prop_assert_eq!(hash, initial_root_hash);
556559
prop_assert!(access_info);
@@ -683,7 +686,7 @@ mod tests {
683686

684687
let pages_tree = match merkle_tree {
685688
MerkleTree::Leaf{ .. } => panic!("Did not expect leaf"),
686-
MerkleTree::Node(_, mut children) => {
689+
MerkleTree::Node{ mut children, ..} => {
687690
// The node for the pages is the second child.
688691
children.remove(1)
689692
},
@@ -693,10 +696,9 @@ mod tests {
693696
let mut leaf: usize = 0;
694697
while let Some(node) = queue.pop_front() {
695698
match node {
696-
MerkleTree::Node(_, children) => queue.extend(children),
699+
MerkleTree::Node{ children, ..} => queue.extend(children),
697700
MerkleTree::Leaf{
698-
access_info,
699-
..
701+
data: MerkleTreeLeafData { access_info, .. }
700702
} => {
701703
prop_assert_eq!(
702704
access_info,

src/riscv/lib/src/state_backend/proof_backend/merkle.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
//! Merkle trees used for proof generation by the PVM
66
7-
87
use octez_riscv_data::compressed_merkle_tree::MERKLE_LEAF_SIZE;
98
use octez_riscv_data::hash::HashError;
109
use octez_riscv_data::merkle_tree::MerkleTree;

src/riscv/lib/src/state_backend/region.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ use bincode::enc::Encoder;
1313
use bincode::error::DecodeError;
1414
use bincode::error::EncodeError;
1515
use octez_riscv_data::clone::CloneState;
16+
use octez_riscv_data::compressed_merkle_tree::MERKLE_LEAF_SIZE;
17+
use octez_riscv_data::compressed_merkle_tree::chunks_to_writer;
1618
use octez_riscv_data::foldable::Fold;
1719
use octez_riscv_data::foldable::Foldable;
1820
use octez_riscv_data::hash::Hash;
@@ -25,6 +27,7 @@ use octez_riscv_data::mode::Normal;
2527
use octez_riscv_data::mode::Prove;
2628
use octez_riscv_data::serialisation::serialise;
2729
use perfect_derive::perfect_derive;
30+
2831
use super::FnManager;
2932
use super::ManagerAlloc;
3033
use super::ManagerBase;
@@ -43,8 +46,6 @@ use crate::state_backend::RegionProj;
4346
use crate::state_backend::normal_backend::region_elem_offset;
4447
use crate::state_backend::proof_backend::merkle::MERKLE_ARITY;
4548
use crate::state_backend::proof_backend::merkle::MerkleWriter;
46-
use octez_riscv_data::compressed_merkle_tree::MERKLE_LEAF_SIZE;
47-
use octez_riscv_data::compressed_merkle_tree::chunks_to_writer;
4849
use crate::state_context::projection::ApplyCons;
4950
use crate::state_context::projection::CellCons;
5051
use crate::state_context::projection::CellsCons;

0 commit comments

Comments
 (0)