11use crate :: {
2+ MerklePaths , PrunedMerklePaths ,
23 challenger:: { Challenger , RATE , WIDTH } ,
34 * ,
45} ;
@@ -14,7 +15,8 @@ use symetric::Compression;
1415#[ derive( Debug ) ]
1516pub struct ProverState < EF : ExtensionField < PF < EF > > , P > {
1617 challenger : Challenger < PF < EF > , P > ,
17- transcript : Proof < PF < EF > > ,
18+ transcript : Vec < PF < EF > > ,
19+ merkle_paths : Vec < PrunedMerklePaths < PF < EF > , PF < EF > > > ,
1820}
1921
2022impl < EF : ExtensionField < PF < EF > > , P : Compression < [ PF < EF > ; WIDTH ] > > ProverState < EF , P >
@@ -26,20 +28,16 @@ where
2628 assert ! ( EF :: DIMENSION <= RATE ) ;
2729 Self {
2830 challenger : Challenger :: new ( compressor) ,
29- transcript : Proof ( Vec :: new ( ) ) ,
31+ transcript : Vec :: new ( ) ,
32+ merkle_paths : Vec :: new ( ) ,
3033 }
3134 }
3235
33- pub fn raw_proof ( self ) -> RawProof < PF < EF > > {
34- self . transcript . into_raw_proof ( )
35- }
36-
37- pub fn pruned_proof ( & self ) -> PrunedProof < PF < EF > > {
38- self . transcript . clone ( ) . prune ( )
39- }
40-
41- pub fn into_pruned_proof ( self ) -> PrunedProof < PF < EF > > {
42- self . transcript . prune ( )
36+ pub fn into_proof ( self ) -> Proof < PF < EF > > {
37+ Proof {
38+ transcript : self . transcript ,
39+ merkle_paths : self . merkle_paths ,
40+ }
4341 }
4442}
4543
6260 PF < EF > : PrimeField64 ,
6361{
6462 fn add_base_scalars ( & mut self , scalars : & [ PF < EF > ] ) {
65- self . transcript . 0 . push ( TranscriptData :: Interraction ( scalars. to_vec ( ) ) ) ;
66- for chunk in scalars. chunks ( RATE ) {
67- let mut buffer = [ PF :: < EF > :: ZERO ; RATE ] ;
68- for ( i, val) in chunk. iter ( ) . enumerate ( ) {
69- buffer[ i] = * val;
70- }
71- self . challenger . observe ( buffer) ;
72- }
63+ self . challenger . observe_scalars ( scalars) ;
64+ self . transcript . extend_from_slice ( scalars) ;
7365 }
7466
7567 fn state ( & self ) -> String {
@@ -81,12 +73,28 @@ where
8173 . map( |f| f. to_string( ) )
8274 . collect:: <Vec <_>>( )
8375 . join( ", " ) ,
84- self . transcript. 0 . len( )
76+ self . transcript. len( )
8577 )
8678 }
8779
80+ fn add_sumcheck_polynomial ( & mut self , coeffs : & [ EF ] , eq_alpha : Option < EF > ) {
81+ match eq_alpha {
82+ None => {
83+ let scalars = flatten_scalars_to_base ( coeffs) ;
84+ self . challenger . observe_scalars ( & scalars) ;
85+ self . transcript . extend_from_slice ( & scalars[ EF :: DIMENSION ..] ) ; // c0 reconstructed by verifier from claimed_sum
86+ }
87+ Some ( alpha) => {
88+ let bare_scalars = flatten_scalars_to_base ( coeffs) ;
89+ let full_scalars = flatten_scalars_to_base ( & expand_bare_to_full ( coeffs, alpha) ) ;
90+ self . challenger . observe_scalars ( & full_scalars) ;
91+ self . transcript . extend_from_slice ( & bare_scalars[ EF :: DIMENSION ..] ) ; // h0 reconstructed by verifier from claimed_sum
92+ }
93+ }
94+ }
95+
8896 fn hint_merkle_paths_base ( & mut self , paths : Vec < MerklePath < PF < EF > , PF < EF > > > ) {
89- self . transcript . 0 . push ( TranscriptData :: MerklePaths ( MerklePaths ( paths) ) ) ;
97+ self . merkle_paths . push ( MerklePaths ( paths) . prune ( ) ) ;
9098 }
9199
92100 fn pow_grinding ( & mut self , bits : usize ) {
@@ -134,14 +142,10 @@ where
134142 } )
135143 . expect ( "failed to find witness" ) ;
136144
137- let witness_found = witness_found. lock ( ) . unwrap ( ) . unwrap ( ) ;
145+ let witness = witness_found. lock ( ) . unwrap ( ) . unwrap ( ) ;
138146
139- self . challenger . observe ( {
140- let mut value = [ PF :: < EF > :: ZERO ; RATE ] ;
141- value[ 0 ] = witness_found;
142- value
143- } ) ;
147+ self . challenger . observe_scalars ( & [ witness] ) ;
144148 assert ! ( self . challenger. state[ 0 ] . as_canonical_u64( ) & ( ( 1 << bits) - 1 ) == 0 ) ;
145- self . transcript . 0 . push ( TranscriptData :: GrindingWitness ( witness_found ) ) ;
149+ self . transcript . push ( witness ) ;
146150 }
147151}
0 commit comments