clean, return hex in JSON
This commit is contained in:
parent
a856e138af
commit
f2d958c701
5 changed files with 80 additions and 115 deletions
|
@ -160,7 +160,7 @@ void printProof(r1cs_se_ppzksnark_proof<libff::alt_bn128_pp> proof, const char*
|
|||
if(i!=1){
|
||||
ss << ",";
|
||||
}
|
||||
ss << libsnarkBigintFromBytes(public_inputs + i*32);
|
||||
ss << HexStringFromLibsnarkBigint(libsnarkBigintFromBytes(public_inputs + i*32));
|
||||
}
|
||||
ss << "]" << "\n";
|
||||
ss << "}" << "\n";
|
||||
|
|
|
@ -178,7 +178,7 @@ void printProof(r1cs_ppzksnark_proof<libff::alt_bn128_pp> proof, const char* pro
|
|||
if(i!=1){
|
||||
ss << ",";
|
||||
}
|
||||
ss << libsnarkBigintFromBytes(public_inputs + i*32);
|
||||
ss << HexStringFromLibsnarkBigint(libsnarkBigintFromBytes(public_inputs + i*32));
|
||||
}
|
||||
ss << "]" << "\n";
|
||||
ss << "}" << "\n";
|
||||
|
|
|
@ -19,6 +19,9 @@ libff::bigint<libff::alt_bn128_r_limbs> libsnarkBigintFromBytes(const uint8_t* _
|
|||
x.data[3 - i] |= uint64_t(_x[i * 8 + j]) << (8 * (7-j));
|
||||
}
|
||||
}
|
||||
|
||||
cout << x << "\n";
|
||||
|
||||
return x;
|
||||
}
|
||||
|
||||
|
|
|
@ -178,52 +178,22 @@ impl Prog<FieldPrime> {
|
|||
}
|
||||
|
||||
impl Computation<FieldPrime> {
|
||||
pub fn prove(self, params: Parameters<Bn256>) -> Proof<Bn256> {
|
||||
pub fn prove(self, params: &Parameters<Bn256>) -> Proof<Bn256> {
|
||||
let rng = &mut thread_rng();
|
||||
let proof = create_random_proof(self.clone(), ¶ms, rng).unwrap();
|
||||
let proof = create_random_proof(self.clone(), params, rng).unwrap();
|
||||
|
||||
let pvk = prepare_verifying_key(¶ms.vk);
|
||||
|
||||
// extract public inputs
|
||||
let public_inputs: Vec<Fr> = self
|
||||
.program
|
||||
.main
|
||||
.arguments
|
||||
.clone()
|
||||
.iter()
|
||||
.zip(self.program.private.clone())
|
||||
.filter(|(_, p)| !p)
|
||||
.map(|(a, _)| a)
|
||||
.chain(
|
||||
self.witness
|
||||
.clone()
|
||||
.unwrap()
|
||||
.0
|
||||
.keys()
|
||||
.filter(|k| k.is_output()),
|
||||
)
|
||||
.map(|v| self.witness.clone().unwrap().0.get(v).unwrap().clone())
|
||||
.map(|v| Fr::from(v.clone()))
|
||||
.collect();
|
||||
let public_inputs = self.public_inputs_values();
|
||||
|
||||
assert!(verify_proof(&pvk, &proof, &public_inputs).unwrap());
|
||||
|
||||
proof
|
||||
}
|
||||
|
||||
pub fn setup_prove_verify(self) -> Proof<Bn256> {
|
||||
// run setup phase
|
||||
let params = self.clone().setup();
|
||||
let pvk = prepare_verifying_key(¶ms.vk);
|
||||
|
||||
// generate proof
|
||||
let rng = &mut thread_rng();
|
||||
|
||||
let proof = create_random_proof(self.clone(), ¶ms, rng).unwrap();
|
||||
|
||||
// extract public inputs
|
||||
let public_inputs: Vec<Fr> = self
|
||||
.program
|
||||
pub fn public_inputs_values(&self) -> Vec<Fr> {
|
||||
self.program
|
||||
.main
|
||||
.arguments
|
||||
.clone()
|
||||
|
@ -241,11 +211,7 @@ impl Computation<FieldPrime> {
|
|||
)
|
||||
.map(|v| self.witness.clone().unwrap().0.get(v).unwrap().clone())
|
||||
.map(|v| Fr::from(v.clone()))
|
||||
.collect();
|
||||
|
||||
assert!(verify_proof(&pvk, &proof, &public_inputs).unwrap());
|
||||
|
||||
proof
|
||||
.collect()
|
||||
}
|
||||
|
||||
pub fn setup(self) -> Parameters<Bn256> {
|
||||
|
@ -291,22 +257,35 @@ vk.gammaABC.len() = {}
|
|||
.replace(") * u]", "]]")
|
||||
}
|
||||
|
||||
pub fn serialize_proof(p: Proof<Bn256>) -> String {
|
||||
pub fn serialize_proof(p: &Proof<Bn256>, inputs: &Vec<Fr>) -> String {
|
||||
format!(
|
||||
"{{
|
||||
\"a\": {},
|
||||
\"b\": {},
|
||||
\"c\": {},
|
||||
\"proof\": {{
|
||||
\"a\": {},
|
||||
\"b\": {},
|
||||
\"c\": {}
|
||||
}},
|
||||
\"inputs\": [{}]
|
||||
}}",
|
||||
p.a, p.b, p.c
|
||||
p.a,
|
||||
p.b,
|
||||
p.c,
|
||||
inputs
|
||||
.iter()
|
||||
.map(|v| format!("\"{}\"", v))
|
||||
.collect::<Vec<_>>()
|
||||
.join(", "),
|
||||
)
|
||||
.replace("G2(x=Fq2(Fq(", "[[")
|
||||
.replace("), y=Fq(", ", ")
|
||||
.replace("G1(x=Fq(", "[")
|
||||
.replace(") + Fq(", ", ")
|
||||
.replace("))", "]")
|
||||
.replace(") * u), y=Fq2(Fq(", "], [")
|
||||
.replace(") * u]", "]]")
|
||||
.replace("G2(x=Fq2(Fq(", "[[\"")
|
||||
.replace("), y=Fq(", "\", \"")
|
||||
.replace("G1(x=Fq(", "[\"")
|
||||
.replace(") + Fq(", "\", \"")
|
||||
.replace(") * u), y=Fq2(Fq(", "\"], [\"")
|
||||
.replace(") * u]", "\"]]")
|
||||
.replace(") * u))", "\"]]")
|
||||
.replace("))", "\"]")
|
||||
.replace("Fr(", "")
|
||||
.replace(")", "")
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
|
@ -332,7 +311,8 @@ mod tests {
|
|||
let witness = program.clone().execute::<FieldPrime>(&vec![]).unwrap();
|
||||
let computation = Computation::with_witness(program, witness);
|
||||
|
||||
let _proof = computation.setup_prove_verify();
|
||||
let params = computation.clone().setup();
|
||||
let _proof = computation.prove(¶ms);
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
@ -356,7 +336,8 @@ mod tests {
|
|||
.unwrap();
|
||||
let computation = Computation::with_witness(program, witness);
|
||||
|
||||
let _proof = computation.setup_prove_verify();
|
||||
let params = computation.clone().setup();
|
||||
let _proof = computation.prove(¶ms);
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
@ -380,84 +361,60 @@ mod tests {
|
|||
.unwrap();
|
||||
let computation = Computation::with_witness(program, witness);
|
||||
|
||||
let _proof = computation.setup_prove_verify();
|
||||
let params = computation.clone().setup();
|
||||
let _proof = computation.prove(¶ms);
|
||||
}
|
||||
}
|
||||
|
||||
mod serialize {
|
||||
use super::*;
|
||||
mod vk {
|
||||
use super::*;
|
||||
#[test]
|
||||
fn serialize() {
|
||||
let program: Prog<FieldPrime> = Prog {
|
||||
main: Function {
|
||||
id: String::from("main"),
|
||||
arguments: vec![],
|
||||
returns: vec![],
|
||||
statements: vec![],
|
||||
},
|
||||
private: vec![],
|
||||
};
|
||||
|
||||
let computation = Computation::with_witness(program, Witness::empty());
|
||||
|
||||
let params = computation.setup();
|
||||
println!("{}", serialize_vk(params.vk));
|
||||
// assert_eq!(serialize_vk(params.vk), "vk.A = [0xe346c6331a8f3b39583944d0812a9ac9be6e507cbae0caea406b46faf05a8f6, 0x8538b02888a72f3415349a24a6493865937bf79facdee21ec725d7d07b9f77e], [0xd6d071f9dc99d9d559a8b2ef4cb28048f402db2c5ccce439b75967f97c1cc62, 0xd82c10002969164b4534f6cbe76d19183ecf4cccc7ec247bbae93f3fcd12737]
|
||||
// vk.B = 0x4fdf8eb48ef7488c914383f1e63a913079e083d4b42714e55bf594c3e8e531f, 0x2e189cec6babb474e475bb86353aa148d09729c643cfaecc7f1e9871f4dd476a
|
||||
// vk.C = [0x2e17f9799ec8dc45c46643cc04b6f572a62451f7745281603abe9bf06dcb258f, 0x1cd480216a68e65fa4c8b595481c61a7fee0c26fa3d54a9d0e520e4c63a3924b], [0x18adf6cc01f7492952f7bc1885ef00e8d4724913ac36746b00e7e50b8c83008e, 0x194c623b624fd5dba6d3d3f510f2fe616deebc153fa2fb5e9a639554454d987d]
|
||||
// vk.gamma = [0x144a4e9398e9b5243f0f9966858948a9e72795c4352a1b574c6ebd46e19c7cb3, 0x259ca428fcc7323d21e64eaa7b2eff9b5df0a9c8f4d590c34b06c5ee25cb2a4b], [0x255e832555526cd59d576a8c6adcdf25a2d9a28ab1dd12891ebb3bf4ca918476, 0x21b0d3078440447b3a1dd437fc61949148d82af0482510350b872cdd3b83073b]
|
||||
// vk.gammaBeta1 = 0x9752a30af0c5550eda78c403f8565be77fea017ffd7813d75583a3ce6b22367, 0xa7996aaf0133388110732201d7ebade0a93946afee0b5a6d07789fece8ce514
|
||||
// vk.gammaBeta2 = [0x1658e036bfd100d130fa69a50d06fb3c003089fe55febe816cf729f35c486ca7, 0x1b58887816825b2a21ca6c61a1d59f84ec48f3e9f9e8c15e780aa2941772672d], [0x577fc24305f3a089acadf047c8b264812e7403f06eaf52eef46b05946e9657, 0x1b80136e8693d8127e1674c986f018c206f0f077f27380a22a8d4315ed1bddf2]
|
||||
// vk.Z = [0x2dc0b7d51c8e879253d7a03c0c21909c9719624896353e720f6c8329b0703a69, 0x1e865831288496134884365c838ffd29293cfd53987e9d1efee899f8741a6613], [0x117929d729dd6a6850fc004547327cca0f35bfae38fbca677e45544a7f80fac0, 0x7f15e5f8624d90efdfb778213810201937e06f6b64ba385d291565d41f31436]
|
||||
// vk.IC.len() = 4
|
||||
// vk.IC[0] = 0x17be3e229f6f31225f8e625a939f4883ee1515d6bd32f6b2f820c151643a7ea8, 0x9fd8bb5948457176ae10d7895ec513bbc6b87a0f30b5d3ed22d1a73cdf87aa
|
||||
// vk.IC[1] = 0x126abf506aa18ab42349c3c81ef2b81efa53178c37b3b59bbf634b8d7c83012, 0x3b03e34fbfbd69e8652aa9bb2a9f3801ef7de3d69f8e77e29f2cdcea9735ace
|
||||
// vk.IC[2] = 0x25eb86c6ff818d3f56cf5c4bfd86152b5fc46f2e9576e3cd215dc2182472dfd9, 0x25c3b07f946bb68ab0cfd50fc2a88d8d3738040e09125d241452aab6b865f986
|
||||
// vk.IC[3] = 0x4952b396f70e1f3ea94f0639375f2824389eb5629e78014a3496937e898f9a5, 0x216c09dc5dd85d771b1088db01f8b3285d33c82ff4363da1b09c81611c31894d
|
||||
// ");
|
||||
}
|
||||
}
|
||||
|
||||
mod proof {
|
||||
use super::*;
|
||||
|
||||
#[allow(dead_code)]
|
||||
#[derive(Deserialize)]
|
||||
struct G16ProofPoints {
|
||||
a: [String; 2],
|
||||
b: [[String; 2]; 2],
|
||||
c: [String; 2],
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
#[derive(Deserialize)]
|
||||
struct G16Proof {
|
||||
proof: G16ProofPoints,
|
||||
inputs: Vec<String>,
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn serialize() {
|
||||
let rng = &mut thread_rng();
|
||||
|
||||
let program: Prog<FieldPrime> = Prog {
|
||||
main: Function {
|
||||
id: String::from("main"),
|
||||
arguments: vec![],
|
||||
returns: vec![],
|
||||
statements: vec![],
|
||||
arguments: vec![FlatVariable::new(0)],
|
||||
returns: vec![FlatVariable::public(0)],
|
||||
statements: vec![Statement::Constraint(
|
||||
FlatVariable::new(0).into(),
|
||||
FlatVariable::public(0).into(),
|
||||
)],
|
||||
},
|
||||
private: vec![],
|
||||
private: vec![false],
|
||||
};
|
||||
|
||||
let witness = program.clone().execute::<FieldPrime>(&vec![]).unwrap();
|
||||
let witness = program
|
||||
.clone()
|
||||
.execute::<FieldPrime>(&vec![FieldPrime::from(42)])
|
||||
.unwrap();
|
||||
let computation = Computation::with_witness(program, witness);
|
||||
|
||||
let public_inputs_values = computation.public_inputs_values();
|
||||
|
||||
let params = computation.clone().setup();
|
||||
let proof = computation.prove(¶ms);
|
||||
|
||||
let proof = create_random_proof(computation, ¶ms, rng).unwrap();
|
||||
|
||||
println!("{}", serialize_proof(proof));
|
||||
// assert_eq!(serialize_vk(params.vk), "vk.A = [0xe346c6331a8f3b39583944d0812a9ac9be6e507cbae0caea406b46faf05a8f6, 0x8538b02888a72f3415349a24a6493865937bf79facdee21ec725d7d07b9f77e], [0xd6d071f9dc99d9d559a8b2ef4cb28048f402db2c5ccce439b75967f97c1cc62, 0xd82c10002969164b4534f6cbe76d19183ecf4cccc7ec247bbae93f3fcd12737]
|
||||
// vk.B = 0x4fdf8eb48ef7488c914383f1e63a913079e083d4b42714e55bf594c3e8e531f, 0x2e189cec6babb474e475bb86353aa148d09729c643cfaecc7f1e9871f4dd476a
|
||||
// vk.C = [0x2e17f9799ec8dc45c46643cc04b6f572a62451f7745281603abe9bf06dcb258f, 0x1cd480216a68e65fa4c8b595481c61a7fee0c26fa3d54a9d0e520e4c63a3924b], [0x18adf6cc01f7492952f7bc1885ef00e8d4724913ac36746b00e7e50b8c83008e, 0x194c623b624fd5dba6d3d3f510f2fe616deebc153fa2fb5e9a639554454d987d]
|
||||
// vk.gamma = [0x144a4e9398e9b5243f0f9966858948a9e72795c4352a1b574c6ebd46e19c7cb3, 0x259ca428fcc7323d21e64eaa7b2eff9b5df0a9c8f4d590c34b06c5ee25cb2a4b], [0x255e832555526cd59d576a8c6adcdf25a2d9a28ab1dd12891ebb3bf4ca918476, 0x21b0d3078440447b3a1dd437fc61949148d82af0482510350b872cdd3b83073b]
|
||||
// vk.gammaBeta1 = 0x9752a30af0c5550eda78c403f8565be77fea017ffd7813d75583a3ce6b22367, 0xa7996aaf0133388110732201d7ebade0a93946afee0b5a6d07789fece8ce514
|
||||
// vk.gammaBeta2 = [0x1658e036bfd100d130fa69a50d06fb3c003089fe55febe816cf729f35c486ca7, 0x1b58887816825b2a21ca6c61a1d59f84ec48f3e9f9e8c15e780aa2941772672d], [0x577fc24305f3a089acadf047c8b264812e7403f06eaf52eef46b05946e9657, 0x1b80136e8693d8127e1674c986f018c206f0f077f27380a22a8d4315ed1bddf2]
|
||||
// vk.Z = [0x2dc0b7d51c8e879253d7a03c0c21909c9719624896353e720f6c8329b0703a69, 0x1e865831288496134884365c838ffd29293cfd53987e9d1efee899f8741a6613], [0x117929d729dd6a6850fc004547327cca0f35bfae38fbca677e45544a7f80fac0, 0x7f15e5f8624d90efdfb778213810201937e06f6b64ba385d291565d41f31436]
|
||||
// vk.IC.len() = 4
|
||||
// vk.IC[0] = 0x17be3e229f6f31225f8e625a939f4883ee1515d6bd32f6b2f820c151643a7ea8, 0x9fd8bb5948457176ae10d7895ec513bbc6b87a0f30b5d3ed22d1a73cdf87aa
|
||||
// vk.IC[1] = 0x126abf506aa18ab42349c3c81ef2b81efa53178c37b3b59bbf634b8d7c83012, 0x3b03e34fbfbd69e8652aa9bb2a9f3801ef7de3d69f8e77e29f2cdcea9735ace
|
||||
// vk.IC[2] = 0x25eb86c6ff818d3f56cf5c4bfd86152b5fc46f2e9576e3cd215dc2182472dfd9, 0x25c3b07f946bb68ab0cfd50fc2a88d8d3738040e09125d241452aab6b865f986
|
||||
// vk.IC[3] = 0x4952b396f70e1f3ea94f0639375f2824389eb5629e78014a3496937e898f9a5, 0x216c09dc5dd85d771b1088db01f8b3285d33c82ff4363da1b09c81611c31894d
|
||||
// ");
|
||||
let serialized_proof = serialize_proof(&proof, &public_inputs_values);
|
||||
serde_json::from_str::<G16Proof>(&serialized_proof).unwrap();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -34,10 +34,15 @@ impl ProofSystem for G16 {
|
|||
|
||||
let params = Parameters::read(parameters_file, true).unwrap();
|
||||
|
||||
let proof = computation.prove(params);
|
||||
let proof = computation.clone().prove(¶ms);
|
||||
|
||||
let mut proof_file = File::create(PathBuf::from(proof_path)).unwrap();
|
||||
write!(proof_file, "{}", serialize_proof(proof)).unwrap();
|
||||
write!(
|
||||
proof_file,
|
||||
"{}",
|
||||
serialize_proof(&proof, &computation.public_inputs_values())
|
||||
)
|
||||
.unwrap();
|
||||
true
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue