pub struct ScannerChip<F>where
F: CircuitField,{ /* private fields */ }Expand description
Chip for scanning: automaton parsing and substring verification.
Implementations§
Source§impl<F> ScannerChip<F>where
F: CircuitField + Ord,
impl<F> ScannerChip<F>where
F: CircuitField + Ord,
Sourcepub fn parse(
&self,
layouter: &mut impl Layouter<F>,
parser: AutomatonParser,
input: &[AssignedByte<F>],
) -> Result<Vec<AssignedNative<F>>, Error>
pub fn parse( &self, layouter: &mut impl Layouter<F>, parser: AutomatonParser, input: &[AssignedByte<F>], ) -> Result<Vec<AssignedNative<F>>, Error>
Parses input in-circuit w.r.t. a regular expression / transducer and
outputs the sequence of integers it produces. The parser may either be
part of a static library (faster to parse) or an arbitrary regex (more
costly but supports any regex). Both variants use the same fixed lookup
table mechanism.
Sourcepub fn parse_varlen<const M: usize, const A: usize>(
&self,
layouter: &mut impl Layouter<F>,
parser: AutomatonParser,
input: &ScannerVec<F, M, A>,
) -> Result<AssignedVector<F, AssignedNative<F>, M, A>, Error>
pub fn parse_varlen<const M: usize, const A: usize>( &self, layouter: &mut impl Layouter<F>, parser: AutomatonParser, input: &ScannerVec<F, M, A>, ) -> Result<AssignedVector<F, AssignedNative<F>, M, A>, Error>
Parses the variable-length input in-circuit w.r.t. a regular
expression / transducer and returns the sequence of markers it produces.
The returned vector has the same length as input’s buffer (M
elements). It inherits the same
get_limits, and
padding_flags as input. Filler
positions in the output are constrained to 0 (the self-loop transitions
on initial/final states output marker 0).
Source§impl<F> ScannerChip<F>where
F: CircuitField + Ord,
impl<F> ScannerChip<F>where
F: CircuitField + Ord,
Sourcepub fn check_bytes(
&self,
layouter: &mut impl Layouter<F>,
sequence: &[AssignedByte<F>],
idx: &AssignedNative<F>,
sub: &[AssignedByte<F>],
) -> Result<(), Error>
pub fn check_bytes( &self, layouter: &mut impl Layouter<F>, sequence: &[AssignedByte<F>], idx: &AssignedNative<F>, sub: &[AssignedByte<F>], ) -> Result<(), Error>
Asserts that sub is a contiguous subsequence of sequence starting at
index idx (0-indexed). This function defers the actual circuit work:
it records the call in the SequenceCache,
grouping entries with the same sequence argument under a single tag.
The circuit assignment happens later in
Self::finalise_substring_checks.
§Cost
The cost of one call is of the order of |sequence| + |sub| rows.
Due to caching, multiple calls with the same sequence argument only
pay the sequence-related cost once.
§Range check
The starting index is range-checked (idx < 2^PARSING_MAX_LEN_BITS)
so that the packed lookup value (idx + i) * (ALPHABET_MAX_SIZE + 1) + byte is injective over the field.
Sourcepub fn check_bytes_ext(
&self,
layouter: &mut impl Layouter<F>,
sequence: &[AssignedNative<F>],
idx: &AssignedNative<F>,
sub: &[AssignedNative<F>],
) -> Result<(), Error>
pub fn check_bytes_ext( &self, layouter: &mut impl Layouter<F>, sequence: &[AssignedNative<F>], idx: &AssignedNative<F>, sub: &[AssignedNative<F>], ) -> Result<(), Error>
More permissive version of Self::check_bytes that allows both
sequence and sub to include the value 256. This function
range-checks all of their cells by 257 to enable that.
Less resilient, and slightly less efficient than Self::check_bytes,
but permits to encode more complex tests on bytes by using 256 as
separator arbitrarily. E.g., the positions at which sub may start may
be restricted by putting 256 blockers in sequence, and at the
beginning and the end of sub.
Sourcepub fn assert_equal_fixlen(
&self,
layouter: &mut impl Layouter<F>,
v1: &[AssignedByte<F>],
v2: &[AssignedByte<F>],
) -> Result<(), Error>
pub fn assert_equal_fixlen( &self, layouter: &mut impl Layouter<F>, v1: &[AssignedByte<F>], v2: &[AssignedByte<F>], ) -> Result<(), Error>
Asserts that two byte slices of fixed length are element-wise equal. Proceeds by iterating and asserting equality over cells.
Source§impl<F> ScannerChip<F>where
F: CircuitField + Ord,
impl<F> ScannerChip<F>where
F: CircuitField + Ord,
Sourcepub fn check_bytes_varlen<const M_SEQ: usize, const A_SEQ: usize, const M_SUB: usize, const A_SUB: usize>(
&self,
layouter: &mut impl Layouter<F>,
sequence: &ScannerVec<F, M_SEQ, A_SEQ>,
idx: &AssignedNative<F>,
sub: &ScannerVec<F, M_SUB, A_SUB>,
) -> Result<(), Error>
pub fn check_bytes_varlen<const M_SEQ: usize, const A_SEQ: usize, const M_SUB: usize, const A_SUB: usize>( &self, layouter: &mut impl Layouter<F>, sequence: &ScannerVec<F, M_SEQ, A_SEQ>, idx: &AssignedNative<F>, sub: &ScannerVec<F, M_SUB, A_SUB>, ) -> Result<(), Error>
Similar to check_bytes, but supports
variable-length inputs. If sub has known fixed length, use
check_bytes_varlen_partial
instead.
Sourcepub fn check_bytes_varlen_partial<const M: usize, const A: usize>(
&self,
layouter: &mut impl Layouter<F>,
sequence: &ScannerVec<F, M, A>,
idx: &AssignedNative<F>,
sub: &[AssignedByte<F>],
) -> Result<(), Error>
pub fn check_bytes_varlen_partial<const M: usize, const A: usize>( &self, layouter: &mut impl Layouter<F>, sequence: &ScannerVec<F, M, A>, idx: &AssignedNative<F>, sub: &[AssignedByte<F>], ) -> Result<(), Error>
Similar to check_bytes, but the sequence
is variable-length while sub is fixed-length. More efficient than
check_bytes_varlen.
Sourcepub fn assert_equal_varlen<const M1: usize, const A1: usize, const M2: usize, const A2: usize>(
&self,
layouter: &mut impl Layouter<F>,
v1: &ScannerVec<F, M1, A1>,
v2: &ScannerVec<F, M2, A2>,
) -> Result<(), Error>
pub fn assert_equal_varlen<const M1: usize, const A1: usize, const M2: usize, const A2: usize>( &self, layouter: &mut impl Layouter<F>, v1: &ScannerVec<F, M1, A1>, v2: &ScannerVec<F, M2, A2>, ) -> Result<(), Error>
Asserts that two byte slices of variable length are element-wise equal.
Proceeds by testing equality of the lengths, and checks that v2 is a
substring of v1 at index 0. If either of the two vectors is also used
as the sequence argument of another substring check, putting it as the
v1 argument is the most cost efficient.
Sourcepub fn assert_equal_varlen_partial<const M: usize, const A: usize>(
&self,
layouter: &mut impl Layouter<F>,
v1: &ScannerVec<F, M, A>,
v2: &[AssignedByte<F>],
) -> Result<(), Error>
pub fn assert_equal_varlen_partial<const M: usize, const A: usize>( &self, layouter: &mut impl Layouter<F>, v1: &ScannerVec<F, M, A>, v2: &[AssignedByte<F>], ) -> Result<(), Error>
Asserts that two byte slices of variable and fixed length, respectively, are element-wise equal. Proceeds by testing equality of the lengths, and checks equality of the varlen buffer with a padded slice.
Source§impl<F> ScannerChip<F>where
F: CircuitField + Ord,
impl<F> ScannerChip<F>where
F: CircuitField + Ord,
Sourcepub fn scanner_vec_to_byte_vector<const M: usize, const A: usize>(
&self,
layouter: &mut impl Layouter<F>,
sv: &ScannerVec<F, M, A>,
) -> Result<AssignedVector<F, AssignedByte<F>, M, A>, Error>
pub fn scanner_vec_to_byte_vector<const M: usize, const A: usize>( &self, layouter: &mut impl Layouter<F>, sv: &ScannerVec<F, M, A>, ) -> Result<AssignedVector<F, AssignedByte<F>, M, A>, Error>
Converts a ScannerVec into an AssignedVector of AssignedBytes.
Filler positions (value 256) are replaced with 0 so that all buffer
elements are valid bytes. The resulting vector can be passed to
operations that expect AssignedByte inputs, such as variable-length
SHA-256.
No range-check constraints are added: payload bytes were already
range-checked during ScannerVec construction, and fillers are
replaced by a known constant (0).
Sourcepub fn assign_scanner_vec<const M: usize, const A: usize>(
&self,
layouter: &mut impl Layouter<F>,
value: Value<Vec<u8>>,
) -> Result<ScannerVec<F, M, A>, Error>
pub fn assign_scanner_vec<const M: usize, const A: usize>( &self, layouter: &mut impl Layouter<F>, value: Value<Vec<u8>>, ) -> Result<ScannerVec<F, M, A>, Error>
Assigns a variable-length byte vector as a ScannerVec.
The input bytes are assigned as AssignedBytes (range-checked to
[0, 255]), promoted to AssignedNative elements, and filler
positions are constrained to ALPHABET_MAX_SIZE in-circuit.
Sourcepub fn scanner_vec_from_byte_vec<const M: usize, const A: usize>(
&self,
layouter: &mut impl Layouter<F>,
vec: AssignedVector<F, AssignedByte<F>, M, A>,
) -> Result<ScannerVec<F, M, A>, Error>
pub fn scanner_vec_from_byte_vec<const M: usize, const A: usize>( &self, layouter: &mut impl Layouter<F>, vec: AssignedVector<F, AssignedByte<F>, M, A>, ) -> Result<ScannerVec<F, M, A>, Error>
Converts an existing AssignedVector of AssignedBytes into a
ScannerVec, constraining filler positions to ALPHABET_MAX_SIZE
and anchoring the length.
The input elements are already range-checked (they are
AssignedBytes). This function computes padding flags and constrains
fillers via select.
Source§impl<F> ScannerChip<F>where
F: CircuitField,
impl<F> ScannerChip<F>where
F: CircuitField,
Sourcepub fn specs_regex(&self, parser: &StdLibParser) -> &Regex
pub fn specs_regex(&self, parser: &StdLibParser) -> &Regex
Gets the regex associated to a StdLibParser, as stored in the static
library of self.
Trait Implementations§
Source§impl<F> Chip<F> for ScannerChip<F>where
F: CircuitField,
impl<F> Chip<F> for ScannerChip<F>where
F: CircuitField,
Source§type Config = ScannerConfig
type Config = ScannerConfig
Circuit::configure.Source§type Loaded = ()
type Loaded = ()
Circuit::synthesize. This might simply be () for some
chips.Source§impl<F> Clone for ScannerChip<F>where
F: CircuitField + Clone,
impl<F> Clone for ScannerChip<F>where
F: CircuitField + Clone,
Source§fn clone(&self) -> ScannerChip<F>
fn clone(&self) -> ScannerChip<F>
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl<F> ComposableChip<F> for ScannerChip<F>where
F: CircuitField + Ord,
impl<F> ComposableChip<F> for ScannerChip<F>where
F: CircuitField + Ord,
Source§fn load(&self, layouter: &mut impl Layouter<F>) -> Result<(), Error>
fn load(&self, layouter: &mut impl Layouter<F>) -> Result<(), Error>
Loads the automaton transition table and finalises all deferred substring checks. Must be called at the end of circuit synthesis.
Source§type InstructionDeps = NativeGadget<F, P2RDecompositionChip<F>, NativeChip<F>>
type InstructionDeps = NativeGadget<F, P2RDecompositionChip<F>, NativeChip<F>>
Source§fn new(config: &ScannerConfig, deps: &Self::InstructionDeps) -> Self
fn new(config: &ScannerConfig, deps: &Self::InstructionDeps) -> Self
Source§fn configure(
meta: &mut ConstraintSystem<F>,
shared_res: &Self::SharedResources,
) -> ScannerConfig
fn configure( meta: &mut ConstraintSystem<F>, shared_res: &Self::SharedResources, ) -> ScannerConfig
Auto Trait Implementations§
impl<F> !RefUnwindSafe for ScannerChip<F>
impl<F> !Send for ScannerChip<F>
impl<F> !Sync for ScannerChip<F>
impl<F> !UnwindSafe for ScannerChip<F>
impl<F> Freeze for ScannerChip<F>
impl<F> Unpin for ScannerChip<F>where
F: Unpin,
impl<F> UnsafeUnpin for ScannerChip<F>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.Source§impl<T> Pointable for T
impl<T> Pointable for T
impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
impl<T> SyncDeps for T
Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.