Merge #7507: Remove internal miner
8d1de43
Remove internal miner (Leviathn)
This commit is contained in:
commit
11c769966a
7 changed files with 0 additions and 288 deletions
|
@ -195,7 +195,6 @@ void Shutdown()
|
||||||
if (pwalletMain)
|
if (pwalletMain)
|
||||||
pwalletMain->Flush(false);
|
pwalletMain->Flush(false);
|
||||||
#endif
|
#endif
|
||||||
GenerateBitcoins(false, 0, Params());
|
|
||||||
StopNode();
|
StopNode();
|
||||||
StopTorControl();
|
StopTorControl();
|
||||||
UnregisterNodeSignals(GetNodeSignals());
|
UnregisterNodeSignals(GetNodeSignals());
|
||||||
|
@ -429,8 +428,6 @@ std::string HelpMessage(HelpMessageMode mode)
|
||||||
_("If <category> is not supplied or if <category> = 1, output all debugging information.") + _("<category> can be:") + " " + debugCategories + ".");
|
_("If <category> is not supplied or if <category> = 1, output all debugging information.") + _("<category> can be:") + " " + debugCategories + ".");
|
||||||
if (showDebug)
|
if (showDebug)
|
||||||
strUsage += HelpMessageOpt("-nodebug", "Turn off debugging messages, same as -debug=0");
|
strUsage += HelpMessageOpt("-nodebug", "Turn off debugging messages, same as -debug=0");
|
||||||
strUsage += HelpMessageOpt("-gen", strprintf(_("Generate coins (default: %u)"), DEFAULT_GENERATE));
|
|
||||||
strUsage += HelpMessageOpt("-genproclimit=<n>", strprintf(_("Set the number of threads for coin generation if enabled (-1 = all cores, default: %d)"), DEFAULT_GENERATE_THREADS));
|
|
||||||
strUsage += HelpMessageOpt("-help-debug", _("Show all debugging options (usage: --help -help-debug)"));
|
strUsage += HelpMessageOpt("-help-debug", _("Show all debugging options (usage: --help -help-debug)"));
|
||||||
strUsage += HelpMessageOpt("-logips", strprintf(_("Include IP addresses in debug output (default: %u)"), DEFAULT_LOGIPS));
|
strUsage += HelpMessageOpt("-logips", strprintf(_("Include IP addresses in debug output (default: %u)"), DEFAULT_LOGIPS));
|
||||||
strUsage += HelpMessageOpt("-logtimestamps", strprintf(_("Prepend debug output with timestamp (default: %u)"), DEFAULT_LOGTIMESTAMPS));
|
strUsage += HelpMessageOpt("-logtimestamps", strprintf(_("Prepend debug output with timestamp (default: %u)"), DEFAULT_LOGTIMESTAMPS));
|
||||||
|
@ -1508,9 +1505,6 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
|
||||||
boost::ref(cs_main), boost::cref(pindexBestHeader), nPowTargetSpacing);
|
boost::ref(cs_main), boost::cref(pindexBestHeader), nPowTargetSpacing);
|
||||||
scheduler.scheduleEvery(f, nPowTargetSpacing);
|
scheduler.scheduleEvery(f, nPowTargetSpacing);
|
||||||
|
|
||||||
// Generate coins in the background
|
|
||||||
GenerateBitcoins(GetBoolArg("-gen", DEFAULT_GENERATE), GetArg("-genproclimit", DEFAULT_GENERATE_THREADS), chainparams);
|
|
||||||
|
|
||||||
// ********************************************************* Step 12: finished
|
// ********************************************************* Step 12: finished
|
||||||
|
|
||||||
SetRPCWarmupFinished();
|
SetRPCWarmupFinished();
|
||||||
|
|
203
src/miner.cpp
203
src/miner.cpp
|
@ -315,206 +315,3 @@ void IncrementExtraNonce(CBlock* pblock, const CBlockIndex* pindexPrev, unsigned
|
||||||
pblock->vtx[0] = txCoinbase;
|
pblock->vtx[0] = txCoinbase;
|
||||||
pblock->hashMerkleRoot = BlockMerkleRoot(*pblock);
|
pblock->hashMerkleRoot = BlockMerkleRoot(*pblock);
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// Internal miner
|
|
||||||
//
|
|
||||||
|
|
||||||
//
|
|
||||||
// ScanHash scans nonces looking for a hash with at least some zero bits.
|
|
||||||
// The nonce is usually preserved between calls, but periodically or if the
|
|
||||||
// nonce is 0xffff0000 or above, the block is rebuilt and nNonce starts over at
|
|
||||||
// zero.
|
|
||||||
//
|
|
||||||
bool static ScanHash(const CBlockHeader *pblock, uint32_t& nNonce, uint256 *phash)
|
|
||||||
{
|
|
||||||
// Write the first 76 bytes of the block header to a double-SHA256 state.
|
|
||||||
CHash256 hasher;
|
|
||||||
CDataStream ss(SER_NETWORK, PROTOCOL_VERSION);
|
|
||||||
ss << *pblock;
|
|
||||||
assert(ss.size() == 80);
|
|
||||||
hasher.Write((unsigned char*)&ss[0], 76);
|
|
||||||
|
|
||||||
while (true) {
|
|
||||||
nNonce++;
|
|
||||||
|
|
||||||
// Write the last 4 bytes of the block header (the nonce) to a copy of
|
|
||||||
// the double-SHA256 state, and compute the result.
|
|
||||||
CHash256(hasher).Write((unsigned char*)&nNonce, 4).Finalize((unsigned char*)phash);
|
|
||||||
|
|
||||||
// Return the nonce if the hash has at least some zero bits,
|
|
||||||
// caller will check if it has enough to reach the target
|
|
||||||
if (((uint16_t*)phash)[15] == 0)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
// If nothing found after trying for a while, return -1
|
|
||||||
if ((nNonce & 0xfff) == 0)
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool ProcessBlockFound(const CBlock* pblock, const CChainParams& chainparams)
|
|
||||||
{
|
|
||||||
LogPrintf("%s\n", pblock->ToString());
|
|
||||||
LogPrintf("generated %s\n", FormatMoney(pblock->vtx[0].vout[0].nValue));
|
|
||||||
|
|
||||||
// Found a solution
|
|
||||||
{
|
|
||||||
LOCK(cs_main);
|
|
||||||
if (pblock->hashPrevBlock != chainActive.Tip()->GetBlockHash())
|
|
||||||
return error("BitcoinMiner: generated block is stale");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Inform about the new block
|
|
||||||
GetMainSignals().BlockFound(pblock->GetHash());
|
|
||||||
|
|
||||||
// Process this block the same as if we had received it from another node
|
|
||||||
CValidationState state;
|
|
||||||
if (!ProcessNewBlock(state, chainparams, NULL, pblock, true, NULL))
|
|
||||||
return error("BitcoinMiner: ProcessNewBlock, block not accepted");
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void static BitcoinMiner(const CChainParams& chainparams)
|
|
||||||
{
|
|
||||||
LogPrintf("BitcoinMiner started\n");
|
|
||||||
SetThreadPriority(THREAD_PRIORITY_LOWEST);
|
|
||||||
RenameThread("bitcoin-miner");
|
|
||||||
|
|
||||||
unsigned int nExtraNonce = 0;
|
|
||||||
|
|
||||||
boost::shared_ptr<CReserveScript> coinbaseScript;
|
|
||||||
GetMainSignals().ScriptForMining(coinbaseScript);
|
|
||||||
|
|
||||||
try {
|
|
||||||
// Throw an error if no script was provided. This can happen
|
|
||||||
// due to some internal error but also if the keypool is empty.
|
|
||||||
// In the latter case, already the pointer is NULL.
|
|
||||||
if (!coinbaseScript || coinbaseScript->reserveScript.empty())
|
|
||||||
throw std::runtime_error("No coinbase script available (mining requires a wallet)");
|
|
||||||
|
|
||||||
while (true) {
|
|
||||||
if (chainparams.MiningRequiresPeers()) {
|
|
||||||
// Busy-wait for the network to come online so we don't waste time mining
|
|
||||||
// on an obsolete chain. In regtest mode we expect to fly solo.
|
|
||||||
do {
|
|
||||||
bool fvNodesEmpty;
|
|
||||||
{
|
|
||||||
LOCK(cs_vNodes);
|
|
||||||
fvNodesEmpty = vNodes.empty();
|
|
||||||
}
|
|
||||||
if (!fvNodesEmpty && !IsInitialBlockDownload())
|
|
||||||
break;
|
|
||||||
MilliSleep(1000);
|
|
||||||
} while (true);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Create new block
|
|
||||||
//
|
|
||||||
unsigned int nTransactionsUpdatedLast = mempool.GetTransactionsUpdated();
|
|
||||||
CBlockIndex* pindexPrev = chainActive.Tip();
|
|
||||||
|
|
||||||
auto_ptr<CBlockTemplate> pblocktemplate(CreateNewBlock(chainparams, coinbaseScript->reserveScript));
|
|
||||||
if (!pblocktemplate.get())
|
|
||||||
{
|
|
||||||
LogPrintf("Error in BitcoinMiner: Keypool ran out, please call keypoolrefill before restarting the mining thread\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
CBlock *pblock = &pblocktemplate->block;
|
|
||||||
IncrementExtraNonce(pblock, pindexPrev, nExtraNonce);
|
|
||||||
|
|
||||||
LogPrintf("Running BitcoinMiner with %u transactions in block (%u bytes)\n", pblock->vtx.size(),
|
|
||||||
::GetSerializeSize(*pblock, SER_NETWORK, PROTOCOL_VERSION));
|
|
||||||
|
|
||||||
//
|
|
||||||
// Search
|
|
||||||
//
|
|
||||||
int64_t nStart = GetTime();
|
|
||||||
arith_uint256 hashTarget = arith_uint256().SetCompact(pblock->nBits);
|
|
||||||
uint256 hash;
|
|
||||||
uint32_t nNonce = 0;
|
|
||||||
while (true) {
|
|
||||||
// Check if something found
|
|
||||||
if (ScanHash(pblock, nNonce, &hash))
|
|
||||||
{
|
|
||||||
if (UintToArith256(hash) <= hashTarget)
|
|
||||||
{
|
|
||||||
// Found a solution
|
|
||||||
pblock->nNonce = nNonce;
|
|
||||||
assert(hash == pblock->GetHash());
|
|
||||||
|
|
||||||
SetThreadPriority(THREAD_PRIORITY_NORMAL);
|
|
||||||
LogPrintf("BitcoinMiner:\n");
|
|
||||||
LogPrintf("proof-of-work found \n hash: %s \ntarget: %s\n", hash.GetHex(), hashTarget.GetHex());
|
|
||||||
ProcessBlockFound(pblock, chainparams);
|
|
||||||
SetThreadPriority(THREAD_PRIORITY_LOWEST);
|
|
||||||
coinbaseScript->KeepScript();
|
|
||||||
|
|
||||||
// In regression test mode, stop mining after a block is found.
|
|
||||||
if (chainparams.MineBlocksOnDemand())
|
|
||||||
throw boost::thread_interrupted();
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check for stop or if block needs to be rebuilt
|
|
||||||
boost::this_thread::interruption_point();
|
|
||||||
// Regtest mode doesn't require peers
|
|
||||||
if (vNodes.empty() && chainparams.MiningRequiresPeers())
|
|
||||||
break;
|
|
||||||
if (nNonce >= 0xffff0000)
|
|
||||||
break;
|
|
||||||
if (mempool.GetTransactionsUpdated() != nTransactionsUpdatedLast && GetTime() - nStart > 60)
|
|
||||||
break;
|
|
||||||
if (pindexPrev != chainActive.Tip())
|
|
||||||
break;
|
|
||||||
|
|
||||||
// Update nTime every few seconds
|
|
||||||
if (UpdateTime(pblock, chainparams.GetConsensus(), pindexPrev) < 0)
|
|
||||||
break; // Recreate the block if the clock has run backwards,
|
|
||||||
// so that we can use the correct time.
|
|
||||||
if (chainparams.GetConsensus().fPowAllowMinDifficultyBlocks)
|
|
||||||
{
|
|
||||||
// Changing pblock->nTime can change work required on testnet:
|
|
||||||
hashTarget.SetCompact(pblock->nBits);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (const boost::thread_interrupted&)
|
|
||||||
{
|
|
||||||
LogPrintf("BitcoinMiner terminated\n");
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
catch (const std::runtime_error &e)
|
|
||||||
{
|
|
||||||
LogPrintf("BitcoinMiner runtime error: %s\n", e.what());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void GenerateBitcoins(bool fGenerate, int nThreads, const CChainParams& chainparams)
|
|
||||||
{
|
|
||||||
static boost::thread_group* minerThreads = NULL;
|
|
||||||
|
|
||||||
if (nThreads < 0)
|
|
||||||
nThreads = GetNumCores();
|
|
||||||
|
|
||||||
if (minerThreads != NULL)
|
|
||||||
{
|
|
||||||
minerThreads->interrupt_all();
|
|
||||||
delete minerThreads;
|
|
||||||
minerThreads = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (nThreads == 0 || !fGenerate)
|
|
||||||
return;
|
|
||||||
|
|
||||||
minerThreads = new boost::thread_group();
|
|
||||||
for (int i = 0; i < nThreads; i++)
|
|
||||||
minerThreads->create_thread(boost::bind(&BitcoinMiner, boost::cref(chainparams)));
|
|
||||||
}
|
|
||||||
|
|
|
@ -17,9 +17,6 @@ class CScript;
|
||||||
class CWallet;
|
class CWallet;
|
||||||
namespace Consensus { struct Params; };
|
namespace Consensus { struct Params; };
|
||||||
|
|
||||||
static const bool DEFAULT_GENERATE = false;
|
|
||||||
static const int DEFAULT_GENERATE_THREADS = 1;
|
|
||||||
|
|
||||||
static const bool DEFAULT_PRINTPRIORITY = false;
|
static const bool DEFAULT_PRINTPRIORITY = false;
|
||||||
|
|
||||||
struct CBlockTemplate
|
struct CBlockTemplate
|
||||||
|
@ -29,8 +26,6 @@ struct CBlockTemplate
|
||||||
std::vector<int64_t> vTxSigOps;
|
std::vector<int64_t> vTxSigOps;
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Run the miner threads */
|
|
||||||
void GenerateBitcoins(bool fGenerate, int nThreads, const CChainParams& chainparams);
|
|
||||||
/** Generate a new block, without valid proof-of-work */
|
/** Generate a new block, without valid proof-of-work */
|
||||||
CBlockTemplate* CreateNewBlock(const CChainParams& chainparams, const CScript& scriptPubKeyIn);
|
CBlockTemplate* CreateNewBlock(const CChainParams& chainparams, const CScript& scriptPubKeyIn);
|
||||||
/** Modify the extranonce in a block */
|
/** Modify the extranonce in a block */
|
||||||
|
|
|
@ -27,8 +27,6 @@ static const CRPCConvertParam vRPCConvertParams[] =
|
||||||
{ "stop", 0 },
|
{ "stop", 0 },
|
||||||
{ "setmocktime", 0 },
|
{ "setmocktime", 0 },
|
||||||
{ "getaddednodeinfo", 0 },
|
{ "getaddednodeinfo", 0 },
|
||||||
{ "setgenerate", 0 },
|
|
||||||
{ "setgenerate", 1 },
|
|
||||||
{ "generate", 0 },
|
{ "generate", 0 },
|
||||||
{ "getnetworkhashps", 0 },
|
{ "getnetworkhashps", 0 },
|
||||||
{ "getnetworkhashps", 1 },
|
{ "getnetworkhashps", 1 },
|
||||||
|
@ -160,4 +158,3 @@ UniValue RPCConvertValues(const std::string &strMethod, const std::vector<std::s
|
||||||
|
|
||||||
return params;
|
return params;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -93,25 +93,6 @@ UniValue getnetworkhashps(const UniValue& params, bool fHelp)
|
||||||
return GetNetworkHashPS(params.size() > 0 ? params[0].get_int() : 120, params.size() > 1 ? params[1].get_int() : -1);
|
return GetNetworkHashPS(params.size() > 0 ? params[0].get_int() : 120, params.size() > 1 ? params[1].get_int() : -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
UniValue getgenerate(const UniValue& params, bool fHelp)
|
|
||||||
{
|
|
||||||
if (fHelp || params.size() != 0)
|
|
||||||
throw runtime_error(
|
|
||||||
"getgenerate\n"
|
|
||||||
"\nReturn if the server is set to generate coins or not. The default is false.\n"
|
|
||||||
"It is set with the command line argument -gen (or " + std::string(BITCOIN_CONF_FILENAME) + " setting gen)\n"
|
|
||||||
"It can also be set with the setgenerate call.\n"
|
|
||||||
"\nResult\n"
|
|
||||||
"true|false (boolean) If the server is set to generate coins or not\n"
|
|
||||||
"\nExamples:\n"
|
|
||||||
+ HelpExampleCli("getgenerate", "")
|
|
||||||
+ HelpExampleRpc("getgenerate", "")
|
|
||||||
);
|
|
||||||
|
|
||||||
LOCK(cs_main);
|
|
||||||
return GetBoolArg("-gen", DEFAULT_GENERATE);
|
|
||||||
}
|
|
||||||
|
|
||||||
UniValue generate(const UniValue& params, bool fHelp)
|
UniValue generate(const UniValue& params, bool fHelp)
|
||||||
{
|
{
|
||||||
if (fHelp || params.size() < 1 || params.size() > 1)
|
if (fHelp || params.size() < 1 || params.size() > 1)
|
||||||
|
@ -182,50 +163,6 @@ UniValue generate(const UniValue& params, bool fHelp)
|
||||||
return blockHashes;
|
return blockHashes;
|
||||||
}
|
}
|
||||||
|
|
||||||
UniValue setgenerate(const UniValue& params, bool fHelp)
|
|
||||||
{
|
|
||||||
if (fHelp || params.size() < 1 || params.size() > 2)
|
|
||||||
throw runtime_error(
|
|
||||||
"setgenerate generate ( genproclimit )\n"
|
|
||||||
"\nSet 'generate' true or false to turn generation on or off.\n"
|
|
||||||
"Generation is limited to 'genproclimit' processors, -1 is unlimited.\n"
|
|
||||||
"See the getgenerate call for the current setting.\n"
|
|
||||||
"\nArguments:\n"
|
|
||||||
"1. generate (boolean, required) Set to true to turn on generation, off to turn off.\n"
|
|
||||||
"2. genproclimit (numeric, optional) Set the processor limit for when generation is on. Can be -1 for unlimited.\n"
|
|
||||||
"\nExamples:\n"
|
|
||||||
"\nSet the generation on with a limit of one processor\n"
|
|
||||||
+ HelpExampleCli("setgenerate", "true 1") +
|
|
||||||
"\nCheck the setting\n"
|
|
||||||
+ HelpExampleCli("getgenerate", "") +
|
|
||||||
"\nTurn off generation\n"
|
|
||||||
+ HelpExampleCli("setgenerate", "false") +
|
|
||||||
"\nUsing json rpc\n"
|
|
||||||
+ HelpExampleRpc("setgenerate", "true, 1")
|
|
||||||
);
|
|
||||||
|
|
||||||
if (Params().MineBlocksOnDemand())
|
|
||||||
throw JSONRPCError(RPC_METHOD_NOT_FOUND, "Use the generate method instead of setgenerate on this network");
|
|
||||||
|
|
||||||
bool fGenerate = true;
|
|
||||||
if (params.size() > 0)
|
|
||||||
fGenerate = params[0].get_bool();
|
|
||||||
|
|
||||||
int nGenProcLimit = GetArg("-genproclimit", DEFAULT_GENERATE_THREADS);
|
|
||||||
if (params.size() > 1)
|
|
||||||
{
|
|
||||||
nGenProcLimit = params[1].get_int();
|
|
||||||
if (nGenProcLimit == 0)
|
|
||||||
fGenerate = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
mapArgs["-gen"] = (fGenerate ? "1" : "0");
|
|
||||||
mapArgs ["-genproclimit"] = itostr(nGenProcLimit);
|
|
||||||
GenerateBitcoins(fGenerate, nGenProcLimit, Params());
|
|
||||||
|
|
||||||
return NullUniValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
UniValue getmininginfo(const UniValue& params, bool fHelp)
|
UniValue getmininginfo(const UniValue& params, bool fHelp)
|
||||||
{
|
{
|
||||||
if (fHelp || params.size() != 0)
|
if (fHelp || params.size() != 0)
|
||||||
|
@ -239,8 +176,6 @@ UniValue getmininginfo(const UniValue& params, bool fHelp)
|
||||||
" \"currentblocktx\": nnn, (numeric) The last block transaction\n"
|
" \"currentblocktx\": nnn, (numeric) The last block transaction\n"
|
||||||
" \"difficulty\": xxx.xxxxx (numeric) The current difficulty\n"
|
" \"difficulty\": xxx.xxxxx (numeric) The current difficulty\n"
|
||||||
" \"errors\": \"...\" (string) Current errors\n"
|
" \"errors\": \"...\" (string) Current errors\n"
|
||||||
" \"generate\": true|false (boolean) If the generation is on or off (see getgenerate or setgenerate calls)\n"
|
|
||||||
" \"genproclimit\": n (numeric) The processor limit for generation. -1 if no generation. (see getgenerate or setgenerate calls)\n"
|
|
||||||
" \"pooledtx\": n (numeric) The size of the mem pool\n"
|
" \"pooledtx\": n (numeric) The size of the mem pool\n"
|
||||||
" \"testnet\": true|false (boolean) If using testnet or not\n"
|
" \"testnet\": true|false (boolean) If using testnet or not\n"
|
||||||
" \"chain\": \"xxxx\", (string) current network name as defined in BIP70 (main, test, regtest)\n"
|
" \"chain\": \"xxxx\", (string) current network name as defined in BIP70 (main, test, regtest)\n"
|
||||||
|
@ -259,12 +194,10 @@ UniValue getmininginfo(const UniValue& params, bool fHelp)
|
||||||
obj.push_back(Pair("currentblocktx", (uint64_t)nLastBlockTx));
|
obj.push_back(Pair("currentblocktx", (uint64_t)nLastBlockTx));
|
||||||
obj.push_back(Pair("difficulty", (double)GetDifficulty()));
|
obj.push_back(Pair("difficulty", (double)GetDifficulty()));
|
||||||
obj.push_back(Pair("errors", GetWarnings("statusbar")));
|
obj.push_back(Pair("errors", GetWarnings("statusbar")));
|
||||||
obj.push_back(Pair("genproclimit", (int)GetArg("-genproclimit", DEFAULT_GENERATE_THREADS)));
|
|
||||||
obj.push_back(Pair("networkhashps", getnetworkhashps(params, false)));
|
obj.push_back(Pair("networkhashps", getnetworkhashps(params, false)));
|
||||||
obj.push_back(Pair("pooledtx", (uint64_t)mempool.size()));
|
obj.push_back(Pair("pooledtx", (uint64_t)mempool.size()));
|
||||||
obj.push_back(Pair("testnet", Params().TestnetToBeDeprecatedFieldRPC()));
|
obj.push_back(Pair("testnet", Params().TestnetToBeDeprecatedFieldRPC()));
|
||||||
obj.push_back(Pair("chain", Params().NetworkIDString()));
|
obj.push_back(Pair("chain", Params().NetworkIDString()));
|
||||||
obj.push_back(Pair("generate", getgenerate(params, false)));
|
|
||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -298,8 +298,6 @@ static const CRPCCommand vRPCCommands[] =
|
||||||
{ "mining", "submitblock", &submitblock, true },
|
{ "mining", "submitblock", &submitblock, true },
|
||||||
|
|
||||||
/* Coin generation */
|
/* Coin generation */
|
||||||
{ "generating", "getgenerate", &getgenerate, true },
|
|
||||||
{ "generating", "setgenerate", &setgenerate, true },
|
|
||||||
{ "generating", "generate", &generate, true },
|
{ "generating", "generate", &generate, true },
|
||||||
|
|
||||||
/* Raw transactions */
|
/* Raw transactions */
|
||||||
|
|
|
@ -192,8 +192,6 @@ extern UniValue setban(const UniValue& params, bool fHelp);
|
||||||
extern UniValue listbanned(const UniValue& params, bool fHelp);
|
extern UniValue listbanned(const UniValue& params, bool fHelp);
|
||||||
extern UniValue clearbanned(const UniValue& params, bool fHelp);
|
extern UniValue clearbanned(const UniValue& params, bool fHelp);
|
||||||
|
|
||||||
extern UniValue getgenerate(const UniValue& params, bool fHelp); // in rpc/mining.cpp
|
|
||||||
extern UniValue setgenerate(const UniValue& params, bool fHelp);
|
|
||||||
extern UniValue generate(const UniValue& params, bool fHelp);
|
extern UniValue generate(const UniValue& params, bool fHelp);
|
||||||
extern UniValue getnetworkhashps(const UniValue& params, bool fHelp);
|
extern UniValue getnetworkhashps(const UniValue& params, bool fHelp);
|
||||||
extern UniValue getmininginfo(const UniValue& params, bool fHelp);
|
extern UniValue getmininginfo(const UniValue& params, bool fHelp);
|
||||||
|
|
Loading…
Reference in a new issue