Skip to content

Commit 04d8f78

Browse files
committed
feat: migrate to lambdaworks merkle tree in proof aggregator
1 parent 7030ea6 commit 04d8f78

File tree

5 files changed

+66
-26
lines changed

5 files changed

+66
-26
lines changed

aggregation_mode/Cargo.lock

Lines changed: 31 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

aggregation_mode/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ tokio = { version = "1", features = ["time"]}
1717
sha3 = "0.10.8"
1818
reqwest = { version = "0.12" }
1919
ciborium = "=0.2.2"
20+
lambdaworks-crypto = { version = "0.12.0", features = ["serde"]}
2021
# Necessary for the VerificationData type
2122
aligned-sdk = { path = "../batcher/aligned-sdk/" }
2223
# zkvms

aggregation_mode/src/aggregators/mod.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@ pub mod sp1_aggregator;
33

44
use std::fmt::Display;
55

6+
use lambdaworks_crypto::merkle_tree::traits::IsMerkleTreeBackend;
67
use risc0_aggregator::{
78
AlignedRisc0VerificationError, Risc0AggregationError, Risc0ProofReceiptAndImageId,
89
};
10+
use sha3::{Digest, Keccak256};
911
use sp1_aggregator::{
1012
AlignedSP1VerificationError, SP1AggregationError, SP1ProofWithPubValuesAndElf,
1113
};
@@ -114,6 +116,12 @@ pub enum AlignedProof {
114116
Risc0(Box<Risc0ProofReceiptAndImageId>),
115117
}
116118

119+
impl Default for AlignedProof {
120+
fn default() -> Self {
121+
todo!()
122+
}
123+
}
124+
117125
impl AlignedProof {
118126
pub fn commitment(&self) -> [u8; 32] {
119127
match self {
@@ -123,6 +131,22 @@ impl AlignedProof {
123131
}
124132
}
125133

134+
impl IsMerkleTreeBackend for AlignedProof {
135+
type Data = AlignedProof;
136+
type Node = [u8; 32];
137+
138+
fn hash_data(leaf: &Self::Data) -> Self::Node {
139+
leaf.commitment()
140+
}
141+
142+
fn hash_new_parent(child_1: &Self::Node, child_2: &Self::Node) -> Self::Node {
143+
let mut hasher = Keccak256::new();
144+
hasher.update(child_1);
145+
hasher.update(child_2);
146+
hasher.finalize().into()
147+
}
148+
}
149+
126150
#[derive(Debug)]
127151
pub enum AlignedVerificationError {
128152
Sp1(AlignedSP1VerificationError),
Lines changed: 6 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,12 @@
11
use crate::aggregators::AlignedProof;
2-
use sha3::{Digest, Keccak256};
3-
4-
pub fn combine_hashes(hash_a: &[u8; 32], hash_b: &[u8; 32]) -> [u8; 32] {
5-
let mut hasher = Keccak256::new();
6-
hasher.update(hash_a);
7-
hasher.update(hash_b);
8-
hasher.finalize().into()
9-
}
2+
use lambdaworks_crypto::merkle_tree::merkle::MerkleTree;
103

114
/// Returns (merkle_root, leaves)
12-
pub fn compute_proofs_merkle_root(proofs: &[AlignedProof]) -> ([u8; 32], Vec<[u8; 32]>) {
5+
pub fn compute_proofs_merkle_root(
6+
proofs: &[AlignedProof],
7+
) -> Option<(MerkleTree<AlignedProof>, Vec<[u8; 32]>)> {
8+
let merkle_tree: MerkleTree<AlignedProof> = MerkleTree::build(proofs)?;
139
let leaves: Vec<[u8; 32]> = proofs.iter().map(|proof| proof.commitment()).collect();
1410

15-
let mut root = leaves.clone();
16-
17-
while root.len() > 1 {
18-
root = root
19-
.chunks(2)
20-
.map(|chunk| match chunk {
21-
[a, b] => combine_hashes(a, b),
22-
[a] => combine_hashes(a, a),
23-
_ => panic!("Unexpected chunk size in leaves"),
24-
})
25-
.collect()
26-
}
27-
28-
(root[0], leaves)
11+
Some((merkle_tree, leaves))
2912
}

aggregation_mode/src/backend/mod.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ pub enum AggregatedProofSubmissionError {
3535
ReceiptError(PendingTransactionError),
3636
FetchingProofs(ProofsFetcherError),
3737
ZKVMAggregation(ProofAggregationError),
38+
BuildingMerkleRoot,
3839
MerkleRootMisMatch,
3940
}
4041

@@ -105,7 +106,9 @@ impl ProofAggregator {
105106
}
106107

107108
info!("Proofs fetched, constructing merkle root...");
108-
let (merkle_root, leaves) = compute_proofs_merkle_root(&proofs);
109+
let (merkle_tree, leaves) = compute_proofs_merkle_root(&proofs)
110+
.ok_or(AggregatedProofSubmissionError::BuildingMerkleRoot)?;
111+
let merkle_root = merkle_tree.root;
109112
info!("Merkle root constructed: 0x{}", hex::encode(merkle_root));
110113

111114
info!("Starting proof aggregation program...");

0 commit comments

Comments
 (0)