Skip to main content
The snarkvm-circuit-program crate provides circuit equivalents of program execution types, including requests, responses, and program data structures used during zero-knowledge proof generation.

Overview

Circuit program types enable verification of program execution within a constraint system. They mirror the structure of console program types while generating the necessary constraints for zero-knowledge proofs.
Source: circuit/program/src/lib.rs:28-44

Request

Structure

A Request represents a function call with inputs:
Source: circuit/program/src/request/mod.rs:128-151

Injection

Requests are injected into circuits with specific mode assignments:
Source: circuit/program/src/request/mod.rs:153-238
Mode Assignment Strategy:
  • tcm (transition commitment) is Public - verified on-chain
  • scm (signer commitment) is Public - verified on-chain
  • Input values are Private - hidden from verifier
  • Metadata (program ID, function name) is Constant - known at compile time
This ensures privacy while allowing on-chain verification.

Accessors

Source: circuit/program/src/request/mod.rs:240-294

InputID

Structure

Input IDs identify and authenticate function inputs:
Source: circuit/program/src/request/mod.rs:27-38

Injection Mode Strategy

Source: circuit/program/src/request/mod.rs:40-64

Value

Structure

Values represent data in program execution:
Source: circuit/program/src/data/value.rs

Plaintext

Plaintext represents structured data:
Source: circuit/program/src/data/plaintext.rs

Record

Records are owned, private data structures:
Source: circuit/program/src/data/record.rs

Response

Responses represent function execution outputs:
Source: circuit/program/src/response/mod.rs

Literal

Structure

Literals are primitive values with casting support:
Source: circuit/program/src/data/literal/mod.rs

Casting

Literals support type casting:
Source: circuit/program/src/data/literal/cast.rs

Identifier

Identifiers name program elements:
Source: circuit/program/src/data/identifier/mod.rs

Visibility Trait

The Visibility trait enables type-level privacy:
Source: circuit/program/src/lib.rs:49-54 This allows generic programming over public and private data.

Example: Request Verification

Constraint Considerations

Request Injection Costs

Optimization Strategies

  1. Use constants when possible - Program ID and function names are Mode::Constant
  2. Batch input verification - Verify multiple inputs together
  3. Optimize record access - Cache frequently accessed fields
  4. Minimize signature verifications - Expensive operation (~25k constraints)
Console/Circuit Synchronization: Circuit program types must remain synchronized with console program types. Any changes to console types require corresponding updates to circuit types to maintain the same API and behavior.

Best Practices

  1. Verify mode assignments - Ensure sensitive data uses Mode::Private
  2. Test constraint counts - Verify expected resource usage per component
  3. Use scopes for profiling - Track resource usage per verification step
  4. Check satisfaction - Always verify constraints are satisfied
  5. Minimize public data - Only expose what’s necessary for verification

See Also