PIVX Core  5.6.99
P2P Digital Currency
coins.h
Go to the documentation of this file.
1 // Copyright (c) 2009-2010 Satoshi Nakamoto
2 // Copyright (c) 2009-2014 The Bitcoin developers
3 // Copyright (c) 2016-2021 The PIVX Core developers
4 // Distributed under the MIT software license, see the accompanying
5 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
6 
7 #ifndef PIVX_COINS_H
8 #define PIVX_COINS_H
9 
10 #include "compressor.h"
11 #include "consensus/consensus.h" // can be removed once policy/ established
12 #include "crypto/siphash.h"
13 #include "memusage.h"
15 #include "script/standard.h"
16 #include "serialize.h"
17 #include "uint256.h"
18 
19 #include <assert.h>
20 #include <stdint.h>
21 
22 #include <unordered_map>
23 
31 class Coin
32 {
33 public:
35  bool fCoinBase;
36 
38  bool fCoinStake;
39 
42 
44  uint32_t nHeight;
45 
47  Coin(CTxOut&& outIn, int nHeightIn, bool fCoinBaseIn, bool fCoinStakeIn) : fCoinBase(fCoinBaseIn), fCoinStake(fCoinStakeIn), out(std::move(outIn)), nHeight(nHeightIn) {}
48  Coin(const CTxOut& outIn, int nHeightIn, bool fCoinBaseIn, bool fCoinStakeIn) : fCoinBase(fCoinBaseIn), fCoinStake(fCoinStakeIn), out(outIn), nHeight(nHeightIn) {}
49 
50  void Clear() {
51  out.SetNull();
52  fCoinBase = false;
53  fCoinStake = false;
54  nHeight = 0;
55  }
56 
59 
60  bool IsCoinBase() const {
61  return fCoinBase;
62  }
63 
64  bool IsCoinStake() const {
65  return fCoinStake;
66  }
67 
68  template<typename Stream>
69  void Serialize(Stream &s) const {
70  assert(!IsSpent());
71  uint32_t code = nHeight * 4 + (fCoinBase ? 2 : 0) + (fCoinStake ? 1 : 0);
72  ::Serialize(s, VARINT(code));
73  ::Serialize(s, Using<TxOutCompression>(out));
74  }
75 
76  template<typename Stream>
77  void Unserialize(Stream &s) {
78  uint32_t code = 0;
79  ::Unserialize(s, VARINT(code));
80  nHeight = code >> 2;
81  fCoinBase = code & 2;
82  fCoinStake = code & 1;
83  ::Unserialize(s, Using<TxOutCompression>(out));
84  }
85 
86  bool IsSpent() const {
87  return out.IsNull();
88  }
89 
90  size_t DynamicMemoryUsage() const {
91  return memusage::DynamicUsage(out.scriptPubKey);
92  }
93 };
94 
96 {
97 private:
99  const uint64_t k0, k1;
100 
101 public:
103 
109  size_t operator()(const COutPoint& id) const {
110  return SipHashUint256Extra(k0, k1, id.hash, id.n);
111  }
112 };
113 
114 // Used on Sapling nullifiers, anchor maps and txmempool::mapTx: sorted by txid
116 {
117 private:
119  const uint64_t k0, k1;
120 
121 public:
122  SaltedIdHasher();
123 
129  size_t operator()(const uint256& txid) const {
130  return SipHashUint256(k0, k1, txid);
131  }
132 };
133 
135  Coin coin; // The actual cached data.
136  unsigned char flags;
137 
138  enum Flags {
139  DIRTY = (1 << 0), // This cache entry is potentially different from the version in the parent view.
140  FRESH = (1 << 1), // The parent view does not have this entry (or it is pruned).
141  };
142 
144  explicit CCoinsCacheEntry(Coin&& coin_) : coin(std::move(coin_)), flags(0) {}
145 };
146 
147 // Sapling
148 
150 {
151  bool entered; // This will be false if the anchor is removed from the cache
152  SaplingMerkleTree tree; // The tree itself
153  unsigned char flags;
154 
155  enum Flags {
156  DIRTY = (1 << 0), // This cache entry is potentially different from the version in the parent view.
157  };
158 
160 };
161 
163 {
164  bool entered; // If the nullifier is spent or not
165  unsigned char flags;
166 
167  enum Flags {
168  DIRTY = (1 << 0), // This cache entry is potentially different from the version in the parent view.
169  };
170 
172 };
173 
174 typedef std::unordered_map<uint256, CAnchorsSaplingCacheEntry, SaltedIdHasher> CAnchorsSaplingMap;
175 typedef std::unordered_map<uint256, CNullifiersCacheEntry, SaltedIdHasher> CNullifiersMap;
176 
177 typedef std::unordered_map<COutPoint, CCoinsCacheEntry, SaltedOutpointHasher> CCoinsMap;
178 
181 {
182 public:
183  CCoinsViewCursor(const uint256 &hashBlockIn): hashBlock(hashBlockIn) {}
184  virtual ~CCoinsViewCursor() {}
185 
186  virtual bool GetKey(COutPoint& key) const = 0;
187  virtual bool GetValue(Coin& coin) const = 0;
188  virtual unsigned int GetValueSize() const = 0;
189 
190  virtual bool Valid() const = 0;
191  virtual void Next() = 0;
192 
194  const uint256 &GetBestBlock() const { return hashBlock; }
195 private:
197 };
198 
201 {
202 public:
204  virtual bool GetCoin(const COutPoint& outpoint, Coin& coin) const;
205 
208  virtual bool HaveCoin(const COutPoint& outpoint) const;
209 
211  virtual uint256 GetBestBlock() const;
212 
217  virtual std::vector<uint256> GetHeadBlocks() const;
218 
221  virtual bool BatchWrite(CCoinsMap& mapCoins,
222  const uint256& hashBlock,
223  const uint256& hashSaplingAnchor,
224  CAnchorsSaplingMap& mapSaplingAnchors,
225  CNullifiersMap& mapSaplingNullifiers);
226 
228  virtual CCoinsViewCursor* Cursor() const;
229 
231  virtual ~CCoinsView() {}
232 
234  virtual size_t EstimateSize() const { return 0; }
235 
236  // Sapling
238  virtual bool GetSaplingAnchorAt(const uint256 &rt, SaplingMerkleTree &tree) const;
239 
241  virtual bool GetNullifier(const uint256 &nullifier) const;
242 
244  virtual uint256 GetBestAnchor() const;
245 };
246 
247 
250 {
251 protected:
253 
254 public:
255  CCoinsViewBacked(CCoinsView* viewIn);
256  bool GetCoin(const COutPoint& outpoint, Coin& coin) const override;
257  bool HaveCoin(const COutPoint& outpoint) const override;
258  uint256 GetBestBlock() const override;
259  std::vector<uint256> GetHeadBlocks() const override;
260  void SetBackend(CCoinsView& viewIn);
261  CCoinsViewCursor* Cursor() const override;
262  size_t EstimateSize() const override;
263 
264  bool BatchWrite(CCoinsMap& mapCoins,
265  const uint256& hashBlock,
266  const uint256& hashSaplingAnchor,
267  CAnchorsSaplingMap& mapSaplingAnchors,
268  CNullifiersMap& mapSaplingNullifiers) override;
269 
270  // Sapling
271  bool GetSaplingAnchorAt(const uint256 &rt, SaplingMerkleTree &tree) const override;
272  bool GetNullifier(const uint256 &nullifier) const override;
273  uint256 GetBestAnchor() const override;
274 };
275 
276 
278 static const unsigned int STANDARD_LOCKTIME_VERIFY_FLAGS = LOCKTIME_VERIFY_SEQUENCE |
279  LOCKTIME_MEDIAN_TIME_PAST;
280 
283 {
284 protected:
291 
292  // Sapling
296 
297  /* Cached dynamic memory usage for the inner Coin objects. */
298  mutable size_t cachedCoinsUsage;
299 
300 public:
301  CCoinsViewCache(CCoinsView *baseIn);
302 
306  CCoinsViewCache(const CCoinsViewCache &) = delete;
307 
308  // Sapling methods
309  bool GetSaplingAnchorAt(const uint256 &rt, SaplingMerkleTree &tree) const override;
310  bool GetNullifier(const uint256 &nullifier) const override;
311  uint256 GetBestAnchor() const override;
312 
313  // Adds the tree to mapSaplingAnchors
314  // and sets the current commitment root to this root.
315  template<typename Tree> void PushAnchor(const Tree &tree);
316 
317  // Removes the current commitment root from mapAnchors and sets
318  // the new current root.
319  void PopAnchor(const uint256 &rt);
320 
321  // Marks nullifiers for a given transaction as spent or not.
322  void SetNullifiers(const CTransaction& tx, bool spent);
323 
325  bool HaveShieldedRequirements(const CTransaction& tx) const;
326 
327  // Standard CCoinsView methods
328  bool GetCoin(const COutPoint& outpoint, Coin& coin) const override;
329  bool HaveCoin(const COutPoint& outpoint) const override;
330  uint256 GetBestBlock() const override;
331  void SetBestBlock(const uint256& hashBlock);
332 
334  bool GetUTXOCoin(const COutPoint& outpoint, Coin& coin) const;
335 
336  bool BatchWrite(CCoinsMap& mapCoins,
337  const uint256& hashBlock,
338  const uint256& hashSaplingAnchor,
339  CAnchorsSaplingMap& mapSaplingAnchors,
340  CNullifiersMap& mapSaplingNullifiers) override;
341 
347  bool HaveCoinInCache(const COutPoint& outpoint) const;
348 
354  const Coin& AccessCoin(const COutPoint& output) const;
355 
360  void AddCoin(const COutPoint& outpoint, Coin&& coin, bool potential_overwrite);
361 
367  void SpendCoin(const COutPoint &outpoint, Coin* moveto = nullptr);
368 
374  bool Flush();
375 
379  void Uncache(const COutPoint &outpoint);
380 
382  unsigned int GetCacheSize() const;
383 
385  size_t DynamicMemoryUsage() const;
386 
395  CAmount GetValueIn(const CTransaction& tx) const;
396 
398  bool HaveInputs(const CTransaction& tx) const;
399 
400  /*
401  * Return the depth of a coin at height nHeight, or -1 if not found
402  */
403  int GetCoinDepthAtHeight(const COutPoint& output, int nHeight) const;
404 
405  /*
406  * Return the sum of the value of all transaction outputs
407  */
408  CAmount GetTotalAmount() const;
409 
410  /*
411  * Prune zerocoin mints and frozen outputs - do it once, after initialization
412  */
413  bool PruneInvalidEntries();
414 
415 
416 private:
417  CCoinsMap::iterator FetchCoin(const COutPoint& outpoint) const;
418 
420  template<typename Tree, typename Cache, typename CacheEntry>
421  void AbstractPopAnchor(
422  const uint256 &newrt,
423  Cache &cacheAnchors,
424  uint256 &hash
425  );
426 
428  template<typename Tree, typename Cache, typename CacheIterator, typename CacheEntry>
429  void AbstractPushAnchor(
430  const Tree &tree,
431  Cache &cacheAnchors,
432  uint256 &hash
433  );
434 
436  template<typename Tree>
438  const uint256 &currentRoot,
439  Tree &tree
440  );
441 };
442 
444 // PIVX: When check is false, this assumes that overwrites are never possible due to BIP34 always in effect
445 // When check is true, the underlying view may be queried to determine whether an addition is
446 // an overwrite.
447 // When fSkipInvalid is true, the invalid_out list is checked before adding the coin.
448 void AddCoins(CCoinsViewCache& cache, const CTransaction& tx, int nHeight, bool check = false, bool fSkipInvalid = false);
449 
451 const Coin& AccessByTxid(const CCoinsViewCache& cache, const uint256& txid);
452 
453 #endif // PIVX_COINS_H
int64_t CAmount
Amount in PIV (Can be negative)
Definition: amount.h:13
false
Definition: bls_dkg.cpp:151
CCoinsView backed by another CCoinsView.
Definition: coins.h:250
bool BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlock, const uint256 &hashSaplingAnchor, CAnchorsSaplingMap &mapSaplingAnchors, CNullifiersMap &mapSaplingNullifiers) override
Do a bulk modification (multiple Coin changes + BestBlock change).
Definition: coins.cpp:42
bool HaveCoin(const COutPoint &outpoint) const override
Just check whether we have data for a given outpoint.
Definition: coins.cpp:35
bool GetNullifier(const uint256 &nullifier) const override
Determine whether a nullifier is spent or not.
Definition: coins.cpp:51
CCoinsViewCursor * Cursor() const override
Get a cursor to iterate over the whole state.
Definition: coins.cpp:39
bool GetCoin(const COutPoint &outpoint, Coin &coin) const override
Retrieve the Coin (unspent transaction output) for a given outpoint.
Definition: coins.cpp:34
size_t EstimateSize() const override
Estimate database size (0 if not implemented)
Definition: coins.cpp:40
uint256 GetBestBlock() const override
Retrieve the block hash whose state this CCoinsView currently represents.
Definition: coins.cpp:36
uint256 GetBestAnchor() const override
Get the current "tip" or the latest anchored tree root in the chain.
Definition: coins.cpp:52
bool GetSaplingAnchorAt(const uint256 &rt, SaplingMerkleTree &tree) const override
Retrieve the tree (Sapling) at a particular anchored root in the chain.
Definition: coins.cpp:50
void SetBackend(CCoinsView &viewIn)
Definition: coins.cpp:38
CCoinsView * base
Definition: coins.h:252
std::vector< uint256 > GetHeadBlocks() const override
Retrieve the range of blocks that may have been only partially written.
Definition: coins.cpp:37
CCoinsViewBacked(CCoinsView *viewIn)
Definition: coins.cpp:33
CCoinsView that adds a memory cache for transactions to another CCoinsView.
Definition: coins.h:283
bool BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlock, const uint256 &hashSaplingAnchor, CAnchorsSaplingMap &mapSaplingAnchors, CNullifiersMap &mapSaplingNullifiers) override
Do a bulk modification (multiple Coin changes + BestBlock change).
Definition: coins.cpp:240
void SpendCoin(const COutPoint &outpoint, Coin *moveto=nullptr)
Spend a coin.
Definition: coins.cpp:133
uint256 hashSaplingAnchor
Definition: coins.h:293
CAmount GetValueIn(const CTransaction &tx) const
Amount of pivx coming in to a transaction Note that lightweight clients may not know anything besides...
Definition: coins.cpp:337
uint256 hashBlock
Make mutable so that we can "fill the cache" even from Get-methods declared as "const".
Definition: coins.h:289
void Uncache(const COutPoint &outpoint)
Removes the UTXO with the given outpoint from the cache, if it is not modified.
Definition: coins.cpp:323
CCoinsViewCache(CCoinsView *baseIn)
Definition: coins.cpp:57
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:357
void BringBestAnchorIntoCache(const uint256 &currentRoot, Tree &tree)
Interface for bringing an anchor into the cache.
CAnchorsSaplingMap cacheSaplingAnchors
Definition: coins.h:294
void SetNullifiers(const CTransaction &tx, bool spent)
Definition: coins.cpp:550
void PushAnchor(const Tree &tree)
bool PruneInvalidEntries()
Definition: coins.cpp:393
CNullifiersMap cacheSaplingNullifiers
Definition: coins.h:295
void PopAnchor(const uint256 &rt)
Definition: coins.cpp:542
void AddCoin(const COutPoint &outpoint, Coin &&coin, bool potential_overwrite)
Add a coin.
Definition: coins.cpp:94
void AbstractPopAnchor(const uint256 &newrt, Cache &cacheAnchors, uint256 &hash)
Generalized interface for popping anchors.
Definition: coins.cpp:512
unsigned int GetCacheSize() const
Calculate the size of the cache (in number of transaction outputs)
Definition: coins.cpp:332
bool GetSaplingAnchorAt(const uint256 &rt, SaplingMerkleTree &tree) const override
Retrieve the tree (Sapling) at a particular anchored root in the chain.
Definition: coins.cpp:422
uint256 GetBestBlock() const override
Retrieve the block hash whose state this CCoinsView currently represents.
Definition: coins.cpp:173
size_t cachedCoinsUsage
Definition: coins.h:298
uint256 GetBestAnchor() const override
Get the current "tip" or the latest anchored tree root in the chain.
Definition: coins.cpp:561
void SetBestBlock(const uint256 &hashBlock)
Definition: coins.cpp:180
CCoinsMap::iterator FetchCoin(const COutPoint &outpoint) const
Definition: coins.cpp:66
bool GetCoin(const COutPoint &outpoint, Coin &coin) const override
Retrieve the Coin (unspent transaction output) for a given outpoint.
Definition: coins.cpp:84
bool GetUTXOCoin(const COutPoint &outpoint, Coin &coin) const
Get the coin and check if it's spent.
Definition: coins.cpp:584
bool HaveCoinInCache(const COutPoint &outpoint) const
Check if we have the given utxo already loaded in this cache.
Definition: coins.cpp:167
bool GetNullifier(const uint256 &nullifier) const override
Determine whether a nullifier is spent or not.
Definition: coins.cpp:446
int GetCoinDepthAtHeight(const COutPoint &output, int nHeight) const
Definition: coins.cpp:369
bool Flush()
Push the modifications applied to this cache to its base.
Definition: coins.cpp:309
size_t DynamicMemoryUsage() const
Calculate the size of the cache (in bytes)
Definition: coins.cpp:59
bool HaveShieldedRequirements(const CTransaction &tx) const
Check whether all sapling spend requirements (anchors/nullifiers) are satisfied.
Definition: coins.cpp:567
CAmount GetTotalAmount() const
Definition: coins.cpp:377
bool HaveCoin(const COutPoint &outpoint) const override
Just check whether we have data for a given outpoint.
Definition: coins.cpp:161
CCoinsMap cacheCoins
Definition: coins.h:290
void AbstractPushAnchor(const Tree &tree, Cache &cacheAnchors, uint256 &hash)
Generalized interface for pushing anchors.
Definition: coins.cpp:461
const Coin & AccessCoin(const COutPoint &output) const
Return a reference to a Coin in the cache, or a pruned one if not found.
Definition: coins.cpp:151
Cursor for iterating over CoinsView state.
Definition: coins.h:181
virtual void Next()=0
virtual bool Valid() const =0
CCoinsViewCursor(const uint256 &hashBlockIn)
Definition: coins.h:183
virtual unsigned int GetValueSize() const =0
uint256 hashBlock
Definition: coins.h:196
virtual ~CCoinsViewCursor()
Definition: coins.h:184
virtual bool GetKey(COutPoint &key) const =0
const uint256 & GetBestBlock() const
Get best block at the time this cursor was created.
Definition: coins.h:194
virtual bool GetValue(Coin &coin) const =0
Abstract view on the open txout dataset.
Definition: coins.h:201
virtual bool BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlock, const uint256 &hashSaplingAnchor, CAnchorsSaplingMap &mapSaplingAnchors, CNullifiersMap &mapSaplingNullifiers)
Do a bulk modification (multiple Coin changes + BestBlock change).
Definition: coins.cpp:22
virtual bool GetCoin(const COutPoint &outpoint, Coin &coin) const
Retrieve the Coin (unspent transaction output) for a given outpoint.
Definition: coins.cpp:16
virtual bool GetNullifier(const uint256 &nullifier) const
Determine whether a nullifier is spent or not.
Definition: coins.cpp:30
virtual uint256 GetBestAnchor() const
Get the current "tip" or the latest anchored tree root in the chain.
Definition: coins.cpp:31
virtual CCoinsViewCursor * Cursor() const
Get a cursor to iterate over the whole state.
Definition: coins.cpp:20
virtual std::vector< uint256 > GetHeadBlocks() const
Retrieve the range of blocks that may have been only partially written.
Definition: coins.cpp:19
virtual bool GetSaplingAnchorAt(const uint256 &rt, SaplingMerkleTree &tree) const
Retrieve the tree (Sapling) at a particular anchored root in the chain.
Definition: coins.cpp:29
virtual ~CCoinsView()
As we use CCoinsViews polymorphically, have a virtual destructor.
Definition: coins.h:231
virtual bool HaveCoin(const COutPoint &outpoint) const
Just check whether we have data for a given outpoint.
Definition: coins.cpp:17
virtual size_t EstimateSize() const
Estimate database size (0 if not implemented)
Definition: coins.h:234
virtual uint256 GetBestBlock() const
Retrieve the block hash whose state this CCoinsView currently represents.
Definition: coins.cpp:18
An outpoint - a combination of a transaction hash and an index n into its vout.
Definition: transaction.h:72
The basic transaction that is broadcasted on the network and contained in blocks.
Definition: transaction.h:244
An output of a transaction.
Definition: transaction.h:137
CScript scriptPubKey
Definition: transaction.h:140
void SetNull()
Definition: transaction.h:152
bool IsNull() const
Definition: transaction.h:159
A UTXO entry.
Definition: coins.h:32
Coin(CTxOut &&outIn, int nHeightIn, bool fCoinBaseIn, bool fCoinStakeIn)
construct a Coin from a CTxOut and height/coinbase properties.
Definition: coins.h:47
bool IsCoinBase() const
Definition: coins.h:60
void Clear()
Definition: coins.h:50
bool IsCoinStake() const
Definition: coins.h:64
void Serialize(Stream &s) const
Definition: coins.h:69
bool fCoinStake
whether the containing transaction was a coinstake
Definition: coins.h:38
Coin()
empty constructor
Definition: coins.h:58
Coin(const CTxOut &outIn, int nHeightIn, bool fCoinBaseIn, bool fCoinStakeIn)
Definition: coins.h:48
CTxOut out
unspent transaction output
Definition: coins.h:41
bool IsSpent() const
Definition: coins.h:86
bool fCoinBase
whether the containing transaction was a coinbase
Definition: coins.h:35
void Unserialize(Stream &s)
Definition: coins.h:77
uint32_t nHeight
at which height the containing transaction was included in the active block chain
Definition: coins.h:44
size_t DynamicMemoryUsage() const
Definition: coins.h:90
SaltedIdHasher()
Definition: coins.cpp:55
size_t operator()(const uint256 &txid) const
This must return size_t.
Definition: coins.h:129
const uint64_t k1
Definition: coins.h:119
const uint64_t k0
Salt.
Definition: coins.h:119
const uint64_t k0
Salt.
Definition: coins.h:99
const uint64_t k1
Definition: coins.h:99
size_t operator()(const COutPoint &id) const
This must return size_t.
Definition: coins.h:109
256-bit opaque blob.
Definition: uint256.h:138
const Coin & AccessByTxid(const CCoinsViewCache &cache, const uint256 &txid)
Utility function to find any unspent output with a given txid.
Definition: coins.cpp:409
std::unordered_map< uint256, CAnchorsSaplingCacheEntry, SaltedIdHasher > CAnchorsSaplingMap
Definition: coins.h:174
std::unordered_map< COutPoint, CCoinsCacheEntry, SaltedOutpointHasher > CCoinsMap
Definition: coins.h:177
void AddCoins(CCoinsViewCache &cache, const CTransaction &tx, int nHeight, bool check=false, bool fSkipInvalid=false)
Utility function to add all of a transaction's outputs to a cache.
Definition: coins.cpp:116
std::unordered_map< uint256, CNullifiersCacheEntry, SaltedIdHasher > CNullifiersMap
Definition: coins.h:175
Definition: uint256.h:212
#define VARINT(obj)
Definition: serialize.h:513
uint64_t SipHashUint256Extra(uint64_t k0, uint64_t k1, const uint256 &val, uint32_t extra)
Definition: siphash.cpp:134
uint64_t SipHashUint256(uint64_t k0, uint64_t k1, const uint256 &val)
Optimized SipHash-2-4 implementation for uint256.
Definition: siphash.cpp:94
Definition: coins.h:150
bool entered
Definition: coins.h:151
Flags
Definition: coins.h:155
@ DIRTY
Definition: coins.h:156
SaplingMerkleTree tree
Definition: coins.h:152
CAnchorsSaplingCacheEntry()
Definition: coins.h:159
unsigned char flags
Definition: coins.h:153
Definition: coins.h:134
unsigned char flags
Definition: coins.h:136
Coin coin
Definition: coins.h:135
Flags
Definition: coins.h:138
@ FRESH
Definition: coins.h:140
@ DIRTY
Definition: coins.h:139
CCoinsCacheEntry()
Definition: coins.h:143
CCoinsCacheEntry(Coin &&coin_)
Definition: coins.h:144
Definition: coins.h:163
unsigned char flags
Definition: coins.h:165
bool entered
Definition: coins.h:164
CNullifiersCacheEntry()
Definition: coins.h:171
Flags
Definition: coins.h:167
@ DIRTY
Definition: coins.h:168