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.circuit/program/src/lib.rs:28-44
Request
Structure
ARequest represents a function call with inputs:
circuit/program/src/request/mod.rs:128-151
Injection
Requests are injected into circuits with specific mode assignments:circuit/program/src/request/mod.rs:153-238
Mode Assignment Strategy:
tcm(transition commitment) is Public - verified on-chainscm(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
Accessors
circuit/program/src/request/mod.rs:240-294
InputID
Structure
Input IDs identify and authenticate function inputs:circuit/program/src/request/mod.rs:27-38
Injection Mode Strategy
circuit/program/src/request/mod.rs:40-64
Value
Structure
Values represent data in program execution:circuit/program/src/data/value.rs
Plaintext
Plaintext represents structured data:circuit/program/src/data/plaintext.rs
Record
Records are owned, private data structures:circuit/program/src/data/record.rs
Response
Responses represent function execution outputs:circuit/program/src/response/mod.rs
Literal
Structure
Literals are primitive values with casting support:circuit/program/src/data/literal/mod.rs
Casting
Literals support type casting:circuit/program/src/data/literal/cast.rs
Identifier
Identifiers name program elements:circuit/program/src/data/identifier/mod.rs
Visibility Trait
TheVisibility trait enables type-level privacy:
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
- Use constants when possible - Program ID and function names are Mode::Constant
- Batch input verification - Verify multiple inputs together
- Optimize record access - Cache frequently accessed fields
- 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
- Verify mode assignments - Ensure sensitive data uses Mode::Private
- Test constraint counts - Verify expected resource usage per component
- Use scopes for profiling - Track resource usage per verification step
- Check satisfaction - Always verify constraints are satisfied
- Minimize public data - Only expose what’s necessary for verification
See Also
- Circuit Overview - Constraint system architecture
- Circuit Types - Primitive types used in programs
- Circuit Environment - Environment and constraints
- Console Program - Console program types