const CTxOut &CCoinsViewCache::GetOutputFor(const CTxIn& input, int& nVersion) const { const CCoins* coins = AccessCoins(input.prevout.hash); assert(coins && coins->IsAvailable(input.prevout.n)); nVersion = coins->nVersion; return coins->vout[input.prevout.n]; }
bool CCoinsViewCache::HaveInputs(const CTransaction& tx) const { if (!tx.IsCoinBase()) { for (unsigned int i = 0; i < tx.vin.size(); i++) { const COutPoint &prevout = tx.vin[i].prevout; const CCoins* coins = AccessCoins(prevout.hash); if (!coins || !coins->IsAvailable(prevout.n)) { return false; } } } return true; }
CAmount CCoinsViewCache::GetValueIn(const CTransaction& tx, int valuationHeight) const { if (tx.IsCoinBase()) return 0; CAmount nValueIn = 0; for (unsigned int i = 0; i < tx.vin.size(); i++){ CTxOut outTX=GetOutputFor(tx.vin[i]); const COutPoint &prevout = tx.vin[i].prevout; const CCoins* coins = AccessCoins(prevout.hash); nValueIn += outTX.GetValueWithInterest(coins->nHeight,valuationHeight); } return nValueIn; }
double CCoinsViewCache::GetPriority(const CTransaction& tx, int nHeight) const { if (tx.IsCoinBase() || tx.IsCoinStake()) return 0.0; double dResult = 0.0; for (const CTxIn& txin: tx.vin) { const CCoins* coins = AccessCoins(txin.prevout.hash); assert(coins); if (!coins->IsAvailable(txin.prevout.n)) continue; if (coins->nHeight < nHeight) { dResult += coins->vout[txin.prevout.n].nValue * (nHeight - coins->nHeight); } } return tx.ComputePriority(dResult); }
double CCoinsViewCache::GetPriority(const CTransaction &tx, int nHeight, CAmount &inChainInputValue) const { inChainInputValue = 0; if (tx.IsCoinBase()) return 0.0; double dResult = 0.0; BOOST_FOREACH(const CTxIn& txin, tx.vin) { const CCoins* coins = AccessCoins(txin.prevout.hash); assert(coins); if (!coins->IsAvailable(txin.prevout.n)) continue; if (coins->nHeight <= nHeight) { dResult += coins->vout[txin.prevout.n].nValue * (nHeight-coins->nHeight); inChainInputValue += coins->vout[txin.prevout.n].nValue; } } return tx.ComputePriority(dResult); }