Created
November 30, 2021 20:27
-
-
Save Michael-Qedit/1a67176cb4c31dfb23027e66670d8e9d to your computer and use it in GitHub Desktop.
ZKHack - Puzzle 6 - Solution
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#![allow(dead_code)] | |
#![allow(non_snake_case)] | |
#![allow(unused_variables)] | |
#![allow(unreachable_code)] | |
#![allow(unused_imports)] | |
use ark_ff::{One, Zero}; | |
use prompt::{puzzle, welcome}; | |
use soundness_of_music::data::puzzle_data; | |
use soundness_of_music::prover; | |
use soundness_of_music::verifier; | |
use soundness_of_music::PUZZLE_DESCRIPTION; | |
use soundness_of_music::prover::prove; | |
use ark_ec::ProjectiveCurve; | |
use ark_ec::AffineCurve; | |
use itertools::izip; | |
type Fr = <ark_bls12_381::Bls12_381 as ark_ec::PairingEngine>::Fr; | |
fn main() { | |
welcome(); | |
puzzle(PUZZLE_DESCRIPTION); | |
let (circuit, setup) = puzzle_data(); | |
/* Your solution here! */ | |
let public_inputs = [Fr::one(), Fr::one()]; | |
let two = Fr::one() + Fr::one(); | |
let four = two + two; | |
let valid_public_inputs = [Fr::one(), four]; | |
let valid_private_inputs = [two]; | |
let mut proof = prover::prove(&valid_public_inputs, &valid_private_inputs, &circuit, &setup); | |
let mut pk = <ark_bls12_381::Bls12_381 as ark_ec::PairingEngine>::G1Projective::zero(); | |
for (valid_public_input, public_input, public_input_polynomial) in izip!(valid_public_inputs.iter().skip(1), public_inputs.iter().skip(1), setup.inputs.iter().skip(1),) | |
{ | |
pk += public_input_polynomial.mul(*valid_public_input - public_input); | |
} | |
let pk = pk.into_affine(); | |
let mut pk_prime = <ark_bls12_381::Bls12_381 as ark_ec::PairingEngine>::G1Projective::zero(); | |
for (valid_public_input, public_input, public_input_polynomial) in izip!(valid_public_inputs.iter().skip(1), public_inputs.iter().skip(1), setup.inputs_prime.iter().skip(1),) | |
{ | |
pk_prime += public_input_polynomial.mul(*valid_public_input - public_input); | |
} | |
let pk_prime = pk_prime.into_affine(); | |
proof.pi_input += &pk; | |
proof.pi_input_prime += &pk_prime; | |
// Replace unimplmented!() with your proof | |
assert!(verifier::verify(&public_inputs, &setup, &proof)); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment