Skip to content

Commit e66b833

Browse files
committed
feat: send proof to aligned and wait for agg proof verification event
1 parent 364d16b commit e66b833

5 files changed

Lines changed: 75 additions & 40 deletions

File tree

examples/L2/crates/l2/Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ types = { workspace = true }
1010
lambdaworks-crypto = { workspace = true }
1111
primitive-types = { workspace = true}
1212
rand = "0.8"
13-
sp1-sdk = "4.1.3"
13+
sp1-sdk = "4.1.7"
1414
sp1_state_transition_program = { path = "./zkvm_programs/sp1/" }
1515
aligned-sdk = { path = "../../../../batcher/aligned-sdk" }
1616
bincode = "1.3.3"
@@ -19,7 +19,7 @@ tokio = "1.44"
1919
alloy = { version = "0.14", features = ["full", "providers"] }
2020

2121
[build-dependencies]
22-
sp1-build = { version = "4.1.3" }
22+
sp1-build = { version = "4.1.7" }
2323

2424
[profile.release]
2525
opt-level = 3
Lines changed: 58 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,15 @@
1-
use aligned_sdk::core::{
2-
constants::INSTANT_MAX_FEE_BATCH_SIZE,
3-
types::{AlignedVerificationData, Signer, SigningKey, VerificationData, Wallet},
1+
use aligned_sdk::{
2+
core::types::{AlignedVerificationData, Signer, SigningKey, VerificationData, Wallet},
3+
sdk::estimate_fee,
44
};
5-
use primitive_types::U256;
5+
use alloy::{
6+
eips::BlockNumberOrTag,
7+
primitives::Address,
8+
providers::{Provider, ProviderBuilder, WsConnect},
9+
rpc::types::Filter,
10+
};
11+
use futures_util::StreamExt;
12+
use sp1_sdk::{HashableKey, SP1VerifyingKey};
613

714
pub async fn send_proof_to_be_verified_on_aligned(
815
proof: &sp1_sdk::SP1ProofWithPublicValues,
@@ -25,41 +32,62 @@ pub async fn send_proof_to_be_verified_on_aligned(
2532
.await
2633
.expect("Retrieve nonce from aligned batcher");
2734

28-
let aligned_verification_data = aligned_sdk::sdk::submit(
29-
network,
30-
&verification_data,
31-
U256::from(INSTANT_MAX_FEE_BATCH_SIZE as u64),
32-
wallet,
33-
nonce,
35+
let max_fee = estimate_fee(
36+
"https://ethereum-holesky-rpc.publicnode.com".into(),
37+
aligned_sdk::core::types::FeeEstimationType::Instant,
3438
)
3539
.await
36-
.expect("Proof to be sent");
40+
.expect("Max fee to be retrieved");
41+
42+
let aligned_verification_data =
43+
aligned_sdk::sdk::submit(network, &verification_data, max_fee, wallet, 0.into())
44+
.await
45+
.expect("Proof to be sent");
3746

3847
aligned_verification_data
3948
}
4049

41-
pub async fn wait_until_proof_is_aggregated() -> u64 {
42-
// let rpc_url = "wss://eth-mainnet.g.alchemy.com/v2/your-api-key";
43-
// let ws = WsConnect::new(rpc_url);
44-
// let provider = ProviderBuilder::new().on_ws(ws).await.unwrap();
50+
pub async fn wait_until_proof_is_aggregated(
51+
network: aligned_sdk::core::types::Network,
52+
eth_rpc_url: String,
53+
beacon_client_url: String,
54+
proof: &sp1_sdk::SP1ProofWithPublicValues,
55+
vk: &SP1VerifyingKey,
56+
) -> Option<Vec<[u8; 32]>> {
57+
let rpc_url = "";
58+
let ws = WsConnect::new(rpc_url);
59+
let provider = ProviderBuilder::new().on_ws(ws).await.unwrap();
60+
61+
let aligned_proof_agg_address =
62+
Address::from(network.get_aligned_proof_agg_service_address().0);
63+
64+
let filter = Filter::new()
65+
.address(aligned_proof_agg_address)
66+
.event("AggregatedProofVerified(bytes32,bytes32)")
67+
.from_block(BlockNumberOrTag::Latest);
4568

46-
// let uniswap_token_address =
47-
// Address::from_str("1f9840a85d5aF5bf1D1762F925BDADdC4201F984").unwrap();
69+
// Subscribe to logs.
70+
let sub = provider.subscribe_logs(&filter).await.unwrap();
71+
let mut stream = sub.into_stream();
4872

49-
// let filter = Filter::new()
50-
// .address(uniswap_token_address)
51-
// // By specifying an `event` or `event_signature` we listen for a specific event of the
52-
// // contract. In this case the `Transfer(address,address,uint256)` event.
53-
// .event("Transfer(address,address,uint256)")
54-
// .from_block(BlockNumberOrTag::Latest);
73+
let verification_data = aligned_sdk::sdk::aggregation::AggregationModeVerificationData::SP1 {
74+
vk: vk.hash_bytes(),
75+
public_inputs: proof.public_values.to_vec(),
76+
};
5577

56-
// // Subscribe to logs.
57-
// let sub = provider.subscribe_logs(&filter).await.unwrap();
58-
// let mut stream = sub.into_stream();
78+
let mut merkle_path = None;
5979

60-
// while let Some(log) = stream.next().await {
61-
// println!("Uniswap token logs: {log:?}");
62-
// }
80+
while let Some(_) = stream.next().await {
81+
merkle_path = aligned_sdk::sdk::aggregation::get_merkle_path_for_proof(
82+
network.clone(),
83+
eth_rpc_url.clone(),
84+
beacon_client_url.clone(),
85+
None,
86+
&verification_data,
87+
)
88+
.await
89+
.unwrap();
90+
}
6391

64-
0
92+
merkle_path
6593
}

examples/L2/crates/l2/src/lib.rs

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
use aligned::{send_proof_to_be_verified_on_aligned, wait_until_proof_is_aggregated};
2-
use alloy::hex;
32
use db::{generate_random_transfers, DB};
43
use primitive_types::U256;
54
use sp1_state_transition_program::ProgramOutput;
@@ -9,10 +8,10 @@ mod aligned;
98
mod db;
109
mod zk;
1110

12-
async fn send_state_transition_to_chain() {}
13-
1411
pub async fn start_l2(
1512
network: aligned_sdk::core::types::Network,
13+
eth_rpc_url: String,
14+
beacon_client_url: String,
1615
wallet: aligned_sdk::core::types::Wallet<aligned_sdk::core::types::SigningKey>,
1716
) {
1817
// 0. Load merkle tree file, if not created, create initial state
@@ -22,7 +21,7 @@ pub async fn start_l2(
2221
let transfers = generate_random_transfers(&db, 10);
2322

2423
// 2. Call zkvm and pass (MerkleTree, Updates to perform)
25-
let (mut proof, _vk) = prove_state_transition(&db, transfers.clone());
24+
let (mut proof, vk) = prove_state_transition(&db, transfers.clone());
2625
let ProgramOutput {
2726
initial_state_merkle_root,
2827
post_state_merkle_root,
@@ -58,10 +57,18 @@ pub async fn start_l2(
5857

5958
// 4. Send the proof to aligned and wait for verification
6059
let _ =
61-
send_proof_to_be_verified_on_aligned(&proof, PROGRAM_ELF.to_vec(), network, wallet).await;
60+
send_proof_to_be_verified_on_aligned(&proof, PROGRAM_ELF.to_vec(), network.clone(), wallet)
61+
.await;
6262

6363
// 5. Wait until proof is aggregated
64-
wait_until_proof_is_aggregated().await;
64+
let merkle_path = wait_until_proof_is_aggregated(
65+
network.clone(),
66+
eth_rpc_url,
67+
beacon_client_url,
68+
&proof,
69+
&vk,
70+
)
71+
.await;
6572

6673
// 6. Send updateState transaction to Ethereum
6774
// let receipt = update_state_on_chain();

examples/L2/crates/l2/src/zk.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ pub fn prove_state_transition(
2121
let (pk, vk) = prover.setup(PROGRAM_ELF);
2222
let proof = prover
2323
.prove(&pk, &stdin)
24-
.groth16()
24+
.compressed()
2525
.run()
2626
.expect("Prover to run fine");
2727

examples/L2/crates/l2/zkvm_programs/sp1/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ edition = "2021"
55
resolver = "2"
66

77
[dependencies]
8-
sp1-zkvm = { version = "4.1.3", features = ["verify"] }
8+
sp1-zkvm = { version = "4.1.7", features = ["verify"] }
99
serde = { version = "1.0.203", features = ["derive"] }
1010
serde_json = "1.0.117"
1111
primitive-types = { version = "0.12.0", features = ["serde"] }

0 commit comments

Comments
 (0)