1+ use std:: sync:: LazyLock ;
2+
13use alloy:: primitives:: Keccak256 ;
2- use sp1_aggregation_program:: { ProofInput , SP1ProofInput } ;
4+ use sp1_aggregation_program:: { ProofVkAndPubInputs , SP1VkAndPubInputs } ;
35use sp1_sdk:: {
4- HashableKey , Prover , ProverClient , SP1ProofWithPublicValues , SP1Stdin , SP1VerifyingKey ,
6+ EnvProver , HashableKey , Prover , ProverClient , SP1ProofWithPublicValues , SP1Stdin ,
7+ SP1VerifyingKey ,
58} ;
69
710use super :: lib:: { AggregatedProof , ProgramOutput , ProofAggregationError } ;
811
912const PROGRAM_ELF : & [ u8 ] =
1013 include_bytes ! ( "../../aggregation_programs/sp1/elf/sp1_aggregator_program" ) ;
1114
15+ static SP1_PROVER_CLIENT : LazyLock < EnvProver > = LazyLock :: new ( ProverClient :: from_env) ;
16+
1217pub struct SP1ProofWithPubValuesAndElf {
1318 pub proof_with_pub_values : SP1ProofWithPublicValues ,
1419 pub elf : Vec < u8 > ,
@@ -17,9 +22,8 @@ pub struct SP1ProofWithPubValuesAndElf {
1722impl SP1ProofWithPubValuesAndElf {
1823 pub fn hash_vk_and_pub_inputs ( & self ) -> [ u8 ; 32 ] {
1924 let mut hasher = Keccak256 :: new ( ) ;
20- for & word in & self . vk ( ) . hash_u32 ( ) {
21- hasher. update ( word. to_le_bytes ( ) ) ;
22- }
25+ let vk_bytes = & self . vk ( ) . hash_bytes ( ) ;
26+ hasher. update ( vk_bytes) ;
2327 hasher. update ( self . proof_with_pub_values . public_values . as_slice ( ) ) ;
2428 hasher. finalize ( ) . into ( )
2529 }
@@ -40,15 +44,15 @@ pub(crate) fn aggregate_proofs(
4044 let mut stdin = SP1Stdin :: new ( ) ;
4145
4246 let mut program_input = sp1_aggregation_program:: Input {
43- proofs : vec ! [ ] ,
47+ proofs_vk_and_pub_inputs : vec ! [ ] ,
4448 merkle_root : input. merkle_root ,
4549 } ;
4650
4751 // write vk + public inputs
4852 for proof in input. proofs . iter ( ) {
4953 program_input
50- . proofs
51- . push ( ProofInput :: SP1Compressed ( SP1ProofInput {
54+ . proofs_vk_and_pub_inputs
55+ . push ( ProofVkAndPubInputs :: SP1Compressed ( SP1VkAndPubInputs {
5256 public_inputs : proof. proof_with_pub_values . public_values . to_vec ( ) ,
5357 vk : proof. vk ( ) . hash_u32 ( ) ,
5458 } ) ) ;
@@ -66,7 +70,7 @@ pub(crate) fn aggregate_proofs(
6670 }
6771
6872 #[ cfg( feature = "prove" ) ]
69- let client = ProverClient :: from_env ( ) ;
73+ let client = & * SP1_PROVER_CLIENT ;
7074 // If not in prove mode, create a mock proof via mock client
7175 #[ cfg( not( feature = "prove" ) ) ]
7276 let client = ProverClient :: builder ( ) . mock ( ) . build ( ) ;
@@ -102,7 +106,7 @@ pub enum AlignedSP1VerificationError {
102106pub ( crate ) fn verify (
103107 sp1_proof_with_pub_values_and_elf : & SP1ProofWithPubValuesAndElf ,
104108) -> Result < ( ) , AlignedSP1VerificationError > {
105- let client = ProverClient :: from_env ( ) ;
109+ let client = & * SP1_PROVER_CLIENT ;
106110
107111 let ( _pk, vk) = client. setup ( & sp1_proof_with_pub_values_and_elf. elf ) ;
108112
@@ -122,7 +126,7 @@ pub(crate) fn verify(
122126}
123127
124128pub fn vk_from_elf ( elf : & [ u8 ] ) -> SP1VerifyingKey {
125- let prover = ProverClient :: builder ( ) . cpu ( ) . build ( ) ;
129+ let prover = & * SP1_PROVER_CLIENT ;
126130 let ( _, vk) = prover. setup ( elf) ;
127131 vk
128132}
0 commit comments