6 #ifndef BITCOIN_COINS_H 7 #define BITCOIN_COINS_H 22 #include <unordered_map> 60 template<
typename Stream>
68 template<
typename Stream>
146 std::equal_to<COutPoint>,
148 sizeof(std::pair<const COutPoint, CCoinsCacheEntry>) +
sizeof(
void*) * 4>>;
162 virtual bool Valid()
const = 0;
163 virtual void Next() = 0;
198 virtual std::unique_ptr<CCoinsViewCursor>
Cursor()
const;
222 std::unique_ptr<CCoinsViewCursor>
Cursor()
const override;
259 std::unique_ptr<CCoinsViewCursor>
Cursor()
const override {
260 throw std::logic_error(
"CCoinsViewCache cursor iteration not supported.");
393 #endif // BITCOIN_COINS_H bool GetCoin(const COutPoint &outpoint, Coin &coin) const override
Retrieve the Coin (unspent transaction output) for a given outpoint.
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.
A Coin in one level of the coins database caching hierarchy.
virtual bool GetCoin(const COutPoint &outpoint, Coin &coin) const
Retrieve the Coin (unspent transaction output) for a given outpoint.
const Coin & AccessCoin(const COutPoint &output) const
Return a reference to Coin in the cache, or coinEmpty if not found.
bool Flush()
Push the modifications applied to this cache to its base and wipe local state.
void SetBackend(CCoinsView &viewIn)
CCoinsCacheEntry(Coin &&coin_, unsigned char flag)
static size_t DynamicUsage(const int8_t &v)
Dynamic memory usage for built-in types is zero.
std::vector< std::function< void()> > m_err_callbacks
A list of callbacks to execute upon leveldb read error.
CCoinsMapMemoryResource m_cache_coins_memory_resource
void AddReadErrCallback(std::function< void()> f)
size_t DynamicMemoryUsage() const
Calculate the size of the cache (in bytes)
CTxOut out
unspent transaction output
std::vector< uint256 > GetHeadBlocks() const override
Retrieve the range of blocks that may have been only partially written.
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.
void ReallocateCache()
Force a reallocation of the cache map.
virtual bool HaveCoin(const COutPoint &outpoint) const
Just check whether a given outpoint is unspent.
bool BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlock, bool erase=true) override
Do a bulk modification (multiple Coin changes + BestBlock change).
bool HaveInputs(const CTransaction &tx) const
Check whether all prevouts of the transaction are present in the UTXO set represented by this view...
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)
virtual ~CCoinsView()
As we use CCoinsViews polymorphically, have a virtual destructor.
void SetBestBlock(const uint256 &hashBlock)
virtual bool GetValue(Coin &coin) const =0
uint32_t nHeight
at which height this containing transaction was included in the active block chain ...
unsigned int GetCacheSize() const
Calculate the size of the cache (in number of transaction outputs)
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...
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.
const Coin & AccessByTxid(const CCoinsViewCache &cache, const uint256 &txid)
Utility function to find any unspent output with a given txid.
CCoinsCacheEntry(Coin &&coin_)
std::unique_ptr< CCoinsViewCursor > Cursor() const override
Get a cursor to iterate over the whole state.
virtual std::vector< uint256 > GetHeadBlocks() const
Retrieve the range of blocks that may have been only partially written.
An output of a transaction.
An outpoint - a combination of a transaction hash and an index n into its vout.
CCoinsViewBacked(CCoinsView *viewIn)
virtual bool BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlock, bool erase=true)
Do a bulk modification (multiple Coin changes + BestBlock change).
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.
uint256 GetBestBlock() const override
Retrieve the block hash whose state this CCoinsView currently represents.
Forwards all allocations/deallocations to the PoolResource.
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".
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.
bool GetCoin(const COutPoint &outpoint, Coin &coin) const override
Retrieve the Coin (unspent transaction output) for a given outpoint.
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...
virtual size_t EstimateSize() const
Estimate database size (0 if not implemented)
void Uncache(const COutPoint &outpoint)
Removes the UTXO with the given outpoint from the cache, if it is not modified.
virtual ~CCoinsViewCursor()
virtual uint256 GetBestBlock() const
Retrieve the block hash whose state this CCoinsView currently represents.
size_t DynamicMemoryUsage() const
bool GetCoin(const COutPoint &outpoint, Coin &coin) 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.
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.
bool HaveCoin(const COutPoint &outpoint) const override
Just check whether a given outpoint is unspent.
bool BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlock, bool erase=true) override
Do a bulk modification (multiple Coin changes + BestBlock change).
const uint256 & GetBestBlock() const
Get best block at the time this cursor was created.
This is a minimally invasive approach to shutdown on LevelDB read errors from the chainstate...
Coin(const CTxOut &outIn, int nHeightIn, bool fCoinBaseIn)
bool Sync()
Push the modifications applied to this cache to its base while retaining the contents of this cache (...
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.