Skip to content

Commit 59e6828

Browse files
committed
Add deterministic mode to CCoinsViewCache
1 parent b0ff310 commit 59e6828

File tree

6 files changed

+17
-8
lines changed

6 files changed

+17
-8
lines changed

src/coins.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,10 @@ bool CCoinsViewBacked::BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlock,
3232
std::unique_ptr<CCoinsViewCursor> CCoinsViewBacked::Cursor() const { return base->Cursor(); }
3333
size_t CCoinsViewBacked::EstimateSize() const { return base->EstimateSize(); }
3434

35-
CCoinsViewCache::CCoinsViewCache(CCoinsView* baseIn) : CCoinsViewBacked(baseIn) {}
35+
CCoinsViewCache::CCoinsViewCache(CCoinsView* baseIn, bool deterministic) :
36+
CCoinsViewBacked(baseIn), m_deterministic(deterministic),
37+
cacheCoins(0, SaltedOutpointHasher(/*deterministic=*/deterministic))
38+
{}
3639

3740
size_t CCoinsViewCache::DynamicMemoryUsage() const {
3841
return memusage::DynamicUsage(cacheCoins) + cachedCoinsUsage;
@@ -311,7 +314,7 @@ void CCoinsViewCache::ReallocateCache()
311314
// Cache should be empty when we're calling this.
312315
assert(cacheCoins.size() == 0);
313316
cacheCoins.~CCoinsMap();
314-
::new (&cacheCoins) CCoinsMap();
317+
::new (&cacheCoins) CCoinsMap(0, SaltedOutpointHasher(/*deterministic=*/m_deterministic));
315318
}
316319

317320
void CCoinsViewCache::SanityCheck() const

src/coins.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,9 @@ class CCoinsViewBacked : public CCoinsView
211211
/** CCoinsView that adds a memory cache for transactions to another CCoinsView */
212212
class CCoinsViewCache : public CCoinsViewBacked
213213
{
214+
private:
215+
const bool m_deterministic;
216+
214217
protected:
215218
/**
216219
* Make mutable so that we can "fill the cache" even from Get-methods
@@ -223,7 +226,7 @@ class CCoinsViewCache : public CCoinsViewBacked
223226
mutable size_t cachedCoinsUsage{0};
224227

225228
public:
226-
CCoinsViewCache(CCoinsView *baseIn);
229+
CCoinsViewCache(CCoinsView *baseIn, bool deterministic = false);
227230

228231
/**
229232
* By deleting the copy constructor, we prevent accidentally using it when one intends to create a cache on top of a base cache.

src/test/fuzz/coins_view.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ FUZZ_TARGET_INIT(coins_view, initialize_coins_view)
4646
{
4747
FuzzedDataProvider fuzzed_data_provider{buffer.data(), buffer.size()};
4848
CCoinsView backend_coins_view;
49-
CCoinsViewCache coins_view_cache{&backend_coins_view};
49+
CCoinsViewCache coins_view_cache{&backend_coins_view, /*deterministic=*/true};
5050
COutPoint random_out_point;
5151
Coin random_coin;
5252
CMutableTransaction random_mutable_transaction;

src/test/fuzz/coinscache_sim.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ FUZZ_TARGET(coinscache_sim)
245245
++current_height;
246246
// Make sure there is always at least one CCoinsViewCache.
247247
if (caches.empty()) {
248-
caches.emplace_back(new CCoinsViewCache(&bottom));
248+
caches.emplace_back(new CCoinsViewCache(&bottom, /*deterministic=*/true));
249249
sim_caches[caches.size()].Wipe();
250250
}
251251

@@ -374,7 +374,7 @@ FUZZ_TARGET(coinscache_sim)
374374
[&]() { // Add a cache level (if not already at the max).
375375
if (caches.size() != MAX_CACHES) {
376376
// Apply to real caches.
377-
caches.emplace_back(new CCoinsViewCache(&*caches.back()));
377+
caches.emplace_back(new CCoinsViewCache(&*caches.back(), /*deterministic=*/true));
378378
// Apply to simulation data.
379379
sim_caches[caches.size()].Wipe();
380380
}

src/util/hasher.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@
99

1010
SaltedTxidHasher::SaltedTxidHasher() : k0(GetRand<uint64_t>()), k1(GetRand<uint64_t>()) {}
1111

12-
SaltedOutpointHasher::SaltedOutpointHasher() : k0(GetRand<uint64_t>()), k1(GetRand<uint64_t>()) {}
12+
SaltedOutpointHasher::SaltedOutpointHasher(bool deterministic) :
13+
k0(deterministic ? 0x8e819f2607a18de6 : GetRand<uint64_t>()),
14+
k1(deterministic ? 0xf4020d2e3983b0eb : GetRand<uint64_t>())
15+
{}
1316

1417
SaltedSipHasher::SaltedSipHasher() : m_k0(GetRand<uint64_t>()), m_k1(GetRand<uint64_t>()) {}
1518

src/util/hasher.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ class SaltedOutpointHasher
3636
const uint64_t k0, k1;
3737

3838
public:
39-
SaltedOutpointHasher();
39+
SaltedOutpointHasher(bool deterministic = false);
4040

4141
/**
4242
* Having the hash noexcept allows libstdc++'s unordered_map to recalculate

0 commit comments

Comments
 (0)