X-Git-Url: https://git.novaco.in/?a=blobdiff_plain;f=src%2Fwallet.cpp;h=f9ce658161998079e567aee99f55d883bea96e70;hb=dedcc04171679c3deaad10b88f99c72c8a9dac5d;hp=36ccc62d02e62f34503ddbe0c19f293defdae2ba;hpb=e15bd794f98272a17adfc447adf68011ababf8bd;p=novacoin.git diff --git a/src/wallet.cpp b/src/wallet.cpp index 36ccc62..f9ce658 100644 --- a/src/wallet.cpp +++ b/src/wallet.cpp @@ -1625,97 +1625,37 @@ void CWallet::GetStakeWeightFromValue(const int64& nTime, const int64& nValue, u } -// NovaCoin: get current stake weight -bool CWallet::GetStakeWeight(const CKeyStore& keystore, uint64& nMinWeight, uint64& nMaxWeight, uint64& nWeight) +// NovaCoin: get current stake miner statistics +void CWallet::GetStakeStats(float &nKernelsRate, float &nCoinDaysRate) { - // Choose coins to use - int64 nBalance = GetBalance(); - int64 nReserveBalance = 0; - - if (mapArgs.count("-reservebalance") && !ParseMoney(mapArgs["-reservebalance"], nReserveBalance)) - return error("CreateCoinStake : invalid reserve balance amount"); + static uint64 nLastKernels = 0, nLastCoinDays = 0; + static float nLastKernelsRate = 0, nLastCoinDaysRate = 0; + static int64 nLastTime = GetTime(); - if (nBalance <= nReserveBalance) - return false; - - CTxDB txdb("r"); + if (nKernelsTried < nLastKernels) { - LOCK2(cs_main, cs_wallet); - // Cache outputs unless best block or wallet transaction set changed - if (!fCoinsDataActual) - { - mapMeta.clear(); - int64 nValueIn = 0; - CoinsSet setCoins; - if (!SelectCoinsSimple(nBalance - nReserveBalance, MIN_TX_FEE, MAX_MONEY, GetAdjustedTime(), nCoinbaseMaturity * 10, setCoins, nValueIn)) - return false; - - if (setCoins.empty()) - return false; - - { - CTxIndex txindex; - CBlock block; - for(CoinsSet::iterator pcoin = setCoins.begin(); pcoin != setCoins.end(); pcoin++) - { - // Load transaction index item - if (!txdb.ReadTxIndex(pcoin->first->GetHash(), txindex)) - continue; + nLastKernels = 0; + nLastCoinDays = 0; - // Read block header - if (!block.ReadFromDisk(txindex.pos.nFile, txindex.pos.nBlockPos, false)) - continue; - - uint64 nStakeModifier = 0; - if (!GetKernelStakeModifier(block.GetHash(), nStakeModifier)) - continue; - - // Add meta record - // (txid, vout.n) => ((txindex, (tx, vout.n)), (block, modifier)) - mapMeta[make_pair(pcoin->first->GetHash(), pcoin->second)] = make_pair(make_pair(txindex, *pcoin), make_pair(block, nStakeModifier)); - - if (fDebug) - printf("Load coin: %s\n", pcoin->first->GetHash().GetHex().c_str()); - } - } - - if (fDebug) - printf("Get stake weight: %d meta items loaded for %d coins\n", mapMeta.size(), setCoins.size()); - - fCoinsDataActual = true; - } + nLastTime = GetTime(); } - - // (txid, vout.n) => ((txindex, (tx, vout.n)), (block, modifier)) - for(MetaMap::const_iterator meta_item = mapMeta.begin(); meta_item != mapMeta.end(); meta_item++) + int64 nInterval = GetTime() - nLastTime; + //if (nKernelsTried > 1000 && nInterval > 5) + if (nInterval > 10) { - // Get coin - CoinsSet::value_type pcoin = meta_item->second.first.second; + nKernelsRate = nLastKernelsRate = ( nKernelsTried - nLastKernels ) / (float) nInterval; + nCoinDaysRate = nLastCoinDaysRate = ( nCoinDaysTried - nLastCoinDays ) / (float) nInterval; - int64 nTimeWeight = GetWeight((int64)pcoin.first->nTime, (int64)GetTime()); - CBigNum bnCoinDayWeight = CBigNum(pcoin.first->vout[pcoin.second].nValue) * nTimeWeight / COIN / (24 * 60 * 60); - - // Weight is greater than zero - if (nTimeWeight > 0) - { - nWeight += bnCoinDayWeight.getuint64(); - } - - // Weight is greater than zero, but the maximum value isn't reached yet - if (nTimeWeight > 0 && nTimeWeight < nStakeMaxAge) - { - nMinWeight += bnCoinDayWeight.getuint64(); - } - - // Maximum weight was reached - if (nTimeWeight == nStakeMaxAge) - { - nMaxWeight += bnCoinDayWeight.getuint64(); - } + nLastKernels = nKernelsTried; + nLastCoinDays = nCoinDaysTried; + nLastTime = GetTime(); + } + else + { + nKernelsRate = nLastKernelsRate; + nCoinDaysRate = nLastCoinDaysRate; } - - return true; } bool CWallet::MergeCoins(const int64& nAmount, const int64& nMinValue, const int64& nOutputValue, list& listMerged) @@ -1913,9 +1853,11 @@ bool CWallet::CreateCoinStake(const CKeyStore& keystore, unsigned int nBits, int } if (fDebug) - printf("Stake miner: %d meta items loaded for %d coins\n", mapMeta.size(), setCoins.size()); + printf("Stake miner: %"PRIszu" meta items loaded for %"PRIszu" coins\n", mapMeta.size(), setCoins.size()); fCoinsDataActual = true; + nKernelsTried = 0; + nCoinDaysTried = 0; } } @@ -1933,7 +1875,7 @@ bool CWallet::CreateCoinStake(const CKeyStore& keystore, unsigned int nBits, int COutPoint prevoutStake; CoinsSet::value_type kernelcoin; - if (ScanForStakeKernelHash(mapMeta, settings, kernelcoin, nTimeTx, nBlockTime)) + if (ScanForStakeKernelHash(mapMeta, settings, kernelcoin, nTimeTx, nBlockTime, nKernelsTried, nCoinDaysTried)) { // Found a kernel if (fDebug && GetBoolArg("-printcoinstake")) @@ -2042,7 +1984,13 @@ bool CWallet::CreateCoinStake(const CKeyStore& keystore, unsigned int nBits, int CTxDB txdb("r"); if (!txNew.GetCoinAge(txdb, nCoinAge)) return error("CreateCoinStake : failed to calculate coin age"); - nCredit += GetProofOfStakeReward(nCoinAge, nBits, txNew.nTime); + + int64 nReward = GetProofOfStakeReward(nCoinAge, nBits, txNew.nTime); + // Refuse to create mint that has zero or negative reward + if(nReward <= 0) + return false; + + nCredit += nReward; } int64 nMinFee = 0; @@ -2780,3 +2728,21 @@ void CWallet::GetKeyBirthTimes(std::map &mapKeyBirth) const { for (std::map::const_iterator it = mapKeyFirstBlock.begin(); it != mapKeyFirstBlock.end(); it++) mapKeyBirth[it->first] = it->second->nTime - 7200; // block times can be 2h off } + +void CWallet::ClearOrphans() +{ + list orphans; + + LOCK(cs_wallet); + for(map::const_iterator it = mapWallet.begin(); it != mapWallet.end(); ++it) + { + const CWalletTx *wtx = &(*it).second; + if((wtx->IsCoinBase() || wtx->IsCoinStake()) && !wtx->IsInMainChain()) + { + orphans.push_back(wtx->GetHash()); + } + } + + for(list::const_iterator it = orphans.begin(); it != orphans.end(); ++it) + EraseFromWallet(*it); +}