This documentation describes how Saito integrates with zero-knowledge proofs (ZK proofs) to enable privacy-preserving applications while maintaining blockchain verifiability.
/zk/
├── build/circuit_name_js/
│ └── circuit_name.wasm # WebAssembly-compiled circuit
└── output/
├── verification_key.json # For proof verification
└── circuit_final.zkey # Proving parameters
For a detailed guide on creating circuits, refer to the SnarkJS tutorial.
Use our compilation script which is located in the root/scripts directory:
# Make script executable
chmod +x compile_circuit.sh
## Running the Script
# Navigate to mod directory
cd mods/your_mod
# Run compilation script for your circuit
../../scripts/compile_circuit.sh circuit_name
The script will:
build/your_circuit_js/output/Make sure you have:
input.json file in your working directoryyour_circuit.circom in the circuits folderThe compilation produces several important files:
your_circuit.wasm: WebAssembly binary of your circuitgenerate_witness.js: Script for generating witnesseswitness_calculator.js: Core witness calculation logicchmod +x scripts/compile-circuit.shinput.json in the directory where you run the scriptBasic module structure with ZK integration:
class YourModule extends ModTemplate {
constructor(app) {
super(app);
// Load ZK components
this.vkey = require('./zk/output/verification_key.json');
}
// Generate and verify proofs
async generateProof(input) {
const { proof, publicSignals } = await snarkjs.groth16.fullProve(
input,
require('./zk/build/your_circuit_js/your_circuit.wasm'),
require('./zk/output/your_circuit_final.zkey')
);
return { proof, publicSignals };
}
async verifyProof(proof, publicSignals) {
return await snarkjs.groth16.verify(
this.vkey,
publicSignals,
proof
);
}
}