diff --git a/CMakeLists.txt b/CMakeLists.txt index 4498f0fbd69d1..a35b23b8645ea 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -205,6 +205,7 @@ set(SERVER_SOURCES ./src/httpserver.cpp ./src/indirectmap.h ./src/init.cpp + ./src/tiertwo/init.cpp ./src/interfaces/handler.cpp ./src/interfaces/wallet.cpp ./src/dbwrapper.cpp diff --git a/src/Makefile.am b/src/Makefile.am index 726283f2caca3..e439a1e47204c 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -200,6 +200,7 @@ BITCOIN_CORE_H = \ httpserver.h \ indirectmap.h \ init.h \ + tiertwo/init.h \ interfaces/handler.h \ interfaces/wallet.h \ invalid.h \ @@ -358,6 +359,7 @@ libbitcoin_server_a_SOURCES = \ httprpc.cpp \ httpserver.cpp \ init.cpp \ + tiertwo/init.cpp \ dbwrapper.cpp \ legacy/validation_zerocoin_legacy.cpp \ sapling/sapling_validation.cpp \ @@ -737,6 +739,7 @@ CLEANFILES = $(EXTRA_LIBRARIES) CLEANFILES += *.gcda *.gcno CLEANFILES += budget/*.gcda budget/*.gcno +CLEANFILES += bls/*.gcda bls/*.gcno CLEANFILES += compat/*.gcda compat/*.gcno CLEANFILES += consensus/*.gcda consensus/*.gcno CLEANFILES += crc32c/src/*.gcda crc32c/src/*.gcno @@ -752,6 +755,7 @@ CLEANFILES += sapling/*.gcda sapling/*.gcno CLEANFILES += script/*.gcda script/*.gcno CLEANFILES += support/*.gcda support/*.gcno CLEANFILES += test/librust/*.gcda test/librust/*.gcno +CLEANFILES += tiertwo/*.gcda tiertwo/*.gcno CLEANFILES += univalue/*.gcda univalue/*.gcno CLEANFILES += util/*.gcda util/*.gcno CLEANFILES += wallet/*.gcda wallet/*.gcno diff --git a/src/budget/budgetmanager.cpp b/src/budget/budgetmanager.cpp index fe801ce7ffc25..58e16fa693f4a 100644 --- a/src/budget/budgetmanager.cpp +++ b/src/budget/budgetmanager.cpp @@ -1308,8 +1308,6 @@ bool CBudgetManager::ProcessMessage(CNode* pfrom, std::string& strCommand, CData int CBudgetManager::ProcessMessageInner(CNode* pfrom, std::string& strCommand, CDataStream& vRecv) { - // lite mode is not supported - if (fLiteMode) return 0; if (!masternodeSync.IsBlockchainSynced()) return 0; if (strCommand == NetMsgType::BUDGETVOTESYNC) { diff --git a/src/init.cpp b/src/init.cpp index 7bfc451221e77..cdee618d3dec5 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -18,8 +18,6 @@ #include "addrman.h" #include "amount.h" #include "bls/bls_wrapper.h" -#include "budget/budgetdb.h" -#include "budget/budgetmanager.h" #include "checkpoints.h" #include "compat/sanity.h" #include "consensus/upgrades.h" @@ -32,9 +30,7 @@ #include "llmq/quorums_init.h" #include "key.h" #include "mapport.h" -#include "masternode-payments.h" #include "masternodeconfig.h" -#include "masternodeman.h" #include "miner.h" #include "netbase.h" #include "net_processing.h" @@ -49,6 +45,7 @@ #include "spork.h" #include "sporkdb.h" #include "evo/evodb.h" +#include "tiertwo/init.h" #include "txdb.h" #include "torcontrol.h" #include "guiinterface.h" @@ -93,7 +90,6 @@ static const bool DEFAULT_PROXYRANDOMIZE = true; static const bool DEFAULT_REST_ENABLE = false; static const bool DEFAULT_DISABLE_SAFEMODE = false; static const bool DEFAULT_STOPAFTERBLOCKIMPORT = false; -static const bool DEFAULT_MASTERNODE = false; static const bool DEFAULT_MNCONFLOCK = true; std::unique_ptr g_connman; @@ -229,9 +225,7 @@ void Shutdown() g_connman.reset(); peerLogic.reset(); - DumpMasternodes(); - DumpBudgets(g_budgetman); - DumpMasternodePayments(); + DumpTierTwo(); if (::mempool.IsLoaded() && gArgs.GetBoolArg("-persistmempool", DEFAULT_PERSIST_MEMPOOL)) { DumpMempool(::mempool); } @@ -522,7 +516,6 @@ std::string HelpMessage(HelpMessageMode mode) } strUsage += HelpMessageOpt("-shrinkdebugfile", "Shrink debug.log file on client startup (default: 1 when no -debug)"); AppendParamsHelpMessages(strUsage, showDebug); - strUsage += HelpMessageOpt("-litemode=", strprintf("Disable all PIVX specific functionality (Masternodes, Budgeting) (0-1, default: %u)", 0)); strUsage += HelpMessageGroup("Masternode options:"); strUsage += HelpMessageOpt("-masternode=", strprintf("Enable the client to act as a masternode (0-1, default: %u)", DEFAULT_MASTERNODE)); @@ -950,19 +943,6 @@ static std::string ResolveErrMsg(const char * const optname, const std::string& return strprintf(_("Cannot resolve -%s address: '%s'"), optname, strBind); } -// Sets the last CACHED_BLOCK_HASHES hashes into masternode manager cache -static void LoadBlockHashesCache(CMasternodeMan& man) -{ - LOCK(cs_main); - const CBlockIndex* pindex = chainActive.Tip(); - unsigned int inserted = 0; - while (pindex && inserted < CACHED_BLOCK_HASHES) { - man.CacheBlockHash(pindex); - pindex = pindex->pprev; - ++inserted; - } -} - void InitLogging() { g_logger->m_print_to_file = !gArgs.IsArgNegated("-debuglogfile"); @@ -1748,91 +1728,12 @@ bool AppInitMain() // ********************************************************* Step 10: setup layer 2 data - uiInterface.InitMessage(_("Loading masternode cache...")); - - mnodeman.SetBestHeight(chain_active_height); - LoadBlockHashesCache(mnodeman); - CMasternodeDB mndb; - CMasternodeDB::ReadResult readResult = mndb.Read(mnodeman); - if (readResult == CMasternodeDB::FileError) - LogPrintf("Missing masternode cache file - mncache.dat, will try to recreate\n"); - else if (readResult != CMasternodeDB::Ok) { - LogPrintf("Error reading mncache.dat - cached data discarded\n"); - } - - uiInterface.InitMessage(_("Loading budget cache...")); - - CBudgetDB budgetdb; - const bool fDryRun = (chain_active_height <= 0); - if (!fDryRun) g_budgetman.SetBestHeight(chain_active_height); - CBudgetDB::ReadResult readResult2 = budgetdb.Read(g_budgetman, fDryRun); - - if (readResult2 == CBudgetDB::FileError) - LogPrintf("Missing budget cache - budget.dat, will try to recreate\n"); - else if (readResult2 != CBudgetDB::Ok) { - LogPrintf("Error reading budget.dat - cached data discarded\n"); - } - - //flag our cached items so we send them to our peers - g_budgetman.ResetSync(); - g_budgetman.ReloadMapSeen(); - - RegisterValidationInterface(&g_budgetman); - - uiInterface.InitMessage(_("Loading masternode payment cache...")); - - CMasternodePaymentDB mnpayments; - CMasternodePaymentDB::ReadResult readResult3 = mnpayments.Read(masternodePayments); - - RegisterValidationInterface(&masternodePayments); + LoadTierTwo(chain_active_height); + if (!InitActiveMN()) return false; + RegisterTierTwoValidationInterface(); - if (readResult3 == CMasternodePaymentDB::FileError) - LogPrintf("Missing masternode payment cache - mnpayments.dat, will try to recreate\n"); - else if (readResult3 != CMasternodePaymentDB::Ok) { - LogPrintf("Error reading mnpayments.dat - cached data discarded\n"); - } - - fMasterNode = gArgs.GetBoolArg("-masternode", DEFAULT_MASTERNODE); - - if ((fMasterNode || masternodeConfig.getCount() > -1) && fTxIndex == false) { - return UIError(strprintf(_("Enabling Masternode support requires turning on transaction indexing." - "Please add %s to your configuration and start with %s"), "txindex=1", "-reindex")); - } - - if (fMasterNode) { - const std::string& mnoperatorkeyStr = gArgs.GetArg("-mnoperatorprivatekey", ""); - const bool fDeterministic = !mnoperatorkeyStr.empty(); - LogPrintf("IS %sMASTERNODE\n", (fDeterministic ? "DETERMINISTIC " : "")); - - if (fDeterministic) { - // Check enforcement - if (!deterministicMNManager->IsDIP3Enforced()) { - const std::string strError = strprintf(_("Cannot start deterministic masternode before enforcement. Remove %s to start as legacy masternode"), "-mnoperatorprivatekey"); - LogPrintf("-- ERROR: %s\n", strError); - return UIError(strError); - } - // Create and register activeMasternodeManager - activeMasternodeManager = new CActiveDeterministicMasternodeManager(); - auto res = activeMasternodeManager->SetOperatorKey(mnoperatorkeyStr); - if (!res) { return UIError(res.getError()); } - RegisterValidationInterface(activeMasternodeManager); - // Init active masternode - const CBlockIndex* pindexTip = WITH_LOCK(cs_main, return chainActive.Tip(); ); - activeMasternodeManager->Init(pindexTip); - } else { - // Check enforcement - if (deterministicMNManager->LegacyMNObsolete()) { - const std::string strError = strprintf(_("Legacy masternode system disabled. Use %s to start as deterministic masternode"), "-mnoperatorprivatekey"); - LogPrintf("-- ERROR: %s\n", strError); - return UIError(strError); - } - auto res = initMasternode(gArgs.GetArg("-masternodeprivkey", ""), gArgs.GetArg("-masternodeaddr", ""), true); - if (!res) { return UIError(res.getError()); } - } - } - - //get the mode of budget voting for this masternode - g_budgetman.strBudgetMode = gArgs.GetArg("-budgetvotemode", "auto"); + // set the mode of budget voting for this node + SetBudgetFinMode(gArgs.GetArg("-budgetvotemode", "auto")); #ifdef ENABLE_WALLET // !TODO: remove after complete transition to DMN @@ -1859,16 +1760,8 @@ bool AppInitMain() } #endif - // lite mode disables all Masternode related functionality - fLiteMode = gArgs.GetBoolArg("-litemode", false); - if (fMasterNode && fLiteMode) { - return UIError(_("You can not start a masternode in litemode")); - } - - LogPrintf("fLiteMode %d\n", fLiteMode); - LogPrintf("Budget Mode %s\n", g_budgetman.strBudgetMode.c_str()); - - threadGroup.create_thread(std::bind(&ThreadCheckMasternodes)); + // Start tier two threads and jobs + StartTierTwoThreadsAndScheduleJobs(threadGroup, scheduler); if (ShutdownRequested()) { LogPrintf("Shutdown requested. Exiting.\n"); diff --git a/src/masternode-payments.cpp b/src/masternode-payments.cpp index 7a100e393a6ca..1264b8cff08c1 100644 --- a/src/masternode-payments.cpp +++ b/src/masternode-payments.cpp @@ -399,15 +399,14 @@ bool CMasternodePayments::ProcessMessageMasternodePayments(CNode* pfrom, std::st { if (!masternodeSync.IsBlockchainSynced()) return true; - if (fLiteMode) return true; //disable all Masternode related functionality - // Skip after legacy obsolete. !TODO: remove when transition to DMN is complete if (deterministicMNManager->LegacyMNObsolete()) { LogPrint(BCLog::MASTERNODE, "mnw - skip obsolete message %s\n", strCommand); return true; } - if (strCommand == NetMsgType::GETMNWINNERS) { //Masternode Payments Request Sync + if (strCommand == NetMsgType::GETMNWINNERS) { + //Masternode Payments Request Sync int nCountNeeded; vRecv >> nCountNeeded; diff --git a/src/masternodeman.cpp b/src/masternodeman.cpp index 06a6e776c9f50..0ce6eee9b98c8 100644 --- a/src/masternodeman.cpp +++ b/src/masternodeman.cpp @@ -950,7 +950,6 @@ bool CMasternodeMan::ProcessMessage(CNode* pfrom, std::string& strCommand, CData int CMasternodeMan::ProcessMessageInner(CNode* pfrom, std::string& strCommand, CDataStream& vRecv) { - if (fLiteMode) return 0; //disable all Masternode related functionality if (!masternodeSync.IsBlockchainSynced()) return 0; // Skip after legacy obsolete. !TODO: remove when transition to DMN is complete @@ -1156,8 +1155,6 @@ bool CMasternodeMan::IsWithinDepth(const uint256& nHash, int depth) const void ThreadCheckMasternodes() { - if (fLiteMode) return; //disable all Masternode related functionality - // Make this thread recognisable as the wallet flushing thread util::ThreadRename("pivx-masternodeman"); LogPrintf("Masternodes thread started\n"); diff --git a/src/spork.cpp b/src/spork.cpp index 83121f7d29017..9b0470e1f6fca 100644 --- a/src/spork.cpp +++ b/src/spork.cpp @@ -86,8 +86,6 @@ void CSporkManager::LoadSporksFromDB() bool CSporkManager::ProcessSpork(CNode* pfrom, std::string& strCommand, CDataStream& vRecv, int& dosScore) { - if (fLiteMode) return true; // disable all masternode related functionality - if (strCommand == NetMsgType::SPORK) { dosScore = ProcessSporkMsg(vRecv); return dosScore == 0; diff --git a/src/tiertwo/init.cpp b/src/tiertwo/init.cpp new file mode 100644 index 0000000000000..97ec72aab6ef7 --- /dev/null +++ b/src/tiertwo/init.cpp @@ -0,0 +1,153 @@ +// Copyright (c) 2021 The PIVX developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or https://www.opensource.org/licenses/mit-license.php. + +#include "tiertwo/init.h" + +#include "budget/budgetdb.h" +#include "guiinterface.h" +#include "guiinterfaceutil.h" +#include "masternodeman.h" +#include "masternode-payments.h" +#include "masternodeconfig.h" +#include "validation.h" + +#include + +// Sets the last CACHED_BLOCK_HASHES hashes into masternode manager cache +static void LoadBlockHashesCache(CMasternodeMan& man) +{ + LOCK(cs_main); + const CBlockIndex* pindex = chainActive.Tip(); + unsigned int inserted = 0; + while (pindex && inserted < CACHED_BLOCK_HASHES) { + man.CacheBlockHash(pindex); + pindex = pindex->pprev; + ++inserted; + } +} + +bool LoadTierTwo(int chain_active_height) +{ + // ################################# // + // ## Legacy Masternodes Manager ### // + // ################################# // + uiInterface.InitMessage(_("Loading masternode cache...")); + + mnodeman.SetBestHeight(chain_active_height); + LoadBlockHashesCache(mnodeman); + CMasternodeDB mndb; + CMasternodeDB::ReadResult readResult = mndb.Read(mnodeman); + if (readResult == CMasternodeDB::FileError) + LogPrintf("Missing masternode cache file - mncache.dat, will try to recreate\n"); + else if (readResult != CMasternodeDB::Ok) { + LogPrintf("Error reading mncache.dat - cached data discarded\n"); + } + + // ##################### // + // ## Budget Manager ### // + // ##################### // + uiInterface.InitMessage(_("Loading budget cache...")); + + CBudgetDB budgetdb; + const bool fDryRun = (chain_active_height <= 0); + if (!fDryRun) g_budgetman.SetBestHeight(chain_active_height); + CBudgetDB::ReadResult readResult2 = budgetdb.Read(g_budgetman, fDryRun); + + if (readResult2 == CBudgetDB::FileError) + LogPrintf("Missing budget cache - budget.dat, will try to recreate\n"); + else if (readResult2 != CBudgetDB::Ok) { + LogPrintf("Error reading budget.dat - cached data discarded\n"); + } + + // flag our cached items so we send them to our peers + g_budgetman.ResetSync(); + g_budgetman.ReloadMapSeen(); + + // ######################################### // + // ## Legacy Masternodes-Payments Manager ## // + // ######################################### // + uiInterface.InitMessage(_("Loading masternode payment cache...")); + + CMasternodePaymentDB mnpayments; + CMasternodePaymentDB::ReadResult readResult3 = mnpayments.Read(masternodePayments); + if (readResult3 == CMasternodePaymentDB::FileError) + LogPrintf("Missing masternode payment cache - mnpayments.dat, will try to recreate\n"); + else if (readResult3 != CMasternodePaymentDB::Ok) { + LogPrintf("Error reading mnpayments.dat - cached data discarded\n"); + } + + return true; +} + +void RegisterTierTwoValidationInterface() +{ + RegisterValidationInterface(&g_budgetman); + RegisterValidationInterface(&masternodePayments); + if (activeMasternodeManager) RegisterValidationInterface(activeMasternodeManager); +} + +void DumpTierTwo() +{ + DumpMasternodes(); + DumpBudgets(g_budgetman); + DumpMasternodePayments(); +} + +void SetBudgetFinMode(const std::string& mode) +{ + g_budgetman.strBudgetMode = mode; + LogPrintf("Budget Mode %s\n", g_budgetman.strBudgetMode); +} + +bool InitActiveMN() +{ + fMasterNode = gArgs.GetBoolArg("-masternode", DEFAULT_MASTERNODE); + if ((fMasterNode || masternodeConfig.getCount() > -1) && fTxIndex == false) { + return UIError(strprintf(_("Enabling Masternode support requires turning on transaction indexing." + "Please add %s to your configuration and start with %s"), "txindex=1", "-reindex")); + } + + if (fMasterNode) { + const std::string& mnoperatorkeyStr = gArgs.GetArg("-mnoperatorprivatekey", ""); + const bool fDeterministic = !mnoperatorkeyStr.empty(); + LogPrintf("IS %s MASTERNODE\n", (fDeterministic ? "DETERMINISTIC " : "")); + + if (fDeterministic) { + // Check enforcement + if (!deterministicMNManager->IsDIP3Enforced()) { + const std::string strError = strprintf( + _("Cannot start deterministic masternode before enforcement. Remove %s to start as legacy masternode"), + "-mnoperatorprivatekey"); + LogPrintf("-- ERROR: %s\n", strError); + return UIError(strError); + } + // Create and register activeMasternodeManager + activeMasternodeManager = new CActiveDeterministicMasternodeManager(); + auto res = activeMasternodeManager->SetOperatorKey(mnoperatorkeyStr); + if (!res) { return UIError(res.getError()); } + // Init active masternode + const CBlockIndex* pindexTip = WITH_LOCK(cs_main, return chainActive.Tip();); + activeMasternodeManager->Init(pindexTip); + } else { + // Check enforcement + if (deterministicMNManager->LegacyMNObsolete()) { + const std::string strError = strprintf( + _("Legacy masternode system disabled. Use %s to start as deterministic masternode"), + "-mnoperatorprivatekey"); + LogPrintf("-- ERROR: %s\n", strError); + return UIError(strError); + } + auto res = initMasternode(gArgs.GetArg("-masternodeprivkey", ""), gArgs.GetArg("-masternodeaddr", ""), + true); + if (!res) { return UIError(res.getError()); } + } + } + // All good + return true; +} + +void StartTierTwoThreadsAndScheduleJobs(boost::thread_group& threadGroup, CScheduler& scheduler) +{ + threadGroup.create_thread(std::bind(&ThreadCheckMasternodes)); +} diff --git a/src/tiertwo/init.h b/src/tiertwo/init.h new file mode 100644 index 0000000000000..79b02e9cd3b99 --- /dev/null +++ b/src/tiertwo/init.h @@ -0,0 +1,35 @@ +// Copyright (c) 2021 The PIVX developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or https://www.opensource.org/licenses/mit-license.php. + +#ifndef PIVX_TIERTWO_INIT_H +#define PIVX_TIERTWO_INIT_H + +#include + +static const bool DEFAULT_MASTERNODE = false; + +class CScheduler; +namespace boost { + class thread_group; +} + +/** Loads from disk all the tier two related objects */ +bool LoadTierTwo(int chain_active_height); + +/** Register all tier two objects */ +void RegisterTierTwoValidationInterface(); + +/** Dump tier two managers to disk */ +void DumpTierTwo(); + +void SetBudgetFinMode(const std::string& mode); + +/** Initialize the active Masternode manager */ +bool InitActiveMN(); + +/** Starts tier two threads and jobs */ +void StartTierTwoThreadsAndScheduleJobs(boost::thread_group& threadGroup, CScheduler& scheduler); + + +#endif //PIVX_TIERTWO_INIT_H diff --git a/src/util/system.cpp b/src/util/system.cpp index 0a8d29781da3c..58c0a85205dd0 100644 --- a/src/util/system.cpp +++ b/src/util/system.cpp @@ -86,7 +86,6 @@ const char * const PIVX_MASTERNODE_CONF_FILENAME = "masternode.conf"; // PIVX only features // Masternode std::atomic fMasterNode{false}; -bool fLiteMode = false; ArgsManager gArgs; diff --git a/src/util/system.h b/src/util/system.h index 198e7fb6b0885..6d81ebb2440ce 100644 --- a/src/util/system.h +++ b/src/util/system.h @@ -55,7 +55,6 @@ extern const char * const DEFAULT_DEBUGLOGFILE; //PIVX only features extern std::atomic fMasterNode; -extern bool fLiteMode; extern CTranslationInterface translationInterface; diff --git a/src/validation.cpp b/src/validation.cpp index 84ce1a60e6341..277142777c43b 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -2055,10 +2055,8 @@ bool static ConnectTip(CValidationState& state, CBlockIndex* pindexNew, const st // Update chainActive & related variables. UpdateTip(pindexNew); // Update TierTwo managers - if (!fLiteMode) { - mnodeman.SetBestHeight(pindexNew->nHeight); - g_budgetman.SetBestHeight(pindexNew->nHeight); - } + mnodeman.SetBestHeight(pindexNew->nHeight); + g_budgetman.SetBestHeight(pindexNew->nHeight); // Update MN manager cache mnodeman.CacheBlockHash(pindexNew); mnodeman.CheckSpentCollaterals(blockConnecting.vtx); diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index ee5bf9839dbb9..9b16dcb55dc28 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -2216,8 +2216,6 @@ CAmount CWallet::GetDelegatedBalance() const CAmount CWallet::GetLockedCoins() const { - if (fLiteMode) return 0; - LOCK(cs_wallet); if (setLockedCoins.empty()) return 0;