X-Git-Url: https://git.novaco.in/?a=blobdiff_plain;f=src%2Fminer.cpp;h=99267651c50f4535fa6ba6f36278f4c7529db1c3;hb=8d43f1482a14263a76c039c227c4383580dcc1db;hp=5ae487cfb50d536b1c46f49bba0caf999d4df5ec;hpb=adb8391acdf671640adb1e8be564e68b254fca69;p=novacoin.git diff --git a/src/miner.cpp b/src/miner.cpp index 5ae487c..9926765 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -15,9 +15,11 @@ using namespace std; // BitcoinMiner // -string strMintMessage = "Info: Minting suspended due to locked wallet."; +string strMintMessage = "Stake miner suspended due to locked wallet."; string strMintWarning; +extern unsigned int nMinerSleep; + int static FormatHashBlocks(void* pbuffer, unsigned int len) { unsigned char* pdata = (unsigned char*)pbuffer; @@ -107,8 +109,7 @@ public: } }; -// CreateNewBlock: -// fProofOfStake: try (best effort) to make a proof-of-stake block +// CreateNewBlock: create new block (without proof-of-work/proof-of-stake) CBlock* CreateNewBlock(CWallet* pwallet, bool fProofOfStake) { // Create new block @@ -125,7 +126,7 @@ CBlock* CreateNewBlock(CWallet* pwallet, bool fProofOfStake) if (!fProofOfStake) { CReserveKey reservekey(pwallet); - txNew.vout[0].scriptPubKey << reservekey.GetReservedKey() << OP_CHECKSIG; + txNew.vout[0].scriptPubKey.SetDestination(reservekey.GetReservedKey().GetID()); } else txNew.vout[0].SetEmpty(); @@ -157,32 +158,9 @@ CBlock* CreateNewBlock(CWallet* pwallet, bool fProofOfStake) if (mapArgs.count("-mintxfee")) ParseMoney(mapArgs["-mintxfee"], nMinTxFee); - // ppcoin: if coinstake available add coinstake tx - static int64 nLastCoinStakeSearchTime = GetAdjustedTime(); // only initialized at startup CBlockIndex* pindexPrev = pindexBest; - if (fProofOfStake) // attempt to find a coinstake - { - pblock->nBits = GetNextTargetRequired(pindexPrev, true); - CTransaction txCoinStake; - int64 nSearchTime = txCoinStake.nTime; // search to current time - if (nSearchTime > nLastCoinStakeSearchTime) - { - if (pwallet->CreateCoinStake(*pwallet, pblock->nBits, nSearchTime-nLastCoinStakeSearchTime, txCoinStake)) - { - if (txCoinStake.nTime >= max(pindexPrev->GetMedianTimePast()+1, pindexPrev->GetBlockTime() - nMaxClockDrift)) - { // make sure coinstake would meet timestamp protocol - // as it would be the same as the block timestamp - pblock->vtx[0].nTime = txCoinStake.nTime; - pblock->vtx.push_back(txCoinStake); - } - } - nLastCoinStakeSearchInterval = nSearchTime - nLastCoinStakeSearchTime; - nLastCoinStakeSearchTime = nSearchTime; - } - } - - pblock->nBits = GetNextTargetRequired(pindexPrev, pblock->IsProofOfStake()); + pblock->nBits = GetNextTargetRequired(pindexPrev, fProofOfStake); // Collect memory pool transactions into the block int64 nFees = 0; @@ -297,11 +275,11 @@ CBlock* CreateNewBlock(CWallet* pwallet, bool fProofOfStake) continue; // Timestamp limit - if (tx.nTime > GetAdjustedTime() || (pblock->IsProofOfStake() && tx.nTime > pblock->vtx[1].nTime)) + if (tx.nTime > GetAdjustedTime() || (fProofOfStake && tx.nTime > pblock->vtx[0].nTime)) continue; - // ppcoin: simplify transaction fee - allow free = false - int64 nMinFee = tx.GetMinFee(nBlockSize, false, GMF_BLOCK); + // Simplify transaction fee - allow free = false + int64 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)) @@ -376,16 +354,17 @@ CBlock* CreateNewBlock(CWallet* pwallet, bool fProofOfStake) if (fDebug && GetBoolArg("-printpriority")) printf("CreateNewBlock(): total size %"PRI64u"\n", nBlockSize); - if (pblock->IsProofOfWork()) - pblock->vtx[0].vout[0].nValue = GetProofOfWorkReward(pblock->nBits); + if (!fProofOfStake) + { + bool fProtocol048 = fTestNet || VALIDATION_SWITCH_TIME < pblock->nTime; + pblock->vtx[0].vout[0].nValue = GetProofOfWorkReward(pblock->nBits, fProtocol048 ? nFees : 0); + } // Fill in header pblock->hashPrevBlock = pindexPrev->GetBlockHash(); - if (pblock->IsProofOfStake()) - pblock->nTime = pblock->vtx[1].nTime; //same as coinstake timestamp pblock->nTime = max(pindexPrev->GetMedianTimePast()+1, pblock->GetMaxTransactionTime()); - pblock->nTime = max(pblock->GetBlockTime(), pindexPrev->GetBlockTime() - nMaxClockDrift); - if (pblock->IsProofOfWork()) + pblock->nTime = max(pblock->GetBlockTime(), PastDrift(pindexPrev->GetBlockTime())); + if (!fProofOfStake) pblock->UpdateTime(pindexPrev); pblock->nNonce = 0; } @@ -404,6 +383,7 @@ void IncrementExtraNonce(CBlock* pblock, CBlockIndex* pindexPrev, unsigned int& hashPrevBlock = pblock->hashPrevBlock; } ++nExtraNonce; + unsigned int nHeight = pindexPrev->nHeight+1; // Height first in coinbase required for block.version=2 pblock->vtx[0].vin[0].scriptSig = (CScript() << nHeight << CBigNum(nExtraNonce)) + COINBASE_FLAGS; assert(pblock->vtx[0].vin[0].scriptSig.size() <= 100); @@ -548,18 +528,22 @@ void StakeMiner(CWallet *pwallet) { if (fShutdown) return; - while (vNodes.empty() || IsInitialBlockDownload()) + + while (pwallet->IsLocked()) { + strMintWarning = strMintMessage; Sleep(1000); if (fShutdown) return; } - while (pwallet->IsLocked()) + while (vNodes.empty() || IsInitialBlockDownload()) { - strMintWarning = strMintMessage; Sleep(1000); + if (fShutdown) + return; } + strMintWarning = ""; // @@ -572,22 +556,18 @@ void StakeMiner(CWallet *pwallet) return; IncrementExtraNonce(pblock.get(), pindexPrev, nExtraNonce); - if(pblock->IsProofOfStake()) + // Trying to sign a block + if (pblock->SignBlock(*pwallet)) { - // Trying to sign a block - if (!pblock->SignBlock(*pwallet)) - { - strMintWarning = strMintMessage; - continue; - } - - strMintWarning = ""; + strMintWarning = _("Stake generation: new block found!"); SetThreadPriority(THREAD_PRIORITY_NORMAL); CheckStake(pblock.get(), *pwallet); SetThreadPriority(THREAD_PRIORITY_LOWEST); + Sleep(500); } + else + Sleep(nMinerSleep); - Sleep(500); continue; } }