X-Git-Url: https://git.novaco.in/?a=blobdiff_plain;f=src%2Fminer.cpp;h=41a4303a67241e614baf07664d56a3246b942813;hb=309244e6fd8edbd6e34e472d5287c1d597af967d;hp=02b38bf161352e47919f849a503be5ecf51a0e48;hpb=a348ee6f5081803ad1ae860c29075b08d772dd08;p=novacoin.git diff --git a/src/miner.cpp b/src/miner.cpp index 02b38bf..41a4303 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -289,9 +289,6 @@ CBlock* CreateNewBlock(CWallet* pwallet, CTransaction *txCoinStake) if (tx.nTime > GetAdjustedTime() || (fProofOfStake && tx.nTime > txCoinStake->nTime)) continue; - // Simplify transaction fee - allow free = false - int64_t nMinFee = tx.GetMinFee(nBlockSize, true, GMF_BLOCK, nTxSize); - // Skip free transactions if we're past the minimum block size: if (fSortedByFee && (dFeePerKb < nMinTxFee) && (nBlockSize + nTxSize >= nBlockMinSize)) continue; @@ -314,10 +311,13 @@ CBlock* CreateNewBlock(CWallet* pwallet, CTransaction *txCoinStake) if (!tx.FetchInputs(txdb, mapTestPoolTmp, false, true, mapInputs, fInvalid)) continue; + // Transaction fee int64_t nTxFees = tx.GetValueIn(mapInputs)-tx.GetValueOut(); + int64_t nMinFee = tx.GetMinFee(nBlockSize, true, GMF_BLOCK, nTxSize); if (nTxFees < nMinFee) continue; + // Sigops accumulation nTxSigOps += tx.GetP2SHSigOpCount(mapInputs); if (nBlockSigOps + nTxSigOps >= MAX_BLOCK_SIGOPS) continue; @@ -649,12 +649,14 @@ bool ScanMap(const MidstateMap &inputsMap, uint32_t nBits, MidstateMap::key_type return false; } -void StakeMiner(CWallet *pwallet) +// Stake miner thread +void ThreadStakeMiner(void* parg) { SetThreadPriority(THREAD_PRIORITY_LOWEST); // Make this thread recognisable as the mining thread RenameThread("novacoin-miner"); + CWallet* pwallet = (CWallet*)parg; MidstateMap inputsMap; if (!FillMap(pwallet, GetAdjustedTime(), inputsMap)) @@ -665,107 +667,128 @@ void StakeMiner(CWallet *pwallet) CBlockIndex* pindexPrev = pindexBest; uint32_t nBits = GetNextTargetRequired(pindexPrev, true); - while (true) + printf("ThreadStakeMinter started\n"); + + try { - if (fShutdown) - return; + vnThreadsRunning[THREAD_MINTER]++; - while (pwallet->IsLocked()) - { - Sleep(1000); - if (fShutdown) - return; - } + MidstateMap::key_type LuckyInput; + std::pair solution; - while (vNodes.empty() || IsInitialBlockDownload()) + // Main miner loop + do { - fTrySync = true; - - Sleep(1000); if (fShutdown) - return; - } + goto _endloop; - if (fTrySync) - { - fTrySync = false; - if (vNodes.size() < 3 || nBestHeight < GetNumBlocksOfPeers()) + while (pwallet->IsLocked()) { Sleep(1000); - continue; + if (fShutdown) + goto _endloop; // Don't be afraid to use a goto if that's the best option. } - } - MidstateMap::key_type LuckyInput; - std::pair solution; - - if (ScanMap(inputsMap, nBits, LuckyInput, solution)) - { - SetThreadPriority(THREAD_PRIORITY_NORMAL); - - // Remove lucky input from the map - inputsMap.erase(inputsMap.find(LuckyInput)); + while (vNodes.empty() || IsInitialBlockDownload()) + { + fTrySync = true; - CKey key; - CTransaction txCoinStake; + Sleep(1000); + if (fShutdown) + goto _endloop; + } - // Create new coinstake transaction - if (!pwallet->CreateCoinStake(LuckyInput.first, LuckyInput.second, solution.second, pindexPrev->nBits, txCoinStake, key)) + if (fTrySync) { - string strMessage = _("Warning: Unable to create coinstake transaction, see debug.log for the details. Mining thread has been stopped."); - strMiscWarning = strMessage; - printf("*** %s\n", strMessage.c_str()); - - return; + // Don't try mine blocks unless we're at the top of chain and have at least three p2p connections. + fTrySync = false; + if (vNodes.size() < 3 || nBestHeight < GetNumBlocksOfPeers()) + { + Sleep(1000); + continue; + } } - // Now we have new coinstake, it's time to create the block ... - CBlock* pblock; - pblock = CreateNewBlock(pwallet, &txCoinStake); - if (!pblock) + if (ScanMap(inputsMap, nBits, LuckyInput, solution)) { - string strMessage = _("Warning: Unable to allocate memory for the new block object. Mining thread has been stopped."); - strMiscWarning = strMessage; - printf("*** %s\n", strMessage.c_str()); + SetThreadPriority(THREAD_PRIORITY_NORMAL); - return; - } + // Remove lucky input from the map + inputsMap.erase(inputsMap.find(LuckyInput)); - unsigned int nExtraNonce = 0; - IncrementExtraNonce(pblock, pindexPrev, nExtraNonce); + CKey key; + CTransaction txCoinStake; - // ... and sign it - if (!key.Sign(pblock->GetHash(), pblock->vchBlockSig)) - { - string strMessage = _("Warning: Proof-of-Stake miner is unable to sign the block (locked wallet?). Mining thread has been stopped."); - strMiscWarning = strMessage; - printf("*** %s\n", strMessage.c_str()); + // Create new coinstake transaction + if (!pwallet->CreateCoinStake(LuckyInput.first, LuckyInput.second, solution.second, nBits, txCoinStake, key)) + { + string strMessage = _("Warning: Unable to create coinstake transaction, see debug.log for the details. Mining thread has been stopped."); + strMiscWarning = strMessage; + printf("*** %s\n", strMessage.c_str()); - return; - } + break; + } - CheckStake(pblock, *pwallet); - SetThreadPriority(THREAD_PRIORITY_LOWEST); - Sleep(500); - } + // Now we have new coinstake, it's time to create the block ... + CBlock* pblock; + pblock = CreateNewBlock(pwallet, &txCoinStake); + if (!pblock) + { + string strMessage = _("Warning: Unable to allocate memory for the new block object. Mining thread has been stopped."); + strMiscWarning = strMessage; + printf("*** %s\n", strMessage.c_str()); - if (pindexPrev != pindexBest) - { - // The best block has been changed, we need to refill the map - if (FillMap(pwallet, GetAdjustedTime(), inputsMap)) - { - pindexPrev = pindexBest; - nBits = GetNextTargetRequired(pindexPrev, true); + break; + } + + unsigned int nExtraNonce = 0; + IncrementExtraNonce(pblock, pindexPrev, nExtraNonce); + + // ... and sign it + if (!key.Sign(pblock->GetHash(), pblock->vchBlockSig)) + { + string strMessage = _("Warning: Proof-of-Stake miner is unable to sign the block (locked wallet?). Mining thread has been stopped."); + strMiscWarning = strMessage; + printf("*** %s\n", strMessage.c_str()); + + break; + } + + CheckStake(pblock, *pwallet); + SetThreadPriority(THREAD_PRIORITY_LOWEST); + Sleep(500); } - else + + if (pindexPrev != pindexBest) { - // Clear existent data if FillMap failed - inputsMap.clear(); + // The best block has been changed, we need to refill the map + if (FillMap(pwallet, GetAdjustedTime(), inputsMap)) + { + pindexPrev = pindexBest; + nBits = GetNextTargetRequired(pindexPrev, true); + } + else + { + // Clear existent data if FillMap failed + inputsMap.clear(); + } } - } - Sleep(500); + Sleep(500); + + _endloop: + (void)0; // do nothing + } + while(!fShutdown); - continue; + vnThreadsRunning[THREAD_MINTER]--; + } + catch (std::exception& e) { + vnThreadsRunning[THREAD_MINTER]--; + PrintException(&e, "ThreadStakeMinter()"); + } catch (...) { + vnThreadsRunning[THREAD_MINTER]--; + PrintException(NULL, "ThreadStakeMinter()"); } + printf("ThreadStakeMinter exiting, %d threads remaining\n", vnThreadsRunning[THREAD_MINTER]); }