mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-04-22 20:58:09 +02:00
rpc: Move the generate RPC call to rpcwallet
This makes it possible to mine to any wallet when multi-wallet mode is added. Solves the same problem as #10649, but IMO in a cleaner way. It also gets rid of the circuitous `ScriptForMining` method on `CValidationInterface`, which really doesn't belong there. After this change it's still possible to mine without wallet through `generatetoaddress`.
This commit is contained in:
@@ -15,6 +15,7 @@
|
||||
#include "policy/fees.h"
|
||||
#include "policy/policy.h"
|
||||
#include "policy/rbf.h"
|
||||
#include "rpc/mining.h"
|
||||
#include "rpc/server.h"
|
||||
#include "script/sign.h"
|
||||
#include "timedata.h"
|
||||
@@ -2922,6 +2923,47 @@ UniValue bumpfee(const JSONRPCRequest& request)
|
||||
return result;
|
||||
}
|
||||
|
||||
UniValue generate(const JSONRPCRequest& request)
|
||||
{
|
||||
CWallet * const pwallet = GetWalletForJSONRPCRequest(request);
|
||||
|
||||
if (!EnsureWalletIsAvailable(pwallet, request.fHelp))
|
||||
return NullUniValue;
|
||||
|
||||
if (request.fHelp || request.params.size() < 1 || request.params.size() > 2)
|
||||
throw std::runtime_error(
|
||||
"generate nblocks ( maxtries )\n"
|
||||
"\nMine up to nblocks blocks immediately (before the RPC call returns) to an address in the wallet.\n"
|
||||
"\nArguments:\n"
|
||||
"1. nblocks (numeric, required) How many blocks are generated immediately.\n"
|
||||
"2. maxtries (numeric, optional) How many iterations to try (default = 1000000).\n"
|
||||
"\nResult:\n"
|
||||
"[ blockhashes ] (array) hashes of blocks generated\n"
|
||||
"\nExamples:\n"
|
||||
"\nGenerate 11 blocks\n"
|
||||
+ HelpExampleCli("generate", "11")
|
||||
);
|
||||
|
||||
int nGenerate = request.params[0].get_int();
|
||||
uint64_t nMaxTries = 1000000;
|
||||
if (request.params.size() > 1) {
|
||||
nMaxTries = request.params[1].get_int();
|
||||
}
|
||||
|
||||
std::shared_ptr<CReserveScript> coinbaseScript;
|
||||
pwallet->GetScriptForMining(coinbaseScript);
|
||||
|
||||
// If the keypool is exhausted, no script is returned at all. Catch this.
|
||||
if (!coinbaseScript)
|
||||
throw JSONRPCError(RPC_WALLET_KEYPOOL_RAN_OUT, "Error: Keypool ran out, please call keypoolrefill first");
|
||||
|
||||
//throw an error if no script was provided
|
||||
if (coinbaseScript->reserveScript.empty())
|
||||
throw JSONRPCError(RPC_INTERNAL_ERROR, "No coinbase script available (mining requires a wallet)");
|
||||
|
||||
return generateBlocks(coinbaseScript, nGenerate, nMaxTries, true);
|
||||
}
|
||||
|
||||
extern UniValue abortrescan(const JSONRPCRequest& request); // in rpcdump.cpp
|
||||
extern UniValue dumpprivkey(const JSONRPCRequest& request); // in rpcdump.cpp
|
||||
extern UniValue importprivkey(const JSONRPCRequest& request);
|
||||
@@ -2985,6 +3027,8 @@ static const CRPCCommand commands[] =
|
||||
{ "wallet", "walletpassphrasechange", &walletpassphrasechange, true, {"oldpassphrase","newpassphrase"} },
|
||||
{ "wallet", "walletpassphrase", &walletpassphrase, true, {"passphrase","timeout"} },
|
||||
{ "wallet", "removeprunedfunds", &removeprunedfunds, true, {"txid"} },
|
||||
|
||||
{ "generating", "generate", &generate, true, {"nblocks","maxtries"} },
|
||||
};
|
||||
|
||||
void RegisterWalletRPCCommands(CRPCTable &t)
|
||||
|
||||
Reference in New Issue
Block a user