45 CCoinsMap::iterator it =
cacheCoins.find(outpoint);
51 CCoinsMap::iterator
ret =
cacheCoins.emplace(std::piecewise_construct, std::forward_as_tuple(outpoint), std::forward_as_tuple(std::move(tmp))).first;
52 if (
ret->second.coin.IsSpent()) {
62 CCoinsMap::const_iterator it =
FetchCoin(outpoint);
64 coin = it->second.coin;
72 if (coin.out.scriptPubKey.IsUnspendable())
return;
73 CCoinsMap::iterator it;
75 std::tie(it, inserted) =
cacheCoins.emplace(std::piecewise_construct, std::forward_as_tuple(outpoint), std::tuple<>());
80 if (!possible_overwrite) {
81 if (!it->second.coin.IsSpent()) {
82 throw std::logic_error(
"Attempted to overwrite an unspent coin (when possible_overwrite is false)");
99 it->second.coin = std::move(coin);
104 (uint32_t)outpoint.
n,
105 (uint32_t)it->second.coin.nHeight,
106 (int64_t)it->second.coin.out.nValue,
107 (
bool)it->second.coin.IsCoinBase());
113 std::piecewise_construct,
114 std::forward_as_tuple(std::move(outpoint)),
121 for (
size_t i = 0; i < tx.
vout.size(); ++i) {
122 bool overwrite = check_for_overwrite ? cache.
HaveCoin(
COutPoint(txid, i)) : fCoinbase;
130 CCoinsMap::iterator it =
FetchCoin(outpoint);
135 (uint32_t)outpoint.
n,
136 (uint32_t)it->second.coin.nHeight,
137 (int64_t)it->second.coin.out.nValue,
138 (
bool)it->second.coin.IsCoinBase());
140 *moveout = std::move(it->second.coin);
146 it->second.coin.Clear();
154 CCoinsMap::const_iterator it =
FetchCoin(outpoint);
158 return it->second.coin;
163 CCoinsMap::const_iterator it =
FetchCoin(outpoint);
164 return (it !=
cacheCoins.end() && !it->second.coin.IsSpent());
168 CCoinsMap::const_iterator it =
cacheCoins.find(outpoint);
169 return (it !=
cacheCoins.end() && !it->second.coin.IsSpent());
183 for (CCoinsMap::iterator it = mapCoins.begin();
184 it != mapCoins.end();
185 it = erase ? mapCoins.erase(it) : std::next(it)) {
190 CCoinsMap::iterator itUs =
cacheCoins.find(it->first);
202 entry.
coin = std::move(it->second.coin);
204 entry.
coin = it->second.coin;
222 throw std::logic_error(
"FRESH flag misapplied to coin that exists in parent cache");
237 itUs->second.coin = std::move(it->second.coin);
239 itUs->second.coin = it->second.coin;
259 throw std::logic_error(
"Not all cached coins were erased");
273 if (it->second.coin.IsSpent()) {
277 it->second.flags = 0;
286 CCoinsMap::iterator it =
cacheCoins.find(hash);
287 if (it !=
cacheCoins.end() && it->second.flags == 0) {
289 TRACE5(utxocache, uncache,
292 (uint32_t)it->second.coin.nHeight,
293 (int64_t)it->second.coin.out.nValue,
294 (
bool)it->second.coin.IsCoinBase());
306 for (
unsigned int i = 0; i < tx.
vin.size(); i++) {
327 size_t recomputed_usage = 0;
332 if (entry.coin.IsSpent()) attr |= 4;
334 assert(attr != 2 && attr != 4 && attr != 7);
337 recomputed_usage += entry.coin.DynamicMemoryUsage();
350 if (!alternate.
IsSpent())
return alternate;
356 template <
typename Func>
361 }
catch(
const std::runtime_error& e) {
362 for (
const auto& f : err_callbacks) {
365 LogPrintf(
"Error reading from database: %s\n", e.what());
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.
const Coin & AccessByTxid(const CCoinsViewCache &view, const uint256 &txid)
Utility function to find any unspent output with a given txid.
CCoinsViewCache(CCoinsView *baseIn, bool deterministic=false)
bool IsSpent() const
Either this coin never existed (see e.g.
static const int WITNESS_SCALE_FACTOR
A Coin in one level of the coins database caching hierarchy.
bool Func(const std::string &str, Span< const char > &sp)
Parse a function call.
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)
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
size_t DynamicMemoryUsage() const
Calculate the size of the cache (in bytes)
std::vector< uint256 > GetHeadBlocks() const override
Retrieve the range of blocks that may have been only partially written.
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).
static const Coin coinEmpty
bool HaveInputs(const CTransaction &tx) const
Check whether all prevouts of the transaction are present in the UTXO set represented by this view...
CCoinsMap::allocator_type::ResourceType CCoinsMapMemoryResource
const bool m_deterministic
bool SpendCoin(const COutPoint &outpoint, Coin *moveto=nullptr)
Spend a coin.
const std::vector< CTxIn > vin
size_t GetSerializeSize(const T &t, int nVersion=0)
DIRTY means the CCoinsCacheEntry is potentially different from the version in the parent cache...
static const unsigned int MAX_BLOCK_WEIGHT
The maximum allowed weight for a block, see BIP 141 (network rule)
void SetBestBlock(const uint256 &hashBlock)
void AddCoins(CCoinsViewCache &cache, const CTransaction &tx, int nHeight, bool check_for_overwrite)
Utility function to add all of a transaction's outputs to a cache.
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...
Abstract view on the open txout dataset.
const uint256 & GetHash() const
bilingual_str _(const char *psz)
Translation function.
std::unique_ptr< CCoinsViewCursor > Cursor() const override
Get a cursor to iterate over the whole state.
const std::vector< CTxOut > vout
virtual std::vector< uint256 > GetHeadBlocks() const
Retrieve the range of blocks that may have been only partially written.
An output of a transaction.
static bool ExecuteBackedWrapper(Func func, const std::vector< std::function< void()>> &err_callbacks)
An outpoint - a combination of a transaction hash and an index n into its vout.
constexpr bool IsNull() const
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.
#define TRACE5(context, event, a, b, c, d, e)
uint256 GetBestBlock() const override
Retrieve the block hash whose state this CCoinsView currently represents.
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".
bool GetCoin(const COutPoint &outpoint, Coin &coin) const override
Retrieve the Coin (unspent transaction output) for a given outpoint.
FRESH means the parent cache does not have this coin or that it is a spent coin in the parent cache...
constexpr const unsigned char * data() const
virtual size_t EstimateSize() const
Estimate database size (0 if not implemented)
static const int PROTOCOL_VERSION
network protocol versioning
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.
size_t DynamicMemoryUsage() const
bool GetCoin(const COutPoint &outpoint, Coin &coin) const override
Retrieve the Coin (unspent transaction output) for a given outpoint.
static const size_t MAX_OUTPUTS_PER_BLOCK
CCoinsMap::iterator FetchCoin(const COutPoint &outpoint) const
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).
static const size_t MIN_TRANSACTION_OUTPUT_WEIGHT
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.