Skip to content

Commit 46dfbf1

Browse files
l0rincTheCharlatan
andcommitted
refactor: Return optional of Coin in GetCoin
Leaving the parameter as well for now. Co-authored-by: TheCharlatan <[email protected]>
1 parent e31bfb2 commit 46dfbf1

File tree

9 files changed

+41
-38
lines changed

9 files changed

+41
-38
lines changed

src/coins.cpp

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
#include <random.h>
1010
#include <util/trace.h>
1111

12-
bool CCoinsView::GetCoin(const COutPoint &outpoint, Coin &coin) const { return false; }
12+
std::optional<Coin> CCoinsView::GetCoin(const COutPoint& outpoint, Coin& coin) const { return std::nullopt; }
1313
uint256 CCoinsView::GetBestBlock() const { return uint256(); }
1414
std::vector<uint256> CCoinsView::GetHeadBlocks() const { return std::vector<uint256>(); }
1515
bool CCoinsView::BatchWrite(CoinsViewCacheCursor& cursor, const uint256 &hashBlock) { return false; }
@@ -18,11 +18,11 @@ std::unique_ptr<CCoinsViewCursor> CCoinsView::Cursor() const { return nullptr; }
1818
bool CCoinsView::HaveCoin(const COutPoint &outpoint) const
1919
{
2020
Coin coin;
21-
return GetCoin(outpoint, coin);
21+
return GetCoin(outpoint, coin).has_value();
2222
}
2323

2424
CCoinsViewBacked::CCoinsViewBacked(CCoinsView *viewIn) : base(viewIn) { }
25-
bool CCoinsViewBacked::GetCoin(const COutPoint &outpoint, Coin &coin) const { return base->GetCoin(outpoint, coin); }
25+
std::optional<Coin> CCoinsViewBacked::GetCoin(const COutPoint& outpoint, Coin& coin) const { return base->GetCoin(outpoint, coin); }
2626
bool CCoinsViewBacked::HaveCoin(const COutPoint &outpoint) const { return base->HaveCoin(outpoint); }
2727
uint256 CCoinsViewBacked::GetBestBlock() const { return base->GetBestBlock(); }
2828
std::vector<uint256> CCoinsViewBacked::GetHeadBlocks() const { return base->GetHeadBlocks(); }
@@ -58,13 +58,14 @@ CCoinsMap::iterator CCoinsViewCache::FetchCoin(const COutPoint &outpoint) const
5858
return ret;
5959
}
6060

