Refactor: move GetValueIn(tx) to tx.GetValueIn()
GetValueIn makes more sense as a CTransaction member.
This commit is contained in:
parent
98c7c8fd1d
commit
0733c1bde6
10 changed files with 33 additions and 36 deletions
|
@ -340,7 +340,6 @@ public:
|
||||||
|
|
||||||
@param[in] tx transaction for which we are checking input total
|
@param[in] tx transaction for which we are checking input total
|
||||||
@return Sum of value of all inputs (scriptSigs)
|
@return Sum of value of all inputs (scriptSigs)
|
||||||
@see CTransaction::FetchInputs
|
|
||||||
*/
|
*/
|
||||||
int64_t GetValueIn(const CTransaction& tx);
|
int64_t GetValueIn(const CTransaction& tx);
|
||||||
|
|
||||||
|
|
12
src/core.cpp
12
src/core.cpp
|
@ -106,6 +106,18 @@ bool CTransaction::IsNewerThan(const CTransaction& old) const
|
||||||
return fNewer;
|
return fNewer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int64_t CTransaction::GetValueOut() const
|
||||||
|
{
|
||||||
|
int64_t nValueOut = 0;
|
||||||
|
BOOST_FOREACH(const CTxOut& txout, vout)
|
||||||
|
{
|
||||||
|
nValueOut += txout.nValue;
|
||||||
|
if (!MoneyRange(txout.nValue) || !MoneyRange(nValueOut))
|
||||||
|
throw std::runtime_error("CTransaction::GetValueOut() : value out of range");
|
||||||
|
}
|
||||||
|
return nValueOut;
|
||||||
|
}
|
||||||
|
|
||||||
std::string CTransaction::ToString() const
|
std::string CTransaction::ToString() const
|
||||||
{
|
{
|
||||||
std::string str;
|
std::string str;
|
||||||
|
|
|
@ -14,6 +14,10 @@
|
||||||
|
|
||||||
class CTransaction;
|
class CTransaction;
|
||||||
|
|
||||||
|
/** No amount larger than this (in satoshi) is valid */
|
||||||
|
static const int64_t MAX_MONEY = 21000000 * COIN;
|
||||||
|
inline bool MoneyRange(int64_t nValue) { return (nValue >= 0 && nValue <= MAX_MONEY); }
|
||||||
|
|
||||||
/** An outpoint - a combination of a transaction hash and an index n into its vout */
|
/** An outpoint - a combination of a transaction hash and an index n into its vout */
|
||||||
class COutPoint
|
class COutPoint
|
||||||
{
|
{
|
||||||
|
@ -217,6 +221,11 @@ public:
|
||||||
uint256 GetHash() const;
|
uint256 GetHash() const;
|
||||||
bool IsNewerThan(const CTransaction& old) const;
|
bool IsNewerThan(const CTransaction& old) const;
|
||||||
|
|
||||||
|
// Return sum of txouts.
|
||||||
|
int64_t GetValueOut() const;
|
||||||
|
// GetValueIn() is a method on CCoinsViewCache, because
|
||||||
|
// inputs must be known to compute value in.
|
||||||
|
|
||||||
bool IsCoinBase() const
|
bool IsCoinBase() const
|
||||||
{
|
{
|
||||||
return (vin.size() == 1 && vin[0].prevout.IsNull());
|
return (vin.size() == 1 && vin[0].prevout.IsNull());
|
||||||
|
|
27
src/main.cpp
27
src/main.cpp
|
@ -379,21 +379,6 @@ bool IsFinalTx(const CTransaction &tx, int nBlockHeight, int64_t nBlockTime)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Amount of bitcoins spent by the transaction.
|
|
||||||
@return sum of all outputs (note: does not include fees)
|
|
||||||
*/
|
|
||||||
int64_t GetValueOut(const CTransaction& tx)
|
|
||||||
{
|
|
||||||
int64_t nValueOut = 0;
|
|
||||||
BOOST_FOREACH(const CTxOut& txout, tx.vout)
|
|
||||||
{
|
|
||||||
nValueOut += txout.nValue;
|
|
||||||
if (!MoneyRange(txout.nValue) || !MoneyRange(nValueOut))
|
|
||||||
throw std::runtime_error("GetValueOut() : value out of range");
|
|
||||||
}
|
|
||||||
return nValueOut;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Check transaction inputs, and make sure any
|
// Check transaction inputs, and make sure any
|
||||||
// pay-to-script-hash transactions are evaluating IsStandard scripts
|
// pay-to-script-hash transactions are evaluating IsStandard scripts
|
||||||
|
@ -717,7 +702,7 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa
|
||||||
// you should add code here to check that the transaction does a
|
// you should add code here to check that the transaction does a
|
||||||
// reasonable number of ECDSA signature verifications.
|
// reasonable number of ECDSA signature verifications.
|
||||||
|
|
||||||
int64_t nFees = view.GetValueIn(tx)-GetValueOut(tx);
|
int64_t nFees = view.GetValueIn(tx)-tx.GetValueOut();
|
||||||
unsigned int nSize = ::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION);
|
unsigned int nSize = ::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION);
|
||||||
|
|
||||||
// Don't accept it if it can't get into a block
|
// Don't accept it if it can't get into a block
|
||||||
|
@ -1342,12 +1327,12 @@ bool CheckInputs(const CTransaction& tx, CValidationState &state, CCoinsViewCach
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nValueIn < GetValueOut(tx))
|
if (nValueIn < tx.GetValueOut())
|
||||||
return state.DoS(100, error("CheckInputs() : %s value in < value out", tx.GetHash().ToString().c_str()),
|
return state.DoS(100, error("CheckInputs() : %s value in < value out", tx.GetHash().ToString().c_str()),
|
||||||
REJECT_INVALID, "in < out");
|
REJECT_INVALID, "in < out");
|
||||||
|
|
||||||
// Tally transaction fees
|
// Tally transaction fees
|
||||||
int64_t nTxFee = nValueIn - GetValueOut(tx);
|
int64_t nTxFee = nValueIn - tx.GetValueOut();
|
||||||
if (nTxFee < 0)
|
if (nTxFee < 0)
|
||||||
return state.DoS(100, error("CheckInputs() : %s nTxFee < 0", tx.GetHash().ToString().c_str()),
|
return state.DoS(100, error("CheckInputs() : %s nTxFee < 0", tx.GetHash().ToString().c_str()),
|
||||||
REJECT_INVALID, "fee < 0");
|
REJECT_INVALID, "fee < 0");
|
||||||
|
@ -1600,7 +1585,7 @@ bool ConnectBlock(CBlock& block, CValidationState& state, CBlockIndex* pindex, C
|
||||||
REJECT_INVALID, "too many sigops");
|
REJECT_INVALID, "too many sigops");
|
||||||
}
|
}
|
||||||
|
|
||||||
nFees += view.GetValueIn(tx)-GetValueOut(tx);
|
nFees += view.GetValueIn(tx)-tx.GetValueOut();
|
||||||
|
|
||||||
std::vector<CScriptCheck> vChecks;
|
std::vector<CScriptCheck> vChecks;
|
||||||
if (!CheckInputs(tx, state, view, fScriptChecks, flags, nScriptCheckThreads ? &vChecks : NULL))
|
if (!CheckInputs(tx, state, view, fScriptChecks, flags, nScriptCheckThreads ? &vChecks : NULL))
|
||||||
|
@ -1620,10 +1605,10 @@ bool ConnectBlock(CBlock& block, CValidationState& state, CBlockIndex* pindex, C
|
||||||
if (fBenchmark)
|
if (fBenchmark)
|
||||||
LogPrintf("- Connect %u transactions: %.2fms (%.3fms/tx, %.3fms/txin)\n", (unsigned)block.vtx.size(), 0.001 * nTime, 0.001 * nTime / block.vtx.size(), nInputs <= 1 ? 0 : 0.001 * nTime / (nInputs-1));
|
LogPrintf("- Connect %u transactions: %.2fms (%.3fms/tx, %.3fms/txin)\n", (unsigned)block.vtx.size(), 0.001 * nTime, 0.001 * nTime / block.vtx.size(), nInputs <= 1 ? 0 : 0.001 * nTime / (nInputs-1));
|
||||||
|
|
||||||
if (GetValueOut(block.vtx[0]) > GetBlockValue(pindex->nHeight, nFees))
|
if (block.vtx[0].GetValueOut() > GetBlockValue(pindex->nHeight, nFees))
|
||||||
return state.DoS(100,
|
return state.DoS(100,
|
||||||
error("ConnectBlock() : coinbase pays too much (actual=%"PRId64" vs limit=%"PRId64")",
|
error("ConnectBlock() : coinbase pays too much (actual=%"PRId64" vs limit=%"PRId64")",
|
||||||
GetValueOut(block.vtx[0]), GetBlockValue(pindex->nHeight, nFees)),
|
block.vtx[0].GetValueOut(), GetBlockValue(pindex->nHeight, nFees)),
|
||||||
REJECT_INVALID, "coinbase too large");
|
REJECT_INVALID, "coinbase too large");
|
||||||
|
|
||||||
if (!control.Wait())
|
if (!control.Wait())
|
||||||
|
|
|
@ -49,9 +49,6 @@ static const unsigned int MAX_BLOCKFILE_SIZE = 0x8000000; // 128 MiB
|
||||||
static const unsigned int BLOCKFILE_CHUNK_SIZE = 0x1000000; // 16 MiB
|
static const unsigned int BLOCKFILE_CHUNK_SIZE = 0x1000000; // 16 MiB
|
||||||
/** The pre-allocation chunk size for rev?????.dat files (since 0.8) */
|
/** The pre-allocation chunk size for rev?????.dat files (since 0.8) */
|
||||||
static const unsigned int UNDOFILE_CHUNK_SIZE = 0x100000; // 1 MiB
|
static const unsigned int UNDOFILE_CHUNK_SIZE = 0x100000; // 1 MiB
|
||||||
/** No amount larger than this (in satoshi) is valid */
|
|
||||||
static const int64_t MAX_MONEY = 21000000 * COIN;
|
|
||||||
inline bool MoneyRange(int64_t nValue) { return (nValue >= 0 && nValue <= MAX_MONEY); }
|
|
||||||
/** Coinbase transaction outputs can only be spent after this number of new blocks (network rule) */
|
/** Coinbase transaction outputs can only be spent after this number of new blocks (network rule) */
|
||||||
static const int COINBASE_MATURITY = 100;
|
static const int COINBASE_MATURITY = 100;
|
||||||
/** Threshold for nLockTime: below this value it is interpreted as block number, otherwise as UNIX timestamp. */
|
/** Threshold for nLockTime: below this value it is interpreted as block number, otherwise as UNIX timestamp. */
|
||||||
|
@ -320,11 +317,6 @@ bool IsStandardTx(const CTransaction& tx, std::string& reason);
|
||||||
|
|
||||||
bool IsFinalTx(const CTransaction &tx, int nBlockHeight = 0, int64_t nBlockTime = 0);
|
bool IsFinalTx(const CTransaction &tx, int nBlockHeight = 0, int64_t nBlockTime = 0);
|
||||||
|
|
||||||
/** Amount of bitcoins spent by the transaction.
|
|
||||||
@return sum of all outputs (note: does not include fees)
|
|
||||||
*/
|
|
||||||
int64_t GetValueOut(const CTransaction& tx);
|
|
||||||
|
|
||||||
/** Undo information for a CBlock */
|
/** Undo information for a CBlock */
|
||||||
class CBlockUndo
|
class CBlockUndo
|
||||||
{
|
{
|
||||||
|
|
|
@ -261,7 +261,7 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn)
|
||||||
// This is a more accurate fee-per-kilobyte than is used by the client code, because the
|
// This is a more accurate fee-per-kilobyte than is used by the client code, because the
|
||||||
// client code rounds up the size to the nearest 1K. That's good, because it gives an
|
// client code rounds up the size to the nearest 1K. That's good, because it gives an
|
||||||
// incentive to create smaller transactions.
|
// incentive to create smaller transactions.
|
||||||
double dFeePerKb = double(nTotalIn-GetValueOut(tx)) / (double(nTxSize)/1000.0);
|
double dFeePerKb = double(nTotalIn-tx.GetValueOut()) / (double(nTxSize)/1000.0);
|
||||||
|
|
||||||
if (porphan)
|
if (porphan)
|
||||||
{
|
{
|
||||||
|
@ -318,7 +318,7 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn)
|
||||||
if (!view.HaveInputs(tx))
|
if (!view.HaveInputs(tx))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
int64_t nTxFees = view.GetValueIn(tx)-GetValueOut(tx);
|
int64_t nTxFees = view.GetValueIn(tx)-tx.GetValueOut();
|
||||||
|
|
||||||
nTxSigOps += GetP2SHSigOpCount(tx, view);
|
nTxSigOps += GetP2SHSigOpCount(tx, view);
|
||||||
if (nBlockSigOps + nTxSigOps >= MAX_BLOCK_SIGOPS)
|
if (nBlockSigOps + nTxSigOps >= MAX_BLOCK_SIGOPS)
|
||||||
|
|
|
@ -194,7 +194,7 @@ QString TransactionDesc::toHTML(CWallet *wallet, CWalletTx &wtx, int vout, int u
|
||||||
strHTML += "<b>" + tr("Credit") + ":</b> " + BitcoinUnits::formatWithUnit(unit, nValue) + "<br>";
|
strHTML += "<b>" + tr("Credit") + ":</b> " + BitcoinUnits::formatWithUnit(unit, nValue) + "<br>";
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t nTxFee = nDebit - GetValueOut(wtx);
|
int64_t nTxFee = nDebit - wtx.GetValueOut();
|
||||||
if (nTxFee > 0)
|
if (nTxFee > 0)
|
||||||
strHTML += "<b>" + tr("Transaction fee") + ":</b> " + BitcoinUnits::formatWithUnit(unit, -nTxFee) + "<br>";
|
strHTML += "<b>" + tr("Transaction fee") + ":</b> " + BitcoinUnits::formatWithUnit(unit, -nTxFee) + "<br>";
|
||||||
}
|
}
|
||||||
|
|
|
@ -95,7 +95,7 @@ QList<TransactionRecord> TransactionRecord::decomposeTransaction(const CWallet *
|
||||||
//
|
//
|
||||||
// Debit
|
// Debit
|
||||||
//
|
//
|
||||||
int64_t nTxFee = nDebit - GetValueOut(wtx);
|
int64_t nTxFee = nDebit - wtx.GetValueOut();
|
||||||
|
|
||||||
for (unsigned int nOut = 0; nOut < wtx.vout.size(); nOut++)
|
for (unsigned int nOut = 0; nOut < wtx.vout.size(); nOut++)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1673,7 +1673,7 @@ Value gettransaction(const Array& params, bool fHelp)
|
||||||
int64_t nCredit = wtx.GetCredit();
|
int64_t nCredit = wtx.GetCredit();
|
||||||
int64_t nDebit = wtx.GetDebit();
|
int64_t nDebit = wtx.GetDebit();
|
||||||
int64_t nNet = nCredit - nDebit;
|
int64_t nNet = nCredit - nDebit;
|
||||||
int64_t nFee = (wtx.IsFromMe() ? GetValueOut(wtx) - nDebit : 0);
|
int64_t nFee = (wtx.IsFromMe() ? wtx.GetValueOut() - nDebit : 0);
|
||||||
|
|
||||||
entry.push_back(Pair("amount", ValueFromAmount(nNet - nFee)));
|
entry.push_back(Pair("amount", ValueFromAmount(nNet - nFee)));
|
||||||
if (wtx.IsFromMe())
|
if (wtx.IsFromMe())
|
||||||
|
|
|
@ -655,7 +655,7 @@ void CWalletTx::GetAmounts(list<pair<CTxDestination, int64_t> >& listReceived,
|
||||||
int64_t nDebit = GetDebit();
|
int64_t nDebit = GetDebit();
|
||||||
if (nDebit > 0) // debit>0 means we signed/sent this transaction
|
if (nDebit > 0) // debit>0 means we signed/sent this transaction
|
||||||
{
|
{
|
||||||
int64_t nValueOut = GetValueOut(*this);
|
int64_t nValueOut = GetValueOut();
|
||||||
nFee = nDebit - nValueOut;
|
nFee = nDebit - nValueOut;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue