Isolate verification to a ProofVerifier context object that allows verification behavior to be tuned by the caller.
This commit is contained in:
@@ -5,7 +5,6 @@
|
||||
#include "zcash/util.h"
|
||||
|
||||
#include <memory>
|
||||
#include <mutex>
|
||||
|
||||
#include <boost/foreach.hpp>
|
||||
#include <boost/format.hpp>
|
||||
@@ -25,8 +24,6 @@ namespace libzcash {
|
||||
|
||||
#include "zcash/circuit/gadget.tcc"
|
||||
|
||||
std::once_flag init_public_params_once_flag;
|
||||
|
||||
CCriticalSection cs_ParamsIO;
|
||||
CCriticalSection cs_LoadKeys;
|
||||
|
||||
@@ -80,10 +77,6 @@ public:
|
||||
JoinSplitCircuit() {}
|
||||
~JoinSplitCircuit() {}
|
||||
|
||||
static void initialize() {
|
||||
std::call_once (init_public_params_once_flag, ppzksnark_ppT::init_public_params);
|
||||
}
|
||||
|
||||
void setProvingKeyPath(std::string path) {
|
||||
pkPath = path;
|
||||
}
|
||||
@@ -151,6 +144,7 @@ public:
|
||||
|
||||
bool verify(
|
||||
const ZCProof& proof,
|
||||
ProofVerifier& verifier,
|
||||
const uint256& pubKeyHash,
|
||||
const uint256& randomSeed,
|
||||
const boost::array<uint256, NumInputs>& macs,
|
||||
@@ -179,7 +173,12 @@ public:
|
||||
vpub_new
|
||||
);
|
||||
|
||||
return r1cs_ppzksnark_online_verifier_strong_IC<ppzksnark_ppT>(*vk_precomp, witness, r1cs_proof);
|
||||
return verifier.check(
|
||||
*vk,
|
||||
*vk_precomp,
|
||||
witness,
|
||||
r1cs_proof
|
||||
);
|
||||
} catch (...) {
|
||||
return false;
|
||||
}
|
||||
@@ -358,7 +357,7 @@ public:
|
||||
template<size_t NumInputs, size_t NumOutputs>
|
||||
JoinSplit<NumInputs, NumOutputs>* JoinSplit<NumInputs, NumOutputs>::Generate()
|
||||
{
|
||||
JoinSplitCircuit<NumInputs, NumOutputs>::initialize();
|
||||
initialize_curve_params();
|
||||
auto js = new JoinSplitCircuit<NumInputs, NumOutputs>();
|
||||
js->generate();
|
||||
|
||||
@@ -368,7 +367,7 @@ JoinSplit<NumInputs, NumOutputs>* JoinSplit<NumInputs, NumOutputs>::Generate()
|
||||
template<size_t NumInputs, size_t NumOutputs>
|
||||
JoinSplit<NumInputs, NumOutputs>* JoinSplit<NumInputs, NumOutputs>::Unopened()
|
||||
{
|
||||
JoinSplitCircuit<NumInputs, NumOutputs>::initialize();
|
||||
initialize_curve_params();
|
||||
return new JoinSplitCircuit<NumInputs, NumOutputs>();
|
||||
}
|
||||
|
||||
|
||||
@@ -83,6 +83,7 @@ public:
|
||||
|
||||
virtual bool verify(
|
||||
const ZCProof& proof,
|
||||
ProofVerifier& verifier,
|
||||
const uint256& pubKeyHash,
|
||||
const uint256& randomSeed,
|
||||
const boost::array<uint256, NumInputs>& hmacs,
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#include "Proof.hpp"
|
||||
|
||||
#include <boost/static_assert.hpp>
|
||||
#include <mutex>
|
||||
|
||||
#include "crypto/common.h"
|
||||
#include "libsnark/common/default_types/r1cs_ppzksnark_pp.hpp"
|
||||
@@ -211,4 +212,36 @@ ZCProof ZCProof::random_invalid()
|
||||
return p;
|
||||
}
|
||||
|
||||
std::once_flag init_public_params_once_flag;
|
||||
|
||||
void initialize_curve_params()
|
||||
{
|
||||
std::call_once (init_public_params_once_flag, curve_pp::init_public_params);
|
||||
}
|
||||
|
||||
ProofVerifier ProofVerifier::Strict() {
|
||||
initialize_curve_params();
|
||||
return ProofVerifier(true);
|
||||
}
|
||||
|
||||
ProofVerifier ProofVerifier::Dummy() {
|
||||
initialize_curve_params();
|
||||
return ProofVerifier(false);
|
||||
}
|
||||
|
||||
template<>
|
||||
bool ProofVerifier::check(
|
||||
const r1cs_ppzksnark_verification_key<curve_pp>& vk,
|
||||
const r1cs_ppzksnark_processed_verification_key<curve_pp>& pvk,
|
||||
const r1cs_primary_input<curve_Fr>& primary_input,
|
||||
const r1cs_ppzksnark_proof<curve_pp>& proof
|
||||
)
|
||||
{
|
||||
if (perform_verification) {
|
||||
return r1cs_ppzksnark_online_verifier_strong_IC<curve_pp>(pvk, primary_input, proof);
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -235,6 +235,36 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
void initialize_curve_params();
|
||||
|
||||
class ProofVerifier {
|
||||
private:
|
||||
bool perform_verification;
|
||||
|
||||
ProofVerifier(bool perform_verification) : perform_verification(perform_verification) { }
|
||||
|
||||
public:
|
||||
// Creates a verification context that strictly verifies
|
||||
// all proofs using libsnark's API.
|
||||
static ProofVerifier Strict();
|
||||
|
||||
// Creates a dummy verification context that performs
|
||||
// no verification, used when avoiding duplicate effort
|
||||
// such as during reindexing.
|
||||
static ProofVerifier Dummy();
|
||||
|
||||
template <typename VerificationKey,
|
||||
typename ProcessedVerificationKey,
|
||||
typename PrimaryInput,
|
||||
typename Proof
|
||||
>
|
||||
bool check(
|
||||
const VerificationKey& vk,
|
||||
const ProcessedVerificationKey& pvk,
|
||||
const PrimaryInput& pi,
|
||||
const Proof& p
|
||||
);
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user