61-
bool CCoinsViewCache::GetCoin(const COutPoint &outpoint, Coin &coin) const {
61+
std::optional<Coin> CCoinsViewCache::GetCoin(const COutPoint& outpoint, Coin& coin) const
62+
{
6263
CCoinsMap::const_iterator it = FetchCoin(outpoint);
6364
if (it != cacheCoins.end()) {
6465
coin = it->second.coin;
65-
return !coin.IsSpent();
66+
if (!coin.IsSpent()) return coin;
6667
}
67-
return false;
68+
return std::nullopt;
6869
}
6970

7071
void CCoinsViewCache::AddCoin(const COutPoint &outpoint, Coin&& coin, bool possible_overwrite) {
@@ -363,8 +364,8 @@ const Coin& AccessByTxid(const CCoinsViewCache& view, const Txid& txid)
363364
return coinEmpty;
364365
}
365366

366-
template <typename Func>
367-
static bool ExecuteBackedWrapper(Func func, const std::vector<std::function<void()>>& err_callbacks)
367+
template <typename ReturnType, typename Func>
368+
static ReturnType ExecuteBackedWrapper(Func func, const std::vector<std::function<void()>>& err_callbacks)
368369
{
369370
try {
370371
return func();
@@ -381,10 +382,12 @@ static bool ExecuteBackedWrapper(Func func, const std::vector<std::function<void
381382
}
382383
}
383384

384-
bool CCoinsViewErrorCatcher::GetCoin(const COutPoint &outpoint, Coin &coin) const {
385-
return ExecuteBackedWrapper([&]() { return CCoinsViewBacked::GetCoin(outpoint, coin); }, m_err_callbacks);
385+
std::optional<Coin> CCoinsViewErrorCatcher::GetCoin(const COutPoint& outpoint, Coin& coin) const
386+
{
387+
return ExecuteBackedWrapper<std::optional<Coin>>([&]() { return CCoinsViewBacked::GetCoin(outpoint, coin); }, m_err_callbacks);
386388
}
387389

388-
bool CCoinsViewErrorCatcher::HaveCoin(const COutPoint &outpoint) const {
389-
return ExecuteBackedWrapper([&]() { return CCoinsViewBacked::HaveCoin(outpoint); }, m_err_callbacks);
390+
bool CCoinsViewErrorCatcher::HaveCoin(const COutPoint& outpoint) const
391+
{
392+
return ExecuteBackedWrapper<bool>([&]() { return CCoinsViewBacked::HaveCoin(outpoint); }, m_err_callbacks);
390393
}

src/coins.h

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -303,11 +303,8 @@ struct CoinsViewCacheCursor
303303
class CCoinsView
304304
{
305305
public:
306-
/** Retrieve the Coin (unspent transaction output) for a given outpoint.
307-
* Returns true only when an unspent coin was found, which is returned in coin.
308-
* When false is returned, coin's value is unspecified.
309-
*/
310-
virtual bool GetCoin(const COutPoint &outpoint, Coin &coin) const;
306+
//! Retrieve the Coin (unspent transaction output) for a given outpoint.
307+
virtual std::optional<Coin> GetCoin(const COutPoint& outpoint, Coin& coin) const;
311308

312309
//! Just check whether a given outpoint is unspent.
313310
virtual bool HaveCoin(const COutPoint &outpoint) const;
@@ -344,7 +341,7 @@ class CCoinsViewBacked : public CCoinsView
344341

345342
public:
346343
CCoinsViewBacked(CCoinsView *viewIn);
347-
bool GetCoin(const COutPoint &outpoint, Coin &coin) const override;
344+
std::optional<Coin> GetCoin(const COutPoint& outpoint, Coin& coin) const override;
348345
bool HaveCoin(const COutPoint &outpoint) const override;
349346
uint256 GetBestBlock() const override;
350347
std::vector<uint256> GetHeadBlocks() const override;
@@ -384,7 +381,7 @@ class CCoinsViewCache : public CCoinsViewBacked
384381
CCoinsViewCache(const CCoinsViewCache &) = delete;
385382

386383
// Standard CCoinsView methods
387-
bool GetCoin(const COutPoint &outpoint, Coin &coin) const override;
384+
std::optional<Coin> GetCoin(const COutPoint& outpoint, Coin& coin) const override;
388385
bool HaveCoin(const COutPoint &outpoint) const override;
389386
uint256 GetBestBlock() const override;
390387
void SetBestBlock(const uint256 &hashBlock);
@@ -514,7 +511,7 @@ class CCoinsViewErrorCatcher final : public CCoinsViewBacked
514511
m_err_callbacks.emplace_back(std::move(f));
515512
}
516513

517-
bool GetCoin(const COutPoint &outpoint, Coin &coin) const override;
514+
std::optional<Coin> GetCoin(const COutPoint& outpoint, Coin& coin) const override;
518515
bool HaveCoin(const COutPoint &outpoint) const override;
519516

520517
private:

src/test/coins_tests.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,18 +44,18 @@ class CCoinsViewTest : public CCoinsView
4444
public:
4545
CCoinsViewTest(FastRandomContext& rng) : m_rng{rng} {}
4646

47-
[[nodiscard]] bool GetCoin(const COutPoint& outpoint, Coin& coin) const override
47+
std::optional<Coin> GetCoin(const COutPoint& outpoint, Coin& coin) const override
4848
{
4949
std::map<COutPoint, Coin>::const_iterator it = map_.find(outpoint);
5050
if (it == map_.end()) {
51-
return false;
51+
return std::nullopt;
5252
}
5353
coin = it->second;
5454
if (coin.IsSpent() && m_rng.randbool() == 0) {
55-
// Randomly return false in case of an empty entry.
56-
return false;
55+
// Randomly return std::nullopt in case of an empty entry.
56+
return std::nullopt;
5757
}
58-
return true;
58+
return coin;
5959
}
6060

6161
uint256 GetBestBlock() const override { return hashBestBlock_; }

src/test/fuzz/coins_view.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ FUZZ_TARGET(coins_view, .init = initialize_coins_view)
163163
const bool exists_using_have_coin = coins_view_cache.HaveCoin(random_out_point);
164164
const bool exists_using_have_coin_in_cache = coins_view_cache.HaveCoinInCache(random_out_point);
165165
Coin coin_using_get_coin;
166-
const bool exists_using_get_coin = coins_view_cache.GetCoin(random_out_point, coin_using_get_coin);
166+
const bool exists_using_get_coin = coins_view_cache.GetCoin(random_out_point, coin_using_get_coin).has_value();
167167
if (exists_using_get_coin) {
168168
assert(coin_using_get_coin == coin_using_access_coin);
169169
}

src/test/fuzz/coinscache_sim.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -146,14 +146,14 @@ class CoinsViewBottom final : public CCoinsView
146146
std::map<COutPoint, Coin> m_data;
147147

148148
public:
149-
bool GetCoin(const COutPoint& outpoint, Coin& coin) const final
149+
std::optional<Coin> GetCoin(const COutPoint& outpoint, Coin& coin) const final
150150
{
151151
auto it = m_data.find(outpoint);
152152
if (it == m_data.end()) {
153-
return false;
153+
return std::nullopt;
154154
} else {
155155
coin = it->second;
156-
return true; // TODO GetCoin shouldn't return spent coins
156+
return coin; // TODO GetCoin shouldn't return spent coins
157157
}
158158
}
159159

@@ -461,7 +461,7 @@ FUZZ_TARGET(coinscache_sim)
461461
// Compare the bottom coinsview (not a CCoinsViewCache) with sim_cache[0].
462462
for (uint32_t outpointidx = 0; outpointidx < NUM_OUTPOINTS; ++outpointidx) {
463463
Coin realcoin;
464-
bool real = bottom.GetCoin(data.outpoints[outpointidx], realcoin);
464+
auto real = bottom.GetCoin(data.outpoints[outpointidx], realcoin);
465465
auto sim = lookup(outpointidx, 0);
466466
if (!sim.has_value()) {
467467
assert(!real || realcoin.IsSpent());

src/txdb.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,10 @@ void CCoinsViewDB::ResizeCache(size_t new_cache_size)
6565
}
6666
}
6767

68-
bool CCoinsViewDB::GetCoin(const COutPoint &outpoint, Coin &coin) const {
69-
return m_db->Read(CoinEntry(&outpoint), coin);
68+
std::optional<Coin> CCoinsViewDB::GetCoin(const COutPoint& outpoint, Coin& coin) const
69+
{
70+
if (m_db->Read(CoinEntry(&outpoint), coin)) return coin;
71+
else return std::nullopt;
7072
}
7173

7274
bool CCoinsViewDB::HaveCoin(const COutPoint &outpoint) const {

src/txdb.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ class CCoinsViewDB final : public CCoinsView
5757
public:
5858
explicit CCoinsViewDB(DBParams db_params, CoinsViewOptions options);
5959

60-
bool GetCoin(const COutPoint &outpoint, Coin &coin) const override;
60+
std::optional<Coin> GetCoin(const COutPoint& outpoint, Coin& coin) const override;
6161
bool HaveCoin(const COutPoint &outpoint) const override;
6262
uint256 GetBestBlock() const override;
6363
std::vector<uint256> GetHeadBlocks() const override;

src/txmempool.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -988,12 +988,13 @@ bool CTxMemPool::HasNoInputsOf(const CTransaction &tx) const
988988

989989
CCoinsViewMemPool::CCoinsViewMemPool(CCoinsView* baseIn, const CTxMemPool& mempoolIn) : CCoinsViewBacked(baseIn), mempool(mempoolIn) { }
990990

991-
bool CCoinsViewMemPool::GetCoin(const COutPoint &outpoint, Coin &coin) const {
991+
std::optional<Coin> CCoinsViewMemPool::GetCoin(const COutPoint& outpoint, Coin& coin) const
992+
{
992993
// Check to see if the inputs are made available by another tx in the package.
993994
// These Coins would not be available in the underlying CoinsView.
994995
if (auto it = m_temp_added.find(outpoint); it != m_temp_added.end()) {
995996
coin = it->second;
996-
return true;
997+
return coin;
997998
}
998999

9991000
// If an entry in the mempool exists, always return that one, as it's guaranteed to never
@@ -1004,9 +1005,9 @@ bool CCoinsViewMemPool::GetCoin(const COutPoint &outpoint, Coin &coin) const {
10041005
if (outpoint.n < ptx->vout.size()) {
10051006
coin = Coin(ptx->vout[outpoint.n], MEMPOOL_HEIGHT, false);
10061007
m_non_base_coins.emplace(outpoint);
1007-
return true;
1008+
return coin;
10081009
} else {
1009-
return false;
1010+
return std::nullopt;
10101011
}
10111012
}
10121013
return base->GetCoin(outpoint, coin);

src/txmempool.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -851,7 +851,7 @@ class CCoinsViewMemPool : public CCoinsViewBacked
851851
CCoinsViewMemPool(CCoinsView* baseIn, const CTxMemPool& mempoolIn);
852852
/** GetCoin, returning whether it exists and is not spent. Also updates m_non_base_coins if the
853853
* coin is not fetched from base. */
854-
bool GetCoin(const COutPoint &outpoint, Coin &coin) const override;
854+
std::optional<Coin> GetCoin(const COutPoint& outpoint, Coin& coin) const override;
855855
/** Add the coins created by this transaction. These coins are only temporarily stored in
856856
* m_temp_added and cannot be flushed to the back end. Only used for package validation. */
857857
void PackageAddTransaction(const CTransactionRef& tx);

0 commit comments

Comments
 (0)