diff --git a/src/consensus/joinsplit.cpp b/src/consensus/joinsplit.cpp index cf0ca635d..b00d9dd71 100644 --- a/src/consensus/joinsplit.cpp +++ b/src/consensus/joinsplit.cpp @@ -32,7 +32,7 @@ bool CheckTransactionJoinsplits(const CTransaction& tx, CValidationState &state) // Ensure that zk-SNARKs verify auto verifier = libzcash::ProofVerifier::Strict(); for(const JSDescription &joinsplit : tx.vjoinsplit) { - if (!joinsplit.Verify(*pzcashParams, verifier, tx.joinSplitPubKey)) { + if (!joinsplit.Verify(pzcashParams.get(), verifier, tx.joinSplitPubKey)) { return state.DoS(100, error("CheckTransaction(): joinsplit does not verify"), REJECT_INVALID, "bad-txns-joinsplit-verification-failed"); } diff --git a/src/init.cpp b/src/init.cpp index dff0a0036..0b7b2b8b6 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -74,6 +74,8 @@ static const bool DEFAULT_STOPAFTERBLOCKIMPORT = false; std::unique_ptr g_connman; std::unique_ptr peerLogic; +std::unique_ptr pzcashParams; + #if !(ENABLE_WALLET) class DummyWalletInit : public WalletInitInterface { public: @@ -92,8 +94,6 @@ public: const WalletInitInterface& g_wallet_init_interface = DummyWalletInit(); #endif -ZCJoinSplit* pzcashParams = nullptr; - #if ENABLE_ZMQ static CZMQNotificationInterface* pzmqNotificationInterface = nullptr; #endif @@ -294,9 +294,6 @@ void Shutdown() g_wallet_init_interface.Close(); globalVerifyHandle.reset(); - delete pzcashParams; - pzcashParams = nullptr; - ECC_Stop(); LogPrintf("%s: done\n", __func__); } @@ -728,7 +725,7 @@ static void ZC_LoadParams() LogPrintf("Loading verifying key from %s\n", vk_path.string().c_str()); gettimeofday(&tv_start, 0); - pzcashParams = ZCJoinSplit::Prepared(vk_path.string(), pk_path.string()); + pzcashParams = std::unique_ptr(ZCJoinSplit::Prepared(vk_path.string(), pk_path.string())); gettimeofday(&tv_end, 0); elapsed = float(tv_end.tv_sec-tv_start.tv_sec) + (tv_end.tv_usec-tv_start.tv_usec)/float(1000000); diff --git a/src/init.h b/src/init.h index 83212c114..0d299d586 100644 --- a/src/init.h +++ b/src/init.h @@ -23,7 +23,7 @@ namespace boost class thread_group; } // namespace boost -extern ZCJoinSplit* pzcashParams; +extern std::unique_ptr pzcashParams; void StartShutdown(); bool ShutdownRequested(); diff --git a/src/wallet/asyncrpcoperation_mergetoaddress.cpp b/src/wallet/asyncrpcoperation_mergetoaddress.cpp index 96806fd53..486099682 100644 --- a/src/wallet/asyncrpcoperation_mergetoaddress.cpp +++ b/src/wallet/asyncrpcoperation_mergetoaddress.cpp @@ -454,7 +454,7 @@ bool AsyncRPCOperation_mergetoaddress::main_impl() // Decrypt the change note's ciphertext to retrieve some data we need ZCNoteDecryption decryptor(changeKey.receiving_key()); - auto hSig = prevJoinSplit.h_sig(*pzcashParams, tx_.joinSplitPubKey); + auto hSig = prevJoinSplit.h_sig(pzcashParams.get(), tx_.joinSplitPubKey); try { NotePlaintext plaintext = NotePlaintext::decrypt( decryptor, @@ -770,7 +770,7 @@ UniValue AsyncRPCOperation_mergetoaddress::perform_joinsplit( uint256 esk; // payment disclosure - secret JSDescription jsdesc = JSDescription::Randomized( - *pzcashParams, + pzcashParams.get(), joinSplitPubKey_, anchor, inputs, @@ -783,7 +783,7 @@ UniValue AsyncRPCOperation_mergetoaddress::perform_joinsplit( &esk); // parameter expects pointer to esk, so pass in address { auto verifier = libzcash::ProofVerifier::Strict(); - if (!(jsdesc.Verify(*pzcashParams, verifier, joinSplitPubKey_))) { + if (!(jsdesc.Verify(pzcashParams.get(), verifier, joinSplitPubKey_))) { throw std::runtime_error("error verifying joinsplit"); } } @@ -822,7 +822,7 @@ UniValue AsyncRPCOperation_mergetoaddress::perform_joinsplit( ss2 << ((unsigned char)0x00); ss2 << jsdesc.ephemeralKey; ss2 << jsdesc.ciphertexts[0]; - ss2 << jsdesc.h_sig(*pzcashParams, joinSplitPubKey_); + ss2 << jsdesc.h_sig(pzcashParams.get(), joinSplitPubKey_); encryptedNote1 = HexStr(ss2.begin(), ss2.end()); } @@ -831,7 +831,7 @@ UniValue AsyncRPCOperation_mergetoaddress::perform_joinsplit( ss2 << ((unsigned char)0x01); ss2 << jsdesc.ephemeralKey; ss2 << jsdesc.ciphertexts[1]; - ss2 << jsdesc.h_sig(*pzcashParams, joinSplitPubKey_); + ss2 << jsdesc.h_sig(pzcashParams.get(), joinSplitPubKey_); encryptedNote2 = HexStr(ss2.begin(), ss2.end()); } diff --git a/src/wallet/asyncrpcoperation_sendmany.cpp b/src/wallet/asyncrpcoperation_sendmany.cpp index d33a08773..28ea6b71d 100644 --- a/src/wallet/asyncrpcoperation_sendmany.cpp +++ b/src/wallet/asyncrpcoperation_sendmany.cpp @@ -568,7 +568,7 @@ bool AsyncRPCOperation_sendmany::main_impl() { // Decrypt the change note's ciphertext to retrieve some data we need ZCNoteDecryption decryptor(spendingkey_.receiving_key()); - auto hSig = prevJoinSplit.h_sig(*pzcashParams, tx_.joinSplitPubKey); + auto hSig = prevJoinSplit.h_sig(pzcashParams.get(), tx_.joinSplitPubKey); try { NotePlaintext plaintext = NotePlaintext::decrypt( decryptor, @@ -982,7 +982,7 @@ UniValue AsyncRPCOperation_sendmany::perform_joinsplit( uint256 esk; // payment disclosure - secret JSDescription jsdesc = JSDescription::Randomized( - *pzcashParams, + pzcashParams.get(), joinSplitPubKey_, anchor, inputs, @@ -995,7 +995,7 @@ UniValue AsyncRPCOperation_sendmany::perform_joinsplit( &esk); // parameter expects pointer to esk, so pass in address { auto verifier = libzcash::ProofVerifier::Strict(); - if (!(jsdesc.Verify(*pzcashParams, verifier, joinSplitPubKey_))) { + if (!(jsdesc.Verify(pzcashParams.get(), verifier, joinSplitPubKey_))) { throw std::runtime_error("error verifying joinsplit"); } } @@ -1038,7 +1038,7 @@ UniValue AsyncRPCOperation_sendmany::perform_joinsplit( ss2 << ((unsigned char) 0x00); ss2 << jsdesc.ephemeralKey; ss2 << jsdesc.ciphertexts[0]; - ss2 << jsdesc.h_sig(*pzcashParams, joinSplitPubKey_); + ss2 << jsdesc.h_sig(pzcashParams.get(), joinSplitPubKey_); encryptedNote1 = HexStr(ss2.begin(), ss2.end()); } @@ -1047,7 +1047,7 @@ UniValue AsyncRPCOperation_sendmany::perform_joinsplit( ss2 << ((unsigned char) 0x01); ss2 << jsdesc.ephemeralKey; ss2 << jsdesc.ciphertexts[1]; - ss2 << jsdesc.h_sig(*pzcashParams, joinSplitPubKey_); + ss2 << jsdesc.h_sig(pzcashParams.get(), joinSplitPubKey_); encryptedNote2 = HexStr(ss2.begin(), ss2.end()); } diff --git a/src/wallet/asyncrpcoperation_shieldcoinbase.cpp b/src/wallet/asyncrpcoperation_shieldcoinbase.cpp index 3934bd05f..11aae953f 100644 --- a/src/wallet/asyncrpcoperation_shieldcoinbase.cpp +++ b/src/wallet/asyncrpcoperation_shieldcoinbase.cpp @@ -354,7 +354,7 @@ UniValue AsyncRPCOperation_shieldcoinbase::perform_joinsplit(ShieldCoinbaseJSInf uint256 esk; // payment disclosure - secret JSDescription jsdesc = JSDescription::Randomized( - *pzcashParams, + pzcashParams.get(), joinSplitPubKey_, anchor, inputs, @@ -367,7 +367,7 @@ UniValue AsyncRPCOperation_shieldcoinbase::perform_joinsplit(ShieldCoinbaseJSInf &esk); // parameter expects pointer to esk, so pass in address { auto verifier = libzcash::ProofVerifier::Strict(); - if (!(jsdesc.Verify(*pzcashParams, verifier, joinSplitPubKey_))) { + if (!(jsdesc.Verify(pzcashParams.get(), verifier, joinSplitPubKey_))) { throw std::runtime_error("error verifying joinsplit"); } } @@ -410,7 +410,7 @@ UniValue AsyncRPCOperation_shieldcoinbase::perform_joinsplit(ShieldCoinbaseJSInf ss2 << ((unsigned char) 0x00); ss2 << jsdesc.ephemeralKey; ss2 << jsdesc.ciphertexts[0]; - ss2 << jsdesc.h_sig(*pzcashParams, joinSplitPubKey_); + ss2 << jsdesc.h_sig(pzcashParams.get(), joinSplitPubKey_); encryptedNote1 = HexStr(ss2.begin(), ss2.end()); } @@ -419,7 +419,7 @@ UniValue AsyncRPCOperation_shieldcoinbase::perform_joinsplit(ShieldCoinbaseJSInf ss2 << ((unsigned char) 0x01); ss2 << jsdesc.ephemeralKey; ss2 << jsdesc.ciphertexts[1]; - ss2 << jsdesc.h_sig(*pzcashParams, joinSplitPubKey_); + ss2 << jsdesc.h_sig(pzcashParams.get(), joinSplitPubKey_); encryptedNote2 = HexStr(ss2.begin(), ss2.end()); }