Skip to content

Commit 3e89813

Browse files
authored
fix: always use u32 for indexing arrays (#10)
1 parent 309404b commit 3e89813

File tree

1 file changed

+74
-74
lines changed

1 file changed

+74
-74
lines changed

src/encoding.nr

Lines changed: 74 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ use crate::tables::{
55
BASE4_PARTIAL_CHOOSE_DECODE_5BIT_TABLE, BASE4_POWERS, BASE4_XOR_DECODE_5BIT_TABLE,
66
};
77

8-
unconstrained fn decompose_e(e: Field) -> [Field; 9] {
9-
let mut r: [Field; 9] = [0; 9];
8+
unconstrained fn decompose_e(e: Field) -> [u32; 9] {
9+
let mut r: [u32; 9] = [0; 9];
1010
let mut bytes = e.to_le_bytes::<8>();
1111
let b8to14 = bytes[1] & 63;
1212
let b14to16 = bytes[1] >> 6;
@@ -15,35 +15,35 @@ unconstrained fn decompose_e(e: Field) -> [Field; 9] {
1515
let b40to41 = bytes[5] & 1;
1616
let b41to48 = bytes[5] >> 1;
1717

18-
r[0] = bytes[0] as Field; // 0-8
19-
r[1] = b8to14 as Field; // 8-14
20-
r[2] = (b14to16 + (b16to18 << 2)) as Field; // 14-18
21-
r[3] = b18to24 as Field;
22-
r[4] = bytes[3] as Field;
23-
r[5] = bytes[4] as Field + (b40to41 as Field) * 256;
24-
r[6] = b41to48 as Field;
25-
r[7] = bytes[6] as Field;
26-
r[8] = bytes[7] as Field;
18+
r[0] = bytes[0] as u32; // 0-8
19+
r[1] = b8to14 as u32; // 8-14
20+
r[2] = (b14to16 + (b16to18 << 2)) as u32; // 14-18
21+
r[3] = b18to24 as u32;
22+
r[4] = bytes[3] as u32;
23+
r[5] = bytes[4] as u32 + (b40to41 as u32) * 256;
24+
r[6] = b41to48 as u32;
25+
r[7] = bytes[6] as u32;
26+
r[8] = bytes[7] as u32;
2727
r
2828
}
2929

30-
unconstrained fn decompose_a(a: Field) -> [Field; 9] {
31-
let mut r: [Field; 9] = [0; 9];
30+
unconstrained fn decompose_a(a: Field) -> [u32; 9] {
31+
let mut r: [u32; 9] = [0; 9];
3232
let mut bytes = a.to_le_bytes::<8>();
3333
let b24to28 = bytes[3] & 15;
3434
let b28to32 = bytes[3] >> 4;
3535
let b32to34 = bytes[4] & 3;
3636
let b34to39 = (bytes[4] >> 2) & 31;
3737
let b39to40 = bytes[4] >> 7;
38-
r[0] = bytes[0] as Field;
39-
r[1] = bytes[1] as Field;
40-
r[2] = bytes[2] as Field;
41-
r[3] = b24to28 as Field;
42-
r[4] = (b28to32 + (b32to34 << 4)) as Field;
43-
r[5] = b34to39 as Field;
44-
r[6] = b39to40 as Field + (bytes[5] as Field * 2);
45-
r[7] = bytes[6] as Field;
46-
r[8] = bytes[7] as Field;
38+
r[0] = bytes[0] as u32;
39+
r[1] = bytes[1] as u32;
40+
r[2] = bytes[2] as u32;
41+
r[3] = b24to28 as u32;
42+
r[4] = (b28to32 + (b32to34 << 4)) as u32;
43+
r[5] = b34to39 as u32;
44+
r[6] = b39to40 as u32 + (bytes[5] as u32 * 2);
45+
r[7] = bytes[6] as u32;
46+
r[8] = bytes[7] as u32;
4747
r
4848
/*
4949
let mut a64 = a as u64;
@@ -112,34 +112,34 @@ impl EncodedWitness {
112112
}
113113
}
114114

115-
unconstrained fn __decompose_witness(w: Field) -> [Field; 12] {
115+
unconstrained fn __decompose_witness(w: Field) -> [u32; 12] {
116116
// 1, 5, 1, 1, 8, 3, 8, 8, 8, 9, 9, 3
117117
let mut acc: u64 = w as u64;
118-
let mut r: [Field; 12] = [0; 12];
118+
let mut r: [u32; 12] = [0; 12];
119119

120-
r[0] = (acc & 1) as Field;
120+
r[0] = (acc & 1) as u32;
121121
acc >>= 1;
122-
r[1] = (acc & 31) as Field;
122+
r[1] = (acc & 31) as u32;
123123
acc >>= 5;
124-
r[2] = (acc & 1) as Field;
124+
r[2] = (acc & 1) as u32;
125125
acc >>= 1;
126-
r[3] = (acc & 1) as Field;
126+
r[3] = (acc & 1) as u32;
127127
acc >>= 1;
128-
r[4] = (acc & 255) as Field;
128+
r[4] = (acc & 255) as u32;
129129
acc >>= 8;
130-
r[5] = (acc & 7) as Field;
130+
r[5] = (acc & 7) as u32;
131131
acc >>= 3;
132-
r[6] = (acc & 255) as Field;
132+
r[6] = (acc & 255) as u32;
133133
acc >>= 8;
134-
r[7] = (acc & 255) as Field;
134+
r[7] = (acc & 255) as u32;
135135
acc >>= 8;
136-
r[8] = (acc & 255) as Field;
136+
r[8] = (acc & 255) as u32;
137137
acc >>= 8;
138-
r[9] = (acc & 511) as Field;
138+
r[9] = (acc & 511) as u32;
139139
acc >>= 9;
140-
r[10] = (acc & 511) as Field;
140+
r[10] = (acc & 511) as u32;
141141
acc >>= 9;
142-
r[11] = (acc & 7) as Field;
142+
r[11] = (acc & 7) as u32;
143143
r
144144
}
145145

@@ -268,31 +268,31 @@ pub(crate) fn encode_message_extension(w: Field) -> EncodedWitness {
268268
// We need to validate the correctness of these slice claims by asserting their sum equals `w`,
269269
// and we also need to validate the bit range of each slice
270270
// (we get an implicit range constraint for free by indexing our BASE4_ENCODE_TABLE lookup tables)
271-
let s: [Field; 12] = unsafe { __decompose_witness(w) };
271+
let s: [u32; 12] = unsafe { __decompose_witness(w) };
272272

273-
let mut reconstructed = s[11];
273+
let mut reconstructed: Field = s[11] as Field;
274274
reconstructed *= 512;
275-
reconstructed += s[10];
275+
reconstructed += s[10] as Field;
276276
reconstructed *= 512;
277-
reconstructed += s[9];
277+
reconstructed += s[9] as Field;
278278
reconstructed *= 256;
279-
reconstructed += s[8];
279+
reconstructed += s[8] as Field;
280280
reconstructed *= 256;
281-
reconstructed += s[7];
281+
reconstructed += s[7] as Field;
282282
reconstructed *= 256;
283-
reconstructed += s[6];
283+
reconstructed += s[6] as Field;
284284
reconstructed *= 8;
285-
reconstructed += s[5];
285+
reconstructed += s[5] as Field;
286286
reconstructed *= 256;
287-
reconstructed += s[4];
287+
reconstructed += s[4] as Field;
288288
reconstructed *= 2;
289-
reconstructed += s[3];
289+
reconstructed += s[3] as Field;
290290
reconstructed *= 2;
291-
reconstructed += s[2];
291+
reconstructed += s[2] as Field;
292292
reconstructed *= 32;
293-
reconstructed += s[1];
293+
reconstructed += s[1] as Field;
294294
reconstructed *= 2;
295-
reconstructed += s[0];
295+
reconstructed += s[0] as Field;
296296
assert_eq(reconstructed, w);
297297

298298
let mut base4_encoded_slices: [Field; 12] = [0; 12];
@@ -373,23 +373,23 @@ pub(crate) fn encode_e(e: Field) -> EncodedChoose {
373373
// (we get an implicit range constraint for free by indexing our BASE4_ENCODE_TABLE lookup tables)
374374
let s = unsafe { decompose_e(e) };
375375

376-
let mut reconstructed = s[8];
376+
let mut reconstructed: Field = s[8] as Field;
377377
reconstructed *= 256;
378-
reconstructed += s[7];
378+
reconstructed += s[7] as Field;
379379
reconstructed *= 128;
380-
reconstructed += s[6];
380+
reconstructed += s[6] as Field;
381381
reconstructed *= 512;
382-
reconstructed += s[5];
382+
reconstructed += s[5] as Field;
383383
reconstructed *= 256;
384-
reconstructed += s[4];
384+
reconstructed += s[4] as Field;
385385
reconstructed *= 64;
386-
reconstructed += s[3];
386+
reconstructed += s[3] as Field;
387387
reconstructed *= 16;
388-
reconstructed += s[2];
388+
reconstructed += s[2] as Field;
389389
reconstructed *= 64;
390-
reconstructed += s[1];
390+
reconstructed += s[1] as Field;
391391
reconstructed *= 256;
392-
reconstructed += s[0];
392+
reconstructed += s[0] as Field;
393393
assert_eq(reconstructed, e); // 7 gates?
394394

395395
// 8, 6, 4, 6, 8, 9, 7, 8, 8
@@ -458,23 +458,23 @@ pub(crate) fn encode_a(a: Field) -> EncodedMajority {
458458

459459
// 8,8,8,4,6,5,9,8,8
460460
// 7 gates?
461-
let mut reconstructed = s[8];
461+
let mut reconstructed: Field = s[8] as Field;
462462
reconstructed *= 256;
463-
reconstructed += s[7];
463+
reconstructed += s[7] as Field;
464464
reconstructed *= 512;
465-
reconstructed += s[6];
465+
reconstructed += s[6] as Field;
466466
reconstructed *= 32;
467-
reconstructed += s[5];
467+
reconstructed += s[5] as Field;
468468
reconstructed *= 64;
469-
reconstructed += s[4];
469+
reconstructed += s[4] as Field;
470470
reconstructed *= 16;
471-
reconstructed += s[3];
471+
reconstructed += s[3] as Field;
472472
reconstructed *= 256;
473-
reconstructed += s[2];
473+
reconstructed += s[2] as Field;
474474
reconstructed *= 256;
475-
reconstructed += s[1];
475+
reconstructed += s[1] as Field;
476476
reconstructed *= 256;
477-
reconstructed += s[0];
477+
reconstructed += s[0] as Field;
478478
assert_eq(reconstructed, a);
479479

480480
let mut base4_encoded_slices: [Field; 9] = [0; 9];
@@ -525,13 +525,13 @@ pub(crate) fn encode_a(a: Field) -> EncodedMajority {
525525
EncodedMajority { raw: a, a: a_ror0, ror28, ror34, ror39 }
526526
}
527527

528-
unconstrained fn __split_into_base4_5bit_slices(encoded: Field) -> [Field; 13] {
528+
unconstrained fn __split_into_base4_5bit_slices(encoded: Field) -> [u32; 13] {
529529
let mut acc = encoded as u128;
530530

531-
let mut slices: [Field; 13] = [0; 13];
531+
let mut slices: [u32; 13] = [0; 13];
532532

533533
for i in 0..13 {
534-
slices[i] = (acc & 1023) as Field;
534+
slices[i] = (acc & 1023) as u32;
535535
acc >>= 10;
536536
}
537537

@@ -548,7 +548,7 @@ pub(crate) fn decode_majority(a: Field, b: Field, c: Field) -> Field {
548548
let mut decoded: Field = 0;
549549
for i in 0..13 {
550550
reconstructed *= 1024;
551-
reconstructed += slices[12 - i];
551+
reconstructed += slices[12 - i] as Field;
552552
decoded *= 32;
553553
decoded += BASE4_MAJORITY_DECODE_5BIT_TABLE[slices[12 - i]];
554554
}
@@ -568,7 +568,7 @@ pub(crate) fn decode_choose(e: Field, f: Field, g: Field) -> Field {
568568
let mut decoded_lhs: Field = 0;
569569
for i in 0..13 {
570570
reconstructed *= 1024;
571-
reconstructed += lhs_slices[12 - i];
571+
reconstructed += lhs_slices[12 - i] as Field;
572572
decoded_lhs *= 32;
573573
decoded_lhs += BASE4_PARTIAL_CHOOSE_DECODE_5BIT_TABLE[lhs_slices[12 - i]];
574574
}
@@ -582,7 +582,7 @@ pub(crate) fn decode_choose(e: Field, f: Field, g: Field) -> Field {
582582
let mut decoded_rhs: Field = 0;
583583
for i in 0..13 {
584584
reconstructed *= 1024;
585-
reconstructed += rhs_slices[12 - i];
585+
reconstructed += rhs_slices[12 - i] as Field;
586586
decoded_rhs *= 32;
587587
decoded_rhs += BASE4_MAJORITY_DECODE_5BIT_TABLE[rhs_slices[12 - i]];
588588
}
@@ -604,7 +604,7 @@ pub(crate) fn decode_xor(encoded: Field) -> Field {
604604
let mut decoded: Field = 0;
605605
for i in 0..13 {
606606
reconstructed *= 1024;
607-
reconstructed += slices[12 - i];
607+
reconstructed += slices[12 - i] as Field;
608608
decoded *= 32;
609609
decoded += BASE4_XOR_DECODE_5BIT_TABLE[slices[12 - i]];
610610
}

0 commit comments

Comments
 (0)