From c016d1acb126a1475e4ce5a65acbe5598a2b87ed Mon Sep 17 00:00:00 2001 From: Monir Hadji Date: Tue, 11 Aug 2026 16:37:33 +0900 Subject: [PATCH] feat(prover-executor): add Groth16 proof type --- crates/prover-executor/src/lib.rs | 3 +++ crates/prover-executor/src/tests.rs | 38 +++++++++++++++++++++++++++-- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/crates/prover-executor/src/lib.rs b/crates/prover-executor/src/lib.rs index 1fd43f1e..a8a0b7ff 100644 --- a/crates/prover-executor/src/lib.rs +++ b/crates/prover-executor/src/lib.rs @@ -218,6 +218,7 @@ impl Executor { pub enum ProofType { Stark, Plonk, + Groth16, } #[derive(Debug, Clone)] @@ -306,6 +307,7 @@ where proof_request = match proof_type { ProofType::Plonk => proof_request.plonk(), ProofType::Stark => proof_request.compressed(), + ProofType::Groth16 => proof_request.groth16(), }; if disable_deferred_proof_verification { @@ -416,6 +418,7 @@ impl Service for NetworkExecutor { let proof_request = match req.proof_type { ProofType::Plonk => proof_request.plonk(), ProofType::Stark => proof_request.compressed(), + ProofType::Groth16 => proof_request.groth16(), }; let proof = proof_request diff --git a/crates/prover-executor/src/tests.rs b/crates/prover-executor/src/tests.rs index 9cd28175..30babc62 100644 --- a/crates/prover-executor/src/tests.rs +++ b/crates/prover-executor/src/tests.rs @@ -2,8 +2,8 @@ use std::{sync::Arc, time::Duration}; use prover_config::MockProverConfig; use sp1_sdk::{ - MockProver, Prover, ProvingKey as _, SP1ProofMode, SP1ProofWithPublicValues, SP1ProvingKey, - SP1PublicValues, SP1Stdin, SP1VerifyingKey, SP1_CIRCUIT_VERSION, + MockProver, Prover, ProvingKey as _, SP1Proof, SP1ProofMode, SP1ProofWithPublicValues, + SP1ProvingKey, SP1PublicValues, SP1Stdin, SP1VerifyingKey, SP1_CIRCUIT_VERSION, }; use tokio::sync::OnceCell; use tower::{service_fn, timeout::TimeoutLayer, Service, ServiceBuilder, ServiceExt}; @@ -351,3 +351,37 @@ async fn executor_normal_behavior_mock_prover() { .verify(&result.unwrap().proof, &verification_key, None) .is_ok()); } + +#[tokio::test] +async fn executor_normal_behavior_mock_prover_groth16() { + let prover = MockProver::new().await; + let proving_key = prover + .setup(ELF.into()) + .await + .expect("setting up proving key"); + let verification_key = proving_key.verifying_key().clone(); + + let mock_prover_config = MockProverConfig::default(); + let mut executor = Executor::build_local_service( + mock_prover_config.proving_timeout, + mock_prover_config.max_concurrency_limit, + LocalExecutor { + prover: Arc::new(LocalProver::Mock(prover.clone())), + proving_key, + verification_key: verification_key.clone(), + }, + ); + let executor = executor.ready().await.expect("valid executor"); + + let result = executor + .call(Request { + stdin: SP1Stdin::new(), + proof_type: ProofType::Groth16, + }) + .await; + + assert!(result.is_ok()); + let proof = result.unwrap().proof; + assert!(matches!(proof.proof, SP1Proof::Groth16(_))); + assert!(prover.verify(&proof, &verification_key, None).is_ok()); +}