aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPieter Wuille <pieter.wuille@gmail.com>2012-10-23 00:21:16 +0200
committerPieter Wuille <pieter.wuille@gmail.com>2012-10-23 00:27:17 +0200
commitc2ed184f987fbb157880fce2f91ebc8514fd6e76 (patch)
tree446f1d6b1dbe7ab527da1598a3b258028894b06a /src
parent1e64c2d585eeb6217d08a49c4cc7a89e0afd0421 (diff)
Added some comments
Some clarifications after a code review by Mike Hearn.
Diffstat (limited to 'src')
-rw-r--r--src/main.cpp9
-rw-r--r--src/main.h17
2 files changed, 24 insertions, 2 deletions
diff --git a/src/main.cpp b/src/main.cpp
index 4386893ee1..26cbab8483 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -698,6 +698,8 @@ bool CTxMemPool::accept(CTransaction &tx, bool fCheckInputs,
return false;
// do all inputs exist?
+ // Note that this does not check for the presence of actual outputs (see the next check for that),
+ // only helps filling in pfMissingInputs (to determine missing vs spent).
BOOST_FOREACH(const CTxIn txin, tx.vin) {
if (!view.HaveCoins(txin.prevout.hash)) {
if (pfMissingInputs)
@@ -706,6 +708,7 @@ bool CTxMemPool::accept(CTransaction &tx, bool fCheckInputs,
}
}
+ // are the actual inputs available?
if (!tx.HaveInputs(view))
return error("CTxMemPool::accept() : inputs already spent");
@@ -1956,9 +1959,13 @@ bool CBlock::CheckBlock(bool fCheckPOW, bool fCheckMerkleRoot) const
if (!tx.CheckTransaction())
return DoS(tx.nDoS, error("CheckBlock() : CheckTransaction failed"));
+ // Build the merkle tree already. We need it anyway later, and it makes the
+ // block cache the transaction hashes, which means they don't need to be
+ // recalculated many times during this block's validation.
+ BuildMerkleTree();
+
// Check for duplicate txids. This is caught by ConnectInputs(),
// but catching it earlier avoids a potential DoS attack:
- BuildMerkleTree();
set<uint256> uniqueTx;
for (unsigned int i=0; i<vtx.size(); i++) {
uniqueTx.insert(GetTxHash(i));
diff --git a/src/main.h b/src/main.h
index 75950109da..36869efe63 100644
--- a/src/main.h
+++ b/src/main.h
@@ -1820,7 +1820,11 @@ public:
// Modify the currently active block index
virtual bool SetBestBlock(CBlockIndex *pindex);
+
+ // Do a bulk modification (multiple SetCoins + one SetBestBlock)
virtual bool BatchWrite(const std::map<uint256, CCoins> &mapCoins, CBlockIndex *pindex);
+
+ // Calculate statistics about the unspent transaction output set
virtual bool GetStats(CCoinsStats &stats);
};
@@ -1851,14 +1855,25 @@ protected:
public:
CCoinsViewCache(CCoinsView &baseIn, bool fDummy = false);
+
+ // Standard CCoinsView methods
bool GetCoins(uint256 txid, CCoins &coins);
bool SetCoins(uint256 txid, const CCoins &coins);
bool HaveCoins(uint256 txid);
- CCoins &GetCoins(uint256 txid);
CBlockIndex *GetBestBlock();
bool SetBestBlock(CBlockIndex *pindex);
bool BatchWrite(const std::map<uint256, CCoins> &mapCoins, CBlockIndex *pindex);
+
+ // Return a modifiable reference to a CCoins. Check HaveCoins first.
+ // Many methods explicitly require a CCoinsViewCache because of this method, to reduce
+ // copying.
+ CCoins &GetCoins(uint256 txid);
+
+ // Push the modifications applied to this cache to its base.
+ // Failure to call this method before destruction will cause the changes to be forgotten.
bool Flush();
+
+ // Calculate the size of the cache (in number of transactions)
unsigned int GetCacheSize();
private: