mirror of
https://github.com/logos-storage/nim-groth16.git
synced 2026-01-05 23:23:08 +00:00
add example proof script
This commit is contained in:
parent
f094de8df3
commit
b4f4f7c97f
@ -15,10 +15,10 @@ At the moment only the `BN254` (aka. `alt-bn128`) curve is supported.
|
|||||||
|
|
||||||
- [ ] make it a nimble package
|
- [ ] make it a nimble package
|
||||||
- [ ] proper MSM implementation (I couldn't make constantine's one to work)
|
- [ ] proper MSM implementation (I couldn't make constantine's one to work)
|
||||||
- [ ] proper polynomial implemention (constantine's one is essentially missing)
|
|
||||||
- [ ] compare `.r1cs` to the "coeffs" section of `.zkey`
|
- [ ] compare `.r1cs` to the "coeffs" section of `.zkey`
|
||||||
- [ ] make it work for different curves
|
- [ ] generate fake circuit-specific setup ourselves
|
||||||
- [ ] multithreaded support (MSM, and possibly also FFT)
|
- [ ] multithreaded support (MSM, and possibly also FFT)
|
||||||
- [ ] add Groth16 notes
|
- [ ] add Groth16 notes
|
||||||
- [ ] document the `snarkjs` circuit-specific setup `H` points convention
|
- [ ] document the `snarkjs` circuit-specific setup `H` points convention
|
||||||
|
- [ ] make it work for different curves
|
||||||
|
|
||||||
|
|||||||
2
example/.gitignore
vendored
Normal file
2
example/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
build/
|
||||||
|
example
|
||||||
11
example/example.nim
Normal file
11
example/example.nim
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
|
||||||
|
import ../test_proof
|
||||||
|
import ../export_json
|
||||||
|
|
||||||
|
let zkey_fname : string = "./build/product.zkey"
|
||||||
|
let wtns_fname : string = "./build/product.wtns"
|
||||||
|
let proof = testProveAndVerify( zkey_fname, wtns_fname)
|
||||||
|
|
||||||
|
exportPublicIO( "./build/nim_public.json" , proof )
|
||||||
|
exportProof( "./build/nim_proof.json" , proof )
|
||||||
|
|
||||||
40
example/product.circom
Normal file
40
example/product.circom
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
pragma circom 2.0.0;
|
||||||
|
|
||||||
|
//
|
||||||
|
// prove a simple factorization
|
||||||
|
//
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
template Product(n) {
|
||||||
|
signal input inp[n];
|
||||||
|
signal output out;
|
||||||
|
|
||||||
|
signal aux[n];
|
||||||
|
aux[0] <== inp[0];
|
||||||
|
for(var i=1; i<n; i++) {
|
||||||
|
aux[i] <== aux[i-1] * inp[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
out <== aux[n-1];
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// a[0]*a[1]*...*a[n-1] + b
|
||||||
|
template Main(n) {
|
||||||
|
signal input plus;
|
||||||
|
signal input inp[n];
|
||||||
|
signal output out;
|
||||||
|
|
||||||
|
component prod = Product(n);
|
||||||
|
inp ==> prod.inp;
|
||||||
|
out <== prod.out + plus;
|
||||||
|
log("out =",out);
|
||||||
|
|
||||||
|
out === 2023;
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
component main {public [plus]} = Main(3);
|
||||||
60
example/prove.sh
Executable file
60
example/prove.sh
Executable file
@ -0,0 +1,60 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
ORIG=`pwd`
|
||||||
|
NAME="product"
|
||||||
|
|
||||||
|
# --- create build directory ---
|
||||||
|
mkdir -p build
|
||||||
|
|
||||||
|
# --- compile the circom code ---
|
||||||
|
circom --r1cs --wasm -o build ${NAME}.circom
|
||||||
|
|
||||||
|
cd build
|
||||||
|
|
||||||
|
# --- download powers-of-tau ceremony, if necessary ---
|
||||||
|
PTAU_FILE="power_of_tau_10.ptau"
|
||||||
|
if ! test -f ./${PTAU_FILE}; then
|
||||||
|
echo "downloading powers-of-tau..."
|
||||||
|
curl https://hermez.s3-eu-west-1.amazonaws.com/powersOfTau28_hez_final_10.ptau --output $PTAU_FILE
|
||||||
|
else
|
||||||
|
echo "powers-of-tau file already exists, skip downloading"
|
||||||
|
fi
|
||||||
|
PTAU_FILE="`pwd`/${PTAU_FILE}"
|
||||||
|
|
||||||
|
# --- perform circuit-specific setup ---
|
||||||
|
snarkjs groth16 setup ${NAME}.r1cs $PTAU_FILE ${NAME}_0000.zkey
|
||||||
|
echo "foobar entropy" | \
|
||||||
|
snarkjs zkey contribute ${NAME}_0000.zkey ${NAME}_0001.zkey --name="1st Contributor Name" -v
|
||||||
|
echo "baz entropy" | \
|
||||||
|
snarkjs zkey contribute ${NAME}_0001.zkey ${NAME}_0002.zkey --name="2nd Contributor Name" -v
|
||||||
|
rm ${NAME}_0000.zkey
|
||||||
|
rm ${NAME}_0001.zkey
|
||||||
|
mv ${NAME}_0002.zkey ${NAME}.zkey
|
||||||
|
|
||||||
|
# --- export vericiation key ---
|
||||||
|
snarkjs zkey export verificationkey ${NAME}.zkey ${NAME}_vkey.json
|
||||||
|
|
||||||
|
# --- create public input ---
|
||||||
|
cd $ORIG
|
||||||
|
echo '{ "inp": [7,11,13] , "plus": 1022 }' >build/${NAME}_input.json
|
||||||
|
|
||||||
|
# --- generate witness ---
|
||||||
|
cd $ORIG/build/${NAME}_js
|
||||||
|
node generate_witness.js ${NAME}.wasm ../${NAME}_input.json ../${NAME}.wtns
|
||||||
|
cd $ORIG/build
|
||||||
|
|
||||||
|
# --- create proof with snarkjs ---
|
||||||
|
# echo "creating the proof with snarkjs..."
|
||||||
|
# snarkjs groth16 prove ${NAME}.zkey ${NAME}.wtns snarkjs_proof.json snarkjs_public.json
|
||||||
|
|
||||||
|
# --- build & execute nim prover ---
|
||||||
|
echo "building and executing the Nim prover..."
|
||||||
|
cd $ORIG
|
||||||
|
nim c -r --processing:off example.nim
|
||||||
|
|
||||||
|
cd $ORIG/build
|
||||||
|
echo "verifying the proof with snarkjs..."
|
||||||
|
snarkjs groth16 verify ${NAME}_vkey.json nim_public.json nim_proof.json
|
||||||
|
|
||||||
|
cd $ORIG
|
||||||
|
|
||||||
@ -64,6 +64,8 @@ proc writeG2( f: File, p: G2 ) =
|
|||||||
writeFp2( f , ',' , oneFp2 )
|
writeFp2( f , ',' , oneFp2 )
|
||||||
f.writeLine(" ]")
|
f.writeLine(" ]")
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
|
||||||
# exports the proof into as a JSON file
|
# exports the proof into as a JSON file
|
||||||
proc exportProof*( fpath: string, prf: Proof ) =
|
proc exportProof*( fpath: string, prf: Proof ) =
|
||||||
|
|
||||||
@ -79,6 +81,7 @@ proc exportProof*( fpath: string, prf: Proof ) =
|
|||||||
|
|
||||||
#-------------------------------------------------------------------------------
|
#-------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#[
|
||||||
func getFakeProof*() : Proof =
|
func getFakeProof*() : Proof =
|
||||||
let pub : seq[Fr] = map( [1,101,102,103,117,119] , intToFr )
|
let pub : seq[Fr] = map( [1,101,102,103,117,119] , intToFr )
|
||||||
let p = unsafeMkG1( intToFp(666) , intToFp(777) )
|
let p = unsafeMkG1( intToFp(666) , intToFp(777) )
|
||||||
@ -92,4 +95,6 @@ proc exportFakeProof*() =
|
|||||||
let prf = getFakeProof()
|
let prf = getFakeProof()
|
||||||
exportPublicIO( "fake_pub.json" , prf )
|
exportPublicIO( "fake_pub.json" , prf )
|
||||||
exportProof( "fake_prf.json" , prf )
|
exportProof( "fake_prf.json" , prf )
|
||||||
|
]#
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
|||||||
@ -7,22 +7,24 @@ import ./zkey_types
|
|||||||
|
|
||||||
#-------------------------------------------------------------------------------
|
#-------------------------------------------------------------------------------
|
||||||
|
|
||||||
proc testProveAndVerify*( zkey_fname, wtns_fname: string) =
|
proc testProveAndVerify*( zkey_fname, wtns_fname: string): Proof =
|
||||||
|
|
||||||
echo("parsing witness & zkey files...")
|
echo("parsing witness & zkey files...")
|
||||||
let witness = parseWitness( wtns_fname)
|
let witness = parseWitness( wtns_fname)
|
||||||
let zkey = parseZKey( zkey_fname)
|
let zkey = parseZKey( zkey_fname)
|
||||||
|
|
||||||
echo("generating proof...")
|
echo("generating proof...")
|
||||||
let vkey = extractVKey( zkey)
|
let vkey = extractVKey( zkey)
|
||||||
let proof = generateProof( zkey, witness )
|
let proof = generateProof( zkey, witness )
|
||||||
|
|
||||||
echo("exporting proof...")
|
|
||||||
exportPublicIO( "my_pub.json" , proof )
|
|
||||||
exportProof( "my_prf.json" , proof )
|
|
||||||
|
|
||||||
echo("verifying the proof...")
|
echo("verifying the proof...")
|
||||||
let ok = verifyProof( vkey, proof)
|
let ok = verifyProof( vkey, proof)
|
||||||
echo("verification succeeded = ",ok)
|
echo("verification succeeded = ",ok)
|
||||||
|
|
||||||
|
# echo("exporting proof...")
|
||||||
|
# exportPublicIO( "my_pub.json" , proof )
|
||||||
|
# exportProof( "my_prf.json" , proof )
|
||||||
|
|
||||||
|
return proof
|
||||||
|
|
||||||
#-------------------------------------------------------------------------------
|
#-------------------------------------------------------------------------------
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user