@@ -530,50 +530,58 @@ impl<E: ExtensionField, Pcs: PolynomialCommitmentScheme<E>> ProverWitnessSecInfo
530530
531531// Information regarding one witness sec
532532#[ derive( Clone ) ]
533- struct VerifierWitnessSecInfo {
533+ struct VerifierWitnessSecInfo < E : ExtensionField , Pcs : PolynomialCommitmentScheme < E > > {
534534 // Number of inputs per block
535535 num_inputs : Vec < usize > ,
536536 // Number of proofs per block, used by merge
537537 num_proofs : Vec < usize > ,
538+ // One commitment per circuit
539+ comm_w : Vec < Pcs :: Commitment >
538540}
539541
540- impl VerifierWitnessSecInfo {
542+ impl < E : ExtensionField , Pcs : PolynomialCommitmentScheme < E > > VerifierWitnessSecInfo < E , Pcs > {
541543 // Unfortunately, cannot obtain all metadata from the commitment
542- fn new ( num_inputs : Vec < usize > , num_proofs : & Vec < usize > ) -> VerifierWitnessSecInfo {
544+ fn new ( num_inputs : Vec < usize > , num_proofs : & Vec < usize > , comm_w : Vec < Pcs :: Commitment > ) -> VerifierWitnessSecInfo {
543545 let l = num_inputs. len ( ) ;
544546 VerifierWitnessSecInfo {
545547 num_inputs,
546548 num_proofs : num_proofs[ ..l] . to_vec ( ) ,
549+ comm_w,
547550 }
548551 }
549552
550553 fn dummy ( ) -> VerifierWitnessSecInfo {
551554 VerifierWitnessSecInfo {
552555 num_inputs : Vec :: new ( ) ,
553556 num_proofs : Vec :: new ( ) ,
557+ comm_w : Vec :: new ( ) ,
554558 }
555559 }
556560
557561 fn pad ( ) -> VerifierWitnessSecInfo {
558562 VerifierWitnessSecInfo {
559563 num_inputs : vec ! [ 1 ] ,
560564 num_proofs : vec ! [ 1 ] ,
565+ comm_w : vec ! [ Pcs :: Commitment :: default ( ) ] ,
561566 }
562567 }
563568
564569 // Concatenate the components in the given order to a new verifier witness sec
565570 fn concat ( components : Vec < & VerifierWitnessSecInfo > ) -> VerifierWitnessSecInfo {
566571 let mut num_inputs = Vec :: new ( ) ;
567572 let mut num_proofs = Vec :: new ( ) ;
573+ let mut comm_w = Vec :: new ( ) ;
568574
569575 for c in components {
570576 num_inputs. extend ( c. num_inputs . clone ( ) ) ;
571577 num_proofs. extend ( c. num_proofs . clone ( ) ) ;
578+ comm_w. extend ( c. comm_w . clone ( ) ) ;
572579 }
573580
574581 VerifierWitnessSecInfo {
575582 num_inputs,
576583 num_proofs,
584+ comm_w,
577585 }
578586 }
579587
@@ -589,6 +597,7 @@ impl VerifierWitnessSecInfo {
589597 let mut inst_map = Vec :: new ( ) ;
590598 let mut merged_num_inputs = Vec :: new ( ) ;
591599 let mut merged_num_proofs = Vec :: new ( ) ;
600+ let mut merged_comm_w = Vec :: new ( ) ;
592601 while inst_map. len ( ) < merged_size {
593602 // Choose the next instance with the most proofs
594603 let mut next_max_num_proofs = 0 ;
@@ -606,13 +615,15 @@ impl VerifierWitnessSecInfo {
606615 inst_map. push ( next_component) ;
607616 merged_num_inputs. push ( components[ next_component] . num_inputs [ pointers[ next_component] ] ) ;
608617 merged_num_proofs. push ( components[ next_component] . num_proofs [ pointers[ next_component] ] ) ;
618+ merged_comm_w. push ( components[ next_component] . comm_w [ pointers[ next_component] ] ) ;
609619 pointers[ next_component] = pointers[ next_component] + 1 ;
610620 }
611621
612622 (
613623 VerifierWitnessSecInfo {
614624 num_inputs : merged_num_inputs,
615625 num_proofs : merged_num_proofs,
626+ comm_w : merged_comm_w,
616627 } ,
617628 inst_map,
618629 )
@@ -637,6 +648,14 @@ pub struct SNARK<E: ExtensionField, Pcs: PolynomialCommitmentScheme<E>> {
637648 block_w2_comm_list : Vec < Pcs :: Commitment > ,
638649 block_w3_comm_list : Vec < Pcs :: Commitment > ,
639650 block_w3_shifted_comm_list : Vec < Pcs :: Commitment > ,
651+
652+ init_phy_mem_w2_comm : Option < Pcs :: Commitment > ,
653+ init_phy_mem_w3_comm : Option < Pcs :: Commitment > ,
654+ init_phy_mem_w3_shifted_comm : Option < Pcs :: Commitment > ,
655+ init_vir_mem_w2_comm : Option < Pcs :: Commitment > ,
656+ init_vir_mem_w3_comm : Option < Pcs :: Commitment > ,
657+ init_vir_mem_w3_shifted_comm : Option < Pcs :: Commitment > ,
658+
640659 phy_mem_addr_w2_comm : Option < Pcs :: Commitment > ,
641660 phy_mem_addr_w3_comm : Option < Pcs :: Commitment > ,
642661 phy_mem_addr_w3_shifted_comm : Option < Pcs :: Commitment > ,
@@ -1613,7 +1632,7 @@ impl<E: ExtensionField + Send + Sync, Pcs: PolynomialCommitmentScheme<E>> SNARK<
16131632
16141633 // Initial Physical Memory-as-a-whole
16151634 let timer_sec_gen = Timer :: new ( "init_phy_mem_witness_gen" ) ;
1616- let ( init_phy_mem_w2_prover, _ , init_phy_mem_w3_prover, _ , init_phy_mem_w3_shifted_prover, _ ) =
1635+ let ( init_phy_mem_w2_prover, init_phy_mem_w2_comm , init_phy_mem_w3_prover, init_phy_mem_w3_comm , init_phy_mem_w3_shifted_prover, init_phy_mem_w3_shifted_comm ) =
16171636 Self :: mem_gen :: < INIT_PHY_MEM_WIDTH > (
16181637 total_num_init_phy_mem_accesses,
16191638 & init_phy_mems_list,
@@ -1626,7 +1645,7 @@ impl<E: ExtensionField + Send + Sync, Pcs: PolynomialCommitmentScheme<E>> SNARK<
16261645
16271646 // Initial Virtual Memory-as-a-whole
16281647 let timer_sec_gen = Timer :: new ( "init_vir_mem_witness_gen" ) ;
1629- let ( init_vir_mem_w2_prover, _ , init_vir_mem_w3_prover, _ , init_vir_mem_w3_shifted_prover, _ ) =
1648+ let ( init_vir_mem_w2_prover, init_vir_mem_w2_comm , init_vir_mem_w3_prover, init_vir_mem_w3_comm , init_vir_mem_w3_shifted_prover, init_vir_mem_w3_shifted_comm ) =
16301649 Self :: mem_gen :: < INIT_VIR_MEM_WIDTH > (
16311650 total_num_init_vir_mem_accesses,
16321651 & init_vir_mems_list,
@@ -1648,6 +1667,24 @@ impl<E: ExtensionField + Send + Sync, Pcs: PolynomialCommitmentScheme<E>> SNARK<
16481667 transcript,
16491668 & poly_pp,
16501669 ) ;
1670+
1671+ for op_comm in vec ! [
1672+ init_phy_mem_w2_comm,
1673+ init_phy_mem_w3_comm,
1674+ init_phy_mem_w3_shifted_comm,
1675+ init_vir_mem_w2_comm,
1676+ init_vir_mem_w3_comm,
1677+ init_vir_mem_w3_shifted_comm,
1678+ phy_mem_addr_w2_comm,
1679+ phy_mem_addr_w3_comm,
1680+ phy_mem_addr_w3_shifted_comm,
1681+ ] {
1682+ match op_comm {
1683+ Some ( comm) => Pcs :: write_commitment ( comm, transcript) ,
1684+ None => Ok ( ( ) ) ,
1685+ }
1686+ }
1687+
16511688 timer_sec_gen. stop ( ) ;
16521689
16531690 // Virtual Memory-as-a-whole
@@ -1701,6 +1738,14 @@ impl<E: ExtensionField + Send + Sync, Pcs: PolynomialCommitmentScheme<E>> SNARK<
17011738 let ( vir_mem_addr_w3_mle, vir_mem_addr_w3_p_comm, vir_mem_addr_w3_v_comm) = Self :: mat_to_comm ( & vir_mem_addr_w3, & poly_pp) ;
17021739 let ( vir_mem_addr_w3_shifted_mle, vir_mem_addr_w3_shifted_p_comm, vir_mem_addr_w3_shifted_v_comm) = Self :: mat_to_comm ( & vir_mem_addr_w3_shifted_mat, & poly_pp) ;
17031740
1741+ for comm in vec ! [
1742+ vir_mem_addr_w2_v_comm,
1743+ vir_mem_addr_w3_v_comm,
1744+ vir_mem_addr_w3_shifted_v_comm,
1745+ ] {
1746+ Pcs :: write_commitment ( comm, transcript) ;
1747+ }
1748+
17041749 let vir_mem_addr_w2_prover =
17051750 ProverWitnessSecInfo :: new ( vec ! [ vir_mem_addr_w2] , vec ! [ vir_mem_addr_w2_mle] , vec ! [ vir_mem_addr_w2_p_comm] ) ;
17061751 let vir_mem_addr_w3_prover =
@@ -2394,6 +2439,14 @@ impl<E: ExtensionField + Send + Sync, Pcs: PolynomialCommitmentScheme<E>> SNARK<
23942439 block_w2_comm_list,
23952440 block_w3_comm_list,
23962441 block_w3_shifted_comm_list,
2442+
2443+ init_phy_mem_w2_comm,
2444+ init_phy_mem_w3_comm,
2445+ init_phy_mem_w3_shifted_comm,
2446+ init_vir_mem_w2_comm,
2447+ init_vir_mem_w3_comm,
2448+ init_vir_mem_w3_shifted_comm,
2449+
23972450 phy_mem_addr_w2_comm,
23982451 phy_mem_addr_w3_comm,
23992452 phy_mem_addr_w3_shifted_comm,
@@ -2744,21 +2797,23 @@ impl<E: ExtensionField + Send + Sync, Pcs: PolynomialCommitmentScheme<E>> SNARK<
27442797 . next_power_of_two ( )
27452798 } )
27462799 . collect ( ) ;
2747- VerifierWitnessSecInfo :: new ( block_w2_size_list, & block_num_proofs)
2800+ VerifierWitnessSecInfo :: new ( block_w2_size_list, & block_num_proofs, self . block_w2_comm_list )
27482801 } ;
27492802 (
2750- VerifierWitnessSecInfo :: new ( vec ! [ num_ios] , & vec ! [ 1 ] ) ,
2751- VerifierWitnessSecInfo :: new ( vec ! [ num_ios] , & vec ! [ consis_num_proofs] ) ,
2752- VerifierWitnessSecInfo :: new ( vec ! [ W3_WIDTH ] , & vec ! [ consis_num_proofs] ) ,
2753- VerifierWitnessSecInfo :: new ( vec ! [ W3_WIDTH ] , & vec ! [ consis_num_proofs] ) ,
2803+ VerifierWitnessSecInfo :: new ( vec ! [ num_ios] , & vec ! [ 1 ] , vec ! [ Pcs :: Commitment :: default ( ) ] ) ,
2804+ VerifierWitnessSecInfo :: new ( vec ! [ num_ios] , & vec ! [ consis_num_proofs] , vec ! [ self . perm_exec_w2_comm ] ) ,
2805+ VerifierWitnessSecInfo :: new ( vec ! [ W3_WIDTH ] , & vec ! [ consis_num_proofs] , vec ! [ self . perm_exec_w3_comm ] ) ,
2806+ VerifierWitnessSecInfo :: new ( vec ! [ W3_WIDTH ] , & vec ! [ consis_num_proofs] , vec ! [ self . perm_exec_w3_shifted_comm ] ) ,
27542807 block_w2_verifier,
27552808 VerifierWitnessSecInfo :: new (
27562809 vec ! [ W3_WIDTH ; block_num_instances] ,
27572810 & block_num_proofs. clone ( ) ,
2811+ self . block_w3_comm_list ,
27582812 ) ,
27592813 VerifierWitnessSecInfo :: new (
27602814 vec ! [ W3_WIDTH ; block_num_instances] ,
27612815 & block_num_proofs. clone ( ) ,
2816+ self . block_w3_shifted_comm_list ,
27622817 ) ,
27632818 )
27642819 } ;
@@ -2782,9 +2837,10 @@ impl<E: ExtensionField + Send + Sync, Pcs: PolynomialCommitmentScheme<E>> SNARK<
27822837 VerifierWitnessSecInfo :: new (
27832838 vec ! [ INIT_PHY_MEM_WIDTH ] ,
27842839 & vec ! [ total_num_init_phy_mem_accesses] ,
2840+ vec ! [ self . init_phy_mem_w2_comm. expect( "commitment should exist" ) ]
27852841 ) ,
2786- VerifierWitnessSecInfo :: new ( vec ! [ W3_WIDTH ] , & vec ! [ total_num_init_phy_mem_accesses] ) ,
2787- VerifierWitnessSecInfo :: new ( vec ! [ W3_WIDTH ] , & vec ! [ total_num_init_phy_mem_accesses] ) ,
2842+ VerifierWitnessSecInfo :: new ( vec ! [ W3_WIDTH ] , & vec ! [ total_num_init_phy_mem_accesses] , vec ! [ self . init_phy_mem_w3_comm . expect ( "commitment should exist" ) ] ) ,
2843+ VerifierWitnessSecInfo :: new ( vec ! [ W3_WIDTH ] , & vec ! [ total_num_init_phy_mem_accesses] , vec ! [ self . init_phy_mem_w3_shifted_comm . expect ( "commitment should exist" ) ] ) ,
27882844 )
27892845 } else {
27902846 (
@@ -2801,9 +2857,10 @@ impl<E: ExtensionField + Send + Sync, Pcs: PolynomialCommitmentScheme<E>> SNARK<
28012857 VerifierWitnessSecInfo :: new (
28022858 vec ! [ INIT_VIR_MEM_WIDTH ] ,
28032859 & vec ! [ total_num_init_vir_mem_accesses] ,
2860+ vec ! [ self . init_vir_mem_w2_comm. expect( "commitment should exist" ) ] ,
28042861 ) ,
2805- VerifierWitnessSecInfo :: new ( vec ! [ W3_WIDTH ] , & vec ! [ total_num_init_vir_mem_accesses] ) ,
2806- VerifierWitnessSecInfo :: new ( vec ! [ W3_WIDTH ] , & vec ! [ total_num_init_vir_mem_accesses] ) ,
2862+ VerifierWitnessSecInfo :: new ( vec ! [ W3_WIDTH ] , & vec ! [ total_num_init_vir_mem_accesses] , vec ! [ self . init_vir_mem_w3_comm . expect ( "commitment should exist" ) ] ) ,
2863+ VerifierWitnessSecInfo :: new ( vec ! [ W3_WIDTH ] , & vec ! [ total_num_init_vir_mem_accesses] , vec ! [ self . init_vir_mem_w3_shifted_comm . expect ( "commitment should exist" ) ] ) ,
28072864 )
28082865 } else {
28092866 (
@@ -2817,9 +2874,9 @@ impl<E: ExtensionField + Send + Sync, Pcs: PolynomialCommitmentScheme<E>> SNARK<
28172874 let ( phy_mem_addr_w2_verifier, phy_mem_addr_w3_verifier, phy_mem_addr_w3_shifted_verifier) = {
28182875 if total_num_phy_mem_accesses > 0 {
28192876 (
2820- VerifierWitnessSecInfo :: new ( vec ! [ PHY_MEM_WIDTH ] , & vec ! [ total_num_phy_mem_accesses] ) ,
2821- VerifierWitnessSecInfo :: new ( vec ! [ W3_WIDTH ] , & vec ! [ total_num_phy_mem_accesses] ) ,
2822- VerifierWitnessSecInfo :: new ( vec ! [ W3_WIDTH ] , & vec ! [ total_num_phy_mem_accesses] ) ,
2877+ VerifierWitnessSecInfo :: new ( vec ! [ PHY_MEM_WIDTH ] , & vec ! [ total_num_phy_mem_accesses] , vec ! [ self . phy_mem_addr_w2_comm . expect ( "commitment should exist" ) ] ) ,
2878+ VerifierWitnessSecInfo :: new ( vec ! [ W3_WIDTH ] , & vec ! [ total_num_phy_mem_accesses] , vec ! [ self . phy_mem_addr_w3_comm ] . expect ( "commitment should exist" ) ) ,
2879+ VerifierWitnessSecInfo :: new ( vec ! [ W3_WIDTH ] , & vec ! [ total_num_phy_mem_accesses] , vec ! [ self . phy_mem_addr_w3_shifted_comm ] . expect ( "commitment should exist" ) ) ,
28232880 )
28242881 } else {
28252882 (
@@ -2832,10 +2889,18 @@ impl<E: ExtensionField + Send + Sync, Pcs: PolynomialCommitmentScheme<E>> SNARK<
28322889
28332890 let ( vir_mem_addr_w2_verifier, vir_mem_addr_w3_verifier, vir_mem_addr_w3_shifted_verifier) = {
28342891 if total_num_vir_mem_accesses > 0 {
2892+ for comm in vec ! [
2893+ self . vir_mem_addr_w2_comm,
2894+ self . vir_mem_addr_w3_comm,
2895+ self . vir_mem_addr_w3_shifted_comm,
2896+ ] {
2897+ Pcs :: write_commitment ( comm, transcript) ;
2898+ }
2899+
28352900 (
2836- VerifierWitnessSecInfo :: new ( vec ! [ VIR_MEM_WIDTH ] , & vec ! [ total_num_vir_mem_accesses] ) ,
2837- VerifierWitnessSecInfo :: new ( vec ! [ W3_WIDTH ] , & vec ! [ total_num_vir_mem_accesses] ) ,
2838- VerifierWitnessSecInfo :: new ( vec ! [ W3_WIDTH ] , & vec ! [ total_num_vir_mem_accesses] ) ,
2901+ VerifierWitnessSecInfo :: new ( vec ! [ VIR_MEM_WIDTH ] , & vec ! [ total_num_vir_mem_accesses] , vec ! [ self . vir_mem_addr_w2_comm ] ) ,
2902+ VerifierWitnessSecInfo :: new ( vec ! [ W3_WIDTH ] , & vec ! [ total_num_vir_mem_accesses] , vec ! [ self . vir_mem_addr_w3_comm ] ) ,
2903+ VerifierWitnessSecInfo :: new ( vec ! [ W3_WIDTH ] , & vec ! [ total_num_vir_mem_accesses] , vec ! [ self . vir_mem_addr_w3_shifted_comm ] ) ,
28392904 )
28402905 } else {
28412906 (
@@ -2848,16 +2913,16 @@ impl<E: ExtensionField + Send + Sync, Pcs: PolynomialCommitmentScheme<E>> SNARK<
28482913
28492914 let ( block_vars_verifier, exec_inputs_verifier) = {
28502915 // add the commitment to the verifier's transcript
2916+ for comm in self . block_vars_comm_list . into_iter ( ) . chain ( vec ! [ self . exec_inputs_comm] ) {
2917+ Pcs :: write_commitment ( comm, transcript) ;
2918+ }
2919+
28512920 (
2852- VerifierWitnessSecInfo :: new ( block_num_vars, & block_num_proofs) ,
2853- VerifierWitnessSecInfo :: new ( vec ! [ num_ios] , & vec ! [ consis_num_proofs] ) ,
2921+ VerifierWitnessSecInfo :: new ( block_num_vars, & block_num_proofs, self . block_vars_comm_list ) ,
2922+ VerifierWitnessSecInfo :: new ( vec ! [ num_ios] , & vec ! [ consis_num_proofs] , vec ! [ self . exec_inputs_comm ] ) ,
28542923 )
28552924 } ;
28562925
2857- for comm in self . block_vars_comm_list . into_iter ( ) . chain ( vec ! [ self . exec_inputs_comm] ) {
2858- Pcs :: write_commitment ( comm, transcript) ;
2859- }
2860-
28612926 let init_phy_mems_verifier = {
28622927 if input_stack. len ( ) > 0 {
28632928 assert_eq ! (
@@ -2887,6 +2952,7 @@ impl<E: ExtensionField + Send + Sync, Pcs: PolynomialCommitmentScheme<E>> SNARK<
28872952 VerifierWitnessSecInfo :: new (
28882953 vec ! [ INIT_PHY_MEM_WIDTH ] ,
28892954 & vec ! [ total_num_init_phy_mem_accesses] ,
2955+ vec ! [ Pcs :: Commitment :: default ( ) ] ,
28902956 )
28912957 } else {
28922958 VerifierWitnessSecInfo :: dummy ( )
@@ -2921,6 +2987,7 @@ impl<E: ExtensionField + Send + Sync, Pcs: PolynomialCommitmentScheme<E>> SNARK<
29212987 VerifierWitnessSecInfo :: new (
29222988 vec ! [ INIT_VIR_MEM_WIDTH ] ,
29232989 & vec ! [ total_num_init_vir_mem_accesses] ,
2990+ vec ! [ Pcs :: Commitment :: default ( ) ] ,
29242991 )
29252992 } else {
29262993 VerifierWitnessSecInfo :: dummy ( )
@@ -2936,8 +3003,8 @@ impl<E: ExtensionField + Send + Sync, Pcs: PolynomialCommitmentScheme<E>> SNARK<
29363003 Pcs :: write_commitment ( comm, transcript) ;
29373004 }
29383005 (
2939- VerifierWitnessSecInfo :: new ( vec ! [ PHY_MEM_WIDTH ] , & vec ! [ total_num_phy_mem_accesses] ) ,
2940- VerifierWitnessSecInfo :: new ( vec ! [ PHY_MEM_WIDTH ] , & vec ! [ total_num_phy_mem_accesses] ) ,
3006+ VerifierWitnessSecInfo :: new ( vec ! [ PHY_MEM_WIDTH ] , & vec ! [ total_num_phy_mem_accesses] , vec ! [ self . addr_phy_mems_comm . expect ( "commitment should exist" ) ] ) ,
3007+ VerifierWitnessSecInfo :: new ( vec ! [ PHY_MEM_WIDTH ] , & vec ! [ total_num_phy_mem_accesses] , vec ! [ self . addr_phy_mems_shifted_comm . expect ( "commitment should exist" ) ] ) ,
29413008 )
29423009 } else {
29433010 (
@@ -2952,15 +3019,17 @@ impl<E: ExtensionField + Send + Sync, Pcs: PolynomialCommitmentScheme<E>> SNARK<
29523019 for comm in vec ! [
29533020 self . addr_vir_mems_comm,
29543021 self . addr_vir_mems_shifted_comm,
3022+ self . addr_ts_bits_comm,
29553023 ] {
29563024 Pcs :: write_commitment ( comm, transcript) ;
29573025 }
29583026 (
2959- VerifierWitnessSecInfo :: new ( vec ! [ VIR_MEM_WIDTH ] , & vec ! [ total_num_vir_mem_accesses] ) ,
2960- VerifierWitnessSecInfo :: new ( vec ! [ VIR_MEM_WIDTH ] , & vec ! [ total_num_vir_mem_accesses] ) ,
3027+ VerifierWitnessSecInfo :: new ( vec ! [ VIR_MEM_WIDTH ] , & vec ! [ total_num_vir_mem_accesses] , vec ! [ self . addr_vir_mems_comm . expect ( "commitment should exist" ) ] ) ,
3028+ VerifierWitnessSecInfo :: new ( vec ! [ VIR_MEM_WIDTH ] , & vec ! [ total_num_vir_mem_accesses] , vec ! [ self . addr_vir_mems_shifted_comm . expect ( "commitment should exist" ) ] ) ,
29613029 VerifierWitnessSecInfo :: new (
29623030 vec ! [ mem_addr_ts_bits_size] ,
29633031 & vec ! [ total_num_vir_mem_accesses] ,
3032+ vec ! [ self . addr_ts_bits_comm. expect( "commitment should exist" ) ] ,
29643033 ) ,
29653034 )
29663035 } else {
0 commit comments