Bitcoin Core 31.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-present 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 <attributes.h>
10#include <compressor.h>
11#include <core_memusage.h>
12#include <memusage.h>
14#include <serialize.h>
16#include <uint256.h>
17#include <util/check.h>
18#include <util/overflow.h>
19#include <util/hasher.h>
20
21#include <cassert>
22#include <cstdint>
23
24#include <functional>
25#include <unordered_map>
26
34class Coin
35{
36public:
39
41 bool fCoinBase : 1;
42
44 uint32_t nHeight : 31;
45
47 Coin(CTxOut&& outIn, int nHeightIn, bool fCoinBaseIn) : out(std::move(outIn)), fCoinBase(fCoinBaseIn), nHeight(nHeightIn) {}
48 Coin(const CTxOut& outIn, int nHeightIn, bool fCoinBaseIn) : out(outIn), fCoinBase(fCoinBaseIn),nHeight(nHeightIn) {}
49
50 void Clear() {
51 out.SetNull();
52 fCoinBase = false;
53 nHeight = 0;
54 }
55
57 Coin() : fCoinBase(false), nHeight(0) { }
58
59 bool IsCoinBase() const {
60 return fCoinBase;
61 }
62
63 template<typename Stream>
64 void Serialize(Stream &s) const {
65 assert(!IsSpent());
66 uint32_t code{(uint32_t{nHeight} << 1) | uint32_t{fCoinBase}};
67 ::Serialize(s, VARINT(code));
68 ::Serialize(s, Using<TxOutCompression>(out));
69 }
70
71 template<typename Stream>
72 void Unserialize(Stream &s) {
73 uint32_t code = 0;
74 ::Unserialize(s, VARINT(code));
75 nHeight = code >> 1;
76 fCoinBase = code & 1;
77 ::Unserialize(s, Using<TxOutCompression>(out));
78 }
79
83 bool IsSpent() const {
84 return out.IsNull();
85 }
86
87 size_t DynamicMemoryUsage() const {
89 }
90};
91
92struct CCoinsCacheEntry;
93using CoinsCachePair = std::pair<const COutPoint, CCoinsCacheEntry>;
94
110{
111private:
124 uint8_t m_flags{0};
125
127 static void AddFlags(uint8_t flags, CoinsCachePair& pair, CoinsCachePair& sentinel) noexcept
128 {
129 Assume(flags & (DIRTY | FRESH));
130 if (!pair.second.m_flags) {
131 Assume(!pair.second.m_prev && !pair.second.m_next);
132 pair.second.m_prev = sentinel.second.m_prev;
133 pair.second.m_next = &sentinel;
134 sentinel.second.m_prev = &pair;
135 pair.second.m_prev->second.m_next = &pair;
136 }
137 Assume(pair.second.m_prev && pair.second.m_next);
138 pair.second.m_flags |= flags;
139 }
140
141public:
142 Coin coin; // The actual cached data.
143
144 enum Flags {
152 DIRTY = (1 << 0),
162 FRESH = (1 << 1),
163 };
164
165 CCoinsCacheEntry() noexcept = default;
166 explicit CCoinsCacheEntry(Coin&& coin_) noexcept : coin(std::move(coin_)) {}
168 {
169 SetClean();
170 }
171
172 static void SetDirty(CoinsCachePair& pair, CoinsCachePair& sentinel) noexcept { AddFlags(DIRTY, pair, sentinel); }
173 static void SetFresh(CoinsCachePair& pair, CoinsCachePair& sentinel) noexcept { AddFlags(FRESH, pair, sentinel); }
174
175 void SetClean() noexcept
176 {
177 if (!m_flags) return;
178 m_next->second.m_prev = m_prev;
179 m_prev->second.m_next = m_next;
180 m_flags = 0;
181 m_prev = m_next = nullptr;
182 }
183 bool IsDirty() const noexcept { return m_flags & DIRTY; }
184 bool IsFresh() const noexcept { return m_flags & FRESH; }
185
187 CoinsCachePair* Next() const noexcept
188 {
190 return m_next;
191 }
192
194 CoinsCachePair* Prev() const noexcept
195 {
197 return m_prev;
198 }
199
201 void SelfRef(CoinsCachePair& pair) noexcept
202 {
203 Assume(&pair.second == this);
204 m_prev = &pair;
205 m_next = &pair;
206 // Set sentinel to DIRTY so we can call Next on it
207 m_flags = DIRTY;
208 }
209};
210
219using CCoinsMap = std::unordered_map<COutPoint,
222 std::equal_to<COutPoint>,
224 sizeof(CoinsCachePair) + sizeof(void*) * 4>>;
225
226using CCoinsMapMemoryResource = CCoinsMap::allocator_type::ResourceType;
227
230{
231public:
232 CCoinsViewCursor(const uint256& in_block_hash) : block_hash(in_block_hash) {}
233 virtual ~CCoinsViewCursor() = default;
234
235 virtual bool GetKey(COutPoint &key) const = 0;
236 virtual bool GetValue(Coin &coin) const = 0;
237
238 virtual bool Valid() const = 0;
239 virtual void Next() = 0;
240
242 const uint256& GetBestBlock() const { return block_hash; }
243private:
245};
246
261{
272 bool will_erase) noexcept
273 : m_dirty_count(dirty_count), m_sentinel(sentinel), m_map(map), m_will_erase(will_erase) {}
274
275 inline CoinsCachePair* Begin() const noexcept { return m_sentinel.second.Next(); }
276 inline CoinsCachePair* End() const noexcept { return &m_sentinel; }
277
280 {
281 const auto next_entry{current.second.Next()};
282 Assume(TrySub(m_dirty_count, current.second.IsDirty()));
283 // If we are not going to erase the cache, we must still erase spent entries.
284 // Otherwise, clear the state of the entry.
285 if (!m_will_erase) {
286 if (current.second.coin.IsSpent()) {
287 assert(current.second.coin.DynamicMemoryUsage() == 0); // scriptPubKey was already cleared in SpendCoin
288 m_map.erase(current.first);
289 } else {
290 current.second.SetClean();
291 }
292 }
293 return next_entry;
294 }
295
296 inline bool WillErase(CoinsCachePair& current) const noexcept { return m_will_erase || current.second.coin.IsSpent(); }
297 size_t GetDirtyCount() const noexcept { return m_dirty_count; }
298 size_t GetTotalCount() const noexcept { return m_map.size(); }
299private:
304};
305
308{
309public:
311 virtual ~CCoinsView() = default;
312
315 virtual std::optional<Coin> GetCoin(const COutPoint& outpoint) const = 0;
316
319 virtual std::optional<Coin> PeekCoin(const COutPoint& outpoint) const = 0;
320
323 virtual bool HaveCoin(const COutPoint& outpoint) const = 0;
324
326 virtual uint256 GetBestBlock() const = 0;
327
332 virtual std::vector<uint256> GetHeadBlocks() const = 0;
333
336 virtual void BatchWrite(CoinsViewCacheCursor& cursor, const uint256& block_hash) = 0;
337
339 virtual std::unique_ptr<CCoinsViewCursor> Cursor() const = 0;
340
342 virtual size_t EstimateSize() const = 0;
343};
344
347{
348protected:
349 CoinsViewEmpty() = default;
350
351public:
352 static CoinsViewEmpty& Get();
353
356
357 std::optional<Coin> GetCoin(const COutPoint&) const override { return {}; }
358 std::optional<Coin> PeekCoin(const COutPoint& outpoint) const override { return GetCoin(outpoint); }
359 bool HaveCoin(const COutPoint& outpoint) const override { return !!GetCoin(outpoint); }
360 uint256 GetBestBlock() const override { return {}; }
361 std::vector<uint256> GetHeadBlocks() const override { return {}; }
362 void BatchWrite(CoinsViewCacheCursor& cursor, const uint256&) override
363 {
364 for (auto it{cursor.Begin()}; it != cursor.End(); it = cursor.NextAndMaybeErase(*it)) { }
365 }
366 std::unique_ptr<CCoinsViewCursor> Cursor() const override { return {}; }
367 size_t EstimateSize() const override { return 0; }
368};
369
372{
373protected:
375
376public:
377 explicit CCoinsViewBacked(CCoinsView* in_view) : base{Assert(in_view)} {}
378
379 void SetBackend(CCoinsView& in_view) { base = &in_view; }
380
381 std::optional<Coin> GetCoin(const COutPoint& outpoint) const override { return base->GetCoin(outpoint); }
382 std::optional<Coin> PeekCoin(const COutPoint& outpoint) const override { return base->PeekCoin(outpoint); }
383 bool HaveCoin(const COutPoint& outpoint) const override { return base->HaveCoin(outpoint); }
384 uint256 GetBestBlock() const override { return base->GetBestBlock(); }
385 std::vector<uint256> GetHeadBlocks() const override { return base->GetHeadBlocks(); }
386 void BatchWrite(CoinsViewCacheCursor& cursor, const uint256& block_hash) override { base->BatchWrite(cursor, block_hash); }
387 std::unique_ptr<CCoinsViewCursor> Cursor() const override { return base->Cursor(); }
388 size_t EstimateSize() const override { return base->EstimateSize(); }
389};
390
391
394{
395private:
396 const bool m_deterministic;
397
398protected:
405 /* The starting sentinel of the flagged entry circular doubly linked list. */
408
409 /* Cached dynamic memory usage for the inner Coin objects. */
410 mutable size_t cachedCoinsUsage{0};
411 /* Running count of dirty Coin cache entries. */
412 mutable size_t m_dirty_count{0};
413
418 void Reset() noexcept;
419
420 /* Fetch the coin from base. Used for cache misses in FetchCoin. */
421 virtual std::optional<Coin> FetchCoinFromBase(const COutPoint& outpoint) const;
422
423public:
424 CCoinsViewCache(CCoinsView* in_base, bool deterministic = false);
425
430
431 // Standard CCoinsView methods
432 std::optional<Coin> GetCoin(const COutPoint& outpoint) const override;
433 std::optional<Coin> PeekCoin(const COutPoint& outpoint) const override;
434 bool HaveCoin(const COutPoint& outpoint) const override;
435 uint256 GetBestBlock() const override;
436 void SetBestBlock(const uint256& block_hash);
437 void BatchWrite(CoinsViewCacheCursor& cursor, const uint256& block_hash) override;
438 std::unique_ptr<CCoinsViewCursor> Cursor() const override {
439 throw std::logic_error("CCoinsViewCache cursor iteration not supported.");
440 }
441
447 bool HaveCoinInCache(const COutPoint &outpoint) const;
448
459 const Coin& AccessCoin(const COutPoint &output) const;
460
465 void AddCoin(const COutPoint& outpoint, Coin&& coin, bool possible_overwrite);
466
474 void EmplaceCoinInternalDANGER(COutPoint&& outpoint, Coin&& coin);
475
481 bool SpendCoin(const COutPoint &outpoint, Coin* moveto = nullptr);
482
490 void Flush(bool reallocate_cache = true);
491
498 void Sync();
499
504 void Uncache(const COutPoint &outpoint);
505
507 unsigned int GetCacheSize() const;
508
510 size_t GetDirtyCount() const noexcept { return m_dirty_count; }
511
513 size_t DynamicMemoryUsage() const;
514
516 bool HaveInputs(const CTransaction& tx) const;
517
523 void ReallocateCache();
524
526 void SanityCheck() const;
527
529 {
530 private:
533 explicit ResetGuard(CCoinsViewCache& cache LIFETIMEBOUND) noexcept : m_cache{cache} {}
534
535 public:
536 ResetGuard(const ResetGuard&) = delete;
537 ResetGuard& operator=(const ResetGuard&) = delete;
540
542 };
543
545 [[nodiscard]] ResetGuard CreateResetGuard() noexcept { return ResetGuard{*this}; }
546
547private:
552 CCoinsMap::iterator FetchCoin(const COutPoint &outpoint) const;
553};
554
565{
566private:
567 std::optional<Coin> FetchCoinFromBase(const COutPoint& outpoint) const override
568 {
569 return base->PeekCoin(outpoint);
570 }
571
572public:
574};
575
580// TODO: pass in a boolean to limit these possible overwrites to known
581// (pre-BIP34) cases.
582void AddCoins(CCoinsViewCache& cache, const CTransaction& tx, int nHeight, bool check = false);
583
588const Coin& AccessByTxid(const CCoinsViewCache& cache, const Txid& txid);
589
598{
599public:
601
602 void AddReadErrCallback(std::function<void()> f) {
603 m_err_callbacks.emplace_back(std::move(f));
604 }
605
606 std::optional<Coin> GetCoin(const COutPoint& outpoint) const override;
607 bool HaveCoin(const COutPoint& outpoint) const override;
608 std::optional<Coin> PeekCoin(const COutPoint& outpoint) const override;
609
610private:
612 std::vector<std::function<void()>> m_err_callbacks;
613
614};
615
616#endif // BITCOIN_COINS_H
#define LIFETIMEBOUND
Definition: attributes.h:16
int flags
Definition: bitcoin-tx.cpp:530
#define Assert(val)
Identity function.
Definition: check.h:116
#define Assume(val)
Assume is the identity function.
Definition: check.h:128
CCoinsView backed by another CCoinsView.
Definition: coins.h:372
bool HaveCoin(const COutPoint &outpoint) const override
Just check whether a given outpoint is unspent.
Definition: coins.h:383
size_t EstimateSize() const override
Estimate database size.
Definition: coins.h:388
uint256 GetBestBlock() const override
Retrieve the block hash whose state this CCoinsView currently represents.
Definition: coins.h:384
std::optional< Coin > PeekCoin(const COutPoint &outpoint) const override
Retrieve the Coin (unspent transaction output) for a given outpoint, without caching results.
Definition: coins.h:382
CCoinsViewBacked(CCoinsView *in_view)
Definition: coins.h:377
std::optional< Coin > GetCoin(const COutPoint &outpoint) const override
Retrieve the Coin (unspent transaction output) for a given outpoint.
Definition: coins.h:381
std::unique_ptr< CCoinsViewCursor > Cursor() const override
Get a cursor to iterate over the whole state. Implementations may return nullptr.
Definition: coins.h:387
CCoinsView * base
Definition: coins.h:374
void BatchWrite(CoinsViewCacheCursor &cursor, const uint256 &block_hash) override
Do a bulk modification (multiple Coin changes + BestBlock change).
Definition: coins.h:386
void SetBackend(CCoinsView &in_view)
Definition: coins.h:379
std::vector< uint256 > GetHeadBlocks() const override
Retrieve the range of blocks that may have been only partially written.
Definition: coins.h:385
CCoinsViewCache & m_cache
Definition: coins.h:532
ResetGuard(const ResetGuard &)=delete
ResetGuard & operator=(ResetGuard &&)=delete
ResetGuard(ResetGuard &&)=delete
ResetGuard & operator=(const ResetGuard &)=delete
ResetGuard(CCoinsViewCache &cache LIFETIMEBOUND) noexcept
Definition: coins.h:533
CCoinsView that adds a memory cache for transactions to another CCoinsView.
Definition: coins.h:394
void Sync()
Push the modifications applied to this cache to its base while retaining the contents of this cache (...
Definition: coins.cpp:272
const bool m_deterministic
Definition: coins.h:396
std::unique_ptr< CCoinsViewCursor > Cursor() const override
Get a cursor to iterate over the whole state. Implementations may return nullptr.
Definition: coins.h:438
size_t GetDirtyCount() const noexcept
Number of dirty cache entries (transaction outputs)
Definition: coins.h:510
CCoinsMapMemoryResource m_cache_coins_memory_resource
Definition: coins.h:404
bool SpendCoin(const COutPoint &outpoint, Coin *moveto=nullptr)
Spend a coin.
Definition: coins.cpp:132
uint256 m_block_hash
Make mutable so that we can "fill the cache" even from Get-methods declared as "const".
Definition: coins.h:403
ResetGuard CreateResetGuard() noexcept
Create a scoped guard that will call Reset() on this cache when it goes out of scope.
Definition: coins.h:545
void Uncache(const COutPoint &outpoint)
Removes the UTXO with the given outpoint from the cache, if it is not modified.
Definition: coins.cpp:291
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:310
void AddCoin(const COutPoint &outpoint, Coin &&coin, bool possible_overwrite)
Add a coin.
Definition: coins.cpp:68
virtual std::optional< Coin > FetchCoinFromBase(const COutPoint &outpoint) const
Definition: coins.cpp:42
size_t m_dirty_count
Definition: coins.h:412
CCoinsViewCache(CCoinsView *in_base, bool deterministic=false)
Definition: coins.cpp:31
void Flush(bool reallocate_cache=true)
Push the modifications applied to this cache to its base and wipe local state.
Definition: coins.cpp:260
void SetBestBlock(const uint256 &block_hash)
Definition: coins.cpp:184
void Reset() noexcept
Discard all modifications made to this cache without flushing to the base view.
Definition: coins.cpp:283
unsigned int GetCacheSize() const
Size of the cache (in number of transaction outputs)
Definition: coins.cpp:306
uint256 GetBestBlock() const override
Retrieve the block hash whose state this CCoinsView currently represents.
Definition: coins.cpp:178
size_t cachedCoinsUsage
Definition: coins.h:410
CCoinsMap::iterator FetchCoin(const COutPoint &outpoint) const
Definition: coins.cpp:47
bool HaveCoinInCache(const COutPoint &outpoint) const
Check if we have the given utxo already loaded in this cache.
Definition: coins.cpp:173
CoinsCachePair m_sentinel
Definition: coins.h:406
size_t DynamicMemoryUsage() const
Calculate the size of the cache (in bytes)
Definition: coins.cpp:38
void BatchWrite(CoinsViewCacheCursor &cursor, const uint256 &block_hash) override
Do a bulk modification (multiple Coin changes + BestBlock change).
Definition: coins.cpp:189
std::optional< Coin > PeekCoin(const COutPoint &outpoint) const override
Retrieve the Coin (unspent transaction output) for a given outpoint, without caching results.
Definition: coins.cpp:23
void EmplaceCoinInternalDANGER(COutPoint &&outpoint, Coin &&coin)
Emplace a coin into cacheCoins without performing any checks, marking the emplaced coin as dirty.
Definition: coins.cpp:111
bool HaveCoin(const COutPoint &outpoint) const override
Just check whether a given outpoint is unspent.
Definition: coins.cpp:167
void SanityCheck() const
Run an internal sanity check on the cache data structure. *‍/.
Definition: coins.cpp:332
CCoinsMap cacheCoins
Definition: coins.h:407
std::optional< Coin > GetCoin(const COutPoint &outpoint) const override
Retrieve the Coin (unspent transaction output) for a given outpoint.
Definition: coins.cpp:62
const Coin & AccessCoin(const COutPoint &output) const
Return a reference to Coin in the cache, or coinEmpty if not found.
Definition: coins.cpp:158
void ReallocateCache()
Force a reallocation of the cache map.
Definition: coins.cpp:322
Cursor for iterating over CoinsView state.
Definition: coins.h:230
const uint256 & GetBestBlock() const
Get best block at the time this cursor was created.
Definition: coins.h:242
virtual void Next()=0
virtual bool Valid() const =0
uint256 block_hash
Definition: coins.h:244
CCoinsViewCursor(const uint256 &in_block_hash)
Definition: coins.h:232
virtual ~CCoinsViewCursor()=default
virtual bool GetKey(COutPoint &key) const =0
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:598
void AddReadErrCallback(std::function< void()> f)
Definition: coins.h:602
std::optional< Coin > GetCoin(const COutPoint &outpoint) const override
Retrieve the Coin (unspent transaction output) for a given outpoint.
Definition: coins.cpp:396
std::vector< std::function< void()> > m_err_callbacks
A list of callbacks to execute upon leveldb read error.
Definition: coins.h:612
bool HaveCoin(const COutPoint &outpoint) const override
Just check whether a given outpoint is unspent.
Definition: coins.cpp:401
CCoinsViewErrorCatcher(CCoinsView *view)
Definition: coins.h:600
std::optional< Coin > PeekCoin(const COutPoint &outpoint) const override
Retrieve the Coin (unspent transaction output) for a given outpoint, without caching results.
Definition: coins.cpp:406
Pure abstract view on the open txout dataset.
Definition: coins.h:308
virtual size_t EstimateSize() const =0
Estimate database size.
virtual std::vector< uint256 > GetHeadBlocks() const =0
Retrieve the range of blocks that may have been only partially written.
virtual std::optional< Coin > PeekCoin(const COutPoint &outpoint) const =0
Retrieve the Coin (unspent transaction output) for a given outpoint, without caching results.
virtual std::optional< Coin > GetCoin(const COutPoint &outpoint) const =0
Retrieve the Coin (unspent transaction output) for a given outpoint.
virtual ~CCoinsView()=default
As we use CCoinsViews polymorphically, have a virtual destructor.
virtual void BatchWrite(CoinsViewCacheCursor &cursor, const uint256 &block_hash)=0
Do a bulk modification (multiple Coin changes + BestBlock change).
virtual std::unique_ptr< CCoinsViewCursor > Cursor() const =0
Get a cursor to iterate over the whole state. Implementations may return nullptr.
virtual bool HaveCoin(const COutPoint &outpoint) const =0
Just check whether a given outpoint is unspent.
virtual uint256 GetBestBlock() const =0
Retrieve the block hash whose state this CCoinsView currently represents.
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:281
An output of a transaction.
Definition: transaction.h:140
CScript scriptPubKey
Definition: transaction.h:143
void SetNull()
Definition: transaction.h:154
bool IsNull() const
Definition: transaction.h:160
A UTXO entry.
Definition: coins.h:35
bool IsCoinBase() const
Definition: coins.h:59
void Clear()
Definition: coins.h:50
void Serialize(Stream &s) const
Definition: coins.h:64
Coin(CTxOut &&outIn, int nHeightIn, bool fCoinBaseIn)
construct a Coin from a CTxOut and height/coinbase information.
Definition: coins.h:47
Coin()
empty constructor
Definition: coins.h:57
CTxOut out
unspent transaction output
Definition: coins.h:38
bool IsSpent() const
Either this coin never existed (see e.g.
Definition: coins.h:83
Coin(const CTxOut &outIn, int nHeightIn, bool fCoinBaseIn)
Definition: coins.h:48
bool fCoinBase
whether containing transaction was a coinbase
Definition: coins.h:41
void Unserialize(Stream &s)
Definition: coins.h:72
uint32_t nHeight
at which height this containing transaction was included in the active block chain
Definition: coins.h:44
size_t DynamicMemoryUsage() const
Definition: coins.h:87
Noop coins view.
Definition: coins.h:347
CoinsViewEmpty & operator=(const CoinsViewEmpty &)=delete
size_t EstimateSize() const override
Estimate database size.
Definition: coins.h:367
void BatchWrite(CoinsViewCacheCursor &cursor, const uint256 &) override
Do a bulk modification (multiple Coin changes + BestBlock change).
Definition: coins.h:362
bool HaveCoin(const COutPoint &outpoint) const override
Just check whether a given outpoint is unspent.
Definition: coins.h:359
uint256 GetBestBlock() const override
Retrieve the block hash whose state this CCoinsView currently represents.
Definition: coins.h:360
CoinsViewEmpty()=default
std::unique_ptr< CCoinsViewCursor > Cursor() const override
Get a cursor to iterate over the whole state. Implementations may return nullptr.
Definition: coins.h:366
std::optional< Coin > PeekCoin(const COutPoint &outpoint) const override
Retrieve the Coin (unspent transaction output) for a given outpoint, without caching results.
Definition: coins.h:358
std::optional< Coin > GetCoin(const COutPoint &) const override
Retrieve the Coin (unspent transaction output) for a given outpoint.
Definition: coins.h:357
CoinsViewEmpty(const CoinsViewEmpty &)=delete
static CoinsViewEmpty & Get()
Definition: coins.cpp:17
std::vector< uint256 > GetHeadBlocks() const override
Retrieve the range of blocks that may have been only partially written.
Definition: coins.h:361
CCoinsViewCache overlay that avoids populating/mutating parent cache layers on cache misses.
Definition: coins.h:565
std::optional< Coin > FetchCoinFromBase(const COutPoint &outpoint) const override
Definition: coins.h:567
Forwards all allocations/deallocations to the PoolResource.
Definition: pool.h:291
256-bit opaque blob.
Definition: uint256.h:196
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:121
std::pair< const COutPoint, CCoinsCacheEntry > CoinsCachePair
Definition: coins.h:93
std::unordered_map< COutPoint, CCoinsCacheEntry, SaltedOutpointHasher, std::equal_to< COutPoint >, PoolAllocator< CoinsCachePair, sizeof(CoinsCachePair)+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:224
const Coin & AccessByTxid(const CCoinsViewCache &cache, const Txid &txid)
Utility function to find any unspent output with a given txid.
Definition: coins.cpp:367
CCoinsMap::allocator_type::ResourceType CCoinsMapMemoryResource
Definition: coins.h:226
unsigned int nHeight
T check(T ptr)
static size_t DynamicUsage(const int8_t &v)
Dynamic memory usage for built-in types is zero.
Definition: memusage.h:31
Definition: common.h:30
constexpr bool TrySub(T &i, const U j) noexcept
Definition: overflow.h:37
#define VARINT(obj)
Definition: serialize.h:493
A Coin in one level of the coins database caching hierarchy.
Definition: coins.h:110
Coin coin
Definition: coins.h:142
CCoinsCacheEntry() noexcept=default
Flags
Definition: coins.h:144
@ 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:162
@ DIRTY
DIRTY means the CCoinsCacheEntry is potentially different from the version in the parent cache.
Definition: coins.h:152
void SetClean() noexcept
Definition: coins.h:175
static void SetFresh(CoinsCachePair &pair, CoinsCachePair &sentinel) noexcept
Definition: coins.h:173
uint8_t m_flags
Definition: coins.h:124
static void AddFlags(uint8_t flags, CoinsCachePair &pair, CoinsCachePair &sentinel) noexcept
Adding a flag requires a reference to the sentinel of the flagged pair linked list.
Definition: coins.h:127
CoinsCachePair * m_next
Definition: coins.h:123
bool IsFresh() const noexcept
Definition: coins.h:184
~CCoinsCacheEntry()
Definition: coins.h:167
static void SetDirty(CoinsCachePair &pair, CoinsCachePair &sentinel) noexcept
Definition: coins.h:172
void SelfRef(CoinsCachePair &pair) noexcept
Only use this for initializing the linked list sentinel.
Definition: coins.h:201
bool IsDirty() const noexcept
Definition: coins.h:183
CoinsCachePair * m_prev
These are used to create a doubly linked list of flagged entries.
Definition: coins.h:122
CoinsCachePair * Next() const noexcept
Only call Next when this entry is DIRTY, FRESH, or both.
Definition: coins.h:187
CoinsCachePair * Prev() const noexcept
Only call Prev when this entry is DIRTY, FRESH, or both.
Definition: coins.h:194
Cursor for iterating over the linked list of flagged entries in CCoinsViewCache.
Definition: coins.h:261
CoinsCachePair & m_sentinel
Definition: coins.h:301
CoinsCachePair * NextAndMaybeErase(CoinsCachePair &current) noexcept
Return the next entry after current, possibly erasing current.
Definition: coins.h:279
size_t & m_dirty_count
Definition: coins.h:300
size_t GetTotalCount() const noexcept
Definition: coins.h:298
bool WillErase(CoinsCachePair &current) const noexcept
Definition: coins.h:296
size_t GetDirtyCount() const noexcept
Definition: coins.h:297
CCoinsMap & m_map
Definition: coins.h:302
CoinsCachePair * Begin() const noexcept
Definition: coins.h:275
CoinsViewCacheCursor(size_t &dirty_count LIFETIMEBOUND, CoinsCachePair &sentinel LIFETIMEBOUND, CCoinsMap &map LIFETIMEBOUND, bool will_erase) noexcept
If will_erase is not set, iterating through the cursor will erase spent coins from the map,...
Definition: coins.h:269
CoinsCachePair * End() const noexcept
Definition: coins.h:276
assert(!tx.IsCoinBase())