From 78df9f0211391d957a16d76497cf0c950d53d36d Mon Sep 17 00:00:00 2001 From: Sean Bowe Date: Wed, 2 Nov 2016 12:40:23 -0600 Subject: [PATCH] Process verification keys to perform online verification. --- src/zcash/JoinSplit.cpp | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/zcash/JoinSplit.cpp b/src/zcash/JoinSplit.cpp index 702c3bac6..8f9eddad2 100644 --- a/src/zcash/JoinSplit.cpp +++ b/src/zcash/JoinSplit.cpp @@ -26,6 +26,7 @@ namespace libzcash { CCriticalSection cs_ParamsIO; CCriticalSection cs_InitializeParams; +CCriticalSection cs_LoadKeys; template void saveToFile(std::string path, T& obj) { @@ -71,6 +72,7 @@ public: boost::optional> pk; boost::optional> vk; + boost::optional> vk_precomp; boost::optional pkPath; JoinSplitCircuit() {} @@ -87,6 +89,8 @@ public: } void loadProvingKey() { + LOCK(cs_LoadKeys); + if (!pk) { if (!pkPath) { throw std::runtime_error("proving key path unknown"); @@ -103,7 +107,14 @@ public: } } void loadVerifyingKey(std::string path) { + LOCK(cs_LoadKeys); + loadFromFile(path, vk); + + processVerifyingKey(); + } + void processVerifyingKey() { + vk_precomp = r1cs_ppzksnark_verifier_process_vk(*vk); } void saveVerifyingKey(std::string path) { if (vk) { @@ -128,11 +139,14 @@ public: } void generate() { + LOCK(cs_LoadKeys); + const r1cs_constraint_system constraint_system = generate_r1cs(); r1cs_ppzksnark_keypair keypair = r1cs_ppzksnark_generator(constraint_system); pk = keypair.pk; vk = keypair.vk; + processVerifyingKey(); } bool verify( @@ -146,7 +160,7 @@ public: uint64_t vpub_new, const uint256& rt ) { - if (!vk) { + if (!vk || !vk_precomp) { throw std::runtime_error("JoinSplit verifying key not loaded"); } @@ -165,7 +179,7 @@ public: vpub_new ); - return r1cs_ppzksnark_verifier_strong_IC(*vk, witness, r1cs_proof); + return r1cs_ppzksnark_online_verifier_strong_IC(*vk_precomp, witness, r1cs_proof); } catch (...) { return false; }