- Overview
- Architecture
- Core Components
- ZkVM Implementations
- Development Guide
- Maintenance Guide
- C4 Model Architecture Diagrams
The any-zkvm library is a Rust template that provides a unified abstraction layer for developing applications across multiple zero-knowledge virtual machines (zkVMs). It enables developers to write code once and execute it on different zkVM backends without modification, facilitating benchmarking and comparison between various zkVM implementations.
- Unified API: Single trait-based interface for multiple zkVMs
- Multi-zkVM Support: SP1, RiscZero, PowdrVM (with Jolt in development)
- Benchmarking: Easy performance comparison across different zkVMs
- Type Safety: Rust's type system ensures correctness
- Modularity: Each zkVM implementation is isolated and optional
- SP1: Succinct's zkVM with RISC-V execution
- RiscZero: General-purpose zkVM with RISC-V ISA
- PowdrVM: Modular zkVM with custom ISA support
- Jolt (In Progress): High-performance zkVM with lookup-based approach
The library follows a trait-based architecture pattern where:
- Core Library (
lib/) defines the abstract interfaces - zkVM Implementations provide concrete implementations
- Cargo Workspace manages dependencies and builds
any-zkvm/
βββ lib/ # Core abstraction library
β βββ src/lib.rs # Main trait definitions
βββ sp1/ # SP1 zkVM implementation
β βββ program/ # Guest program code
β βββ script/ # Host execution code
β βββ lib/ # SP1-specific bindings
βββ risczero/ # RiscZero zkVM implementation
β βββ host/ # Host execution code
β βββ methods/ # Guest methods
β βββ methods/guest/ # Guest program code
βββ powdr/ # PowdrVM implementation
βββ build.sh # Installation script
βββ Cargo.toml # Workspace configuration
The central abstraction that all zkVM implementations must implement:
pub trait ZkvmProcessor {
type Output;
type Input;
fn get_guest_inputs() -> Result<Self::Input, ZkvmProcessError>;
fn get_host_inputs() -> Self::Input;
fn prove(input: Self::Input) -> Result<Self::Output, ZkvmProcessError>;
fn process_outputs(output: Self::Output);
}get_guest_inputs(): Reads inputs from the zkVM runtime environmentget_host_inputs(): Provides inputs from the host environmentprove(input): Contains the computational logic to be provenprocess_outputs(output): Handles the verified outputs
Each zkVM backend extends the base functionality with specialized traits:
pub trait Sp1ZkvmProcessor {
fn process_internal_outputs(
receipt: &mut sp1_sdk::SP1PublicValues,
) -> <Processor as ZkvmProcessor>::Output;
fn secp256k1_add(p: *mut [u32; 16], q: *mut [u32; 16]);
}pub trait RiscZeroZkvmProcessor {
fn process_internal_outputs(
receipt: &risc0_zkvm::Receipt,
) -> <Processor as ZkvmProcessor>::Output;
fn secp256k1_add(p: *mut [u32; 16], q: *mut [u32; 16]);
}pub trait PowdrZkvmProcessor {
fn process_internal_outputs(receipt: [u32; 8]) -> <Processor as ZkvmProcessor>::Output;
fn secp256k1_add(p: *mut [u32; 16], q: *mut [u32; 16]);
}#[derive(Debug)]
pub enum ZkvmProcessError {
NotImplemented,
}Directory: sp1/
SP1 is Succinct's zkVM that executes RISC-V programs and generates zero-knowledge proofs.
Architecture:
- Program (
sp1/program/): Guest code compiled to RISC-V - Script (
sp1/script/): Host code that manages proving and verification - Features: EVM-compatible proofs, Groth16/PLONK support
Key Characteristics:
- High performance for large computations
- EVM compatibility for on-chain verification
- Requires significant RAM (128GB+ for Groth16/PLONK)
Directory: risczero/
RiscZero provides a general-purpose zkVM with RISC-V instruction set architecture.
Architecture:
- Host (
risczero/host/): Prover and verifier logic - Methods (
risczero/methods/): Method definitions and guest code - Guest (
risczero/methods/guest/): Actual computation logic
Key Characteristics:
- Mature ecosystem and tooling
- Strong RISC-V compliance
- Excellent developer experience
Directory: powdr/
PowdrVM is a modular zkVM that supports custom instruction set architectures.
Key Characteristics:
- Modular architecture
- Custom ISA support
- AVX optimization capabilities
- Experimental Valida ISA support (planned)
-
Install Dependencies:
./build.sh
-
Configure Your Logic: Edit
lib/src/lib.rsto implement your computational logic in theprove()method. -
Run Specific zkVM:
cargo run -p [sp1|risczero|powdrVM] --release
-
Enable AVX Optimization (for supported zkVMs):
RUSTFLAGS='-C target-cpu=native' cargo run -p [zkVM] --release
-
Define Input/Output Types:
impl ZkvmProcessor for Processor { type Output = YourOutputType; type Input = YourInputType; // ... }
-
Implement Core Logic:
fn prove(input: Self::Input) -> Result<Self::Output, ZkvmProcessError> { // Your computational logic here // This code will be executed in the zkVM }
-
Handle Outputs:
fn process_outputs(output: Self::Output) { // Process verified outputs }
- Create zkVM Directory:
new_zkvm/ - Implement Traits: Extend
ZkvmProcessorand create zkVM-specific trait - Add Cargo Configuration: Update workspace
Cargo.toml - Implement Guest/Host Split: Follow the pattern of existing implementations
- Add Feature Flags: Enable conditional compilation
- Update Build Script: Include installation steps in
build.sh
- Trait Consistency: Ensure all zkVM implementations follow the same trait interface
- Feature Flags: Use cargo features to conditionally compile zkVM-specific code
- Error Handling: Extend
ZkvmProcessErroras needed for new error conditions - Documentation: Maintain inline documentation for all public interfaces
- Unit Tests: Test each trait implementation independently
- Integration Tests: Verify cross-zkVM compatibility
- Benchmarking: Regular performance comparisons between implementations
- CI/CD: Automated testing across all supported zkVMs
- Memory Usage: Monitor RAM requirements, especially for SP1
- Compilation Time: Track build times across different zkVMs
- Proof Generation: Benchmark proving times for various workloads
- AVX Support: Leverage hardware acceleration where available
- Update Dependencies: Regular updates to zkVM SDKs
- Feature Parity: Ensure all implementations support the same core features
- Documentation Sync: Keep README and documentation current
- Security Audits: Regular review of cryptographic implementations
- Build Failures: Check zkVM-specific dependencies and toolchain requirements
- Memory Issues: Verify sufficient RAM for proof generation
- Feature Conflicts: Ensure only one zkVM feature is enabled at build time
- Runtime Errors: Check input/output type compatibility
- Logging: Enable verbose logging for zkVM operations
- Isolation: Test each zkVM implementation separately
- Validation: Verify inputs and outputs at boundaries
- Profiling: Use performance tools to identify bottlenecks
graph TB
User["π€ Developer<br/>(Person)<br/><br/>Develops zkVM applications<br/>using any-zkvm"]
AnyZkvm["π¦ Any-zkVM Library<br/>(Software System)<br/><br/>Unified abstraction layer for<br/>developing applications across<br/>multiple zkVMs"]
SP1["π· SP1 zkVM<br/>(External System)<br/><br/>Succinct's zero-knowledge<br/>virtual machine"]
RiscZero["π· RiscZero zkVM<br/>(External System)<br/><br/>General-purpose zkVM with<br/>RISC-V ISA"]
PowdrVM["π· PowdrVM<br/>(External System)<br/><br/>Modular zkVM with<br/>custom ISA support"]
Blockchain["π· Blockchain Network<br/>(External System)<br/><br/>Target blockchain for<br/>proof verification"]
User -->|"Develops applications using"| AnyZkvm
AnyZkvm -->|"Generates proofs via"| SP1
AnyZkvm -->|"Generates proofs via"| RiscZero
AnyZkvm -->|"Generates proofs via"| PowdrVM
AnyZkvm -->|"Submits proofs to"| Blockchain
classDef person fill:#08427b
classDef system fill:#1168bd
classDef external fill:#999999
class User person
class AnyZkvm system
class SP1,RiscZero,PowdrVM,Blockchain external
graph TB
subgraph "Any-zkVM Library"
CoreLib["π Core Library<br/>(Rust Library)<br/><br/>Defines ZkvmProcessor trait<br/>and common abstractions"]
SP1Container["π¦ SP1 Implementation<br/>(Rust Module)<br/><br/>SP1-specific zkVM<br/>implementation"]
RiscZeroContainer["π¦ RiscZero Implementation<br/>(Rust Module)<br/><br/>RiscZero-specific zkVM<br/>implementation"]
PowdrContainer["π¦ PowdrVM Implementation<br/>(Rust Module)<br/><br/>PowdrVM-specific zkVM<br/>implementation"]
BuildSystem["π§ Build System<br/>(Cargo Workspace)<br/><br/>Manages dependencies<br/>and compilation"]
end
Developer["π€ Developer"]
SP1SDK["π· SP1 SDK"]
RiscZeroSDK["π· RiscZero SDK"]
PowdrSDK["π· PowdrVM SDK"]
Developer -->|"Implements ZkvmProcessor"| CoreLib
CoreLib -->|"Extended by"| SP1Container
CoreLib -->|"Extended by"| RiscZeroContainer
CoreLib -->|"Extended by"| PowdrContainer
SP1Container -->|"Uses"| SP1SDK
RiscZeroContainer -->|"Uses"| RiscZeroSDK
PowdrContainer -->|"Uses"| PowdrSDK
BuildSystem -->|"Builds"| CoreLib
BuildSystem -->|"Builds"| SP1Container
BuildSystem -->|"Builds"| RiscZeroContainer
BuildSystem -->|"Builds"| PowdrContainer
classDef person fill:#08427b
classDef container fill:#1168bd
classDef external fill:#999999
class Developer person
class CoreLib,SP1Container,RiscZeroContainer,PowdrContainer,BuildSystem container
class SP1SDK,RiscZeroSDK,PowdrSDK external
graph TB
subgraph "Core Library (lib/src/lib.rs)"
ZkvmProcessor["π― ZkvmProcessor Trait<br/>(Rust Trait)<br/><br/>Main abstraction interface<br/>- get_guest_inputs()<br/>- get_host_inputs()<br/>- prove()<br/>- process_outputs()"]
SP1Trait["π― Sp1ZkvmProcessor Trait<br/>(Rust Trait)<br/><br/>SP1-specific extensions<br/>- process_internal_outputs()<br/>- secp256k1_add()"]
RiscZeroTrait["π― RiscZeroZkvmProcessor Trait<br/>(Rust Trait)<br/><br/>RiscZero-specific extensions<br/>- process_internal_outputs()<br/>- secp256k1_add()"]
PowdrTrait["π― PowdrZkvmProcessor Trait<br/>(Rust Trait)<br/><br/>PowdrVM-specific extensions<br/>- process_internal_outputs()<br/>- secp256k1_add()"]
ErrorTypes["π Error Types<br/>(Rust Enum)<br/><br/>ZkvmProcessError<br/>- NotImplemented"]
ProcessorStruct["ποΈ Processor Struct<br/>(Rust Struct)<br/><br/>Default implementation<br/>with fibonacci example"]
FibonacciFunc["βοΈ Fibonacci Function<br/>(Rust Function)<br/><br/>Example computation<br/>fibonacci(n: u32) -> (u32, u32)"]
TypeDefinitions["π Type Definitions<br/>(Rust Types)<br/><br/>Input/Output type aliases<br/>for each zkVM"]
end
ZkvmProcessor -->|"Extended by"| SP1Trait
ZkvmProcessor -->|"Extended by"| RiscZeroTrait
ZkvmProcessor -->|"Extended by"| PowdrTrait
ZkvmProcessor -->|"Uses"| ErrorTypes
ZkvmProcessor -->|"Implemented by"| ProcessorStruct
ProcessorStruct -->|"Uses"| FibonacciFunc
ProcessorStruct -->|"Defines"| TypeDefinitions
SP1Trait -->|"Implemented by"| ProcessorStruct
RiscZeroTrait -->|"Implemented by"| ProcessorStruct
PowdrTrait -->|"Implemented by"| ProcessorStruct
classDef component fill:#1168bd
classDef trait fill:#2e8b57
classDef struct fill:#ff6b35
classDef function fill:#ffd23f
classDef types fill:#ee6c4d
class ZkvmProcessor,SP1Trait,RiscZeroTrait,PowdrTrait trait
class ProcessorStruct struct
class FibonacciFunc function
class ErrorTypes,TypeDefinitions types
The any-zkvm library provides a powerful abstraction for zkVM development, enabling developers to write once and deploy across multiple zero-knowledge virtual machines. Its modular architecture, comprehensive trait system, and focus on maintainability make it an excellent foundation for zkVM application development and benchmarking.
For future engineers maintaining this library, focus on:
- Maintaining trait consistency across implementations
- Regular updates to keep pace with zkVM ecosystem changes
- Performance optimization and benchmarking
- Clear documentation and examples
- Robust error handling and debugging capabilities
The C4 model diagrams above provide a clear architectural overview at different levels of abstraction, helping both newcomers and experienced developers understand the system's structure and relationships.