Auto merge of #3458 - str4d:temp-sapling-disable, r=ebfull

Disable Sapling features on mainnet

Also places them behind an experimental features flag on testnet.
This commit is contained in:
Homu 2018-08-14 08:52:46 -07:00
commit b004f254d5
6 changed files with 70 additions and 10 deletions

View File

@ -23,6 +23,7 @@ zcash_gtest_SOURCES += \
gtest/test_equihash.cpp \ gtest/test_equihash.cpp \
gtest/test_httprpc.cpp \ gtest/test_httprpc.cpp \
gtest/test_joinsplit.cpp \ gtest/test_joinsplit.cpp \
gtest/test_keys.cpp \
gtest/test_keystore.cpp \ gtest/test_keystore.cpp \
gtest/test_noteencryption.cpp \ gtest/test_noteencryption.cpp \
gtest/test_mempool.cpp \ gtest/test_mempool.cpp \

42
src/gtest/test_keys.cpp Normal file
View File

@ -0,0 +1,42 @@
#include <chainparams.h>
#include <key_io.h>
#include <zcash/Address.hpp>
#include <gtest/gtest.h>
TEST(Keys, DISABLED_EncodeAndDecodeSapling)
{
SelectParams(CBaseChainParams::MAIN);
for (size_t i = 0; i < 1000; i++) {
auto sk = libzcash::SaplingSpendingKey::random();
{
std::string sk_string = EncodeSpendingKey(sk);
EXPECT_EQ(
sk_string.substr(0, 24),
Params().Bech32HRP(CChainParams::SAPLING_SPENDING_KEY));
auto spendingkey2 = DecodeSpendingKey(sk_string);
EXPECT_TRUE(IsValidSpendingKey(spendingkey2));
ASSERT_TRUE(boost::get<libzcash::SaplingSpendingKey>(&spendingkey2) != nullptr);
auto sk2 = boost::get<libzcash::SaplingSpendingKey>(spendingkey2);
EXPECT_EQ(sk, sk2);
}
{
auto addr = sk.default_address();
std::string addr_string = EncodePaymentAddress(addr);
EXPECT_EQ(
addr_string.substr(0, 2),
Params().Bech32HRP(CChainParams::SAPLING_PAYMENT_ADDRESS));
auto paymentaddr2 = DecodePaymentAddress(addr_string);
EXPECT_TRUE(IsValidPaymentAddress(paymentaddr2));
ASSERT_TRUE(boost::get<libzcash::SaplingPaymentAddress>(&paymentaddr2) != nullptr);
auto addr2 = boost::get<libzcash::SaplingPaymentAddress>(paymentaddr2);
EXPECT_EQ(addr, addr2);
}
}
}

View File

