mirror of
https://github.com/dashpay/dash.git
synced 2024-12-25 12:02:48 +01:00
Merge #15492: [rpc] remove deprecated generate method
07cae5287c [wallet] remove unused GetScriptForMining (Sjors Provoost) 8bb3e4c487 [rpc] remove deprecated generate method (Sjors Provoost) Pull request description: As announced in v0.18, the wallet generate rpc method is deprecated and will be fully removed in v0.19. Clients should transition to using the node rpc method `generatetoaddress`. Tree-SHA512: 9e5e913b59f3e18440b2b7b356124c7b87ad19f81a1ab6ada06a6c396b84e734895465f569296f1ba8c12abf74863bab5fd77765c9e806c239713aa83a59485f
This commit is contained in:
parent
e4f621fd57
commit
8cac4ed930
11
doc/release-notes-15492.md
Normal file
11
doc/release-notes-15492.md
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
Deprecated or removed RPCs
|
||||||
|
--------------------------
|
||||||
|
- The wallet's `generate` RPC method was deprecated in v0.18 and has now
|
||||||
|
been fully removed. This RPC is only used for
|
||||||
|
testing, but its implementation reached across multiple subsystems
|
||||||
|
(wallet and mining), so it has been removed to simplify the
|
||||||
|
wallet-node interface. Projects that are using `generate` for testing
|
||||||
|
purposes should transition to using the `generatetoaddress` RPC, which
|
||||||
|
does not require or use the wallet component. Calling
|
||||||
|
`generatetoaddress` with an address returned by the `getnewaddress`
|
||||||
|
RPC gives the same functionality as the old `generate` RPC.
|
@ -29,8 +29,6 @@ static const CRPCConvertParam vRPCConvertParams[] =
|
|||||||
{ "setmocktime", 0, "timestamp" },
|
{ "setmocktime", 0, "timestamp" },
|
||||||
{ "mockscheduler", 0, "delta_time" },
|
{ "mockscheduler", 0, "delta_time" },
|
||||||
#if ENABLE_MINER
|
#if ENABLE_MINER
|
||||||
{ "generate", 0, "nblocks" },
|
|
||||||
{ "generate", 1, "maxtries" },
|
|
||||||
{ "generatetoaddress", 0, "nblocks" },
|
{ "generatetoaddress", 0, "nblocks" },
|
||||||
{ "generatetoaddress", 2, "maxtries" },
|
{ "generatetoaddress", 2, "maxtries" },
|
||||||
{ "generatetodescriptor", 0, "num_blocks" },
|
{ "generatetodescriptor", 0, "num_blocks" },
|
||||||
|
@ -13,7 +13,6 @@
|
|||||||
#include <policy/feerate.h>
|
#include <policy/feerate.h>
|
||||||
#include <policy/fees.h>
|
#include <policy/fees.h>
|
||||||
#include <rpc/blockchain.h>
|
#include <rpc/blockchain.h>
|
||||||
#include <rpc/mining.h>
|
|
||||||
#include <rpc/rawtransaction_util.h>
|
#include <rpc/rawtransaction_util.h>
|
||||||
#include <rpc/server.h>
|
#include <rpc/server.h>
|
||||||
#include <rpc/util.h>
|
#include <rpc/util.h>
|
||||||
@ -3326,67 +3325,6 @@ UniValue signrawtransactionwithwallet(const JSONRPCRequest& request)
|
|||||||
return SignTransaction(mtx, request.params[1], pwallet, coins, false, request.params[2]);
|
return SignTransaction(mtx, request.params[1], pwallet, coins, false, request.params[2]);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if ENABLE_MINER
|
|
||||||
UniValue generate(const JSONRPCRequest& request)
|
|
||||||
{
|
|
||||||
if (request.fHelp || request.params.size() < 1 || request.params.size() > 2) {
|
|
||||||
throw std::runtime_error(
|
|
||||||
RPCHelpMan{"generate",
|
|
||||||
"\nMine up to nblocks blocks immediately (before the RPC call returns) to an address in the wallet.\n",
|
|
||||||
{
|
|
||||||
{"nblocks", RPCArg::Type::NUM, RPCArg::Optional::NO, "How many blocks are generated immediately."},
|
|
||||||
{"maxtries", RPCArg::Type::NUM, /* default */ "1000000", "How many iterations to try."},
|
|
||||||
},
|
|
||||||
RPCResult{
|
|
||||||
"[ blockhashes ] (json array) hashes of blocks generated\n"
|
|
||||||
},
|
|
||||||
RPCExamples{
|
|
||||||
"\nGenerate 11 blocks\n"
|
|
||||||
+ HelpExampleCli("generate", "11")
|
|
||||||
},
|
|
||||||
}.ToString());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!IsDeprecatedRPCEnabled("generate")) {
|
|
||||||
throw JSONRPCError(RPC_METHOD_DEPRECATED, "The wallet generate rpc method is deprecated and will be fully removed in v0.19. "
|
|
||||||
"To use generate in v0.18, restart dashd with -deprecatedrpc=generate.\n"
|
|
||||||
"Clients should transition to using the node rpc method generatetoaddress\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
|
|
||||||
if (!wallet) return NullUniValue;
|
|
||||||
CWallet* const pwallet = wallet.get();
|
|
||||||
|
|
||||||
int num_generate = request.params[0].get_int();
|
|
||||||
uint64_t max_tries = 1000000;
|
|
||||||
if (!request.params[1].isNull()) {
|
|
||||||
max_tries = request.params[1].get_int();
|
|
||||||
}
|
|
||||||
|
|
||||||
std::shared_ptr<CReserveScript> coinbase_script;
|
|
||||||
pwallet->GetScriptForMining(coinbase_script);
|
|
||||||
|
|
||||||
// If the keypool is exhausted, no script is returned at all. Catch this.
|
|
||||||
if (!coinbase_script) {
|
|
||||||
throw JSONRPCError(RPC_WALLET_KEYPOOL_RAN_OUT, "Error: Keypool ran out, please call keypoolrefill first");
|
|
||||||
}
|
|
||||||
|
|
||||||
//throw an error if no script was provided
|
|
||||||
if (coinbase_script->reserveScript.empty()) {
|
|
||||||
throw JSONRPCError(RPC_INTERNAL_ERROR, "No coinbase script available");
|
|
||||||
}
|
|
||||||
|
|
||||||
const CTxMemPool& mempool = EnsureMemPool();
|
|
||||||
|
|
||||||
return generateBlocks(mempool, coinbase_script, num_generate, max_tries, true);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
UniValue generate(const JSONRPCRequest& request)
|
|
||||||
{
|
|
||||||
throw JSONRPCError(RPC_METHOD_NOT_FOUND, "This call is not available because RPC miner isn't compiled");
|
|
||||||
}
|
|
||||||
#endif //ENABLE_MINING
|
|
||||||
|
|
||||||
static UniValue rescanblockchain(const JSONRPCRequest& request)
|
static UniValue rescanblockchain(const JSONRPCRequest& request)
|
||||||
{
|
{
|
||||||
if (request.fHelp || request.params.size() > 2) {
|
if (request.fHelp || request.params.size() > 2) {
|
||||||
@ -3990,11 +3928,6 @@ UniValue walletcreatefundedpsbt(const JSONRPCRequest& request)
|
|||||||
static const CRPCCommand commands[] =
|
static const CRPCCommand commands[] =
|
||||||
{ // category name actor (function) argNames
|
{ // category name actor (function) argNames
|
||||||
// --------------------- ------------------------ ----------------------- ----------
|
// --------------------- ------------------------ ----------------------- ----------
|
||||||
#if ENABLE_MINER
|
|
||||||
{ "generating", "generate", &generate, {"nblocks","maxtries"} },
|
|
||||||
#else
|
|
||||||
{ "hidden", "generate", &generate, {"nblocks","maxtries"} }, // Hidden as it isn't functional, just an error to let people know if miner isn't compiled
|
|
||||||
#endif //ENABLE_MINER
|
|
||||||
{ "hidden", "instantsendtoaddress", &instantsendtoaddress, {} },
|
{ "hidden", "instantsendtoaddress", &instantsendtoaddress, {} },
|
||||||
{ "rawtransactions", "fundrawtransaction", &fundrawtransaction, {"hexstring","options"} },
|
{ "rawtransactions", "fundrawtransaction", &fundrawtransaction, {"hexstring","options"} },
|
||||||
{ "wallet", "abandontransaction", &abandontransaction, {"txid"} },
|
{ "wallet", "abandontransaction", &abandontransaction, {"txid"} },
|
||||||
|
@ -4772,17 +4772,6 @@ void CWallet::MarkReserveKeysAsUsed(int64_t keypool_id)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CWallet::GetScriptForMining(std::shared_ptr<CReserveScript> &script)
|
|
||||||
{
|
|
||||||
std::shared_ptr<CReserveKey> rKey = std::make_shared<CReserveKey>(this);
|
|
||||||
CPubKey pubkey;
|
|
||||||
if (!rKey->GetReservedKey(pubkey, false))
|
|
||||||
return;
|
|
||||||
|
|
||||||
script = rKey;
|
|
||||||
script->reserveScript = CScript() << ToByteVector(pubkey) << OP_CHECKSIG;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CWallet::LockCoin(const COutPoint& output)
|
void CWallet::LockCoin(const COutPoint& output)
|
||||||
{
|
{
|
||||||
AssertLockHeld(cs_wallet);
|
AssertLockHeld(cs_wallet);
|
||||||
|
@ -1177,8 +1177,6 @@ public:
|
|||||||
|
|
||||||
bool DelAddressBook(const CTxDestination& address);
|
bool DelAddressBook(const CTxDestination& address);
|
||||||
|
|
||||||
void GetScriptForMining(std::shared_ptr<CReserveScript> &script);
|
|
||||||
|
|
||||||
unsigned int GetKeyPoolSize() EXCLUSIVE_LOCKS_REQUIRED(cs_wallet)
|
unsigned int GetKeyPoolSize() EXCLUSIVE_LOCKS_REQUIRED(cs_wallet)
|
||||||
{
|
{
|
||||||
AssertLockHeld(cs_wallet);
|
AssertLockHeld(cs_wallet);
|
||||||
|
@ -4,28 +4,26 @@
|
|||||||
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
"""Test deprecation of RPC calls."""
|
"""Test deprecation of RPC calls."""
|
||||||
from test_framework.test_framework import BitcoinTestFramework
|
from test_framework.test_framework import BitcoinTestFramework
|
||||||
|
# from test_framework.util import assert_raises_rpc_error
|
||||||
|
|
||||||
class DeprecatedRpcTest(BitcoinTestFramework):
|
class DeprecatedRpcTest(BitcoinTestFramework):
|
||||||
def set_test_params(self):
|
def set_test_params(self):
|
||||||
self.num_nodes = 2
|
self.num_nodes = 2
|
||||||
self.setup_clean_chain = True
|
self.setup_clean_chain = True
|
||||||
self.extra_args = [[], ["-deprecatedrpc=generate"]]
|
self.extra_args = [[], []]
|
||||||
|
|
||||||
def skip_test_if_missing_module(self):
|
|
||||||
# The generate RPC method requires the wallet to be compiled
|
|
||||||
self.skip_if_no_wallet()
|
|
||||||
|
|
||||||
def run_test(self):
|
def run_test(self):
|
||||||
# This test should be used to verify correct behaviour of deprecated
|
# This test should be used to verify correct behaviour of deprecated
|
||||||
# RPC methods with and without the -deprecatedrpc flags. For example:
|
# RPC methods with and without the -deprecatedrpc flags. For example:
|
||||||
#
|
#
|
||||||
# self.log.info("Make sure that -deprecatedrpc=createmultisig allows it to take addresses")
|
# In set_test_params:
|
||||||
# assert_raises_rpc_error(-5, "Invalid public key", self.nodes[0].createmultisig, 1, [self.nodes[0].getnewaddress()])
|
# self.extra_args = [[], ["-deprecatedrpc=generate"]]
|
||||||
# self.nodes[1].createmultisig(1, [self.nodes[1].getnewaddress()])
|
#
|
||||||
|
# In run_test:
|
||||||
self.log.info("Test generate RPC")
|
# self.log.info("Test generate RPC")
|
||||||
assert_raises_rpc_error(-32, 'The wallet generate rpc method is deprecated', self.nodes[0].rpc.generate, 1)
|
# assert_raises_rpc_error(-32, 'The wallet generate rpc method is deprecated', self.nodes[0].rpc.generate, 1)
|
||||||
self.nodes[1].generate(1)
|
# self.nodes[1].generate(1)
|
||||||
|
self.log.info("No tested deprecated RPC methods")
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
DeprecatedRpcTest().main()
|
DeprecatedRpcTest().main()
|
||||||
|
Loading…
Reference in New Issue
Block a user