Merge pull request #5474 from LarryRuane/2022-01-disable-sprout-addr-gen
rpc: Disable Sprout address generation at Canopy #5368
This commit is contained in:
commit
28eddb7c21
|
@ -41,6 +41,7 @@ class RemoveSproutShieldingTest (BitcoinTestFramework):
|
||||||
|
|
||||||
# Shield coinbase to Sprout on node 0. Should pass
|
# Shield coinbase to Sprout on node 0. Should pass
|
||||||
sprout_addr = self.nodes[0].z_getnewaddress('sprout')
|
sprout_addr = self.nodes[0].z_getnewaddress('sprout')
|
||||||
|
sprout_addr_node2 = self.nodes[2].z_getnewaddress('sprout')
|
||||||
myopid = self.nodes[0].z_shieldcoinbase(get_coinbase_address(self.nodes[0]), sprout_addr, 0)['opid']
|
myopid = self.nodes[0].z_shieldcoinbase(get_coinbase_address(self.nodes[0]), sprout_addr, 0)['opid']
|
||||||
wait_and_assert_operationid_status(self.nodes[0], myopid)
|
wait_and_assert_operationid_status(self.nodes[0], myopid)
|
||||||
print("taddr -> Sprout z_shieldcoinbase tx accepted before Canopy on node 0")
|
print("taddr -> Sprout z_shieldcoinbase tx accepted before Canopy on node 0")
|
||||||
|
@ -69,6 +70,7 @@ class RemoveSproutShieldingTest (BitcoinTestFramework):
|
||||||
# included in the next (or later) block, after Canopy has activated.
|
# included in the next (or later) block, after Canopy has activated.
|
||||||
self.nodes[0].generate(5)
|
self.nodes[0].generate(5)
|
||||||
self.sync_all()
|
self.sync_all()
|
||||||
|
assert_equal(self.nodes[0].getblockchaininfo()['upgrades']['e9ff75a6']['status'], 'pending')
|
||||||
|
|
||||||
# Shield coinbase to Sprout on node 0. Should fail
|
# Shield coinbase to Sprout on node 0. Should fail
|
||||||
sprout_addr = self.nodes[0].z_getnewaddress('sprout')
|
sprout_addr = self.nodes[0].z_getnewaddress('sprout')
|
||||||
|
@ -101,8 +103,17 @@ class RemoveSproutShieldingTest (BitcoinTestFramework):
|
||||||
wait_and_assert_operationid_status(self.nodes[0], merge_tx_1['opid'])
|
wait_and_assert_operationid_status(self.nodes[0], merge_tx_1['opid'])
|
||||||
print("Sprout -> Sprout z_mergetoaddress tx accepted at Canopy activation on node 0")
|
print("Sprout -> Sprout z_mergetoaddress tx accepted at Canopy activation on node 0")
|
||||||
|
|
||||||
|
# Activate Canopy
|
||||||
self.nodes[0].generate(1)
|
self.nodes[0].generate(1)
|
||||||
self.sync_all()
|
self.sync_all()
|
||||||
|
assert_equal(self.nodes[0].getblockchaininfo()['upgrades']['e9ff75a6']['status'], 'active')
|
||||||
|
|
||||||
|
# Generating a Sprout address should fail after Canopy.
|
||||||
|
assert_raises_message(
|
||||||
|
JSONRPCException,
|
||||||
|
"Invalid address type, \"sprout\" is not allowed after Canopy",
|
||||||
|
self.nodes[0].z_getnewaddress, 'sprout')
|
||||||
|
print("Sprout z_getnewaddress rejected at Canopy activation on node 0")
|
||||||
|
|
||||||
# Shield coinbase to Sapling on node 0. Should pass
|
# Shield coinbase to Sapling on node 0. Should pass
|
||||||
sapling_addr = self.nodes[0].z_getnewaddress('sapling')
|
sapling_addr = self.nodes[0].z_getnewaddress('sapling')
|
||||||
|
@ -115,7 +126,7 @@ class RemoveSproutShieldingTest (BitcoinTestFramework):
|
||||||
self.sync_all()
|
self.sync_all()
|
||||||
|
|
||||||
# Create z_mergetoaddress Sprout -> Sprout transaction on node 1. Should pass
|
# Create z_mergetoaddress Sprout -> Sprout transaction on node 1. Should pass
|
||||||
merge_tx_2 = self.nodes[1].z_mergetoaddress(["ANY_SPROUT"], self.nodes[2].z_getnewaddress('sprout'))
|
merge_tx_2 = self.nodes[1].z_mergetoaddress(["ANY_SPROUT"], sprout_addr_node2)
|
||||||
wait_and_assert_operationid_status(self.nodes[1], merge_tx_2['opid'])
|
wait_and_assert_operationid_status(self.nodes[1], merge_tx_2['opid'])
|
||||||
print("Sprout -> Sprout z_mergetoaddress tx accepted at NU5 activation on node 1")
|
print("Sprout -> Sprout z_mergetoaddress tx accepted at NU5 activation on node 1")
|
||||||
|
|
||||||
|
|
|
@ -2911,6 +2911,7 @@ UniValue z_getnewaddress(const UniValue& params, bool fHelp)
|
||||||
"z_getnewaddress ( type )\n"
|
"z_getnewaddress ( type )\n"
|
||||||
"\nReturns a new shielded address for receiving payments.\n"
|
"\nReturns a new shielded address for receiving payments.\n"
|
||||||
"\nWith no arguments, returns a Sapling address.\n"
|
"\nWith no arguments, returns a Sapling address.\n"
|
||||||
|
"Generating a Sprout address is not allowed after Canopy has activated.\n"
|
||||||
"\nArguments:\n"
|
"\nArguments:\n"
|
||||||
"1. \"type\" (string, optional, default=\"" + defaultType + "\") The type of address. One of [\""
|
"1. \"type\" (string, optional, default=\"" + defaultType + "\") The type of address. One of [\""
|
||||||
+ ADDR_TYPE_SPROUT + "\", \"" + ADDR_TYPE_SAPLING + "\"].\n"
|
+ ADDR_TYPE_SPROUT + "\", \"" + ADDR_TYPE_SAPLING + "\"].\n"
|
||||||
|
@ -2931,8 +2932,16 @@ UniValue z_getnewaddress(const UniValue& params, bool fHelp)
|
||||||
addrType = params[0].get_str();
|
addrType = params[0].get_str();
|
||||||
}
|
}
|
||||||
|
|
||||||
KeyIO keyIO(Params());
|
const auto& chainparams = Params();
|
||||||
|
KeyIO keyIO(chainparams);
|
||||||
if (addrType == ADDR_TYPE_SPROUT) {
|
if (addrType == ADDR_TYPE_SPROUT) {
|
||||||
|
if (chainparams.GetConsensus().NetworkUpgradeActive(chainActive.Height(), Consensus::UPGRADE_CANOPY)) {
|
||||||
|
throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid address type, \""
|
||||||
|
+ ADDR_TYPE_SPROUT + "\" is not allowed after Canopy");
|
||||||
|
}
|
||||||
|
if (IsInitialBlockDownload(Params().GetConsensus())) {
|
||||||
|
throw JSONRPCError(RPC_CLIENT_IN_INITIAL_DOWNLOAD, "Error: Creating a Sprout address during initial block download is not supported.");
|
||||||
|
}
|
||||||
return keyIO.EncodePaymentAddress(pwalletMain->GenerateNewSproutZKey());
|
return keyIO.EncodePaymentAddress(pwalletMain->GenerateNewSproutZKey());
|
||||||
} else if (addrType == ADDR_TYPE_SAPLING) {
|
} else if (addrType == ADDR_TYPE_SAPLING) {
|
||||||
return keyIO.EncodePaymentAddress(pwalletMain->GenerateNewSaplingZKey());
|
return keyIO.EncodePaymentAddress(pwalletMain->GenerateNewSaplingZKey());
|
||||||
|
|
|
@ -812,6 +812,11 @@ BOOST_AUTO_TEST_CASE(rpc_wallet_z_getnewaddress) {
|
||||||
addr = CallRPC("z_getnewaddress sprout");
|
addr = CallRPC("z_getnewaddress sprout");
|
||||||
CheckHaveAddr<SproutPaymentAddress>(keyIO.DecodePaymentAddress(addr.get_str()));
|
CheckHaveAddr<SproutPaymentAddress>(keyIO.DecodePaymentAddress(addr.get_str()));
|
||||||
|
|
||||||
|
// Requesting a sprout address during IBD should fail
|
||||||
|
bool ibd = TestSetIBD(true);
|
||||||
|
CheckRPCThrows("z_getnewaddress sprout", "Error: Creating a Sprout address during initial block download is not supported.");
|
||||||
|
TestSetIBD(ibd);
|
||||||
|
|
||||||
// Should throw on invalid argument
|
// Should throw on invalid argument
|
||||||
CheckRPCThrows("z_getnewaddress garbage", "Invalid address type");
|
CheckRPCThrows("z_getnewaddress garbage", "Invalid address type");
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue