Refactor HaveShieldedRequirements to use tl::expected (example with a void T)

and rename it to CheckShieldedRequirements.

Signed-off-by: Daira Hopwood <jacaranda.org>
This commit is contained in:
Daira Hopwood 2022-08-25 20:34:14 +01:00
parent 4de0d85abf
commit d502714326
4 changed files with 19 additions and 18 deletions

View File

@ -1003,7 +1003,7 @@ CAmount CCoinsViewCache::GetValueIn(const CTransaction& tx) const
return nResult;
}
std::optional<UnsatisfiedShieldedReq> CCoinsViewCache::HaveShieldedRequirements(const CTransaction& tx) const
tl::expected<void, UnsatisfiedShieldedReq> CCoinsViewCache::CheckShieldedRequirements(const CTransaction& tx) const
{
boost::unordered_map<uint256, SproutMerkleTree, SaltedTxidHasher> intermediates;
@ -1019,7 +1019,7 @@ std::optional<UnsatisfiedShieldedReq> CCoinsViewCache::HaveShieldedRequirements(
TracingWarn("consensus", "Sprout double-spend detected",
"txid", txid.c_str(),
"nf", nf.c_str());
return UnsatisfiedShieldedReq::SproutDuplicateNullifier;
return tl::unexpected(UnsatisfiedShieldedReq::SproutDuplicateNullifier);
}
}
@ -1033,7 +1033,7 @@ std::optional<UnsatisfiedShieldedReq> CCoinsViewCache::HaveShieldedRequirements(
TracingWarn("consensus", "Transaction uses unknown Sprout anchor",
"txid", txid.c_str(),
"anchor", anchor.c_str());
return UnsatisfiedShieldedReq::SproutUnknownAnchor;
return tl::unexpected(UnsatisfiedShieldedReq::SproutUnknownAnchor);
}
for (const uint256& commitment : joinsplit.commitments)
@ -1051,7 +1051,7 @@ std::optional<UnsatisfiedShieldedReq> CCoinsViewCache::HaveShieldedRequirements(
TracingWarn("consensus", "Sapling double-spend detected",
"txid", txid.c_str(),
"nf", nf.c_str());
return UnsatisfiedShieldedReq::SaplingDuplicateNullifier;
return tl::unexpected(UnsatisfiedShieldedReq::SaplingDuplicateNullifier);
}
SaplingMerkleTree tree;
@ -1061,7 +1061,7 @@ std::optional<UnsatisfiedShieldedReq> CCoinsViewCache::HaveShieldedRequirements(
TracingWarn("consensus", "Transaction uses unknown Sapling anchor",
"txid", txid.c_str(),
"anchor", anchor.c_str());
return UnsatisfiedShieldedReq::SaplingUnknownAnchor;
return tl::unexpected(UnsatisfiedShieldedReq::SaplingUnknownAnchor);
}
}
@ -1072,7 +1072,7 @@ std::optional<UnsatisfiedShieldedReq> CCoinsViewCache::HaveShieldedRequirements(
TracingWarn("consensus", "Orchard double-spend detected",
"txid", txid.c_str(),
"nf", nf.c_str());
return UnsatisfiedShieldedReq::OrchardDuplicateNullifier;
return tl::unexpected(UnsatisfiedShieldedReq::OrchardDuplicateNullifier);
}
}
@ -1085,11 +1085,11 @@ std::optional<UnsatisfiedShieldedReq> CCoinsViewCache::HaveShieldedRequirements(
TracingWarn("consensus", "Transaction uses unknown Orchard anchor",
"txid", txid.c_str(),
"anchor", anchor.c_str());
return UnsatisfiedShieldedReq::OrchardUnknownAnchor;
return tl::unexpected(UnsatisfiedShieldedReq::OrchardUnknownAnchor);
}
}
return std::nullopt;
return {};
}
bool CCoinsViewCache::HaveInputs(const CTransaction& tx) const

View File

