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

  1. Test edge cases
  2. Include negative tests
  3. Test with random inputs
  4. Verify constraint satisfaction
  5. 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

  1. Review circuit development guide
  2. Set up your development environment
  3. Return to overview

Need help with your circuit development? Explore our circuit development guide or join our Discord for community support.

Previous
Circuit Development