From 68dc30664b68d34825e4351ea58322b6a5695a48 Mon Sep 17 00:00:00 2001 From: random-zebra Date: Wed, 10 Feb 2021 22:22:23 +0100 Subject: [PATCH] [Init] Add -mnoperatorprivatekey to flag the active mn as deterministic --- src/activemasternode.cpp | 4 +--- src/init.cpp | 44 +++++++++++++++++++++++++++------------- src/messagesigner.cpp | 10 +++++++++ src/messagesigner.h | 1 + 4 files changed, 42 insertions(+), 17 deletions(-) diff --git a/src/activemasternode.cpp b/src/activemasternode.cpp index 11357cb110004c..6481041fa298c5 100644 --- a/src/activemasternode.cpp +++ b/src/activemasternode.cpp @@ -61,11 +61,9 @@ OperationResult CActiveDeterministicMasternodeManager::SetOperatorKey(const std: if (strMNOperatorPrivKey.empty()) { return errorOut("ERROR: Masternode operator priv key cannot be empty."); } - CPubKey pubkey; - if (!CMessageSigner::GetKeysFromSecret(strMNOperatorPrivKey, info.keyOperator, pubkey)) { + if (!CMessageSigner::GetKeysFromSecret(strMNOperatorPrivKey, info.keyOperator, info.keyIDOperator)) { return errorOut(_("Invalid mnoperatorprivatekey. Please see the documentation.")); } - info.keyIDOperator = pubkey.GetID(); return OperationResult(true); } diff --git a/src/init.cpp b/src/init.cpp index 432121b0932154..27b1099027f928 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -316,7 +316,7 @@ void PrepareShutdown() pEvoNotificationInterface = nullptr; } - if (fMasterNode) { + if (activeMasternodeManager) { UnregisterValidationInterface(activeMasternodeManager); } @@ -572,6 +572,7 @@ std::string HelpMessage(HelpMessageMode mode) strUsage += HelpMessageOpt("-masternodeprivkey=", _("Set the masternode private key")); strUsage += HelpMessageOpt("-masternodeaddr=", strprintf(_("Set external address:port to get to this masternode (example: %s)"), "128.127.106.235:51472")); strUsage += HelpMessageOpt("-budgetvotemode=", _("Change automatic finalized budget voting behavior. mode=auto: Vote for only exact finalized budget match to my generated budget. (string, default: auto)")); + strUsage += HelpMessageOpt("-mnoperatorprivatekey=", _("Set the masternode operator private key. Only valid with -masternode=1. When set, the masternode acts as a deterministic masternode.")); strUsage += HelpMessageGroup(_("Node relay options:")); strUsage += HelpMessageOpt("-datacarrier", strprintf(_("Relay and mine data carrier transactions (default: %u)"), DEFAULT_ACCEPT_DATACARRIER)); @@ -1894,14 +1895,34 @@ bool AppInitMain() } if (fMasterNode) { - LogPrintf("IS MASTER NODE\n"); - - // init and register activeMasternodeManager - activeMasternodeManager = new CActiveDeterministicMasternodeManager(); - RegisterValidationInterface(activeMasternodeManager); - - auto res = initMasternode(gArgs.GetArg("-masternodeprivkey", ""), gArgs.GetArg("-masternodeaddr", ""), true); - if (!res) { return UIError(res.getError()); } + 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 = "Cannot start deterministic masternode before enforcement. Remove -mnoperatorprivatekey to start as legacy masternode"; + LogPrintf("-- ERROR: %s\n", strError); + return UIError(_(strError.c_str())); + } + // Create and register activeMasternodeManager + activeMasternodeManager = new CActiveDeterministicMasternodeManager(); + auto res = activeMasternodeManager->SetOperatorKey(mnoperatorkeyStr); + if (!res) { return UIError(res.getError()); } + RegisterValidationInterface(activeMasternodeManager); + // Init active masternode + activeMasternodeManager->Init(); + } else { + // Check enforcement + if (deterministicMNManager->LegacyMNObsolete()) { + const std::string strError = "Legacy masternode system disabled. Use -mnoperatorprivatekey to start as deterministic masternode"; + LogPrintf("-- ERROR: %s\n", strError); + return UIError(_(strError.c_str())); + } + 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 @@ -1938,11 +1959,6 @@ bool AppInitMain() return false; } - if (fMasterNode) { - assert(activeMasternodeManager); - activeMasternodeManager->Init(); - } - // ********************************************************* Step 11: start node if (!strErrors.str().empty()) diff --git a/src/messagesigner.cpp b/src/messagesigner.cpp index 8149002c8c9884..386f47c868853d 100644 --- a/src/messagesigner.cpp +++ b/src/messagesigner.cpp @@ -22,6 +22,16 @@ bool CMessageSigner::GetKeysFromSecret(const std::string& strSecret, CKey& keyRe return true; } +bool CMessageSigner::GetKeysFromSecret(const std::string& strSecret, CKey& keyRet, CKeyID& keyIDRet) +{ + CPubKey pubkey; + if (!GetKeysFromSecret(strSecret, keyRet, pubkey)) { + return false; + } + keyIDRet = pubkey.GetID(); + return true; +} + uint256 CMessageSigner::GetMessageHash(const std::string& strMessage) { CHashWriter ss(SER_GETHASH, 0); diff --git a/src/messagesigner.h b/src/messagesigner.h index c088b04ac3832c..ded8c6e6e2a2dd 100644 --- a/src/messagesigner.h +++ b/src/messagesigner.h @@ -23,6 +23,7 @@ class CMessageSigner public: /// Set the private/public key values, returns true if successful static bool GetKeysFromSecret(const std::string& strSecret, CKey& keyRet, CPubKey& pubkeyRet); + static bool GetKeysFromSecret(const std::string& strSecret, CKey& keyRet, CKeyID& keyIDRet); /// Get the hash based on the input message static uint256 GetMessageHash(const std::string& strMessage); /// Sign the message, returns true if successful