@ -18,6 +18,7 @@
#include <stdint.h>
#include <boost/unordered_map.hpp>
#include <expected.hpp>
#include "zcash/History.hpp"
#include "zcash/IncrementalMerkleTree.hpp"
@ -613,7 +614,7 @@ public:
bool HaveInputs(const CTransaction& tx) const;
//! Check whether all joinsplit and sapling spend requirements (anchors/nullifiers) are satisfied
std::optional<UnsatisfiedShieldedReq> HaveShieldedRequirements(const CTransaction& tx) const;
tl::expected<void, UnsatisfiedShieldedReq> CheckShieldedRequirements(const CTransaction& tx) const;
//! Return priority of tx at height nHeight
double GetPriority(const CTransaction &tx, int nHeight) const;

View File

@ -2570,11 +2570,11 @@ bool CheckTxShieldedInputs(
int dosLevel)
{
// Are the shielded spends' requirements met?
auto unmetShieldedReq = view.HaveShieldedRequirements(tx);
if (unmetShieldedReq) {
auto unmetShieldedReq = view.CheckShieldedRequirements(tx);
if (!unmetShieldedReq.has_value()) {
auto txid = tx.GetHash().ToString();
auto rejectCode = ShieldedReqRejectCode(*unmetShieldedReq);
auto rejectReason = ShieldedReqRejectReason(*unmetShieldedReq);
auto rejectCode = ShieldedReqRejectCode(unmetShieldedReq.error());
auto rejectReason = ShieldedReqRejectReason(unmetShieldedReq.error());
TracingDebug(
"main", "CheckTxShieldedInputs(): shielded requirements not met",
"txid", txid.c_str(),

View File

@ -387,7 +387,7 @@ BOOST_AUTO_TEST_CASE(chained_joinsplits)
CMutableTransaction mtx;
mtx.vJoinSplit.push_back(js2);
BOOST_CHECK(cache.HaveShieldedRequirements(mtx) == std::optional<UnsatisfiedShieldedReq>(UnsatisfiedShieldedReq::SproutUnknownAnchor));
BOOST_CHECK(cache.CheckShieldedRequirements(mtx) == tl::unexpected(UnsatisfiedShieldedReq::SproutUnknownAnchor));
}
{
@ -397,7 +397,7 @@ BOOST_AUTO_TEST_CASE(chained_joinsplits)
mtx.vJoinSplit.push_back(js2);
mtx.vJoinSplit.push_back(js1);
BOOST_CHECK(cache.HaveShieldedRequirements(mtx) == std::optional<UnsatisfiedShieldedReq>(UnsatisfiedShieldedReq::SproutUnknownAnchor));
BOOST_CHECK(cache.CheckShieldedRequirements(mtx) == tl::unexpected(UnsatisfiedShieldedReq::SproutUnknownAnchor));
}
{
@ -405,7 +405,7 @@ BOOST_AUTO_TEST_CASE(chained_joinsplits)
mtx.vJoinSplit.push_back(js1);
mtx.vJoinSplit.push_back(js2);
BOOST_CHECK(cache.HaveShieldedRequirements(mtx) == std::nullopt);
BOOST_CHECK(cache.CheckShieldedRequirements(mtx).has_value());
}
{
@ -414,7 +414,7 @@ BOOST_AUTO_TEST_CASE(chained_joinsplits)
mtx.vJoinSplit.push_back(js2);
mtx.vJoinSplit.push_back(js3);
BOOST_CHECK(cache.HaveShieldedRequirements(mtx) == std::nullopt);
BOOST_CHECK(cache.CheckShieldedRequirements(mtx).has_value());
}
{
@ -424,7 +424,7 @@ BOOST_AUTO_TEST_CASE(chained_joinsplits)
mtx.vJoinSplit.push_back(js2);
mtx.vJoinSplit.push_back(js3);
BOOST_CHECK(cache.HaveShieldedRequirements(mtx) == std::nullopt);
BOOST_CHECK(cache.CheckShieldedRequirements(mtx).has_value());
}
}