Master Core  v0.0.9 - 49a5c0d97abf09ef2911ddfe8d9551df59f9efd3-dirty
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
coins.cpp
Go to the documentation of this file.
1 // Copyright (c) 2012-2013 The Bitcoin developers
2 // Distributed under the MIT/X11 software license, see the accompanying
3 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4 
5 #include "coins.h"
6 
7 #include <assert.h>
8 
9 // calculate number of bytes for the bitmask, and its number of non-zero bytes
10 // each bit in the bitmask represents the availability of one output, but the
11 // availabilities of the first two outputs are encoded separately
12 void CCoins::CalcMaskSize(unsigned int &nBytes, unsigned int &nNonzeroBytes) const {
13  unsigned int nLastUsedByte = 0;
14  for (unsigned int b = 0; 2+b*8 < vout.size(); b++) {
15  bool fZero = true;
16  for (unsigned int i = 0; i < 8 && 2+b*8+i < vout.size(); i++) {
17  if (!vout[2+b*8+i].IsNull()) {
18  fZero = false;
19  continue;
20  }
21  }
22  if (!fZero) {
23  nLastUsedByte = b + 1;
24  nNonzeroBytes++;
25  }
26  }
27  nBytes += nLastUsedByte;
28 }
29 
30 bool CCoins::Spend(const COutPoint &out, CTxInUndo &undo) {
31  if (out.n >= vout.size())
32  return false;
33  if (vout[out.n].IsNull())
34  return false;
35  undo = CTxInUndo(vout[out.n]);
36  vout[out.n].SetNull();
37  Cleanup();
38  if (vout.size() == 0) {
39  undo.nHeight = nHeight;
40  undo.fCoinBase = fCoinBase;
41  undo.nVersion = this->nVersion;
42  }
43  return true;
44 }
45 
46 bool CCoins::Spend(int nPos) {
47  CTxInUndo undo;
48  COutPoint out(0, nPos);
49  return Spend(out, undo);
50 }
51 
52 
53 bool CCoinsView::GetCoins(const uint256 &txid, CCoins &coins) { return false; }
54 bool CCoinsView::SetCoins(const uint256 &txid, const CCoins &coins) { return false; }
55 bool CCoinsView::HaveCoins(const uint256 &txid) { return false; }
57 bool CCoinsView::SetBestBlock(const uint256 &hashBlock) { return false; }
58 bool CCoinsView::BatchWrite(const std::map<uint256, CCoins> &mapCoins, const uint256 &hashBlock) { return false; }
59 bool CCoinsView::GetStats(CCoinsStats &stats) { return false; }
60 
61 
62 CCoinsViewBacked::CCoinsViewBacked(CCoinsView &viewIn) : base(&viewIn) { }
63 bool CCoinsViewBacked::GetCoins(const uint256 &txid, CCoins &coins) { return base->GetCoins(txid, coins); }
64 bool CCoinsViewBacked::SetCoins(const uint256 &txid, const CCoins &coins) { return base->SetCoins(txid, coins); }
65 bool CCoinsViewBacked::HaveCoins(const uint256 &txid) { return base->HaveCoins(txid); }
67 bool CCoinsViewBacked::SetBestBlock(const uint256 &hashBlock) { return base->SetBestBlock(hashBlock); }
68 void CCoinsViewBacked::SetBackend(CCoinsView &viewIn) { base = &viewIn; }
69 bool CCoinsViewBacked::BatchWrite(const std::map<uint256, CCoins> &mapCoins, const uint256 &hashBlock) { return base->BatchWrite(mapCoins, hashBlock); }
70 bool CCoinsViewBacked::GetStats(CCoinsStats &stats) { return base->GetStats(stats); }
71 
72 CCoinsViewCache::CCoinsViewCache(CCoinsView &baseIn, bool fDummy) : CCoinsViewBacked(baseIn), hashBlock(0) { }
73 
74 bool CCoinsViewCache::GetCoins(const uint256 &txid, CCoins &coins) {
75  if (cacheCoins.count(txid)) {
76  coins = cacheCoins[txid];
77  return true;
78  }
79  if (base->GetCoins(txid, coins)) {
80  cacheCoins[txid] = coins;
81  return true;
82  }
83  return false;
84 }
85 
86 std::map<uint256,CCoins>::iterator CCoinsViewCache::FetchCoins(const uint256 &txid) {
87  std::map<uint256,CCoins>::iterator it = cacheCoins.lower_bound(txid);
88  if (it != cacheCoins.end() && it->first == txid)
89  return it;
90  CCoins tmp;
91  if (!base->GetCoins(txid,tmp))
92  return cacheCoins.end();
93  std::map<uint256,CCoins>::iterator ret = cacheCoins.insert(it, std::make_pair(txid, CCoins()));
94  tmp.swap(ret->second);
95  return ret;
96 }
97 
99  std::map<uint256,CCoins>::iterator it = FetchCoins(txid);
100  assert(it != cacheCoins.end());
101  return it->second;
102 }
103 
104 bool CCoinsViewCache::SetCoins(const uint256 &txid, const CCoins &coins) {
105  cacheCoins[txid] = coins;
106  return true;
107 }
108 
110  return FetchCoins(txid) != cacheCoins.end();
111 }
112 
114  if (hashBlock == uint256(0))
116  return hashBlock;
117 }
118 
119 bool CCoinsViewCache::SetBestBlock(const uint256 &hashBlockIn) {
120  hashBlock = hashBlockIn;
121  return true;
122 }
123 
124 bool CCoinsViewCache::BatchWrite(const std::map<uint256, CCoins> &mapCoins, const uint256 &hashBlockIn) {
125  for (std::map<uint256, CCoins>::const_iterator it = mapCoins.begin(); it != mapCoins.end(); it++)
126  cacheCoins[it->first] = it->second;
127  hashBlock = hashBlockIn;
128  return true;
129 }
130 
132  bool fOk = base->BatchWrite(cacheCoins, hashBlock);
133  if (fOk)
134  cacheCoins.clear();
135  return fOk;
136 }
137 
139  return cacheCoins.size();
140 }
141 
143 {
144  const CCoins &coins = GetCoins(input.prevout.hash);
145  assert(coins.IsAvailable(input.prevout.n));
146  return coins.vout[input.prevout.n];
147 }
148 
150 {
151  if (tx.IsCoinBase())
152  return 0;
153 
154  int64_t nResult = 0;
155  for (unsigned int i = 0; i < tx.vin.size(); i++)
156  nResult += GetOutputFor(tx.vin[i]).nValue;
157 
158  return nResult;
159 }
160 
162 {
163  if (!tx.IsCoinBase()) {
164  // first check whether information about the prevout hash is available
165  for (unsigned int i = 0; i < tx.vin.size(); i++) {
166  const COutPoint &prevout = tx.vin[i].prevout;
167  if (!HaveCoins(prevout.hash))
168  return false;
169  }
170 
171  // then check whether the actual outputs are available
172  for (unsigned int i = 0; i < tx.vin.size(); i++) {
173  const COutPoint &prevout = tx.vin[i].prevout;
174  const CCoins &coins = GetCoins(prevout.hash);
175  if (!coins.IsAvailable(prevout.n))
176  return false;
177  }
178  }
179  return true;
180 }
181 
182 double CCoinsViewCache::GetPriority(const CTransaction &tx, int nHeight)
183 {
184  if (tx.IsCoinBase())
185  return 0.0;
186  double dResult = 0.0;
187  BOOST_FOREACH(const CTxIn& txin, tx.vin)
188  {
189  const CCoins &coins = GetCoins(txin.prevout.hash);
190  if (!coins.IsAvailable(txin.prevout.n)) continue;
191  if (coins.nHeight < nHeight) {
192  dResult += coins.vout[txin.prevout.n].nValue * (nHeight-coins.nHeight);
193  }
194  }
195  return tx.ComputePriority(dResult);
196 }
bool Flush()
Definition: coins.cpp:131
void SetBackend(CCoinsView &viewIn)
Definition: coins.cpp:68
double ComputePriority(double dPriorityInputs, unsigned int nTxSize=0) const
Definition: core.cpp:121
std::vector< CTxOut > vout
Definition: coins.h:75
uint256 GetBestBlock()
Definition: coins.cpp:66
void Cleanup()
Definition: coins.h:93
int nHeight
Definition: coins.h:78
uint256 GetBestBlock()
Definition: coins.cpp:113
pruned version of CTransaction: only retains metadata and unspent transaction outputs ...
Definition: coins.h:68
unsigned int n
Definition: core.h:26
bool GetStats(CCoinsStats &stats)
Definition: coins.cpp:70
virtual uint256 GetBestBlock()
Definition: coins.cpp:56
Undo information for a CTxIn.
Definition: core.h:287
bool GetCoins(const uint256 &txid, CCoins &coins)
Definition: coins.cpp:74
bool IsAvailable(unsigned int nPos) const
Definition: coins.h:228
virtual bool SetBestBlock(const uint256 &hashBlock)
Definition: coins.cpp:57
int nVersion
Definition: coins.h:82
Abstract view on the open txout dataset.
Definition: coins.h:258
bool HaveCoins(const uint256 &txid)
Definition: coins.cpp:109
An input of a transaction.
Definition: core.h:70
virtual bool GetCoins(const uint256 &txid, CCoins &coins)
Definition: coins.cpp:53
bool fCoinBase
Definition: core.h:291
bool HaveInputs(const CTransaction &tx)
Definition: coins.cpp:161
CCoinsView * base
Definition: coins.h:292
std::map< uint256, CCoins >::iterator FetchCoins(const uint256 &txid)
Definition: coins.cpp:86
void CalcMaskSize(unsigned int &nBytes, unsigned int &nNonzeroBytes) const
Definition: coins.cpp:12
bool BatchWrite(const std::map< uint256, CCoins > &mapCoins, const uint256 &hashBlock)
Definition: coins.cpp:124
std::vector< CTxIn > vin
Definition: core.h:190
const CTxOut & GetOutputFor(const CTxIn &input)
Definition: coins.cpp:142
virtual bool HaveCoins(const uint256 &txid)
Definition: coins.cpp:55
CCoinsViewCache(CCoinsView &baseIn, bool fDummy=false)
Definition: coins.cpp:72
void swap(CCoins &to)
Definition: coins.h:108
An output of a transaction.
Definition: core.h:119
unsigned int nHeight
Definition: core.h:292
CCoinsViewBacked(CCoinsView &viewIn)
Definition: coins.cpp:62
An outpoint - a combination of a transaction hash and an index n into its vout.
Definition: core.h:22
virtual bool GetStats(CCoinsStats &stats)
Definition: coins.cpp:59
bool fCoinBase
Definition: coins.h:72
256-bit unsigned integer
Definition: uint256.h:531
uint256 hashBlock
Definition: coins.h:311
bool SetBestBlock(const uint256 &hashBlock)
Definition: coins.cpp:67
bool Spend(const COutPoint &out, CTxInUndo &undo)
Definition: coins.cpp:30
double GetPriority(const CTransaction &tx, int nHeight)
Definition: coins.cpp:182
virtual bool BatchWrite(const std::map< uint256, CCoins > &mapCoins, const uint256 &hashBlock)
Definition: coins.cpp:58
bool SetCoins(const uint256 &txid, const CCoins &coins)
Definition: coins.cpp:64
bool HaveCoins(const uint256 &txid)
Definition: coins.cpp:65
bool BatchWrite(const std::map< uint256, CCoins > &mapCoins, const uint256 &hashBlock)
Definition: coins.cpp:69
int64_t GetValueIn(const CTransaction &tx)
Amount of bitcoins coming in to a transaction Note that lightweight clients may not know anything bes...
Definition: coins.cpp:149
bool GetCoins(const uint256 &txid, CCoins &coins)
Definition: coins.cpp:63
bool IsCoinBase() const
Definition: core.h:232
bool SetCoins(const uint256 &txid, const CCoins &coins)
Definition: coins.cpp:104
int nVersion
Definition: core.h:293
bool SetBestBlock(const uint256 &hashBlock)
Definition: coins.cpp:119
unsigned int GetCacheSize()
Definition: coins.cpp:138
The basic transaction that is broadcasted on the network and contained in blocks. ...
Definition: core.h:183
CCoinsView backed by another CCoinsView.
Definition: coins.h:289
COutPoint prevout
Definition: core.h:73
int64_t nValue
Definition: core.h:122
std::map< uint256, CCoins > cacheCoins
Definition: coins.h:312
uint256 hash
Definition: core.h:25
virtual bool SetCoins(const uint256 &txid, const CCoins &coins)
Definition: coins.cpp:54