Process verification keys to perform online verification.
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user