From a9a09db46e6efc1704639b3717dbabbb47f98b24 Mon Sep 17 00:00:00 2001 From: smtmfft Date: Mon, 14 Oct 2024 08:23:15 +0000 Subject: [PATCH 1/7] fix r0 aggregation proof format --- provers/risc0/driver/src/lib.rs | 15 ++++--- .../driver/src/methods/risc0_aggregation.rs | 2 +- .../risc0/driver/src/methods/risc0_guest.rs | 2 +- provers/risc0/driver/src/snarks.rs | 45 +++++++++++++------ 4 files changed, 43 insertions(+), 21 deletions(-) diff --git a/provers/risc0/driver/src/lib.rs b/provers/risc0/driver/src/lib.rs index 6dd8a200c..6b68dbd61 100644 --- a/provers/risc0/driver/src/lib.rs +++ b/provers/risc0/driver/src/lib.rs @@ -180,13 +180,18 @@ impl Prover for Risc0Prover { "Generate aggregatino receipt journal: {:?}", receipt.journal ); + let block_proof_image_id = compute_image_id(RISC0_GUEST_ELF).unwrap(); let aggregation_image_id = compute_image_id(RISC0_AGGREGATION_ELF).unwrap(); - let enc_proof = - snarks::verify_groth16_snark_from_receipt(aggregation_image_id, receipt.clone()) - .await - .map_err(|err| format!("Failed to verify SNARK: {err:?}"))?; - let snark_proof = format!("0x{}", hex::encode(enc_proof)); + let proof_data = snarks::verify_aggregation_groth16_proof( + block_proof_image_id, + aggregation_image_id, + receipt.clone(), + ) + .await + .map_err(|err| format!("Failed to verify SNARK: {err:?}"))?; + let snark_proof = alloy_primitives::hex::encode_prefixed(proof_data); + info!("Aggregation proof: {:?}", snark_proof); let proof_gen_result = Ok(Risc0Response { proof: snark_proof, receipt: serde_json::to_string(&receipt).unwrap(), diff --git a/provers/risc0/driver/src/methods/risc0_aggregation.rs b/provers/risc0/driver/src/methods/risc0_aggregation.rs index 06ad39e27..bc1990827 100644 --- a/provers/risc0/driver/src/methods/risc0_aggregation.rs +++ b/provers/risc0/driver/src/methods/risc0_aggregation.rs @@ -1,5 +1,5 @@ pub const RISC0_AGGREGATION_ELF: &[u8] = include_bytes!("../../../guest/target/riscv32im-risc0-zkvm-elf/release/risc0-aggregation"); pub const RISC0_AGGREGATION_ID: [u32; 8] = [ - 440526723, 3767976668, 67051936, 881100330, 2605787818, 1152192925, 943988177, 1141581874, + 3593026424, 359928015, 3488866833, 2676323972, 1129344711, 55769507, 233041442, 3293280986, ]; diff --git a/provers/risc0/driver/src/methods/risc0_guest.rs b/provers/risc0/driver/src/methods/risc0_guest.rs index 159152655..a4eb56b9e 100644 --- a/provers/risc0/driver/src/methods/risc0_guest.rs +++ b/provers/risc0/driver/src/methods/risc0_guest.rs @@ -1,5 +1,5 @@ pub const RISC0_GUEST_ELF: &[u8] = include_bytes!("../../../guest/target/riscv32im-risc0-zkvm-elf/release/risc0-guest"); pub const RISC0_GUEST_ID: [u32; 8] = [ - 2426111784, 2252773481, 4093155148, 2853313326, 836865213, 1159934005, 790932950, 229907112, + 2522428380, 1790994278, 397707036, 244564411, 3780865207, 1282154214, 1673205005, 3172292887, ]; diff --git a/provers/risc0/driver/src/snarks.rs b/provers/risc0/driver/src/snarks.rs index a766ccf7a..23161485b 100644 --- a/provers/risc0/driver/src/snarks.rs +++ b/provers/risc0/driver/src/snarks.rs @@ -157,17 +157,43 @@ pub async fn verify_groth16_from_snark_receipt( let seal = encode(snark_receipt.snark.to_vec())?; let journal_digest = snark_receipt.journal.digest(); let post_state_digest = snark_receipt.post_state_digest.digest(); - verify_groth16_snark_impl(image_id, seal, journal_digest, post_state_digest).await + let encoded_proof = + verify_groth16_snark_impl(image_id, seal, journal_digest, post_state_digest).await?; + let proof = (encoded_proof, B256::from_slice(image_id.as_bytes())) + .abi_encode() + .iter() + .skip(32) + .copied() + .collect(); + Ok(proof) } -pub async fn verify_groth16_snark_from_receipt( - image_id: Digest, +pub async fn verify_aggregation_groth16_proof( + block_proof_image_id: Digest, + aggregation_image_id: Digest, receipt: Receipt, ) -> Result> { let seal = receipt.inner.groth16().unwrap().seal.clone(); let journal_digest = receipt.journal.digest(); let post_state_digest = receipt.claim()?.as_value().unwrap().post.digest(); - verify_groth16_snark_impl(image_id, seal, journal_digest, post_state_digest).await + let encoded_proof = verify_groth16_snark_impl( + aggregation_image_id, + seal, + journal_digest, + post_state_digest, + ) + .await?; + let proof = ( + encoded_proof, + B256::from_slice(block_proof_image_id.as_bytes()), + B256::from_slice(aggregation_image_id.as_bytes()), + ) + .abi_encode() + .iter() + .skip(32) + .copied() + .collect(); + Ok(proof) } pub async fn verify_groth16_snark_impl( @@ -209,14 +235,5 @@ pub async fn verify_groth16_snark_impl( tracing_err!("SNARK verification failed: {verify_call_res:?}!"); } - Ok(make_risc0_groth16_proof(enc_seal, image_id)) -} - -pub fn make_risc0_groth16_proof(seal: Vec, image_id: Digest) -> Vec { - (seal, B256::from_slice(image_id.as_bytes())) - .abi_encode() - .iter() - .skip(32) - .copied() - .collect() + Ok(enc_seal) } From 8051dc59348efc09464ace90f0f39517601dfcab Mon Sep 17 00:00:00 2001 From: smtmfft <99081233+smtmfft@users.noreply.github.com> Date: Tue, 15 Oct 2024 15:08:54 +0800 Subject: [PATCH 2/7] Update provers/risc0/driver/src/lib.rs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Petar Vujović --- provers/risc0/driver/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/provers/risc0/driver/src/lib.rs b/provers/risc0/driver/src/lib.rs index 6b68dbd61..7fc66f64e 100644 --- a/provers/risc0/driver/src/lib.rs +++ b/provers/risc0/driver/src/lib.rs @@ -191,7 +191,7 @@ impl Prover for Risc0Prover { .map_err(|err| format!("Failed to verify SNARK: {err:?}"))?; let snark_proof = alloy_primitives::hex::encode_prefixed(proof_data); - info!("Aggregation proof: {:?}", snark_proof); + info!("Aggregation proof: {snark_proof:?}"); let proof_gen_result = Ok(Risc0Response { proof: snark_proof, receipt: serde_json::to_string(&receipt).unwrap(), From cb5c02e4bb1a0a66b97b8c821bfe458918da85b7 Mon Sep 17 00:00:00 2001 From: smtmfft Date: Tue, 15 Oct 2024 07:20:57 +0000 Subject: [PATCH 3/7] fix review comments --- provers/risc0/driver/src/snarks.rs | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/provers/risc0/driver/src/snarks.rs b/provers/risc0/driver/src/snarks.rs index 23161485b..fdc116870 100644 --- a/provers/risc0/driver/src/snarks.rs +++ b/provers/risc0/driver/src/snarks.rs @@ -173,9 +173,19 @@ pub async fn verify_aggregation_groth16_proof( aggregation_image_id: Digest, receipt: Receipt, ) -> Result> { - let seal = receipt.inner.groth16().unwrap().seal.clone(); + let seal = receipt + .inner + .groth16() + .map_err(|e| anyhow::Error::msg(format!("receipt.inner.groth16() failed: {e:?}")))? + .seal + .clone(); let journal_digest = receipt.journal.digest(); - let post_state_digest = receipt.claim()?.as_value().unwrap().post.digest(); + let post_state_digest = receipt + .claim()? + .as_value() + .map_err(|e| anyhow::Error::msg(format!("receipt.claim()?.as_value() failed: {e:?}")))? + .post + .digest(); let encoded_proof = verify_groth16_snark_impl( aggregation_image_id, seal, From f3e406a6ef99af28268cf7f038c83b92fa7a8c77 Mon Sep 17 00:00:00 2001 From: smtmfft Date: Tue, 15 Oct 2024 10:07:03 +0000 Subject: [PATCH 4/7] refine info print --- host/src/proof.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/host/src/proof.rs b/host/src/proof.rs index 9223a5866..c6184d3c9 100644 --- a/host/src/proof.rs +++ b/host/src/proof.rs @@ -211,8 +211,8 @@ impl ProofActor { } result = Self::handle_aggregate(request_clone, &opts) => { match result { - Ok(()) => { - info!("Host handling message"); + Ok(status) => { + info!("Host handling message: {status:?}"); } Err(error) => { error!("Worker failed due to: {error:?}"); @@ -244,7 +244,7 @@ impl ProofActor { self.run_task(proof_request).await; } else { info!( - "Task concurrency limit reached, current running {running_task_count:?}, pending: {:?}", + "Task concurrency status: running:{running_task_count:?}, add {proof_request:?} to pending list[{:?}]", self.pending_tasks.lock().await.len() ); let mut pending_tasks = self.pending_tasks.lock().await; From 2d918a825ef03762f0a150d1ba885213fad3d3b0 Mon Sep 17 00:00:00 2001 From: smtmfft Date: Tue, 15 Oct 2024 10:22:32 +0000 Subject: [PATCH 5/7] refine info print --- host/src/proof.rs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/host/src/proof.rs b/host/src/proof.rs index c6184d3c9..095a2c2d2 100644 --- a/host/src/proof.rs +++ b/host/src/proof.rs @@ -231,13 +231,13 @@ impl ProofActor { while let Some(message) = self.receiver.recv().await { match message { Message::Cancel(key) => { - debug!("Message::Cancel task: {key:?}"); + debug!("Message::Cancel({key:?})"); if let Err(error) = self.cancel_task(key).await { error!("Failed to cancel task: {error}") } } Message::Task(proof_request) => { - debug!("Message::Task proof_request: {proof_request:?}"); + debug!("Message::Task({proof_request:?})"); let running_task_count = self.running_tasks.lock().await.len(); if running_task_count < self.opts.concurrency_limit { info!("Running task {proof_request:?}"); @@ -253,9 +253,9 @@ impl ProofActor { } Message::TaskComplete(req) => { // pop up pending task if any task complete - debug!("Message::TaskComplete: {req:?}"); + debug!("Message::TaskComplete({req:?})"); info!( - "task completed, current running {:?}, pending: {:?}", + "task {req:?} completed, current running {:?}, pending: {:?}", self.running_tasks.lock().await.len(), self.pending_tasks.lock().await.len() ); @@ -269,11 +269,13 @@ impl ProofActor { } } Message::CancelAggregate(request) => { + debug!("Message::CancelAggregate({request:?})"); if let Err(error) = self.cancel_aggregation_task(request).await { error!("Failed to cancel task: {error}") } } Message::Aggregate(request) => { + debug!("Message::Aggregate({request:?})"); let permit = Arc::clone(&semaphore) .acquire_owned() .await From 8f55ae4857968efa3823fe8eae5e880d950e78bf Mon Sep 17 00:00:00 2001 From: smtmfft Date: Tue, 15 Oct 2024 11:52:45 +0000 Subject: [PATCH 6/7] add timeout to sp1 wait_proof --- provers/sp1/driver/src/lib.rs | 6 +++++- script/prove-block.sh | 3 ++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/provers/sp1/driver/src/lib.rs b/provers/sp1/driver/src/lib.rs index 8de517f52..7897f5d64 100644 --- a/provers/sp1/driver/src/lib.rs +++ b/provers/sp1/driver/src/lib.rs @@ -24,6 +24,7 @@ use std::{ borrow::BorrowMut, env, fs, path::{Path, PathBuf}, + time::Duration, }; use tracing::{debug, error, info}; @@ -170,7 +171,10 @@ impl Prover for Sp1Prover { output.header.number ); network_prover - .wait_proof::(&proof_id, None) + .wait_proof::( + &proof_id, + Some(Duration::from_secs(3600)), + ) .await .map_err(|e| ProverError::GuestError(format!("Sp1: network proof failed {e:?}")))? }; diff --git a/script/prove-block.sh b/script/prove-block.sh index 8e3113e89..0c3306302 100755 --- a/script/prove-block.sh +++ b/script/prove-block.sh @@ -144,13 +144,14 @@ for block in $(eval echo {$rangeStart..$rangeEnd}); do fi echo "- proving block $block" - curl --location --request POST 'http://localhost:8080/v3/proof' \ + curl --location --request POST 'http://localhost:8080/v2/proof' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer 4cbd753fbcbc2639de804f8ce425016a50e0ecd53db00cb5397912e83f5e570e' \ --data-raw "{ \"network\": \"$chain\", \"l1_network\": \"$l1_network\", \"block_numbers\": [[$block, null], [$(($block+1)), null]], + \"block_number\": $block, \"prover\": \"$prover\", \"graffiti\": \"$graffiti\", $proofParam From 7e7b0f9689a873c5c9c1c5e0599cee39bf6f4ec2 Mon Sep 17 00:00:00 2001 From: smtmfft Date: Thu, 17 Oct 2024 04:53:06 +0000 Subject: [PATCH 7/7] refine info print --- host/src/server/api/v3/proof/mod.rs | 23 +++++++++++++---------- provers/sp1/driver/src/lib.rs | 4 +--- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/host/src/server/api/v3/proof/mod.rs b/host/src/server/api/v3/proof/mod.rs index 2e739cc58..40679c614 100644 --- a/host/src/server/api/v3/proof/mod.rs +++ b/host/src/server/api/v3/proof/mod.rs @@ -1,18 +1,18 @@ -use axum::{debug_handler, extract::State, routing::post, Json, Router}; -use raiko_core::{ - interfaces::{AggregationOnlyRequest, AggregationRequest, ProofRequest, ProofRequestOpt}, - provider::get_task_data, -}; -use raiko_tasks::{TaskDescriptor, TaskManager, TaskStatus}; -use utoipa::OpenApi; - use crate::{ interfaces::HostResult, metrics::{inc_current_req, inc_guest_req_count, inc_host_req_count}, server::api::{v2, v3::Status}, Message, ProverState, }; +use axum::{debug_handler, extract::State, routing::post, Json, Router}; +use raiko_core::{ + interfaces::{AggregationOnlyRequest, AggregationRequest, ProofRequest, ProofRequestOpt}, + provider::get_task_data, +}; +use raiko_lib::prover::Proof; +use raiko_tasks::{TaskDescriptor, TaskManager, TaskStatus}; use tracing::{debug, info}; +use utoipa::OpenApi; mod aggregate; mod cancel; @@ -125,8 +125,11 @@ async fn proof_handler( let mut proofs = Vec::with_capacity(tasks.len()); for (task, req) in tasks { let raw_proof = manager.get_task_proof(&task).await?; - let proof = serde_json::from_slice(&raw_proof)?; - debug!("req: {req:?} gets proof: {proof:?}"); + let proof: Proof = serde_json::from_slice(&raw_proof)?; + debug!( + "Aggregation sub-req: {req:?} gets proof {:?} with input {:?}.", + proof.proof, proof.input + ); proofs.push(proof); } diff --git a/provers/sp1/driver/src/lib.rs b/provers/sp1/driver/src/lib.rs index 7897f5d64..dd09c3217 100644 --- a/provers/sp1/driver/src/lib.rs +++ b/provers/sp1/driver/src/lib.rs @@ -257,9 +257,6 @@ impl Prover for Sp1Prover { _store: Option<&mut dyn IdWrite>, ) -> ProverResult { let param = Sp1Param::deserialize(config.get("sp1").unwrap()).unwrap(); - - info!("aggregate proof with param: {param:?}"); - let block_inputs: Vec = input .proofs .iter() @@ -316,6 +313,7 @@ impl Prover for Sp1Prover { let prove_result = client .prove(&pk, stdin) .plonk() + .timeout(Duration::from_secs(3600)) .run() .expect("proving failed");