Development
Testing & Analysis
This guide covers tools and best practices for testing and analyzing your zero-knowledge circuits.
Circuit Analysis Tools
Circomspect
- Circomspect
- Static analysis for Circom circuits
- Security vulnerability detection
- Best practices enforcement
- Constraint optimization checks
Example usage:
circomspect check circuit.circom
Common Checks
- Signal constraints
- Unreachable code
- Constraint satisfaction
- Gas optimization
- Security patterns
Testing Frameworks
Circom Testing
const { wasm } = require("circom_tester");
describe("Multiplier circuit", () => {
let circuit;
before(async () => {
circuit = await wasm.loadCircuit("multiplier.circom");
});
it("should multiply correctly", async () => {
const input = {
a: 2,
b: 3
};
const witness = await circuit.calculateWitness(input);
await circuit.assertOut(witness, {c: 6});
});
});
RISC Zero Testing
#[cfg(test)]
mod tests {
use risc0_zkvm::Prover;
use crate::methods::MULTIPLY_ID;
#[test]
fn test_multiply() {
let mut prover = Prover::new(MULTIPLY_ID).unwrap();
prover.add_input_u32_slice(&[2, 3]);
let receipt = prover.run().unwrap();
assert_eq!(receipt.journal[0], 6);
}
}
Performance Analysis
Circuit Metrics
- Number of constraints
- Circuit depth
- Memory usage
- Gas costs
Optimization Checks
- Redundant constraints
- Unnecessary computations
- Memory access patterns
- Parallel computation opportunities
Best Practices
Test Organization
circuits/
├── src/
│ ├── multiplier.circom
│ └── utils.circom
├── test/
│ ├── multiplier.test.js
│ └── utils.test.js
└── scripts/
└── analyze.sh
Testing Guidelines
- Test edge cases
- Include negative tests
- Test with random inputs
- Verify constraint satisfaction
- Check error conditions
Continuous Integration
GitHub Actions Example
name: Circuit Tests
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Install dependencies
run: |
npm install
npm install -g circom
- name: Run tests
run: npm test
- name: Run circuit analysis
run: circomspect check circuits/**/*.circom
Security Testing
Common Vulnerabilities
- Unconstrained signals
- Division by zero
- Integer overflow
- Incorrect range checks
- Missing constraints
Security Checklist
- [ ] All signals properly constrained
- [ ] Range checks implemented
- [ ] Overflow protection added
- [ ] Error conditions handled
- [ ] Access controls verified
Debugging Tools
Circuit Visualization
- Signal flow graphs
- Constraint relationships
- Memory access patterns
- Execution traces
Logging & Tracing
pragma circom 2.0.0;
template Debug() {
signal input in;
signal output out;
// Debug log
log("Input value:", in);
out <== in;
}
Next Steps
Need help with your circuit development? Explore our circuit development guide or join our Discord for community support.