// BitcoinMiner
//
-string strMintMessage = "Info: Minting suspended due to locked wallet.";
-string strMintWarning;
+extern unsigned int nMinerSleep;
int static FormatHashBlocks(void* pbuffer, unsigned int len)
{
}
};
-// 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
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();
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;
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))
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);
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;
}
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);
{
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
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;
}
}