Zero-Knowledge Proofs (ZKPs) are complex cryptographic protocols aimed at maintaining privacy and security in blockchain operations. These protocols allow one party to prove to another that certain information is true, without revealing any details about the information itself. As blockchains evolve, there is an increasing need for privacy-conscious and scalable solutions — this is where Zero-Knowledge Proofs come into play. Here, we will unravel a way to implement a Zero-Knowledge Proof system on Ethereum blockchain using Solidity.
Ethereum uses a type of ZKP called zk-SNARKs (Zero-Knowledge Succinct Non-Interactive Argument of Knowledge). This scheme is succinct and non-interactive, allowing for efficient exchanges of proofs.
npm install -g truffle
Let's create a new truffle project.
$ mkdir ZKP-demo && cd ZKP-demo $ truffle init
Next, install the zk-SNARKs library for Solidity — snarkjs
and circom
compiler.
$ npm install -D snarkjs circom
Now, create a simple circuit file circuit.circom
.
$ touch circuit.circom
Open the circuit.circom
file and put this code:
template Multiplier() { signal private input a; signal private input b; signal output c; var z = a*b; c <== z; } component main = Multiplier();
This simple circuit will multiply two private inputs and provide the output.
Now we'll compile this circuit using circom
.
$ npx circom circuit.circom --r1cs --wasm --sym
This will generate three files: circuit.r1cs, circuit.wasm, circuit.sym.
Next, generate the zk-SNARKs trusted setup using snarkjs
.
$ npx snarkjs setup
This will generate two more files: proving_key.json, verification_key.json.
Now, let's generate the proof and public signals.
$ npx snarkjs calculatewitness --input '{"a": 3, "b": 21}' $ npx snarkjs proof
The last command generates proof.json and public.json.
Finally, we can verify the proof.
$ npx snarkjs verify
Implementing Zero-Knowledge Proofs in Blockchain is an exciting topic as it provides a pathway to securing information and preserving privacy in decentralized systems. Incorporating ZKP's especially zk-SNARKs in Ethereum smart contracts can expand the utility of blockchain applications by a significant margin.