Bitcoin Core  27.99.0
P2P Digital Currency
coins.h
Go to the documentation of this file.
1 // Copyright (c) 2009-2010 Satoshi Nakamoto
2 // Copyright (c) 2009-2022 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 
9 #include <compressor.h>
10 #include <core_memusage.h>
11 #include <memusage.h>
12 #include <primitives/transaction.h>
13 #include <serialize.h>
15 #include <uint256.h>
16 #include <util/hasher.h>
17 
18 #include <assert.h>
19 #include <stdint.h>
20 
21 #include <functional>
22 #include <unordered_map>
23 
31 class Coin
32 {
33 public:
36 
38  unsigned int fCoinBase : 1;
39 
41  uint32_t nHeight : 31;
42 
44  Coin(CTxOut&& outIn, int nHeightIn, bool fCoinBaseIn) : out(std::move(outIn)), fCoinBase(fCoinBaseIn), nHeight(nHeightIn) {}
45  Coin(const CTxOut& outIn, int nHeightIn, bool fCoinBaseIn) : out(outIn), fCoinBase(fCoinBaseIn),nHeight(nHeightIn) {}
46 
47  void Clear() {
48  out.SetNull();
49  fCoinBase = false;
50  nHeight = 0;
51  }
52 
54  Coin() : fCoinBase(false), nHeight(0) { }
55 
56  bool IsCoinBase() const {
57  return fCoinBase;
58  }
59 
60  template<typename Stream>
61  void Serialize(Stream &s) const {
62  assert(!IsSpent());
63  uint32_t code = nHeight * uint32_t{2} + fCoinBase;
64  ::Serialize(s, VARINT(code));
65  ::Serialize(s, Using<TxOutCompression>(out));
66  }
67 
68  template<typename Stream>
69  void Unserialize(Stream &s) {
70  uint32_t code = 0;
71  ::Unserialize(s, VARINT(code));
72  nHeight = code >> 1;
73  fCoinBase = code & 1;
74  ::Unserialize(s, Using<TxOutCompression>(out));
75  }
76 
80  bool IsSpent() const {
81  return out.IsNull();
82  }
83 
84  size_t DynamicMemoryUsage() const {
86  }
87 };
88 
105 {
106  Coin coin; // The actual cached data.
107  unsigned char flags;
108 
109  enum Flags {
117  DIRTY = (1 << 0),
127  FRESH = (1 << 1),
128  };
129 
131  explicit CCoinsCacheEntry(Coin&& coin_) : coin(std::move(coin_)), flags(0) {}
132  CCoinsCacheEntry(Coin&& coin_, unsigned char flag) : coin(std::move(coin_)), flags(flag) {}
133 };
134 
143 using CCoinsMap = std::unordered_map<COutPoint,
146  std::equal_to<COutPoint>,
148  sizeof(std::pair<const COutPoint, CCoinsCacheEntry>) + sizeof(void*) * 4>>;
149 
150 using CCoinsMapMemoryResource = CCoinsMap::allocator_type::ResourceType;
151 
154 {
155 public:
156  CCoinsViewCursor(const uint256 &hashBlockIn): hashBlock(hashBlockIn) {}
157  virtual ~CCoinsViewCursor() {}
158 
159  virtual bool GetKey(COutPoint &key) const = 0;
160  virtual bool GetValue(Coin &coin) const = 0;
161 
162  virtual bool Valid() const = 0;
163  virtual void Next() = 0;
164 
166  const uint256 &GetBestBlock() const { return hashBlock; }
167 private:
169 };
170 
173 {
174 public:
179  virtual bool GetCoin(const COutPoint &outpoint, Coin &coin) const;
180 
182  virtual bool HaveCoin(const COutPoint &outpoint) const;
183 
185  virtual uint256 GetBestBlock() const;
186 
191  virtual std::vector<uint256> GetHeadBlocks() const;
192 
195  virtual bool BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlock, bool erase = true);
196 
198  virtual std::unique_ptr<CCoinsViewCursor> Cursor() const;
199 
201  virtual ~CCoinsView() {}
202 
204  virtual size_t EstimateSize() const { return 0; }
205 };
206 
207 
210 {
211 protected:
213 
214 public:
215  CCoinsViewBacked(CCoinsView *viewIn);
216  bool GetCoin(const COutPoint &outpoint, Coin &coin) const override;
217  bool HaveCoin(const COutPoint &outpoint) const override;
218  uint256 GetBestBlock() const override;
219  std::vector<uint256> GetHeadBlocks() const override;
220  void SetBackend(CCoinsView &viewIn);
221  bool BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlock, bool erase = true) override;
222  std::unique_ptr<CCoinsViewCursor> Cursor() const override;
223  size_t EstimateSize() const override;
224 };
225 
226 
229 {
230 private:
231  const bool m_deterministic;
232 
233 protected:
241 
242  /* Cached dynamic memory usage for the inner Coin objects. */
243  mutable size_t cachedCoinsUsage{0};
244 
245 public:
246  CCoinsViewCache(CCoinsView *baseIn, bool deterministic = false);
247 
251  CCoinsViewCache(const CCoinsViewCache &) = delete;
252 
253  // Standard CCoinsView methods
254  bool GetCoin(const COutPoint &outpoint, Coin &coin) const override;
255  bool HaveCoin(const COutPoint &outpoint) const override;
256  uint256 GetBestBlock() const override;
257  void SetBestBlock(const uint256 &hashBlock);
258  bool BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlock, bool erase = true) override;
259  std::unique_ptr<CCoinsViewCursor> Cursor() const override {
260  throw std::logic_error("CCoinsViewCache cursor iteration not supported.");
261  }
262 
268  bool HaveCoinInCache(const COutPoint &outpoint) const;
269 
280  const Coin& AccessCoin(const COutPoint &output) const;
281 
286  void AddCoin(const COutPoint& outpoint, Coin&& coin, bool possible_overwrite);
287 
295  void EmplaceCoinInternalDANGER(COutPoint&& outpoint, Coin&& coin);
296 
302  bool SpendCoin(const COutPoint &outpoint, Coin* moveto = nullptr);
303 
310  bool Flush();
311 
319  bool Sync();
320 
325  void Uncache(const COutPoint &outpoint);
326 
328  unsigned int GetCacheSize() const;
329 
331  size_t DynamicMemoryUsage() const;
332 
334  bool HaveInputs(const CTransaction& tx) const;
335 
341  void ReallocateCache();
342 
344  void SanityCheck() const;
345 
346 private:
351  CCoinsMap::iterator FetchCoin(const COutPoint &outpoint) const;
352 };
353 
358 // TODO: pass in a boolean to limit these possible overwrites to known
359 // (pre-BIP34) cases.
360 void AddCoins(CCoinsViewCache& cache, const CTransaction& tx, int nHeight, bool check = false);
361 
366 const Coin& AccessByTxid(const CCoinsViewCache& cache, const Txid& txid);
367 
376 {
377 public:
379 
380  void AddReadErrCallback(std::function<void()> f) {
381  m_err_callbacks.emplace_back(std::move(f));
382  }
383 
384  bool GetCoin(const COutPoint &outpoint, Coin &coin) const override;
385  bool HaveCoin(const COutPoint &outpoint) const override;
386 
387 private:
389  std::vector<std::function<void()>> m_err_callbacks;
390 
391 };
392 
393 #endif // BITCOIN_COINS_H
CCoinsView backed by another CCoinsView.
Definition: coins.h:210
bool HaveCoin(const COutPoint &outpoint) const override
Just check whether a given outpoint is unspent.
Definition: coins.cpp:26
bool GetCoin(const COutPoint &outpoint, Coin &coin) const override
Retrieve the Coin (unspent transaction output) for a given outpoint.
Definition: coins.cpp:25
size_t EstimateSize() const override
Estimate database size (0 if not implemented)
Definition: coins.cpp:32
uint256 GetBestBlock() const override
Retrieve the block hash whose state this CCoinsView currently represents.
Definition: coins.cpp:27
void SetBackend(CCoinsView &viewIn)
Definition: coins.cpp:29
std::unique_ptr< CCoinsViewCursor > Cursor() const override
Get a cursor to iterate over the whole state.
Definition: coins.cpp:31
CCoinsView * base
Definition: coins.h:212
bool BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlock, bool erase=true) override
Do a bulk modification (multiple Coin changes + BestBlock change).
Definition: coins.cpp:30
std::vector< uint256 > GetHeadBlocks() const override
Retrieve the range of blocks that may have been only partially written.
Definition: coins.cpp:28
CCoinsViewBacked(CCoinsView *viewIn)
Definition: coins.cpp:24
CCoinsView that adds a memory cache for transactions to another CCoinsView.
Definition: coins.h:229
CCoinsViewCache(CCoinsView *baseIn, bool deterministic=false)
Definition: coins.cpp:34
std::unique_ptr< CCoinsViewCursor > Cursor() const override
Get a cursor to iterate over the whole state.
Definition: coins.h:259
const bool m_deterministic
Definition: coins.h:231
uint256 hashBlock
Make mutable so that we can "fill the cache" even from Get-methods declared as "const".
Definition: coins.h:238
CCoinsMapMemoryResource m_cache_coins_memory_resource
Definition: coins.h:239
bool SpendCoin(const COutPoint &outpoint, Coin *moveto=nullptr)
Spend a coin.
Definition: coins.cpp:128
void Uncache(const COutPoint &outpoint)
Removes the UTXO with the given outpoint from the cache, if it is not modified.
Definition: coins.cpp:283
CCoinsViewCache(const CCoinsViewCache &)=delete
By deleting the copy constructor, we prevent accidentally using it when one intends to create a cache...
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:302
void AddCoin(const COutPoint &outpoint, Coin &&coin, bool possible_overwrite)
Add a coin.
Definition: coins.cpp:69
bool BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlock, bool erase=true) override
Do a bulk modification (multiple Coin changes + BestBlock change).
Definition: coins.cpp:181
unsigned int GetCacheSize() const
Calculate the size of the cache (in number of transaction outputs)
Definition: coins.cpp:298
uint256 GetBestBlock() const override
Retrieve the block hash whose state this CCoinsView currently represents.
Definition: coins.cpp:171
size_t cachedCoinsUsage
Definition: coins.h:243
void SetBestBlock(const uint256 &hashBlock)
Definition: coins.cpp:177
CCoinsMap::iterator FetchCoin(const COutPoint &outpoint) const
Definition: coins.cpp:43
bool GetCoin(const COutPoint &outpoint, Coin &coin) const override
Retrieve the Coin (unspent transaction output) for a given outpoint.
Definition: coins.cpp:60
bool HaveCoinInCache(const COutPoint &outpoint) const
Check if we have the given utxo already loaded in this cache.
Definition: coins.cpp:166
bool Flush()
Push the modifications applied to this cache to its base and wipe local state.
Definition: coins.cpp:253
size_t DynamicMemoryUsage() const
Calculate the size of the cache (in bytes)
Definition: coins.cpp:39
bool Sync()
Push the modifications applied to this cache to its base while retaining the contents of this cache (...
Definition: coins.cpp:266
void EmplaceCoinInternalDANGER(COutPoint &&outpoint, Coin &&coin)
Emplace a coin into cacheCoins without performing any checks, marking the emplaced coin as dirty.
Definition: coins.cpp:109
bool HaveCoin(const COutPoint &outpoint) const override
Just check whether a given outpoint is unspent.
Definition: coins.cpp:161
void SanityCheck() const
Run an internal sanity check on the cache data structure. *‍/.
Definition: coins.cpp:324
CCoinsMap cacheCoins
Definition: coins.h:240
const Coin & AccessCoin(const COutPoint &output) const
Return a reference to Coin in the cache, or coinEmpty if not found.
Definition: coins.cpp:152
void ReallocateCache()
Force a reallocation of the cache map.
Definition: coins.cpp:314
Cursor for iterating over CoinsView state.
Definition: coins.h:154
virtual void Next()=0
virtual bool Valid() const =0
CCoinsViewCursor(const uint256 &hashBlockIn)
Definition: coins.h:156
uint256 hashBlock
Definition: coins.h:168
virtual ~CCoinsViewCursor()
Definition: coins.h:157
virtual bool GetKey(COutPoint &key) const =0
const uint256 & GetBestBlock() const
Get best block at the time this cursor was created.
Definition: coins.h:166
virtual bool GetValue(Coin &coin) const =0
This is a minimally invasive approach to shutdown on LevelDB read errors from the chainstate,...
Definition: coins.h:376
void AddReadErrCallback(std::function< void()> f)
Definition: coins.h:380
std::vector< std::function< void()> > m_err_callbacks
A list of callbacks to execute upon leveldb read error.
Definition: coins.h:389
bool GetCoin(const COutPoint &outpoint, Coin &coin) const override
Retrieve the Coin (unspent transaction output) for a given outpoint.
Definition: coins.cpp:373
bool HaveCoin(const COutPoint &outpoint) const override
Just check whether a given outpoint is unspent.
Definition: coins.cpp:377
CCoinsViewErrorCatcher(CCoinsView *view)
Definition: coins.h:378
Abstract view on the open txout dataset.
Definition: coins.h:173
virtual bool GetCoin(const COutPoint &outpoint, Coin &coin) const
Retrieve the Coin (unspent transaction output) for a given outpoint.
Definition: coins.cpp:12
virtual std::vector< uint256 > GetHeadBlocks() const
Retrieve the range of blocks that may have been only partially written.
Definition: coins.cpp:14
virtual ~CCoinsView()
As we use CCoinsViews polymorphically, have a virtual destructor.
Definition: coins.h:201
virtual bool HaveCoin(const COutPoint &outpoint) const
Just check whether a given outpoint is unspent.
Definition: coins.cpp:18
virtual size_t EstimateSize() const
Estimate database size (0 if not implemented)
Definition: coins.h:204
virtual std::unique_ptr< CCoinsViewCursor > Cursor() const
Get a cursor to iterate over the whole state.
Definition: coins.cpp:16
virtual bool BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlock, bool erase=true)
Do a bulk modification (multiple Coin changes + BestBlock change).
Definition: coins.cpp:15
virtual uint256 GetBestBlock() const
Retrieve the block hash whose state this CCoinsView currently represents.
Definition: coins.cpp:13
An outpoint - a combination of a transaction hash and an index n into its vout.
Definition: transaction.h:29
The basic transaction that is broadcasted on the network and contained in blocks.
Definition: transaction.h:296
An output of a transaction.
Definition: transaction.h:150
CScript scriptPubKey
Definition: transaction.h:153
void SetNull()
Definition: transaction.h:164
bool IsNull() const
Definition: transaction.h:170
A UTXO entry.
Definition: coins.h:32
bool IsCoinBase() const
Definition: coins.h:56
void Clear()
Definition: coins.h:47
void Serialize(Stream &s) const
Definition: coins.h:61
Coin(CTxOut &&outIn, int nHeightIn, bool fCoinBaseIn)
construct a Coin from a CTxOut and height/coinbase information.
Definition: coins.h:44
Coin()
empty constructor
Definition: coins.h:54
CTxOut out
unspent transaction output
Definition: coins.h:35
bool IsSpent() const
Either this coin never existed (see e.g.
Definition: coins.h:80
Coin(const CTxOut &outIn, int nHeightIn, bool fCoinBaseIn)
Definition: coins.h:45
void Unserialize(Stream &s)
Definition: coins.h:69
uint32_t nHeight
at which height this containing transaction was included in the active block chain
Definition: coins.h:41
size_t DynamicMemoryUsage() const
Definition: coins.h:84
unsigned int fCoinBase
whether containing transaction was a coinbase
Definition: coins.h:38
Forwards all allocations/deallocations to the PoolResource.
Definition: pool.h:277
256-bit opaque blob.
Definition: uint256.h:106
void AddCoins(CCoinsViewCache &cache, const CTransaction &tx, int nHeight, bool check=false)
Utility function to add all of a transaction's outputs to a cache.
Definition: coins.cpp:117
const Coin & AccessByTxid(const CCoinsViewCache &cache, const Txid &txid)
Utility function to find any unspent output with a given txid.
Definition: coins.cpp:344
std::unordered_map< COutPoint, CCoinsCacheEntry, SaltedOutpointHasher, std::equal_to< COutPoint >, PoolAllocator< std::pair< const COutPoint, CCoinsCacheEntry >, sizeof(std::pair< const COutPoint, CCoinsCacheEntry >)+sizeof(void *) *4 > > CCoinsMap
PoolAllocator's MAX_BLOCK_SIZE_BYTES parameter here uses sizeof the data, and adds the size of 4 poin...
Definition: coins.h:148
CCoinsMap::allocator_type::ResourceType CCoinsMapMemoryResource
Definition: coins.h:150
unsigned int nHeight
static size_t DynamicUsage(const int8_t &v)
Dynamic memory usage for built-in types is zero.
Definition: memusage.h:30
#define VARINT(obj)
Definition: serialize.h:513
A Coin in one level of the coins database caching hierarchy.
Definition: coins.h:105
unsigned char flags
Definition: coins.h:107
Coin coin
Definition: coins.h:106
Flags
Definition: coins.h:109
@ FRESH
FRESH means the parent cache does not have this coin or that it is a spent coin in the parent cache.
Definition: coins.h:127
@ DIRTY
DIRTY means the CCoinsCacheEntry is potentially different from the version in the parent cache.
Definition: coins.h:117
CCoinsCacheEntry(Coin &&coin_, unsigned char flag)
Definition: coins.h:132
CCoinsCacheEntry()
Definition: coins.h:130
CCoinsCacheEntry(Coin &&coin_)
Definition: coins.h:131
assert(!tx.IsCoinBase())