From: Sunny King Date: Fri, 3 Aug 2012 20:50:51 +0000 (+0100) Subject: PPCoin: Fix premature mint thread exit since 06281cf X-Git-Tag: v0.4.0-unstable~111 X-Git-Url: https://git.novaco.in/?p=novacoin.git;a=commitdiff_plain;h=16580f9e77f54d9fcbf53a9af99c26d1e3eea5d3 PPCoin: Fix premature mint thread exit since 06281cf Wallet lock warning message for minting blocks Block minting suspended when wallet is locked --- diff --git a/src/bitcoinrpc.cpp b/src/bitcoinrpc.cpp index 2ea5415..61f09c6 100644 --- a/src/bitcoinrpc.cpp +++ b/src/bitcoinrpc.cpp @@ -972,8 +972,8 @@ Value sendmany(const Array& params, bool fHelp) if (pwalletMain->IsLocked()) throw JSONRPCError(-13, "Error: Please enter the wallet passphrase with walletpassphrase first."); - if (fWalletUnlockStakeOnly) - throw JSONRPCError(-13, "Error: Wallet unlocked for coinstake only."); + if (fWalletUnlockMintOnly) + throw JSONRPCError(-13, "Error: Wallet unlocked for block minting only."); // Check funds int64 nBalance = GetAccountBalance(strAccount, nMinDepth); @@ -1601,9 +1601,9 @@ Value walletpassphrase(const Array& params, bool fHelp) { if (pwalletMain->IsCrypted() && (fHelp || params.size() < 2 || params.size() > 3)) throw runtime_error( - "walletpassphrase [stakeonly]\n" + "walletpassphrase [mintonly]\n" "Stores the wallet decryption key in memory for seconds.\n" - "stakeonly is optional true/false allowing only stake creation."); + "mintonly is optional true/false allowing only block minting."); if (fHelp) return true; if (!pwalletMain->IsCrypted()) @@ -1635,9 +1635,9 @@ Value walletpassphrase(const Array& params, bool fHelp) // ppcoin: if user OS account compromised prevent trivial sendmoney commands if (params.size() > 2) - fWalletUnlockStakeOnly = params[2].get_bool(); + fWalletUnlockMintOnly = params[2].get_bool(); else - fWalletUnlockStakeOnly = false; + fWalletUnlockMintOnly = false; return Value::null; } @@ -1886,7 +1886,7 @@ Value getwork(const Array& params, bool fHelp) pblock->vtx[0].vin[0].scriptSig = mapNewBlock[pdata->hashMerkleRoot].second; pblock->hashMerkleRoot = pblock->BuildMerkleTree(); if (!pblock->SignBlock(*pwalletMain)) - throw JSONRPCError(-100, "Unable to sign block"); + throw JSONRPCError(-100, "Unable to sign block, wallet locked?"); return CheckWork(pblock, *pwalletMain, reservekey); } diff --git a/src/main.cpp b/src/main.cpp index 835f60c..e8b8c61 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2408,6 +2408,9 @@ void PrintBlockTree() map mapAlerts; CCriticalSection cs_mapAlerts; +static string strMintMessage = _("Info: Minting suspended due to locked wallet."); +static string strMintWarning; + string GetWarnings(string strFor) { int nPriority = 0; @@ -2416,6 +2419,13 @@ string GetWarnings(string strFor) if (GetBoolArg("-testsafemode")) strRPC = "test"; + // ppcoin: wallet lock warning for minting + if (strMintWarning != "") + { + nPriority = 0; + strStatusBar = strMintWarning; + } + // Misc warnings like out of disk space and clock is wrong if (strMiscWarning != "") { @@ -3554,6 +3564,8 @@ public: uint64 nLastBlockTx = 0; uint64 nLastBlockSize = 0; +// CreateNewBlock: +// fProofOfStake: try (best effort) to make a proof-of-stake block CBlock* CreateNewBlock(CWallet* pwallet, bool fProofOfStake) { CReserveKey reservekey(pwallet); @@ -3577,7 +3589,7 @@ CBlock* CreateNewBlock(CWallet* pwallet, bool fProofOfStake) static unsigned int nLastCoinStakeCheckTime = GetAdjustedTime() - nMaxClockDrift / 2; // only initialized at startup CBlockIndex* pindexPrev = pindexBest; - if (fProofOfStake) + if (fProofOfStake) // attemp to find a coinstake { while (nLastCoinStakeCheckTime < GetAdjustedTime()) { @@ -3751,8 +3763,7 @@ CBlock* CreateNewBlock(CWallet* pwallet, bool fProofOfStake) // Fill in header pblock->hashPrevBlock = pindexPrev->GetBlockHash(); pblock->hashMerkleRoot = pblock->BuildMerkleTree(); - pblock->nTime = max(pindexPrev->GetMedianTimePast()+1, GetAdjustedTime()); - pblock->nTime = max(pblock->GetBlockTime(), pblock->GetMaxTransactionTime()); + pblock->nTime = max(pindexPrev->GetMedianTimePast()+1, pblock->GetMaxTransactionTime()); pblock->nTime = max(pblock->GetBlockTime(), pindexPrev->GetBlockTime() - nMaxClockDrift); pblock->UpdateTime(pindexPrev); pblock->nNonce = 0; @@ -3877,7 +3888,7 @@ void BitcoinMiner(CWallet *pwallet, bool fProofOfStake) CReserveKey reservekey(pwallet); unsigned int nExtraNonce = 0; - while (fGenerateBitcoins) + while (fGenerateBitcoins || fProofOfStake) { if (fShutdown) return; @@ -3886,10 +3897,16 @@ void BitcoinMiner(CWallet *pwallet, bool fProofOfStake) Sleep(1000); if (fShutdown) return; - if (!fGenerateBitcoins) + if ((!fGenerateBitcoins) && !fProofOfStake) return; } + while (pwallet->IsLocked()) + { + strMintWarning = strMintMessage; + Sleep(1000); + } + strMintWarning = ""; // // Create new block @@ -3904,17 +3921,21 @@ void BitcoinMiner(CWallet *pwallet, bool fProofOfStake) IncrementExtraNonce(pblock.get(), pindexPrev, nExtraNonce); // ppcoin: if proof-of-stake block found then process block - if (pblock->IsProofOfStake()) + if (fProofOfStake) { - if (!pblock->SignBlock(*pwalletMain)) + if (pblock->IsProofOfStake()) { - error("CPUMiner: Unable to sign new proof-of-stake block"); - return; + if (!pblock->SignBlock(*pwalletMain)) + { + strMintWarning = strMintMessage; + continue; + } + strMintWarning = ""; + printf("CPUMiner : proof-of-stake block found %s\n", pblock->GetHash().ToString().c_str()); + SetThreadPriority(THREAD_PRIORITY_NORMAL); + CheckWork(pblock.get(), *pwalletMain, reservekey); + SetThreadPriority(THREAD_PRIORITY_LOWEST); } - printf("CPUMiner : proof-of-stake block found %s\n", pblock->GetHash().ToString().c_str()); - SetThreadPriority(THREAD_PRIORITY_NORMAL); - CheckWork(pblock.get(), *pwalletMain, reservekey); - SetThreadPriority(THREAD_PRIORITY_LOWEST); Sleep(500); continue; } @@ -3964,10 +3985,10 @@ void BitcoinMiner(CWallet *pwallet, bool fProofOfStake) assert(hash == pblock->GetHash()); if (!pblock->SignBlock(*pwalletMain)) { - error("BitcoinMiner: Unable to sign new proof-of-work block"); - return; + strMintWarning = strMintMessage; + break; } - + strMintWarning = ""; SetThreadPriority(THREAD_PRIORITY_NORMAL); CheckWork(pblock.get(), *pwalletMain, reservekey); SetThreadPriority(THREAD_PRIORITY_LOWEST); @@ -4022,8 +4043,7 @@ void BitcoinMiner(CWallet *pwallet, bool fProofOfStake) break; // Update nTime every few seconds - pblock->nTime = max(pindexPrev->GetMedianTimePast()+1, GetAdjustedTime()); - pblock->nTime = max(pblock->GetBlockTime(), pblock->GetMaxTransactionTime()); + pblock->nTime = max(pindexPrev->GetMedianTimePast()+1, pblock->GetMaxTransactionTime()); pblock->nTime = max(pblock->GetBlockTime(), pindexPrev->GetBlockTime() - nMaxClockDrift); pblock->UpdateTime(pindexPrev); nBlockTime = ByteReverse(pblock->nTime); diff --git a/src/wallet.cpp b/src/wallet.cpp index c4e568c..144c4b3 100644 --- a/src/wallet.cpp +++ b/src/wallet.cpp @@ -73,7 +73,7 @@ bool CWallet::AddCScript(const CScript& redeemScript) // ppcoin: optional setting to create coinstake only when unlocked; // serves to disable the trivial sendmoney when OS account compromised -bool fWalletUnlockStakeOnly = false; +bool fWalletUnlockMintOnly = false; bool CWallet::Unlock(const SecureString& strWalletPassphrase) { @@ -1365,9 +1365,9 @@ string CWallet::SendMoney(CScript scriptPubKey, int64 nValue, CWalletTx& wtxNew, printf("SendMoney() : %s", strError.c_str()); return strError; } - if (fWalletUnlockStakeOnly) + if (fWalletUnlockMintOnly) { - string strError = _("Error: Wallet unlocked for coinstake only, unable to create transaction."); + string strError = _("Error: Wallet unlocked for block minting only, unable to create transaction."); printf("SendMoney() : %s", strError.c_str()); return strError; } diff --git a/src/wallet.h b/src/wallet.h index d3c25f9..9229d30 100644 --- a/src/wallet.h +++ b/src/wallet.h @@ -11,7 +11,7 @@ #include "keystore.h" #include "script.h" -extern bool fWalletUnlockStakeOnly; +extern bool fWalletUnlockMintOnly; class CWalletTx; class CReserveKey;