Skip to main content

ScannerChip

Struct ScannerChip 

Source
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,

Source

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.

Source

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,

Source

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.

Source

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.

Source

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,

Source

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.

Source

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.

Source

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.

Source

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,

Source

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).

Source

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.

Source

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,

Source

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,

Source§

type Config = ScannerConfig

A type that holds the configuration for this chip, and any other state it may need during circuit synthesis, that can be derived during Circuit::configure.
Source§

type Loaded = ()

A type that holds any general chip state that needs to be loaded at the start of Circuit::synthesize. This might simply be () for some chips.
Source§

fn config(&self) -> &Self::Config

The chip holds its own configuration.
Source§

fn loaded(&self) -> &Self::Loaded

Provides access to general chip state loaded at the beginning of circuit synthesis. Read more
Source§

impl<F> Clone for ScannerChip<F>
where F: CircuitField + Clone,

Source§

fn clone(&self) -> ScannerChip<F>

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<F> ComposableChip<F> for ScannerChip<F>
where F: CircuitField + Ord,

Source§

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>>

Instruction set dependencies of the chip. This chip will need to be provided with subchips that implement these instructions.
Source§

type SharedResources = ([Column<Advice>; 6], Column<Fixed>, HashMap<StdLibParser, (Regex, Automaton), FxBuildHasher>)

Resources that can be used by other chips or gadgets, typically sub-chip configurations and columns.
Source§

fn new(config: &ScannerConfig, deps: &Self::InstructionDeps) -> Self

Initialize the chip.
Source§

fn configure( meta: &mut ConstraintSystem<F>, shared_res: &Self::SharedResources, ) -> ScannerConfig

Configure the chip. Receives the underlying chips and columns it needs via Self::SharedResources. This method must not allocate any resource in the constraint system that is intended to be shared by other chips.
Source§

impl<F> Debug for ScannerChip<F>
where F: CircuitField + Debug,

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

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> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> Conv for T

Source§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
Source§

impl<T> FmtForward for T

Source§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
Source§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
Source§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
Source§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
Source§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
Source§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
Source§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
Source§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
Source§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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 more
Source§

impl<T> Pipe for T
where T: ?Sized,

Source§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
Source§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
Source§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
Source§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows 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
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows 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
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
Source§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> SyncDeps for T

Source§

impl<T> Tap for T

Source§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
Source§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
Source§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
Source§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
Source§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
Source§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
Source§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
Source§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
Source§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
Source§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .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
where Self: BorrowMut<B>, B: ?Sized,

Calls .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
where Self: AsRef<R>, R: ?Sized,

Calls .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
where Self: AsMut<R>, R: ?Sized,

Calls .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
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> TryConv for T

Source§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more