2
2
3
3
use std:: marker:: PhantomData ;
4
4
5
+ use rand_core:: OsRng ;
6
+ use ff:: Field ;
7
+
5
8
use crate :: {
6
9
constants:: { NIO_CYCLE_FOLD , NUM_CHALLENGE_BITS , NUM_FE_IN_EMULATED_POINT } ,
7
10
errors:: NovaError ,
@@ -66,15 +69,16 @@ where
66
69
67
70
absorb_primary_r1cs :: < E1 , E2 > ( U2 , & mut ro) ;
68
71
69
- let ( T , comm_T) = S . commit_T ( ck, U1 , W1 , U2 , W2 ) ?;
72
+ let r_T = E1 :: Scalar :: random ( & mut OsRng ) ;
73
+ let ( T , comm_T) = S . commit_T ( ck, U1 , W1 , U2 , W2 , & r_T) ?;
70
74
71
75
absorb_primary_commitment :: < E1 , E2 > ( & comm_T, & mut ro) ;
72
76
73
77
let r = scalar_as_base :: < E2 > ( ro. squeeze ( NUM_CHALLENGE_BITS ) ) ;
74
78
75
79
let U = U1 . fold ( U2 , & comm_T, & r) ;
76
80
77
- let W = W1 . fold ( W2 , & T , & r) ?;
81
+ let W = W1 . fold ( W2 , & T , & r_T , & r) ?;
78
82
79
83
Ok ( (
80
84
Self {
@@ -131,7 +135,8 @@ impl<E: Engine> CycleFoldNIFS<E> {
131
135
absorb_cyclefold_r1cs ( U2 , & mut ro) ;
132
136
133
137
// compute a commitment to the cross-term
134
- let ( T , comm_T) = S . commit_T ( ck, U1 , W1 , U2 , W2 ) ?;
138
+ let r_T = E :: Scalar :: random ( & mut OsRng ) ;
139
+ let ( T , comm_T) = S . commit_T ( ck, U1 , W1 , U2 , W2 , & r_T) ?;
135
140
136
141
// append `comm_T` to the transcript and obtain a challenge
137
142
comm_T. absorb_in_ro ( & mut ro) ;
@@ -143,7 +148,7 @@ impl<E: Engine> CycleFoldNIFS<E> {
143
148
let U = U1 . fold ( U2 , & comm_T, & r) ;
144
149
145
150
// fold the witness using `r` and `T`
146
- let W = W1 . fold ( W2 , & T , & r) ?;
151
+ let W = W1 . fold ( W2 , & T , & r_T , & r) ?;
147
152
148
153
// return the folded instance and witness
149
154
Ok ( (
0 commit comments