pub struct StarkVerifier<C>where
C: StarkGenericConfig,{ /* private fields */ }Expand description
zk-STARK verifier
This is a high-level wrapper around the STARK verification functionality. It provides a convenient interface for verifying STARK proofs with a given configuration.
§Example
use lib_q_zkp::stark::{StarkVerifier, default_config};
use Complex;
use Mersenne31;
type Val = Complex<Mersenne31>;
let config = default_config();
let verifier = StarkVerifier::new(config);
// air: implements Air trait (same as used in proof generation)
// proof: StarkProof<Config>
// public_values: &[Val]
verifier.verify(&air, &proof, &public_values)?;Implementations§
Source§impl<C> StarkVerifier<C>where
C: StarkGenericConfig,
impl<C> StarkVerifier<C>where
C: StarkGenericConfig,
Sourcepub fn new(config: C) -> StarkVerifier<C>
pub fn new(config: C) -> StarkVerifier<C>
Create a new zk-STARK verifier with the given configuration
Sourcepub fn verify<A>(
&self,
air: &A,
proof: &Proof<C>,
public_values: &[<<<C as StarkGenericConfig>::Pcs as Pcs<<C as StarkGenericConfig>::Challenge, <C as StarkGenericConfig>::Challenger>>::Domain as PolynomialSpace>::Val],
) -> Result<(), VerificationError<<<C as StarkGenericConfig>::Pcs as Pcs<<C as StarkGenericConfig>::Challenge, <C as StarkGenericConfig>::Challenger>>::Error>>where
A: Air<SymbolicAirBuilder<<<<C as StarkGenericConfig>::Pcs as Pcs<<C as StarkGenericConfig>::Challenge, <C as StarkGenericConfig>::Challenger>>::Domain as PolynomialSpace>::Val>> + for<'a> Air<VerifierConstraintFolder<'a, C>>,
pub fn verify<A>(
&self,
air: &A,
proof: &Proof<C>,
public_values: &[<<<C as StarkGenericConfig>::Pcs as Pcs<<C as StarkGenericConfig>::Challenge, <C as StarkGenericConfig>::Challenger>>::Domain as PolynomialSpace>::Val],
) -> Result<(), VerificationError<<<C as StarkGenericConfig>::Pcs as Pcs<<C as StarkGenericConfig>::Challenge, <C as StarkGenericConfig>::Challenger>>::Error>>where
A: Air<SymbolicAirBuilder<<<<C as StarkGenericConfig>::Pcs as Pcs<<C as StarkGenericConfig>::Challenge, <C as StarkGenericConfig>::Challenger>>::Domain as PolynomialSpace>::Val>> + for<'a> Air<VerifierConstraintFolder<'a, C>>,
Verify a STARK proof for the given AIR and public values
§Arguments
air- The Algebraic Intermediate Representation that was used to generate the proofproof- The STARK proof to verifypublic_values- Public values that were used during proof generation
§Returns
Ok(()) if the proof is valid, Err(VerificationError) otherwise
Sourcepub fn derive_challenges<A>(
&self,
air: &A,
proof: &Proof<C>,
public_values: &[<<<C as StarkGenericConfig>::Pcs as Pcs<<C as StarkGenericConfig>::Challenge, <C as StarkGenericConfig>::Challenger>>::Domain as PolynomialSpace>::Val],
) -> Result<(<C as StarkGenericConfig>::Challenge, <C as StarkGenericConfig>::Challenge, <C as StarkGenericConfig>::Challenge, Vec<<C as StarkGenericConfig>::Challenge>), VerificationError<<<C as StarkGenericConfig>::Pcs as Pcs<<C as StarkGenericConfig>::Challenge, <C as StarkGenericConfig>::Challenger>>::Error>>where
A: Air<SymbolicAirBuilder<<<<C as StarkGenericConfig>::Pcs as Pcs<<C as StarkGenericConfig>::Challenge, <C as StarkGenericConfig>::Challenger>>::Domain as PolynomialSpace>::Val>> + for<'a> Air<VerifierConstraintFolder<'a, C>>,
<<C as StarkGenericConfig>::Pcs as Pcs<<C as StarkGenericConfig>::Challenge, <C as StarkGenericConfig>::Challenger>>::Proof: FriDataExtractor<Challenge = <C as StarkGenericConfig>::Challenge>,
<C as StarkGenericConfig>::Challenger: CanObserve<<<<C as StarkGenericConfig>::Pcs as Pcs<<C as StarkGenericConfig>::Challenge, <C as StarkGenericConfig>::Challenger>>::Domain as PolynomialSpace>::Val> + CanObserve<<<C as StarkGenericConfig>::Pcs as Pcs<<C as StarkGenericConfig>::Challenge, <C as StarkGenericConfig>::Challenger>>::Commitment> + CanObserve<<<<C as StarkGenericConfig>::Pcs as Pcs<<C as StarkGenericConfig>::Challenge, <C as StarkGenericConfig>::Challenger>>::Proof as FriDataExtractor>::Commitment>,
pub fn derive_challenges<A>(
&self,
air: &A,
proof: &Proof<C>,
public_values: &[<<<C as StarkGenericConfig>::Pcs as Pcs<<C as StarkGenericConfig>::Challenge, <C as StarkGenericConfig>::Challenger>>::Domain as PolynomialSpace>::Val],
) -> Result<(<C as StarkGenericConfig>::Challenge, <C as StarkGenericConfig>::Challenge, <C as StarkGenericConfig>::Challenge, Vec<<C as StarkGenericConfig>::Challenge>), VerificationError<<<C as StarkGenericConfig>::Pcs as Pcs<<C as StarkGenericConfig>::Challenge, <C as StarkGenericConfig>::Challenger>>::Error>>where
A: Air<SymbolicAirBuilder<<<<C as StarkGenericConfig>::Pcs as Pcs<<C as StarkGenericConfig>::Challenge, <C as StarkGenericConfig>::Challenger>>::Domain as PolynomialSpace>::Val>> + for<'a> Air<VerifierConstraintFolder<'a, C>>,
<<C as StarkGenericConfig>::Pcs as Pcs<<C as StarkGenericConfig>::Challenge, <C as StarkGenericConfig>::Challenger>>::Proof: FriDataExtractor<Challenge = <C as StarkGenericConfig>::Challenge>,
<C as StarkGenericConfig>::Challenger: CanObserve<<<<C as StarkGenericConfig>::Pcs as Pcs<<C as StarkGenericConfig>::Challenge, <C as StarkGenericConfig>::Challenger>>::Domain as PolynomialSpace>::Val> + CanObserve<<<C as StarkGenericConfig>::Pcs as Pcs<<C as StarkGenericConfig>::Challenge, <C as StarkGenericConfig>::Challenger>>::Commitment> + CanObserve<<<<C as StarkGenericConfig>::Pcs as Pcs<<C as StarkGenericConfig>::Challenge, <C as StarkGenericConfig>::Challenger>>::Proof as FriDataExtractor>::Commitment>,
Derive Fiat–Shamir challenges by replaying the verifier transcript.
Returns (zeta, zeta_next, alpha, betas) so that callers (e.g. aggregation)
can serialize proofs with real challenges. Only supports proofs without
preprocessed trace (preprocessed_width == 0).
Sourcepub fn derive_query_positions<A>(
&self,
air: &A,
proof: &Proof<C>,
public_values: &[<<<C as StarkGenericConfig>::Pcs as Pcs<<C as StarkGenericConfig>::Challenge, <C as StarkGenericConfig>::Challenger>>::Domain as PolynomialSpace>::Val],
fri_params: &FriQueryParams,
) -> Result<Vec<usize>, VerificationError<<<C as StarkGenericConfig>::Pcs as Pcs<<C as StarkGenericConfig>::Challenge, <C as StarkGenericConfig>::Challenger>>::Error>>where
A: Air<SymbolicAirBuilder<<<<C as StarkGenericConfig>::Pcs as Pcs<<C as StarkGenericConfig>::Challenge, <C as StarkGenericConfig>::Challenger>>::Domain as PolynomialSpace>::Val>> + for<'a> Air<VerifierConstraintFolder<'a, C>>,
<<C as StarkGenericConfig>::Pcs as Pcs<<C as StarkGenericConfig>::Challenge, <C as StarkGenericConfig>::Challenger>>::Proof: FriDataExtractor<Challenge = <C as StarkGenericConfig>::Challenge>,
<C as StarkGenericConfig>::Challenger: CanObserve<<<<C as StarkGenericConfig>::Pcs as Pcs<<C as StarkGenericConfig>::Challenge, <C as StarkGenericConfig>::Challenger>>::Domain as PolynomialSpace>::Val> + CanObserve<<<C as StarkGenericConfig>::Pcs as Pcs<<C as StarkGenericConfig>::Challenge, <C as StarkGenericConfig>::Challenger>>::Commitment> + CanObserve<<<<C as StarkGenericConfig>::Pcs as Pcs<<C as StarkGenericConfig>::Challenge, <C as StarkGenericConfig>::Challenger>>::Proof as FriDataExtractor>::Commitment> + GrindingChallenger<Witness = <<<C as StarkGenericConfig>::Pcs as Pcs<<C as StarkGenericConfig>::Challenge, <C as StarkGenericConfig>::Challenger>>::Proof as FriDataExtractor>::Witness>,
<<<C as StarkGenericConfig>::Pcs as Pcs<<C as StarkGenericConfig>::Challenge, <C as StarkGenericConfig>::Challenger>>::Proof as FriDataExtractor>::Witness: Clone,
pub fn derive_query_positions<A>(
&self,
air: &A,
proof: &Proof<C>,
public_values: &[<<<C as StarkGenericConfig>::Pcs as Pcs<<C as StarkGenericConfig>::Challenge, <C as StarkGenericConfig>::Challenger>>::Domain as PolynomialSpace>::Val],
fri_params: &FriQueryParams,
) -> Result<Vec<usize>, VerificationError<<<C as StarkGenericConfig>::Pcs as Pcs<<C as StarkGenericConfig>::Challenge, <C as StarkGenericConfig>::Challenger>>::Error>>where
A: Air<SymbolicAirBuilder<<<<C as StarkGenericConfig>::Pcs as Pcs<<C as StarkGenericConfig>::Challenge, <C as StarkGenericConfig>::Challenger>>::Domain as PolynomialSpace>::Val>> + for<'a> Air<VerifierConstraintFolder<'a, C>>,
<<C as StarkGenericConfig>::Pcs as Pcs<<C as StarkGenericConfig>::Challenge, <C as StarkGenericConfig>::Challenger>>::Proof: FriDataExtractor<Challenge = <C as StarkGenericConfig>::Challenge>,
<C as StarkGenericConfig>::Challenger: CanObserve<<<<C as StarkGenericConfig>::Pcs as Pcs<<C as StarkGenericConfig>::Challenge, <C as StarkGenericConfig>::Challenger>>::Domain as PolynomialSpace>::Val> + CanObserve<<<C as StarkGenericConfig>::Pcs as Pcs<<C as StarkGenericConfig>::Challenge, <C as StarkGenericConfig>::Challenger>>::Commitment> + CanObserve<<<<C as StarkGenericConfig>::Pcs as Pcs<<C as StarkGenericConfig>::Challenge, <C as StarkGenericConfig>::Challenger>>::Proof as FriDataExtractor>::Commitment> + GrindingChallenger<Witness = <<<C as StarkGenericConfig>::Pcs as Pcs<<C as StarkGenericConfig>::Challenge, <C as StarkGenericConfig>::Challenger>>::Proof as FriDataExtractor>::Witness>,
<<<C as StarkGenericConfig>::Pcs as Pcs<<C as StarkGenericConfig>::Challenge, <C as StarkGenericConfig>::Challenger>>::Proof as FriDataExtractor>::Witness: Clone,
Derive FRI query positions by replaying the Fiat–Shamir challenger through commitments,
FRI betas, final polynomial, and PoW, then sampling num_queries indices.
Returns the same query indices the verifier would use when verifying the proof. Call with the same FRI params used to produce the proof (e.g. from config).
Auto Trait Implementations§
impl<C> Freeze for StarkVerifier<C>where
C: Freeze,
impl<C> RefUnwindSafe for StarkVerifier<C>where
C: RefUnwindSafe,
impl<C> Send for StarkVerifier<C>where
C: Send,
impl<C> Sync for StarkVerifier<C>where
C: Sync,
impl<C> Unpin for StarkVerifier<C>where
C: Unpin,
impl<C> UnsafeUnpin for StarkVerifier<C>where
C: UnsafeUnpin,
impl<C> UnwindSafe for StarkVerifier<C>where
C: UnwindSafe,
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
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 more