PRCYCoin  2.0.0.7rc1
P2P Digital Currency
circuit_compress_impl.h
Go to the documentation of this file.
1 /**********************************************************************
2  * Copyright (c) 2018 Andrew Poelstra *
3  * Distributed under the MIT software license, see the accompanying *
4  * file COPYING or http://www.opensource.org/licenses/mit-license.php.*
5  **********************************************************************/
6 
7 #ifndef SECP256K1_MODULE_BULLETPROOF_CIRCUIT_COMPRESS_IMPL
8 #define SECP256K1_MODULE_BULLETPROOF_CIRCUIT_COMPRESS_IMPL
9 
11 
12 typedef struct {
13  secp256k1_scalar c_sum;
14  secp256k1_scalar *wl_wo; /* y^-n . (x * WL + WO), gates-many */
15  secp256k1_scalar *wr; /* y^-n . WR, gates-many */
16  secp256k1_scalar *wv; /* WV, commits-many */
17  secp256k1_scalar *zn; /* z^n, constraints-many */
19 
20 /* l and r coefficients */
21 typedef struct {
22  /* l0 = 0*/
24  /* l2 = assn->ao */
28  /* r2 = 0 */
30  secp256k1_scalar *wv; /* WV, commits-many */
31  secp256k1_scalar *zn; /* z^n, constraints + 2-many */
33 
34 static void secp256k1_fast_scalar_mul(secp256k1_scalar *r, const secp256k1_fast_scalar *a, const secp256k1_scalar *b) {
35  switch (a->special) {
36  case -2:
37  secp256k1_scalar_add(r, b, b);
38  secp256k1_scalar_negate(r, r);
39  break;
40  case -1:
41  secp256k1_scalar_negate(r, b);
42  break;
43  case 0:
44  secp256k1_scalar_clear(r);
45  break;
46  case 1:
47  *r = *b;
48  break;
49  case 2:
50  secp256k1_scalar_add(r, b, b);
51  break;
52  default:
53  secp256k1_scalar_mul(r, &a->scal, b);
54  break;
55  }
56 #ifdef VERIFY
57 {
58  secp256k1_scalar mul;
59  secp256k1_scalar_mul(&mul, &a->scal, b);
60  CHECK(secp256k1_scalar_eq(&mul, r));
61 }
62 #endif
63 }
64 
65 static void secp256k1_wmatrix_row_compress(secp256k1_scalar *r, const secp256k1_bulletproof_wmatrix_row *row, const secp256k1_scalar *zn) {
66  size_t j;
67  secp256k1_scalar_clear(r);
68  for (j = 0; j < row->size; j++) {
69  secp256k1_scalar term;
70  secp256k1_fast_scalar_mul(&term, &row->entry[j].scal, &zn[row->entry[j].idx]);
71  secp256k1_scalar_add(r, r, &term);
72  }
73 }
74 
76  return secp256k1_scratch_allocate_frame(
77  scratch,
78  n_proofs * (sizeof(secp256k1_bulletproof_vfy_compressed_circuit) + (2 * circ->n_gates + circ->n_constraints + circ->n_commits) * sizeof(secp256k1_scalar)),
79  n_proofs * 2
80  );
81 }
82 
84  secp256k1_bulletproof_vfy_compressed_circuit *ret = (secp256k1_bulletproof_vfy_compressed_circuit *)secp256k1_scratch_alloc(scratch, sizeof(*ret));
85  secp256k1_scalar *ss = (secp256k1_scalar *)secp256k1_scratch_alloc(scratch, (2 * circ->n_gates + circ->n_commits + circ->n_constraints) * sizeof(*ss));
86  secp256k1_scalar yinvn, zyn;
87  secp256k1_scalar zsqr;
88  secp256k1_scalar tmp;
89  size_t i;
90 
91  ret->wl_wo = &ss[0 * circ->n_gates];
92  ret->wr = &ss[1 * circ->n_gates];
93  ret->wv = &ss[2 * circ->n_gates];
94  ret->zn = &ss[2 * circ->n_gates + circ->n_commits];
95 
96  secp256k1_scalar_sqr(&zsqr, z); /* z^1 and z^2 are reserved for bits */
97  secp256k1_scalar_mul(&ret->zn[0], &zsqr, z);
98  for (i = 1; i < circ->n_constraints; i++) {
99  secp256k1_scalar_mul(&ret->zn[i], &ret->zn[i - 1], z);
100  }
101 
102  zyn = *z;
103  secp256k1_scalar_set_int(&yinvn, 1);
104  secp256k1_scalar_clear(&ret->c_sum);
105 
106  for (i = 0; i < circ->n_gates; i++) {
107  secp256k1_scalar wl;
108  secp256k1_wmatrix_row_compress(&wl, &circ->wl[i], ret->zn);
109 
110  /* For bits only WL has constraints beyond the bit-constraints */
111  if (i < circ->n_bits) {
112  secp256k1_scalar_negate(&ret->wr[i], z); /* set WR */
113 
114  secp256k1_scalar_mul(&wl, &wl, &yinvn);
115  secp256k1_scalar_add(&wl, &wl, z); /* add bit-constraint to WL */
116 
117  secp256k1_scalar_mul(&ret->wl_wo[i], &wl, x); /* WO becomes WL*x */
118  secp256k1_scalar_add(&ret->wl_wo[i], &ret->wl_wo[i], &zsqr); /* set WLx + WO */
119 
120  /* Multiply WL by WR and add to the c sum */
121  secp256k1_scalar_mul(&wl, &wl, &zyn);
122  secp256k1_scalar_negate(&wl, &wl);
123 
124  secp256k1_scalar_add(&ret->c_sum, &ret->c_sum, &wl);
125  secp256k1_scalar_add(&ret->c_sum, &ret->c_sum, &zyn);
126  secp256k1_scalar_mul(&zyn, &zyn, y);
127  } else {
128  secp256k1_wmatrix_row_compress(&ret->wr[i], &circ->wr[i], ret->zn);
129  secp256k1_wmatrix_row_compress(&ret->wl_wo[i], &circ->wo[i], ret->zn);
130 
131  secp256k1_scalar_mul(&tmp, &wl, x);
132  secp256k1_scalar_add(&tmp, &tmp, &ret->wl_wo[i]);
133  secp256k1_scalar_mul(&ret->wl_wo[i], &tmp, &yinvn);
134 
135  secp256k1_scalar_mul(&ret->wr[i], &ret->wr[i], &yinvn);
136 
137  secp256k1_scalar_mul(&tmp, &wl, &ret->wr[i]);
138  secp256k1_scalar_add(&ret->c_sum, &ret->c_sum, &tmp);
139  }
140 
141  secp256k1_scalar_mul(&yinvn, &yinvn, yinv);
142  }
143 
144  secp256k1_scalar_sqr(&tmp, x);
145  for (i = 0; i < circ->n_commits; i++) {
146  secp256k1_wmatrix_row_compress(&ret->wv[i], &circ->wv[i], ret->zn);
147  secp256k1_scalar_mul(&ret->wv[i], &ret->wv[i], &tmp);
148  }
149 
150  for (i = 0; i < circ->n_constraints; i++) {
151  secp256k1_scalar term;
152  secp256k1_fast_scalar_mul(&term, &circ->c[i], &ret->zn[i]);
153  secp256k1_scalar_add(&ret->c_sum, &ret->c_sum, &term);
154  }
155  secp256k1_scalar_mul(&ret->c_sum, &ret->c_sum, &tmp);
156 
157  return ret;
158 }
159 
161  int ret = secp256k1_scratch_allocate_frame(
162  scratch,
163  (sizeof(secp256k1_bulletproof_pf_compressed_circuit) + (5 * circ->n_gates + circ->n_constraints + circ->n_commits) * sizeof(secp256k1_scalar)),
164  2
165  );
166  return ret;
167 }
168 
170  secp256k1_bulletproof_pf_compressed_circuit *ret = (secp256k1_bulletproof_pf_compressed_circuit *)secp256k1_scratch_alloc(scratch, sizeof(*ret));
171  secp256k1_scalar *ss = (secp256k1_scalar *)secp256k1_scratch_alloc(scratch, (5 * circ->n_gates + circ->n_commits + circ->n_constraints) * sizeof(*ss));
172  size_t i;
173 
174  VERIFY_CHECK(ret != NULL);
175  VERIFY_CHECK(ss != NULL);
176 
177  ret->l1 = &ss[0 * circ->n_gates];
178  ret->l3 = &ss[1 * circ->n_gates];
179  ret->r0 = &ss[2 * circ->n_gates];
180  ret->r1 = &ss[3 * circ->n_gates];
181  ret->r3 = &ss[4 * circ->n_gates];
182  ret->wv = &ss[5 * circ->n_gates];
183  ret->zn = &ss[5 * circ->n_gates + circ->n_commits];
184 
185  for (i = 0; i < circ->n_gates; i++) {
186  secp256k1_scalar_chacha20(&ret->l3[i], &ret->r3[i], nonce, 4 + i);
187  }
188 
189  return ret;
190 }
191 
193  secp256k1_scalar yinvn, yn;
194  secp256k1_scalar zsqr;
195  size_t i;
196 
197  secp256k1_scalar_sqr(&zsqr, z); /* z^1 and z^2 are reserved for bits */
198  secp256k1_scalar_mul(&ret->zn[0], &zsqr, z);
199  for (i = 1; i < circ->n_constraints; i++) {
200  secp256k1_scalar_mul(&ret->zn[i], &ret->zn[i - 1], z);
201  }
202 
203  secp256k1_scalar_set_int(&yinvn, 1);
204  secp256k1_scalar_set_int(&yn, 1);
205 
206  for (i = 0; i < circ->n_gates; i++) {
207  secp256k1_scalar wl, wr, wo;
208 
209  secp256k1_wmatrix_row_compress(&wl, &circ->wl[i], ret->zn);
210  secp256k1_wmatrix_row_compress(&wr, &circ->wr[i], ret->zn);
211  secp256k1_wmatrix_row_compress(&wo, &circ->wo[i], ret->zn);
212 
213  /* Add bit constraints to sums, in the randomized form
214  * y^i*z*(Li - Ri - 1) + y^i*z^2*Oi = 0 */
215  if (i < circ->n_bits) {
216  secp256k1_scalar tmp;
217 
218  secp256k1_scalar_negate(&tmp, z);
219  secp256k1_scalar_add(&wr, &wr, &tmp);
220 
221  secp256k1_scalar_mul(&tmp, &yn, z);
222  secp256k1_scalar_add(&wl, &wl, &tmp);
223 
224  secp256k1_scalar_mul(&tmp, &tmp, z);
225  secp256k1_scalar_add(&wo, &wo, &tmp);
226  } else {
227  secp256k1_scalar_mul(&wr, &wr, &yinvn);
228  }
229 
230  /* Compute l3 and r3 */
231  secp256k1_scalar_mul(&ret->r3[i], &ret->r3[i], &yn);
232  /* Compute l1 */
233  if (i < assn->n_gates) {
234  secp256k1_scalar_add(&ret->l1[i], &wr, &assn->al[i]);
235  }
236  /* Compute r0 */
237  secp256k1_scalar_negate(&ret->r0[i], &yn);
238  secp256k1_scalar_add(&ret->r0[i], &ret->r0[i], &wo);
239  /* Compute r1 */
240  if (i < assn->n_gates) {
241  secp256k1_scalar_mul(&ret->r1[i], &assn->ar[i], &yn);
242  secp256k1_scalar_add(&ret->r1[i], &ret->r1[i], &wl);
243  } else {
244  ret->r1[i] = wl;
245  }
246 
247  secp256k1_scalar_mul(&yn, &yn, y);
248  secp256k1_scalar_mul(&yinvn, &yinvn, yinv);
249  }
250 
251  for (i = 0; i < circ->n_commits; i++) {
252  secp256k1_wmatrix_row_compress(&ret->wv[i], &circ->wv[i], ret->zn);
253  }
254 }
255 
256 #endif
secp256k1_scratch_space_struct2
Definition: scratch.h:14
secp256k1_fast_scalar::special
int special
Definition: main_impl.h:21
VERIFY_CHECK
#define VERIFY_CHECK(cond)
Definition: util.h:61
secp256k1_bulletproof_pf_compressed_circuit::l1
secp256k1_scalar * l1
Definition: circuit_compress_impl.h:23
secp256k1_bulletproof_circuit::n_commits
size_t n_commits
Definition: main_impl.h:33
secp256k1_bulletproof_pf_compressed_circuit::zn
secp256k1_scalar * zn
Definition: circuit_compress_impl.h:31
b
void const uint64_t * b
Definition: field_5x52_asm_impl.h:10
secp256k1_bulletproof_circuit_assignment::al
secp256k1_scalar * al
Definition: main_impl.h:48
secp256k1_bulletproof_circuit_assignment::ar
secp256k1_scalar * ar
Definition: main_impl.h:49
secp256k1_bulletproof_vfy_compressed_circuit::wl_wo
secp256k1_scalar * wl_wo
Definition: circuit_compress_impl.h:18
secp256k1_bulletproof_circuit::wr
secp256k1_bulletproof_wmatrix_row * wr
Definition: main_impl.h:37
secp256k1_bulletproof_pf_compressed_circuit::wv
secp256k1_scalar * wv
Definition: circuit_compress_impl.h:30
secp256k1_bulletproof_pf_compressed_circuit::r0
secp256k1_scalar * r0
Definition: circuit_compress_impl.h:26
secp256k1_bulletproof_vfy_compressed_circuit_allocate_frame
int secp256k1_bulletproof_vfy_compressed_circuit_allocate_frame(secp256k1_scratch *scratch, const secp256k1_bulletproof_circuit *circ, size_t n_proofs)
Definition: circuit_compress_impl.h:75
secp256k1_bulletproof_vfy_compressed_circuit
Definition: circuit_compress_impl.h:12
r
void const uint64_t uint64_t * r
Definition: field_5x52_asm_impl.h:10
secp256k1_bulletproof_vfy_compressed_circuit::c_sum
secp256k1_scalar c_sum
Definition: circuit_compress_impl.h:17
secp256k1_bulletproof_pf_compressed_circuit::l3
secp256k1_scalar * l3
Definition: circuit_compress_impl.h:25
secp256k1_fast_scalar::scal
secp256k1_scalar scal
Definition: main_impl.h:22
secp256k1_scalar
A scalar modulo the group order of the secp256k1 curve.
Definition: scalar_4x64.h:13
secp256k1_bulletproof_circuit::wv
secp256k1_bulletproof_wmatrix_row * wv
Definition: main_impl.h:39
secp256k1_bulletproof_circuit::c
secp256k1_fast_scalar * c
Definition: main_impl.h:40
secp256k1_bulletproof_pf_compressed_circuit_allocate_frame
int secp256k1_bulletproof_pf_compressed_circuit_allocate_frame(secp256k1_scratch *scratch, const secp256k1_bulletproof_circuit *circ)
Definition: circuit_compress_impl.h:160
secp256k1_bulletproof_pf_compressed_circuit::r1
secp256k1_scalar * r1
Definition: circuit_compress_impl.h:27
secp256k1_bulletproof_circuit::wo
secp256k1_bulletproof_wmatrix_row * wo
Definition: main_impl.h:38
secp256k1_bulletproof_vfy_compressed_circuit::wr
secp256k1_scalar * wr
Definition: circuit_compress_impl.h:19
secp256k1_bulletproof_pf_compressed_circuit
Definition: circuit_compress_impl.h:21
secp256k1_bulletproof_vfy_compressed_circuit::wv
secp256k1_scalar * wv
Definition: circuit_compress_impl.h:20
secp256k1_bulletproof_circuit::n_gates
size_t n_gates
Definition: main_impl.h:32
secp256k1_bulletproof_pf_compress_circuit
void secp256k1_bulletproof_pf_compress_circuit(secp256k1_bulletproof_pf_compressed_circuit *ret, const secp256k1_bulletproof_circuit *circ, const secp256k1_bulletproof_circuit_assignment *assn, const secp256k1_scalar *y, const secp256k1_scalar *yinv, const secp256k1_scalar *z)
Definition: circuit_compress_impl.h:192
secp256k1_bulletproof_circuit_assignment
Definition: main_impl.h:45
secp256k1_bulletproof_vfy_compressed_circuit::zn
secp256k1_scalar * zn
Definition: circuit_compress_impl.h:21
secp256k1_bulletproof_wmatrix_entry::idx
size_t idx
Definition: main_impl.h:22
secp256k1_fast_scalar
Definition: main_impl.h:16
secp256k1_bulletproof_pf_compressed_circuit::r3
secp256k1_scalar * r3
Definition: circuit_compress_impl.h:29
main_impl.h
secp256k1_bulletproof_wmatrix_entry::scal
secp256k1_fast_scalar scal
Definition: main_impl.h:23
secp256k1_bulletproof_circuit
Definition: main_impl.h:31
secp256k1_bulletproof_pf_slsr
secp256k1_bulletproof_pf_compressed_circuit * secp256k1_bulletproof_pf_slsr(secp256k1_scratch *scratch, const secp256k1_bulletproof_circuit *circ, const unsigned char *nonce)
Definition: circuit_compress_impl.h:169
secp256k1_bulletproof_wmatrix_row::size
size_t size
Definition: main_impl.h:27
CHECK
#define CHECK(cond)
Definition: util.h:43
secp256k1_bulletproof_circuit::n_constraints
size_t n_constraints
Definition: main_impl.h:34
secp256k1_bulletproof_vfy_compress_circuit
secp256k1_bulletproof_vfy_compressed_circuit * secp256k1_bulletproof_vfy_compress_circuit(secp256k1_scratch *scratch, const secp256k1_bulletproof_circuit *circ, const secp256k1_scalar *x, const secp256k1_scalar *y, const secp256k1_scalar *yinv, const secp256k1_scalar *z)
Definition: circuit_compress_impl.h:83
secp256k1_bulletproof_wmatrix_row::entry
secp256k1_bulletproof_wmatrix_entry * entry
Definition: main_impl.h:28
secp256k1_bulletproof_circuit::wl
secp256k1_bulletproof_wmatrix_row * wl
Definition: main_impl.h:36
secp256k1_bulletproof_wmatrix_row
Definition: main_impl.h:26