plugins/compact-reviewer/skills/performance-review/SKILL.md
Use when reviewing Compact circuits for performance issues, optimizing constraint counts, analyzing proof generation time, or identifying gas and cost optimization opportunities.
npx skillsauth add aaronbassett/midnight-knowledgebase compact-reviewer:performance-reviewInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
4 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Analyze circuit efficiency and identify optimization opportunities in Compact contracts.
This skill activates for queries about:
Trigger words: performance, optimization, constraints, circuit efficiency, proof generation, gas, cost
| Operation | Cost | Notes |
|-----------|------|-------|
| Addition (+) | 0 | Free in R1CS |
| Subtraction (-) | 0 | Free |
| Multiplication (*) | 1 | Single constraint |
| Division (/) | ~1 | Includes inverse |
| Equality (==) | ~1 | Direct check |
| Inequality (<, >) | ~254 | Bit decomposition |
| Hash (Pedersen) | ~1,000 | Optimized |
| SHA256 | ~25,000 | Expensive |
| Merkle proof (depth N) | ~N×1,000 | Per-level hash |
Total Constraints ≈
(Hash Ops × 1,000) +
(SHA256 Ops × 25,000) +
(Comparisons × 254) +
(Merkle Depth × 1,000) +
(Loop Iterations × Body Cost)
| Optimization | Savings | Effort |
|-------------|---------|--------|
| Replace SHA256 → Pedersen | 25x per hash | Low |
| Use == instead of < | ~253 constraints | Low |
| Reduce Merkle depth | ~1,000 per level | Medium |
| Move computation to witness | Variable | Medium |
Scan the contract for:
// High-cost operations
persistentHash() // ~1,000 constraints
persistentCommit() // ~1,000 constraints
sha256() // ~25,000 constraints ❌ Avoid
ecMul() // ~5,000-10,000 constraints
// Medium-cost operations
if x < y { } // ~254 constraints (bit decomposition)
for i in 0..N { } // Multiplies inner constraints by N
// Low-cost operations
x + y // Free
x * y // 1 constraint
x == y // ~1 constraint
For each loop:
1. What operations are inside?
2. How many iterations?
3. Can any operations move outside?
4. Is the loop necessary?
Example:
// ❌ Inefficient: hash inside loop
for i in 0..10 {
hashes[i] = hash(data[i]); // 10 × 1,000 = 10,000 constraints
}
// ✅ Consider: can this be done in witness?
Smaller types mean cheaper comparisons:
| Type | Comparison Cost | |------|-----------------| | Uint<8> | ~8 constraints | | Uint<64> | ~64 constraints | | Uint<254> | ~254 constraints |
// Merkle tree with depth 20
const proof = get_merkle_proof(); // ~20,000 constraints
// Consider: Is depth 20 necessary?
// Depth 10 would be ~10,000 constraints
tools
Use when setting up Midnight development environment, installing Compact compiler and developer tools, configuring proof server, verifying prerequisites, or getting started with Midnight development.
tools
--- name: midnight-tooling:midnight-debugging description: Use when encountering Midnight errors like "compact: command not found", "ERR_UNSUPPORTED_DIR_IMPORT", version mismatches, proof server failures, "@midnight-ntwrk" package errors, or compilation failures. --- # Midnight Environment Debugging Expert knowledge for identifying and resolving common Midnight development toolchain issues. ## Diagnostic Approach When encountering Midnight-related errors, follow this systematic approach: 1.
tools
Use when checking Midnight version compatibility, understanding pragma language_version, verifying compiler and runtime version relationships, or troubleshooting version mismatch errors between Midnight components.
tools
Use when setting up CI/CD for Midnight projects, configuring GitHub Actions for Compact contract compilation, running TypeScript tests in CI, validating version consistency, or automating contract builds.