@ -286,7 +286,11 @@ libzcash::PaymentAddress DecodePaymentAddress(const std::string& str)
} }
data.clear(); data.clear();
auto bech = bech32::Decode(str); auto bech = bech32::Decode(str);
if (bech.first == Params().Bech32HRP(CChainParams::SAPLING_PAYMENT_ADDRESS) && bool allowSapling = Params().NetworkIDString() == "regtest" || (
Params().NetworkIDString() == "test" &&
GetBoolArg("-experimentalfeatures", false) &&
GetBoolArg("-developersapling", false));
if (allowSapling && bech.first == Params().Bech32HRP(CChainParams::SAPLING_PAYMENT_ADDRESS) &&
bech.second.size() == ConvertedSaplingPaymentAddressSize) { bech.second.size() == ConvertedSaplingPaymentAddressSize) {
// Bech32 decoding // Bech32 decoding
data.reserve((bech.second.size() * 5) / 8); data.reserve((bech.second.size() * 5) / 8);
@ -352,7 +356,11 @@ libzcash::SpendingKey DecodeSpendingKey(const std::string& str)
} }
data.clear(); data.clear();
auto bech = bech32::Decode(str); auto bech = bech32::Decode(str);
if (bech.first == Params().Bech32HRP(CChainParams::SAPLING_SPENDING_KEY) && bool allowSapling = Params().NetworkIDString() == "regtest" || (
Params().NetworkIDString() == "test" &&
GetBoolArg("-experimentalfeatures", false) &&
GetBoolArg("-developersapling", false));
if (allowSapling && bech.first == Params().Bech32HRP(CChainParams::SAPLING_SPENDING_KEY) &&
bech.second.size() == ConvertedSaplingSpendingKeySize) { bech.second.size() == ConvertedSaplingSpendingKeySize) {
// Bech32 decoding // Bech32 decoding
data.reserve((bech.second.size() * 5) / 8); data.reserve((bech.second.size() * 5) / 8);

View File

@ -223,11 +223,13 @@ BOOST_AUTO_TEST_CASE(zc_address_test)
BOOST_AUTO_TEST_CASE(zs_address_test) BOOST_AUTO_TEST_CASE(zs_address_test)
{ {
SelectParams(CBaseChainParams::REGTEST);
for (size_t i = 0; i < 1000; i++) { for (size_t i = 0; i < 1000; i++) {
auto sk = SaplingSpendingKey::random(); auto sk = SaplingSpendingKey::random();
{ {
std::string sk_string = EncodeSpendingKey(sk); std::string sk_string = EncodeSpendingKey(sk);
BOOST_CHECK(sk_string.compare(0, 24, Params().Bech32HRP(CChainParams::SAPLING_SPENDING_KEY)) == 0); BOOST_CHECK(sk_string.compare(0, 27, Params().Bech32HRP(CChainParams::SAPLING_SPENDING_KEY)) == 0);
auto spendingkey2 = DecodeSpendingKey(sk_string); auto spendingkey2 = DecodeSpendingKey(sk_string);
BOOST_CHECK(IsValidSpendingKey(spendingkey2)); BOOST_CHECK(IsValidSpendingKey(spendingkey2));
@ -240,7 +242,7 @@ BOOST_AUTO_TEST_CASE(zs_address_test)
auto addr = sk.default_address(); auto addr = sk.default_address();
std::string addr_string = EncodePaymentAddress(addr); std::string addr_string = EncodePaymentAddress(addr);
BOOST_CHECK(addr_string.compare(0, 2, Params().Bech32HRP(CChainParams::SAPLING_PAYMENT_ADDRESS)) == 0); BOOST_CHECK(addr_string.compare(0, 15, Params().Bech32HRP(CChainParams::SAPLING_PAYMENT_ADDRESS)) == 0);
auto paymentaddr2 = DecodePaymentAddress(addr_string); auto paymentaddr2 = DecodePaymentAddress(addr_string);
BOOST_CHECK(IsValidPaymentAddress(paymentaddr2)); BOOST_CHECK(IsValidPaymentAddress(paymentaddr2));

View File

@ -383,12 +383,13 @@ BOOST_AUTO_TEST_CASE(rpc_wallet_z_validateaddress)
BOOST_CHECK_NO_THROW(retValue = CallRPC("z_validateaddress zs1z7rejlpsa98s2rrrfkwmaxu53e4ue0ulcrw0h4x5g8jl04tak0d3mm47vdtahatqrlkngh9slya")); BOOST_CHECK_NO_THROW(retValue = CallRPC("z_validateaddress zs1z7rejlpsa98s2rrrfkwmaxu53e4ue0ulcrw0h4x5g8jl04tak0d3mm47vdtahatqrlkngh9slya"));
resultObj = retValue.get_obj(); resultObj = retValue.get_obj();
b = find_value(resultObj, "isvalid").get_bool(); b = find_value(resultObj, "isvalid").get_bool();
BOOST_CHECK_EQUAL(b, true); // TODO: Revert when we re-enable Sapling addresses on mainnet
BOOST_CHECK_EQUAL(find_value(resultObj, "type").get_str(), "sapling");
b = find_value(resultObj, "ismine").get_bool();
BOOST_CHECK_EQUAL(b, false); BOOST_CHECK_EQUAL(b, false);
BOOST_CHECK_EQUAL(find_value(resultObj, "diversifier").get_str(), "1787997c30e94f050c634d"); // BOOST_CHECK_EQUAL(find_value(resultObj, "type").get_str(), "sapling");
BOOST_CHECK_EQUAL(find_value(resultObj, "diversifiedtransmissionkey").get_str(), "34ed1f60f5db5763beee1ddbb37dd5f7e541d4d4fbdcc09fbfcc6b8e949bbe9d"); // b = find_value(resultObj, "ismine").get_bool();
// BOOST_CHECK_EQUAL(b, false);
// BOOST_CHECK_EQUAL(find_value(resultObj, "diversifier").get_str(), "1787997c30e94f050c634d");
// BOOST_CHECK_EQUAL(find_value(resultObj, "diversifiedtransmissionkey").get_str(), "34ed1f60f5db5763beee1ddbb37dd5f7e541d4d4fbdcc09fbfcc6b8e949bbe9d");
} }
/* /*
@ -536,6 +537,8 @@ BOOST_AUTO_TEST_CASE(rpc_wallet_z_importwallet)
*/ */
BOOST_AUTO_TEST_CASE(rpc_wallet_z_importexport) BOOST_AUTO_TEST_CASE(rpc_wallet_z_importexport)
{ {
SelectParams(CBaseChainParams::REGTEST);
LOCK2(cs_main, pwalletMain->cs_wallet); LOCK2(cs_main, pwalletMain->cs_wallet);
UniValue retValue; UniValue retValue;
int n1 = 1000; // number of times to import/export int n1 = 1000; // number of times to import/export

View File

@ -3133,9 +3133,13 @@ UniValue z_getnewaddress(const UniValue& params, bool fHelp)
addrType = params[0].get_str(); addrType = params[0].get_str();
} }
bool allowSapling = Params().NetworkIDString() == "regtest" || (
Params().NetworkIDString() == "test" &&
GetBoolArg("-experimentalfeatures", false) &&
GetBoolArg("-developersapling", false));
if (addrType == ADDR_TYPE_SPROUT) { if (addrType == ADDR_TYPE_SPROUT) {
return EncodePaymentAddress(pwalletMain->GenerateNewZKey()); return EncodePaymentAddress(pwalletMain->GenerateNewZKey());
} else if (addrType == ADDR_TYPE_SAPLING) { } else if (addrType == ADDR_TYPE_SAPLING && allowSapling) {
return EncodePaymentAddress(pwalletMain->GenerateNewSaplingZKey()); return EncodePaymentAddress(pwalletMain->GenerateNewSaplingZKey());
} else { } else {
throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid address type"); throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid address type");