From 46000796185acac1ad68f046b445f5dd6c1d1e33 Mon Sep 17 00:00:00 2001 From: Kris Nuttycombe Date: Sun, 3 Jul 2022 17:12:57 -0600 Subject: [PATCH] Replace "Disabled" Orchard AuthValidator with std::nullopt --- src/main.cpp | 16 +++++++++------- src/main.h | 2 +- src/rust/include/rust/orchard.h | 4 ++-- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index c73fc7063..86b826e78 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1245,7 +1245,7 @@ bool ContextualCheckShieldedInputs( const PrecomputedTransactionData& txdata, CValidationState &state, const CCoinsViewCache &view, - orchard::AuthValidator& orchardAuth, + std::optional& orchardAuth, const Consensus::Params& consensus, uint32_t consensusBranchId, bool nu5Active, @@ -1380,7 +1380,9 @@ bool ContextualCheckShieldedInputs( } // Queue Orchard bundle to be batch-validated. - tx.GetOrchardBundle().QueueAuthValidation(orchardAuth, dataToBeSigned); + if (orchardAuth.has_value()) { + tx.GetOrchardBundle().QueueAuthValidation(orchardAuth.value(), dataToBeSigned); + } return true; } @@ -2001,7 +2003,7 @@ bool AcceptToMemoryPool( // This will be a single-transaction batch, which is still more efficient as every // Orchard bundle contains at least two signatures. - auto orchardAuth = orchard::AuthValidator::Batch(); + std::optional orchardAuth = orchard::AuthValidator::Batch(); // Check shielded input signatures. if (!ContextualCheckShieldedInputs( @@ -2018,8 +2020,8 @@ bool AcceptToMemoryPool( return false; } - // Check Orchard bundle authorizations. - if (!orchardAuth.Validate()) { + // Check Orchard bundle authorizations. `orchardAuth` here is known to be non-null + if (!orchardAuth.value().Validate()) { return state.DoS(100, false, REJECT_INVALID, "bad-orchard-bundle-authorization"); } @@ -3073,7 +3075,7 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin auto verifier = fExpensiveChecks ? ProofVerifier::Strict() : ProofVerifier::Disabled(); // Disable Orchard batch signature validation if possible. - auto orchardAuth = fExpensiveChecks ? + std::optional orchardAuth = fExpensiveChecks ? orchard::AuthValidator::Batch() : orchard::AuthValidator::Disabled(); // If in initial block download, and this block is an ancestor of a checkpoint, @@ -3516,7 +3518,7 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin REJECT_INVALID, "bad-cb-amount"); // Ensure Orchard signatures are valid (if we are checking them) - if (!orchardAuth.Validate()) { + if (orchardAuth.has_value() && !orchardAuth.value().Validate()) { return state.DoS(100, error("ConnectBlock(): an Orchard bundle within the block is invalid"), REJECT_INVALID, "bad-orchard-bundle-authorization"); diff --git a/src/main.h b/src/main.h index 162db7eef..ccb151835 100644 --- a/src/main.h +++ b/src/main.h @@ -402,7 +402,7 @@ bool ContextualCheckShieldedInputs( const PrecomputedTransactionData& txdata, CValidationState &state, const CCoinsViewCache &view, - orchard::AuthValidator& orchardAuth, + std::optional& orchardAuth, const Consensus::Params& consensus, uint32_t consensusBranchId, bool nu5Active, diff --git a/src/rust/include/rust/orchard.h b/src/rust/include/rust/orchard.h index 1ea3a1bf7..98b527aea 100644 --- a/src/rust/include/rust/orchard.h +++ b/src/rust/include/rust/orchard.h @@ -161,8 +161,8 @@ public: /// Creates a validation context that performs no validation. This can be /// used when avoiding duplicate effort such as during reindexing. - static AuthValidator Disabled() { - return AuthValidator(); + static std::optional Disabled() { + return std::nullopt; } /// Queues an Orchard bundle for validation.