Bitcoin
coins.h
Go to the documentation of this file.
1 // Copyright (c) 2009-2010 Satoshi Nakamoto
2 // Copyright (c) 2009-2018 The Bitcoin Core developers
3 // Distributed under the MIT software license, see the accompanying
4 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
5 
6 #ifndef BITCOIN_COINS_H
7 #define BITCOIN_COINS_H
8 
10 #include <compressor.h>
11 #include <core_memusage.h>
12 #include <crypto/siphash.h>
13 #include <memusage.h>
14 #include <serialize.h>
15 #include <uint256.h>
16 
17 #include <assert.h>
18 #include <stdint.h>
19 
20 #include <unordered_map>
21 
29 class Coin
30 {
31 public:
34 
36  unsigned int fCoinBase : 1;
37 
40 
42  Coin(CTxOut&& outIn, int nHeightIn, bool fCoinBaseIn) : out(std::move(outIn)), fCoinBase(fCoinBaseIn), nHeight(nHeightIn) {}
43  Coin(const CTxOut& outIn, int nHeightIn, bool fCoinBaseIn) : out(outIn), fCoinBase(fCoinBaseIn),nHeight(nHeightIn) {}
44 
45  void Clear() {
46  out.SetNull();
47  fCoinBase = false;
48  nHeight = 0;
49  }
50 
52  Coin() : fCoinBase(false), nHeight(0) { }
53 
54  bool IsCoinBase() const {
55  return fCoinBase;
56  }
57 
58  template<typename Stream>
59  void Serialize(Stream &s) const {
60  assert(!IsSpent());
61  uint32_t code = nHeight * 2 + fCoinBase;
62  ::Serialize(s, VARINT(code));
64  }
65 
66  template<typename Stream>
67  void Unserialize(Stream &s) {
68  uint32_t code = 0;
69  ::Unserialize(s, VARINT(code));
70  nHeight = code >> 1;
71  fCoinBase = code & 1;
73  }
74 
75  bool IsSpent() const {
76  return out.IsNull();
77  }
78 
79  size_t DynamicMemoryUsage() const {
81  }
82 };
83 
85 {
86 private:
88  const uint64_t k0, k1;
89 
90 public:
92 
98  size_t operator()(const COutPoint& id) const {
99  return SipHashUint256Extra(k0, k1, id.hash, id.n);
100  }
101 };
102 
104 {
105  Coin coin; // The actual cached data.
106  unsigned char flags;
107 
108  enum Flags {
109  DIRTY = (1 << 0), // This cache entry is potentially different from the version in the parent view.
110  FRESH = (1 << 1), // The parent view does not have this entry (or it is pruned).
111  /* Note that FRESH is a performance optimization with which we can
112  * erase coins that are fully spent if we know we do not need to
113  * flush the changes to the parent cache. It is always safe to
114  * not mark FRESH if that condition is not guaranteed.
115  */
116  };
117 
119  explicit CCoinsCacheEntry(Coin&& coin_) : coin(std::move(coin_)), flags(0) {}
120 };
121 
122 typedef std::unordered_map<COutPoint, CCoinsCacheEntry, SaltedOutpointHasher> CCoinsMap;
123 
126 {
127 public:
128  CCoinsViewCursor(const uint256 &hashBlockIn): hashBlock(hashBlockIn) {}
129  virtual ~CCoinsViewCursor() {}
130 
131  virtual bool GetKey(COutPoint &key) const = 0;
132  virtual bool GetValue(Coin &coin) const = 0;
133  virtual unsigned int GetValueSize() const = 0;
134 
135  virtual bool Valid() const = 0;
136  virtual void Next() = 0;
137 
139  const uint256 &GetBestBlock() const { return hashBlock; }
140 private:
142 };
143 
146 {
147 public:
152  virtual bool GetCoin(const COutPoint &outpoint, Coin &coin) const;
153 
155  virtual bool HaveCoin(const COutPoint &outpoint) const;
156 
158  virtual uint256 GetBestBlock() const;
159 
164  virtual std::vector<uint256> GetHeadBlocks() const;
165 
168  virtual bool BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlock);
169 
171  virtual CCoinsViewCursor *Cursor() const;
172 
174  virtual ~CCoinsView() {}
175 
177  virtual size_t EstimateSize() const { return 0; }
178 };
179 
180 
183 {
184 protected:
186 
187 public:
188  CCoinsViewBacked(CCoinsView *viewIn);
189  bool GetCoin(const COutPoint &outpoint, Coin &coin) const override;
190  bool HaveCoin(const COutPoint &outpoint) const override;
191  uint256 GetBestBlock() const override;
192  std::vector<uint256> GetHeadBlocks() const override;
193  void SetBackend(CCoinsView &viewIn);
194  bool BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlock) override;
195  CCoinsViewCursor *Cursor() const override;
196  size_t EstimateSize() const override;
197 };
198 
199 
202 {
203 protected:
210 
211  /* Cached dynamic memory usage for the inner Coin objects. */
212  mutable size_t cachedCoinsUsage;
213 
214 public:
215  CCoinsViewCache(CCoinsView *baseIn);
216 
220  CCoinsViewCache(const CCoinsViewCache &) = delete;
221 
222  // Standard CCoinsView methods
223  bool GetCoin(const COutPoint &outpoint, Coin &coin) const override;
224  bool HaveCoin(const COutPoint &outpoint) const override;
225  uint256 GetBestBlock() const override;
226  void SetBestBlock(const uint256 &hashBlock);
227  bool BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlock) override;
228  CCoinsViewCursor* Cursor() const override {
229  throw std::logic_error("CCoinsViewCache cursor iteration not supported.");
230  }
231 
237  bool HaveCoinInCache(const COutPoint &outpoint) const;
238 
249  const Coin& AccessCoin(const COutPoint &output) const;
250 
255  void AddCoin(const COutPoint& outpoint, Coin&& coin, bool potential_overwrite);
256 
262  bool SpendCoin(const COutPoint &outpoint, Coin* moveto = nullptr);
263 
269  bool Flush();
270 
275  void Uncache(const COutPoint &outpoint);
276 
278  unsigned int GetCacheSize() const;
279 
281  size_t DynamicMemoryUsage() const;
282 
291  CAmount GetValueIn(const CTransaction& tx) const;
292 
294  bool HaveInputs(const CTransaction& tx) const;
295 
296 private:
301  CCoinsMap::iterator FetchCoin(const COutPoint &outpoint) const;
302 };
303 
308 // TODO: pass in a boolean to limit these possible overwrites to known
309 // (pre-BIP34) cases.
310 void AddCoins(CCoinsViewCache& cache, const CTransaction& tx, int nHeight, bool check = false);
311 
316 const Coin& AccessByTxid(const CCoinsViewCache& cache, const uint256& txid);
317 
318 #endif // BITCOIN_COINS_H
Definition: coins.h:182
unsigned int fCoinBase
whether containing transaction was a coinbase
Definition: coins.h:36
virtual void Next()=0
virtual bool GetKey(COutPoint &key) const =0
virtual size_t EstimateSize() const
Estimate database size (0 if not implemented)
Definition: coins.h:177
CCoinsViewCursor * Cursor() const override
Get a cursor to iterate over the whole state.
Definition: coins.h:228
bool HaveCoin(const COutPoint &outpoint) const override
Just check whether a given outpoint is unspent.
Definition: coins.cpp:25
Definition: compressor.h:86
CCoinsView * base
Definition: coins.h:185
size_t DynamicMemoryUsage() const
Calculate the size of the cache (in bytes)
Definition: coins.cpp:37
bool IsSpent() const
Definition: coins.h:75
static size_t DynamicUsage(const int8_t &v)
Definition: memusage.h:27
CCoinsMap cacheCoins
Definition: coins.h:209
bool IsCoinBase() const
Definition: coins.h:54
bool IsNull() const
Definition: transaction.h:160
unsigned int nHeight
Definition: mempool_eviction.cpp:15
virtual std::vector< uint256 > GetHeadBlocks() const
Definition: coins.cpp:13
bool GetCoin(const COutPoint &outpoint, Coin &coin) const override
Definition: coins.cpp:58
const uint64_t k1
Definition: coins.h:88
Coin()
empty constructor
Definition: coins.h:52
virtual bool GetCoin(const COutPoint &outpoint, Coin &coin) const
Definition: coins.cpp:11
virtual ~CCoinsView()
As we use CCoinsViews polymorphically, have a virtual destructor.
Definition: coins.h:174
CCoinsViewCursor(const uint256 &hashBlockIn)
Definition: coins.h:128
virtual uint256 GetBestBlock() const
Retrieve the block hash whose state this CCoinsView currently represents.
Definition: coins.cpp:12
uint256 GetBestBlock() const override
Retrieve the block hash whose state this CCoinsView currently represents.
Definition: coins.cpp:26
const uint64_t k0
Definition: coins.h:88
uint256 hashBlock
Definition: coins.h:208
void AddCoin(const COutPoint &outpoint, Coin &&coin, bool potential_overwrite)
Definition: coins.cpp:67
void Serialize(Stream &s) const
Definition: coins.h:59
Definition: coins.h:125
bool SpendCoin(const COutPoint &outpoint, Coin *moveto=nullptr)
Definition: coins.cpp:99
virtual bool Valid() const =0
Definition: coins.h:201
void Unserialize(Stream &s)
Definition: coins.h:67
int64_t CAmount
Definition: amount.h:12
CCoinsCacheEntry(Coin &&coin_)
Definition: coins.h:119
std::vector< uint256 > GetHeadBlocks() const override
Definition: coins.cpp:27
bool BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlock) override
Definition: coins.cpp:29
size_t operator()(const COutPoint &id) const
Definition: coins.h:98
bool GetCoin(const COutPoint &outpoint, Coin &coin) const override
Definition: coins.cpp:24
Definition: transaction.h:270
Definition: transaction.h:18
const Coin & AccessCoin(const COutPoint &output) const
Definition: coins.cpp:117
const Coin & AccessByTxid(const CCoinsViewCache &cache, const uint256 &txid)
Definition: coins.cpp:251
unsigned int uint32_t
Definition: stdint.h:21
Definition: coins.h:29
uint32_t nHeight
at which height this containing transaction was included in the active block chain
Definition: coins.h:39
unsigned char flags
Definition: coins.h:106
unsigned long long uint64_t
Definition: stdint.h:22
CCoinsViewCache(CCoinsView *baseIn)
Definition: coins.cpp:35
bool HaveCoin(const COutPoint &outpoint) const override
Just check whether a given outpoint is unspent.
Definition: coins.cpp:126
std::unordered_map< COutPoint, CCoinsCacheEntry, SaltedOutpointHasher > CCoinsMap
Definition: coins.h:122
CCoinsMap::iterator FetchCoin(const COutPoint &outpoint) const
Definition: coins.cpp:41
CCoinsCacheEntry()
Definition: coins.h:118
void SetBackend(CCoinsView &viewIn)
Definition: coins.cpp:28
Definition: coins.h:84
uint256 GetBestBlock() const override
Retrieve the block hash whose state this CCoinsView currently represents.
Definition: coins.cpp:136
bool HaveInputs(const CTransaction &tx) const
Check whether all prevouts of the transaction are present in the UTXO set represented by this view.
Definition: coins.cpp:236
virtual bool BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlock)
Definition: coins.cpp:14
void SetBestBlock(const uint256 &hashBlock)
Definition: coins.cpp:142
CTxOut out
unspent transaction output
Definition: coins.h:33
Flags
Definition: coins.h:108
uint64_t SipHashUint256Extra(uint64_t k0, uint64_t k1, const uint256 &val, uint32_t extra)
Definition: siphash.cpp:134
CScript scriptPubKey
Definition: transaction.h:137
virtual bool GetValue(Coin &coin) const =0
virtual ~CCoinsViewCursor()
Definition: coins.h:129
Definition: coins.h:145
uint256 hashBlock
Definition: coins.h:141
Definition: uint256.h:121
CCoinsViewCursor * Cursor() const override
Get a cursor to iterate over the whole state.
Definition: coins.cpp:30
size_t cachedCoinsUsage
Definition: coins.h:212
void AddCoins(CCoinsViewCache &cache, const CTransaction &tx, int nHeight, bool check=false)
Definition: coins.cpp:88
virtual bool HaveCoin(const COutPoint &outpoint) const
Just check whether a given outpoint is unspent.
Definition: coins.cpp:17
CCoinsViewBacked(CCoinsView *viewIn)
Definition: coins.cpp:23
const uint256 & GetBestBlock() const
Get best block at the time this cursor was created.
Definition: coins.h:139
bool Flush()
Definition: coins.cpp:204
size_t EstimateSize() const override
Estimate database size (0 if not implemented)
Definition: coins.cpp:31
Definition: coins.h:103
Definition: coins.h:110
bool HaveCoinInCache(const COutPoint &outpoint) const
Definition: coins.cpp:131
unsigned int GetCacheSize() const
Calculate the size of the cache (in number of transaction outputs)
Definition: coins.cpp:220
Coin(const CTxOut &outIn, int nHeightIn, bool fCoinBaseIn)
Definition: coins.h:43
bool BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlock) override
Definition: coins.cpp:146
virtual CCoinsViewCursor * Cursor() const
Get a cursor to iterate over the whole state.
Definition: coins.cpp:15
Coin(CTxOut &&outIn, int nHeightIn, bool fCoinBaseIn)
construct a Coin from a CTxOut and height/coinbase information.
Definition: coins.h:42
Coin coin
Definition: coins.h:105
Definition: coins.h:109
size_t DynamicMemoryUsage() const
Definition: coins.h:79
T & REF(const T &val)
Definition: serialize.h:48
void SetNull()
Definition: transaction.h:154
SaltedOutpointHasher()
Definition: coins.cpp:33
#define VARINT(obj,...)
Definition: serialize.h:422
CAmount GetValueIn(const CTransaction &tx) const
Definition: coins.cpp:224
key
Definition: extract_strings_qt.py:80
void Uncache(const COutPoint &outpoint)
Definition: coins.cpp:211
virtual unsigned int GetValueSize() const =0
void Clear()
Definition: coins.h:45
Definition: transaction.h:133