mirror of
https://github.com/dashpay/dash.git
synced 2024-12-26 04:22:55 +01:00
merge bitcoin#16943: Add generatetodescriptor RPC
This commit is contained in:
parent
41252a1de2
commit
c18786d9cf
@ -33,6 +33,8 @@ static const CRPCConvertParam vRPCConvertParams[] =
|
|||||||
{ "generate", 1, "maxtries" },
|
{ "generate", 1, "maxtries" },
|
||||||
{ "generatetoaddress", 0, "nblocks" },
|
{ "generatetoaddress", 0, "nblocks" },
|
||||||
{ "generatetoaddress", 2, "maxtries" },
|
{ "generatetoaddress", 2, "maxtries" },
|
||||||
|
{ "generatetodescriptor", 0, "num_blocks" },
|
||||||
|
{ "generatetodescriptor", 2, "maxtries" },
|
||||||
#endif // ENABLE_MINER
|
#endif // ENABLE_MINER
|
||||||
{ "getnetworkhashps", 0, "nblocks" },
|
{ "getnetworkhashps", 0, "nblocks" },
|
||||||
{ "getnetworkhashps", 1, "height" },
|
{ "getnetworkhashps", 1, "height" },
|
||||||
|
@ -21,6 +21,8 @@
|
|||||||
#include <rpc/mining.h>
|
#include <rpc/mining.h>
|
||||||
#include <rpc/server.h>
|
#include <rpc/server.h>
|
||||||
#include <rpc/util.h>
|
#include <rpc/util.h>
|
||||||
|
#include <script/descriptor.h>
|
||||||
|
#include <script/sign.h>
|
||||||
#include <shutdown.h>
|
#include <shutdown.h>
|
||||||
#include <txmempool.h>
|
#include <txmempool.h>
|
||||||
#include <util/fees.h>
|
#include <util/fees.h>
|
||||||
@ -154,6 +156,50 @@ UniValue generateBlocks(std::shared_ptr<CReserveScript> coinbaseScript, int nGen
|
|||||||
return blockHashes;
|
return blockHashes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static UniValue generatetodescriptor(const JSONRPCRequest& request)
|
||||||
|
{
|
||||||
|
RPCHelpMan{
|
||||||
|
"generatetodescriptor",
|
||||||
|
"\nMine blocks immediately to a specified descriptor (before the RPC call returns)\n",
|
||||||
|
{
|
||||||
|
{"num_blocks", RPCArg::Type::NUM, RPCArg::Optional::NO, "How many blocks are generated immediately."},
|
||||||
|
{"descriptor", RPCArg::Type::STR, RPCArg::Optional::NO, "The descriptor to send the newly generated bitcoin to."},
|
||||||
|
{"maxtries", RPCArg::Type::NUM, /* default */ "1000000", "How many iterations to try."},
|
||||||
|
},
|
||||||
|
RPCResult{
|
||||||
|
"[ blockhashes ] (array) hashes of blocks generated\n"},
|
||||||
|
RPCExamples{
|
||||||
|
"\nGenerate 11 blocks to mydesc\n" + HelpExampleCli("generatetodescriptor", "11 \"mydesc\"")},
|
||||||
|
}
|
||||||
|
.Check(request);
|
||||||
|
|
||||||
|
const int num_blocks{request.params[0].get_int()};
|
||||||
|
const int64_t max_tries{request.params[2].isNull() ? 1000000 : request.params[2].get_int()};
|
||||||
|
|
||||||
|
FlatSigningProvider key_provider;
|
||||||
|
std::string error;
|
||||||
|
const auto desc = Parse(request.params[1].get_str(), key_provider, error, /* require_checksum = */ false);
|
||||||
|
if (!desc) {
|
||||||
|
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, error);
|
||||||
|
}
|
||||||
|
if (desc->IsRange()) {
|
||||||
|
throw JSONRPCError(RPC_INVALID_PARAMETER, "Ranged descriptor not accepted. Maybe pass through deriveaddresses first?");
|
||||||
|
}
|
||||||
|
|
||||||
|
FlatSigningProvider provider;
|
||||||
|
std::vector<CScript> coinbase_script;
|
||||||
|
if (!desc->Expand(0, key_provider, coinbase_script, provider)) {
|
||||||
|
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, strprintf("Cannot derive script without private keys"));
|
||||||
|
}
|
||||||
|
|
||||||
|
CHECK_NONFATAL(coinbase_script.size() == 1);
|
||||||
|
|
||||||
|
std::shared_ptr<CReserveScript> coinbaseScript = std::make_shared<CReserveScript>();
|
||||||
|
coinbaseScript->reserveScript = coinbase_script.at(0);
|
||||||
|
|
||||||
|
return generateBlocks(coinbaseScript, num_blocks, max_tries, false);
|
||||||
|
}
|
||||||
|
|
||||||
static UniValue generatetoaddress(const JSONRPCRequest& request)
|
static UniValue generatetoaddress(const JSONRPCRequest& request)
|
||||||
{
|
{
|
||||||
if (request.fHelp || request.params.size() < 2 || request.params.size() > 3)
|
if (request.fHelp || request.params.size() < 2 || request.params.size() > 3)
|
||||||
@ -197,6 +243,10 @@ static UniValue generatetoaddress(const JSONRPCRequest& request)
|
|||||||
{
|
{
|
||||||
throw JSONRPCError(RPC_METHOD_NOT_FOUND, "This call is not available because RPC miner isn't compiled");
|
throw JSONRPCError(RPC_METHOD_NOT_FOUND, "This call is not available because RPC miner isn't compiled");
|
||||||
}
|
}
|
||||||
|
static UniValue generatetodescriptor(const JSONRPCRequest& request)
|
||||||
|
{
|
||||||
|
throw JSONRPCError(RPC_METHOD_NOT_FOUND, "This call is not available because RPC miner isn't compiled");
|
||||||
|
}
|
||||||
#endif // ENABLE_MINER
|
#endif // ENABLE_MINER
|
||||||
|
|
||||||
static UniValue getmininginfo(const JSONRPCRequest& request)
|
static UniValue getmininginfo(const JSONRPCRequest& request)
|
||||||
@ -1011,8 +1061,10 @@ static const CRPCCommand commands[] =
|
|||||||
|
|
||||||
#if ENABLE_MINER
|
#if ENABLE_MINER
|
||||||
{ "generating", "generatetoaddress", &generatetoaddress, {"nblocks","address","maxtries"} },
|
{ "generating", "generatetoaddress", &generatetoaddress, {"nblocks","address","maxtries"} },
|
||||||
|
{ "generating", "generatetodescriptor", &generatetodescriptor, {"num_blocks","descriptor","maxtries"} },
|
||||||
#else
|
#else
|
||||||
{ "hidden", "generatetoaddress", &generatetoaddress, {"nblocks","address","maxtries"} }, // Hidden as it isn't functional, just an error to let people know if miner isn't compiled
|
{ "hidden", "generatetoaddress", &generatetoaddress, {"nblocks","address","maxtries"} }, // Hidden as it isn't functional, just an error to let people know if miner isn't compiled
|
||||||
|
{ "hidden", "generatetodescriptor", &generatetodescriptor, {"num_blocks","descriptor","maxtries"} },
|
||||||
#endif // ENABLE_MINER
|
#endif // ENABLE_MINER
|
||||||
|
|
||||||
{ "util", "estimatesmartfee", &estimatesmartfee, {"conf_target", "estimate_mode"} },
|
{ "util", "estimatesmartfee", &estimatesmartfee, {"conf_target", "estimate_mode"} },
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
"""Test the invalidateblock RPC."""
|
"""Test the invalidateblock RPC."""
|
||||||
|
|
||||||
from test_framework.test_framework import BitcoinTestFramework
|
from test_framework.test_framework import BitcoinTestFramework
|
||||||
from test_framework.address import ADDRESS_BCRT1_UNSPENDABLE
|
from test_framework.address import ADDRESS_BCRT1_UNSPENDABLE_DESCRIPTOR
|
||||||
from test_framework.util import (
|
from test_framework.util import (
|
||||||
assert_equal,
|
assert_equal,
|
||||||
connect_nodes,
|
connect_nodes,
|
||||||
@ -88,7 +88,7 @@ class InvalidateTest(BitcoinTestFramework):
|
|||||||
assert_equal(tip, self.nodes[1].getbestblockhash())
|
assert_equal(tip, self.nodes[1].getbestblockhash())
|
||||||
|
|
||||||
self.log.info("Verify that we reconsider all ancestors as well")
|
self.log.info("Verify that we reconsider all ancestors as well")
|
||||||
blocks = self.nodes[1].generatetoaddress(10, ADDRESS_BCRT1_UNSPENDABLE)
|
blocks = self.nodes[1].generatetodescriptor(10, ADDRESS_BCRT1_UNSPENDABLE_DESCRIPTOR)
|
||||||
assert_equal(self.nodes[1].getbestblockhash(), blocks[-1])
|
assert_equal(self.nodes[1].getbestblockhash(), blocks[-1])
|
||||||
# Invalidate the two blocks at the tip
|
# Invalidate the two blocks at the tip
|
||||||
self.nodes[1].invalidateblock(blocks[-1])
|
self.nodes[1].invalidateblock(blocks[-1])
|
||||||
@ -100,7 +100,7 @@ class InvalidateTest(BitcoinTestFramework):
|
|||||||
assert_equal(self.nodes[1].getbestblockhash(), blocks[-1])
|
assert_equal(self.nodes[1].getbestblockhash(), blocks[-1])
|
||||||
|
|
||||||
self.log.info("Verify that we reconsider all descendants")
|
self.log.info("Verify that we reconsider all descendants")
|
||||||
blocks = self.nodes[1].generatetoaddress(10, ADDRESS_BCRT1_UNSPENDABLE)
|
blocks = self.nodes[1].generatetodescriptor(10, ADDRESS_BCRT1_UNSPENDABLE_DESCRIPTOR)
|
||||||
assert_equal(self.nodes[1].getbestblockhash(), blocks[-1])
|
assert_equal(self.nodes[1].getbestblockhash(), blocks[-1])
|
||||||
# Invalidate the two blocks at the tip
|
# Invalidate the two blocks at the tip
|
||||||
self.nodes[1].invalidateblock(blocks[-2])
|
self.nodes[1].invalidateblock(blocks[-2])
|
||||||
|
@ -14,6 +14,7 @@ from .util import hex_str_to_bytes
|
|||||||
|
|
||||||
# Note unlike in bitcoin, this address isn't bech32 since we don't (at this time) support bech32.
|
# Note unlike in bitcoin, this address isn't bech32 since we don't (at this time) support bech32.
|
||||||
ADDRESS_BCRT1_UNSPENDABLE = 'yVg3NBUHNEhgDceqwVUjsZHreC5PBHnUo9'
|
ADDRESS_BCRT1_UNSPENDABLE = 'yVg3NBUHNEhgDceqwVUjsZHreC5PBHnUo9'
|
||||||
|
ADDRESS_BCRT1_UNSPENDABLE_DESCRIPTOR = 'addr(yVg3NBUHNEhgDceqwVUjsZHreC5PBHnUo9)#e5kt0jtk'
|
||||||
|
|
||||||
chars = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
|
chars = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user