Skip to content

Commit b78376b

Browse files
authored
chore: use bool for ScanData fields (#72)
1 parent 2fafc07 commit b78376b

File tree

2 files changed

+23
-30
lines changed

2 files changed

+23
-30
lines changed

src/json.nr

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -420,27 +420,28 @@ impl<let NumBytes: u32, let NumPackedFields: u32, let MaxNumTokens: u32, let Max
420420
let mut transcript_ptr: u32 = 0;
421421
let mut scan_mode = GRAMMAR_CAPTURE;
422422
let mut length: Field = 0;
423-
let mut previous_was_potential_escape_sequence = 0;
423+
let mut previous_was_potential_escape_sequence: bool = false;
424424
for i in 0..NumBytes {
425425
// while this assert is in an unconstrained function, the out of bounds accesss `raw_transcript[transcript_ptr]` in build_transcript also generates failing constraints
426426
assert(transcript_ptr < MaxNumTokens, "build_transcript: MaxNumTokens limit exceeded!");
427427
let ascii = self.json[i];
428428

429-
let encoded_ascii =
430-
previous_was_potential_escape_sequence * 1024 + scan_mode * 256 + ascii as Field;
429+
let encoded_ascii = previous_was_potential_escape_sequence as Field * 1024
430+
+ scan_mode * 256
431+
+ ascii as Field;
431432
let ScanData { scan_token, push_transcript, increase_length, is_potential_escape_sequence } =
432433
ScanData::from_field(JSON_CAPTURE_TABLE[cast_num_to_u32(encoded_ascii)]);
433434

434-
if push_transcript == 1 {
435+
if push_transcript {
435436
let new_entry = RawTranscriptEntry::to_field(
436437
RawTranscriptEntry { encoded_ascii, index: i as Field - length, length },
437438
);
438439

439440
raw_transcript[transcript_ptr] = new_entry;
440441
transcript_ptr += 1;
441-
length = increase_length;
442+
length = increase_length as Field;
442443
} else {
443-
length += increase_length;
444+
length += increase_length as Field;
444445
}
445446

446447
previous_was_potential_escape_sequence = is_potential_escape_sequence;
@@ -493,13 +494,14 @@ impl<let NumBytes: u32, let NumPackedFields: u32, let MaxNumTokens: u32, let Max
493494
let raw_transcript = unsafe { self.__build_transcript() };
494495

495496
// 14 gates per iteration, plus fixed cost for initing 2,048 size lookup table (4,096 gates)
496-
let mut previous_was_potential_escape_sequence = 0;
497+
let mut previous_was_potential_escape_sequence: bool = false;
497498
for i in 0..NumBytes {
498499
let ascii = self.json[i];
499500

500501
// 1 gate
501-
let encoded_ascii =
502-
previous_was_potential_escape_sequence * 1024 + scan_mode * 256 + ascii as Field;
502+
let encoded_ascii = previous_was_potential_escape_sequence as Field * 1024
503+
+ scan_mode * 256
504+
+ ascii as Field;
503505
std::as_witness(encoded_ascii);
504506

505507
// 2 gates
@@ -519,14 +521,14 @@ impl<let NumBytes: u32, let NumPackedFields: u32, let MaxNumTokens: u32, let Max
519521
std::as_witness(diff);
520522

521523
// 1 gate
522-
assert(diff * push_transcript == 0);
524+
assert(diff * push_transcript as Field == 0);
523525

524526
// 1 gate
525-
length = length * (1 - push_transcript) + increase_length;
527+
length = length * (1 - push_transcript as Field) + increase_length as Field;
526528
std::as_witness(length);
527529

528530
// 1 gate
529-
transcript_ptr += push_transcript;
531+
transcript_ptr += push_transcript as Field;
530532

531533
previous_was_potential_escape_sequence = is_potential_escape_sequence;
532534
scan_mode = scan_token;

src/transcript_entry.nr

Lines changed: 9 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -107,19 +107,19 @@ pub(crate) struct TranscriptEntry {
107107

108108
pub(crate) struct ScanData {
109109
pub(crate) scan_token: Field,
110-
pub(crate) push_transcript: Field,
111-
pub(crate) increase_length: Field,
112-
pub(crate) is_potential_escape_sequence: Field,
110+
pub(crate) push_transcript: bool,
111+
pub(crate) increase_length: bool,
112+
pub(crate) is_potential_escape_sequence: bool,
113113
}
114114

115115
impl ScanData {
116116
unconstrained fn __from_field(f: Field) -> Self {
117117
let bytes: [u8; 6] = f.to_le_bytes();
118118

119119
let scan_token: Field = bytes[0] as Field;
120-
let push_transcript = bytes[1] as Field;
121-
let increase_length = bytes[2] as Field;
122-
let is_potential_escape_sequence = bytes[3] as Field;
120+
let push_transcript = bytes[1] != 0;
121+
let increase_length = bytes[2] != 0;
122+
let is_potential_escape_sequence = bytes[3] != 0;
123123
let error = bytes[4] as Field * 0x100 + bytes[5] as Field;
124124
assert(error == 0, "ScanData: Invalid token");
125125
ScanData { scan_token, push_transcript, increase_length, is_potential_escape_sequence }
@@ -128,21 +128,12 @@ impl ScanData {
128128
pub(crate) fn from_field(f: Field) -> Self {
129129
// Safety: check the comments below
130130
let result = unsafe { ScanData::__from_field(f) };
131-
// checks increase_length is a valid boolean
132-
assert(result.increase_length * result.increase_length == result.increase_length);
133-
// checks push_transcript is a valid boolean
134-
assert(result.push_transcript * result.push_transcript == result.push_transcript);
135-
// checks is_potential_escape_sequence is a valid boolean
136-
assert(
137-
result.is_potential_escape_sequence * result.is_potential_escape_sequence
138-
== result.is_potential_escape_sequence,
139-
);
140131
// checks the input field is a valid combination of the outputs of the decomposition
141132
assert(
142133
result.scan_token
143-
+ result.push_transcript * 0x100
144-
+ result.increase_length * 0x10000
145-
+ result.is_potential_escape_sequence * 0x1000000
134+
+ result.push_transcript as Field * 0x100
135+
+ result.increase_length as Field * 0x10000
136+
+ result.is_potential_escape_sequence as Field * 0x1000000
146137
== f,
147138
);
148139
result

0 commit comments

Comments
 (0)