Process verification keys to perform online verification.

This commit is contained in:
Sean Bowe
2016-11-02 12:40:23 -06:00
parent 226a6b3248
commit 78df9f0211

View File

@@ -26,6 +26,7 @@ namespace libzcash {
CCriticalSection cs_ParamsIO; CCriticalSection cs_ParamsIO;
CCriticalSection cs_InitializeParams; CCriticalSection cs_InitializeParams;
CCriticalSection cs_LoadKeys;
template<typename T> template<typename T>
void saveToFile(std::string path, T& obj) { void saveToFile(std::string path, T& obj) {
@@ -71,6 +72,7 @@ public:
boost::optional<r1cs_ppzksnark_proving_key<ppzksnark_ppT>> pk; boost::optional<r1cs_ppzksnark_proving_key<ppzksnark_ppT>> pk;
boost::optional<r1cs_ppzksnark_verification_key<ppzksnark_ppT>> vk; boost::optional<r1cs_ppzksnark_verification_key<ppzksnark_ppT>> vk;
boost::optional<r1cs_ppzksnark_processed_verification_key<ppzksnark_ppT>> vk_precomp;
boost::optional<std::string> pkPath; boost::optional<std::string> pkPath;
JoinSplitCircuit() {} JoinSplitCircuit() {}
@@ -87,6 +89,8 @@ public:
} }
void loadProvingKey() { void loadProvingKey() {
LOCK(cs_LoadKeys);
if (!pk) { if (!pk) {
if (!pkPath) { if (!pkPath) {
throw std::runtime_error("proving key path unknown"); throw std::runtime_error("proving key path unknown");
@@ -103,7 +107,14 @@ public:
} }
} }
void loadVerifyingKey(std::string path) { void loadVerifyingKey(std::string path) {
LOCK(cs_LoadKeys);
loadFromFile(path, vk); loadFromFile(path, vk);
processVerifyingKey();
}
void processVerifyingKey() {
vk_precomp = r1cs_ppzksnark_verifier_process_vk(*vk);
} }
void saveVerifyingKey(std::string path) { void saveVerifyingKey(std::string path) {
if (vk) { if (vk) {
@@ -128,11 +139,14 @@ public:
} }
void generate() { void generate() {
LOCK(cs_LoadKeys);
const r1cs_constraint_system<FieldT> constraint_system = generate_r1cs(); const r1cs_constraint_system<FieldT> constraint_system = generate_r1cs();
r1cs_ppzksnark_keypair<ppzksnark_ppT> keypair = r1cs_ppzksnark_generator<ppzksnark_ppT>(constraint_system); r1cs_ppzksnark_keypair<ppzksnark_ppT> keypair = r1cs_ppzksnark_generator<ppzksnark_ppT>(constraint_system);
pk = keypair.pk; pk = keypair.pk;
vk = keypair.vk; vk = keypair.vk;
processVerifyingKey();
} }
bool verify( bool verify(
@@ -146,7 +160,7 @@ public:
uint64_t vpub_new, uint64_t vpub_new,
const uint256& rt const uint256& rt
) { ) {
if (!vk) { if (!vk || !vk_precomp) {
throw std::runtime_error("JoinSplit verifying key not loaded"); throw std::runtime_error("JoinSplit verifying key not loaded");
} }
@@ -165,7 +179,7 @@ public:
vpub_new vpub_new
); );
return r1cs_ppzksnark_verifier_strong_IC<ppzksnark_ppT>(*vk, witness, r1cs_proof); return r1cs_ppzksnark_online_verifier_strong_IC<ppzksnark_ppT>(*vk_precomp, witness, r1cs_proof);
} catch (...) { } catch (...) {
return false; return false;
} }