6 #ifndef BITCOIN_COINS_H 7 #define BITCOIN_COINS_H 25 #include <unordered_map> 63 template<
typename Stream>
71 template<
typename Stream>
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;
137 Assume(pair.second.m_prev && pair.second.m_next);
138 pair.second.m_flags |=
flags;
203 Assume(&pair.second ==
this);
222 std::equal_to<COutPoint>,
238 virtual bool Valid()
const = 0;
239 virtual void Next() = 0;
272 bool will_erase) noexcept
281 const auto next_entry{current.second.Next()};
286 if (current.second.coin.IsSpent()) {
287 assert(current.second.coin.DynamicMemoryUsage() == 0);
288 m_map.erase(current.first);
290 current.second.SetClean();
336 virtual std::unique_ptr<CCoinsViewCursor>
Cursor()
const;
361 std::unique_ptr<CCoinsViewCursor>
Cursor()
const override;
392 void Reset() noexcept;
413 throw std::logic_error(
"CCoinsViewCache cursor iteration not supported.");
464 void Flush(
bool reallocate_cache =
true);
590 #endif // BITCOIN_COINS_H CoinsCachePair * NextAndMaybeErase(CoinsCachePair ¤t) noexcept
Return the next entry after current, possibly erasing current.
uint256 GetBestBlock() const override
Retrieve the block hash whose state this CCoinsView currently represents.
CCoinsViewCache(CCoinsView *baseIn, bool deterministic=false)
bool IsSpent() const
Either this coin never existed (see e.g.
constexpr bool TrySub(T &i, const U j) noexcept
CoinsCachePair m_sentinel
A Coin in one level of the coins database caching hierarchy.
const Coin & AccessByTxid(const CCoinsViewCache &cache, const Txid &txid)
Utility function to find any unspent output with a given txid.
const Coin & AccessCoin(const COutPoint &output) const
Return a reference to Coin in the cache, or coinEmpty if not found.
void SetBackend(CCoinsView &viewIn)
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...
ResetGuard(CCoinsViewCache &cache LIFETIMEBOUND) noexcept
CoinsCachePair * End() const noexcept
static size_t DynamicUsage(const int8_t &v)
Dynamic memory usage for built-in types is zero.
size_t GetDirtyCount() const noexcept
std::optional< Coin > FetchCoinFromBase(const COutPoint &outpoint) const override
std::vector< std::function< void()> > m_err_callbacks
A list of callbacks to execute upon leveldb read error.
CCoinsMapMemoryResource m_cache_coins_memory_resource
CoinsCachePair * m_prev
These are used to create a doubly linked list of flagged entries.
void AddReadErrCallback(std::function< void()> f)
size_t DynamicMemoryUsage() const
Calculate the size of the cache (in bytes)
CTxOut out
unspent transaction output
std::optional< Coin > PeekCoin(const COutPoint &outpoint) const override
Retrieve the Coin (unspent transaction output) for a given outpoint, without caching results...
bool WillErase(CoinsCachePair ¤t) const noexcept
std::vector< uint256 > GetHeadBlocks() const override
Retrieve the range of blocks that may have been only partially written.
virtual ~CCoinsViewCursor()=default
unsigned int fCoinBase
whether containing transaction was a coinbase
bool HaveCoinInCache(const COutPoint &outpoint) const
Check if we have the given utxo already loaded in this cache.
bool IsFresh() const noexcept
void ReallocateCache()
Force a reallocation of the cache map.
CCoinsViewCache overlay that avoids populating/mutating parent cache layers on cache misses...
virtual bool HaveCoin(const COutPoint &outpoint) const
Just check whether a given outpoint is unspent.
std::optional< Coin > PeekCoin(const COutPoint &outpoint) const override
Retrieve the Coin (unspent transaction output) for a given outpoint, without caching results...
bool HaveInputs(const CTransaction &tx) const
Check whether all prevouts of the transaction are present in the UTXO set represented by this view...
std::optional< Coin > GetCoin(const COutPoint &outpoint) const override
Retrieve the Coin (unspent transaction output) for a given outpoint.
void Serialize(Stream &s) const
CCoinsMap::allocator_type::ResourceType CCoinsMapMemoryResource
const bool m_deterministic
bool SpendCoin(const COutPoint &outpoint, Coin *moveto=nullptr)
Spend a coin.
DIRTY means the CCoinsCacheEntry is potentially different from the version in the parent cache...
CCoinsViewErrorCatcher(CCoinsView *view)
void SetBestBlock(const uint256 &hashBlock)
virtual bool GetValue(Coin &coin) const =0
CoinsCachePair & m_sentinel
uint32_t nHeight
at which height this containing transaction was included in the active block chain ...
unsigned int GetCacheSize() const
Size of the cache (in number of transaction outputs)
CCoinsCacheEntry() noexcept=default
std::pair< const COutPoint, CCoinsCacheEntry > CoinsCachePair
void EmplaceCoinInternalDANGER(COutPoint &&outpoint, Coin &&coin)
Emplace a coin into cacheCoins without performing any checks, marking the emplaced coin as dirty...
virtual bool Valid() const =0
Abstract view on the open txout dataset.
CoinsCachePair * Next() const noexcept
Only call Next when this entry is DIRTY, FRESH, or both.
void Flush(bool reallocate_cache=true)
Push the modifications applied to this cache to its base and wipe local state.
Cursor for iterating over the linked list of flagged entries in CCoinsViewCache.
std::unique_ptr< CCoinsViewCursor > Cursor() const override
Get a cursor to iterate over the whole state.
std::optional< Coin > GetCoin(const COutPoint &outpoint) const override
Retrieve the Coin (unspent transaction output) for a given outpoint.
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...
ResetGuard CreateResetGuard() noexcept
Create a scoped guard that will call Reset() on this cache when it goes out of scope.
virtual std::vector< uint256 > GetHeadBlocks() const
Retrieve the range of blocks that may have been only partially written.
virtual std::optional< Coin > PeekCoin(const COutPoint &outpoint) const
Retrieve the Coin (unspent transaction output) for a given outpoint, without caching results...
An output of a transaction.
CoinsCachePair * Prev() const noexcept
Only call Prev when this entry is DIRTY, FRESH, or both.
virtual void BatchWrite(CoinsViewCacheCursor &cursor, const uint256 &hashBlock)
Do a bulk modification (multiple Coin changes + BestBlock change).
void BatchWrite(CoinsViewCacheCursor &cursor, const uint256 &hashBlock) override
Do a bulk modification (multiple Coin changes + BestBlock change).
An outpoint - a combination of a transaction hash and an index n into its vout.
virtual ~CCoinsView()=default
As we use CCoinsViews polymorphically, have a virtual destructor.
CCoinsViewBacked(CCoinsView *viewIn)
#define Assume(val)
Assume is the identity function.
void AddCoin(const COutPoint &outpoint, Coin &&coin, bool possible_overwrite)
Add a coin.
virtual bool GetKey(COutPoint &key) const =0
std::unique_ptr< CCoinsViewCursor > Cursor() const override
Get a cursor to iterate over the whole state.
CoinsCachePair * Begin() const noexcept
uint256 GetBestBlock() const override
Retrieve the block hash whose state this CCoinsView currently represents.
Forwards all allocations/deallocations to the PoolResource.
size_t GetTotalCount() const noexcept
bool HaveCoin(const COutPoint &outpoint) const override
Just check whether a given outpoint is unspent.
uint256 hashBlock
Make mutable so that we can "fill the cache" even from Get-methods declared as "const".
size_t GetDirtyCount() const noexcept
Number of dirty cache entries (transaction outputs)
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.
void Sync()
Push the modifications applied to this cache to its base while retaining the contents of this cache (...
void Unserialize(Stream &s)
FRESH means the parent cache does not have this coin or that it is a spent coin in the parent cache...
static void SetDirty(CoinsCachePair &pair, CoinsCachePair &sentinel) noexcept
virtual size_t EstimateSize() const
Estimate database size (0 if not implemented)
void SelfRef(CoinsCachePair &pair) noexcept
Only use this for initializing the linked list sentinel.
void Uncache(const COutPoint &outpoint)
Removes the UTXO with the given outpoint from the cache, if it is not modified.
virtual uint256 GetBestBlock() const
Retrieve the block hash whose state this CCoinsView currently represents.
CCoinsViewCache & m_cache
size_t DynamicMemoryUsage() const
ResetGuard & operator=(const ResetGuard &)=delete
virtual std::optional< Coin > GetCoin(const COutPoint &outpoint) const
Retrieve the Coin (unspent transaction output) for a given outpoint.
std::optional< Coin > GetCoin(const COutPoint &outpoint) const override
Retrieve the Coin (unspent transaction output) for a given outpoint.
CCoinsMap::iterator FetchCoin(const COutPoint &outpoint) const
CCoinsViewCursor(const uint256 &hashBlockIn)
virtual std::unique_ptr< CCoinsViewCursor > Cursor() const
Get a cursor to iterate over the whole state.
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.
The basic transaction that is broadcasted on the network and contained in blocks. ...
void SanityCheck() const
Run an internal sanity check on the cache data structure. */.
CCoinsView backed by another CCoinsView.
size_t EstimateSize() const override
Estimate database size (0 if not implemented)
CCoinsView that adds a memory cache for transactions to another CCoinsView.
static void SetFresh(CoinsCachePair &pair, CoinsCachePair &sentinel) noexcept
bool HaveCoin(const COutPoint &outpoint) const override
Just check whether a given outpoint is unspent.
void Reset() noexcept
Discard all modifications made to this cache without flushing to the base view.
const uint256 & GetBestBlock() const
Get best block at the time this cursor was created.
bool IsDirty() const noexcept
This is a minimally invasive approach to shutdown on LevelDB read errors from the chainstate...
Coin(const CTxOut &outIn, int nHeightIn, bool fCoinBaseIn)
void BatchWrite(CoinsViewCacheCursor &cursor, const uint256 &hashBlock) override
Do a bulk modification (multiple Coin changes + BestBlock change).
virtual std::optional< Coin > FetchCoinFromBase(const COutPoint &outpoint) const
std::optional< Coin > PeekCoin(const COutPoint &outpoint) const override
Retrieve the Coin (unspent transaction output) for a given outpoint, without caching results...
bool HaveCoin(const COutPoint &outpoint) const override
Just check whether a given outpoint is unspent.
Coin(CTxOut &&outIn, int nHeightIn, bool fCoinBaseIn)
construct a Coin from a CTxOut and height/coinbase information.
Cursor for iterating over CoinsView state.