X-Git-Url: https://git.novaco.in/?a=blobdiff_plain;f=src%2Fminer.cpp;h=f91b3bda5e85c6f32d96e431bcb5d08a42fb18eb;hb=d008ea3376606276a86ed3c972654363eb23f47d;hp=5ae487cfb50d536b1c46f49bba0caf999d4df5ec;hpb=adb8391acdf671640adb1e8be564e68b254fca69;p=novacoin.git diff --git a/src/miner.cpp b/src/miner.cpp index 5ae487c..f91b3bd 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -15,8 +15,7 @@ using namespace std; // BitcoinMiner // -string strMintMessage = "Info: Minting suspended due to locked wallet."; -string strMintWarning; +extern unsigned int nMinerSleep; int static FormatHashBlocks(void* pbuffer, unsigned int len) { @@ -107,8 +106,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 +123,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 +155,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 +272,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)) @@ -333,7 +308,7 @@ CBlock* CreateNewBlock(CWallet* pwallet, bool fProofOfStake) if (nBlockSigOps + nTxSigOps >= MAX_BLOCK_SIGOPS) continue; - if (!tx.ConnectInputs(txdb, mapInputs, mapTestPoolTmp, CDiskTxPos(1,1,1), pindexPrev, false, true)) + if (!tx.ConnectInputs(txdb, mapInputs, mapTestPoolTmp, CDiskTxPos(1,1,1), pindexPrev, false, true, true, MANDATORY_SCRIPT_VERIFY_FLAGS)) continue; mapTestPoolTmp[tx.GetHash()] = CTxIndex(CDiskTxPos(1,1,1), tx.vout.size()); swap(mapTestPool, mapTestPoolTmp); @@ -374,18 +349,19 @@ CBlock* CreateNewBlock(CWallet* pwallet, bool fProofOfStake) nLastBlockSize = nBlockSize; if (fDebug && GetBoolArg("-printpriority")) - printf("CreateNewBlock(): total size %"PRI64u"\n", nBlockSize); + 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 +380,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,19 +525,20 @@ void StakeMiner(CWallet *pwallet) { if (fShutdown) return; - while (vNodes.empty() || IsInitialBlockDownload()) + + while (pwallet->IsLocked()) { Sleep(1000); if (fShutdown) return; } - while (pwallet->IsLocked()) + while (vNodes.empty() || IsInitialBlockDownload()) { - strMintWarning = strMintMessage; Sleep(1000); + if (fShutdown) + return; } - strMintWarning = ""; // // Create new block @@ -572,22 +550,17 @@ 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 = ""; SetThreadPriority(THREAD_PRIORITY_NORMAL); CheckStake(pblock.get(), *pwallet); SetThreadPriority(THREAD_PRIORITY_LOWEST); + Sleep(500); } + else + Sleep(nMinerSleep); - Sleep(500); continue; } }