Skip to content

Commit af1d2ff

Browse files
committed
[primitives] Precompute result of CTransaction::HasWitness
1 parent d51fb9c commit af1d2ff

File tree

2 files changed

+14
-11
lines changed

2 files changed

+14
-11
lines changed

src/primitives/transaction.cpp

+10-2
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include <util/transaction_identifier.h>
1616
#include <version.h>
1717

18+
#include <algorithm>
1819
#include <cassert>
1920
#include <stdexcept>
2021

@@ -71,6 +72,13 @@ Txid CMutableTransaction::GetHash() const
7172
return Txid::FromUint256((CHashWriter{SERIALIZE_TRANSACTION_NO_WITNESS} << *this).GetHash());
7273
}
7374

75+
bool CTransaction::ComputeHasWitness() const
76+
{
77+
return std::any_of(vin.begin(), vin.end(), [](const auto& input) {
78+
return !input.scriptWitness.IsNull();
79+
});
80+
}
81+
7482
Txid CTransaction::ComputeHash() const
7583
{
7684
return Txid::FromUint256((CHashWriter{SERIALIZE_TRANSACTION_NO_WITNESS} << *this).GetHash());
@@ -85,8 +93,8 @@ Wtxid CTransaction::ComputeWitnessHash() const
8593
return Wtxid::FromUint256((CHashWriter{0} << *this).GetHash());
8694
}
8795

88-
CTransaction::CTransaction(const CMutableTransaction& tx) : vin(tx.vin), vout(tx.vout), nVersion(tx.nVersion), nLockTime(tx.nLockTime), hash{ComputeHash()}, m_witness_hash{ComputeWitnessHash()} {}
89-
CTransaction::CTransaction(CMutableTransaction&& tx) : vin(std::move(tx.vin)), vout(std::move(tx.vout)), nVersion(tx.nVersion), nLockTime(tx.nLockTime), hash{ComputeHash()}, m_witness_hash{ComputeWitnessHash()} {}
96+
CTransaction::CTransaction(const CMutableTransaction& tx) : vin(tx.vin), vout(tx.vout), nVersion(tx.nVersion), nLockTime(tx.nLockTime), m_has_witness{ComputeHasWitness()}, hash{ComputeHash()}, m_witness_hash{ComputeWitnessHash()} {}
97+
CTransaction::CTransaction(CMutableTransaction&& tx) : vin(std::move(tx.vin)), vout(std::move(tx.vout)), nVersion(tx.nVersion), nLockTime(tx.nLockTime), m_has_witness{ComputeHasWitness()}, hash{ComputeHash()}, m_witness_hash{ComputeWitnessHash()} {}
9098

9199
CAmount CTransaction::GetValueOut() const
92100
{

src/primitives/transaction.h

+4-9
Original file line numberDiff line numberDiff line change
@@ -310,12 +310,15 @@ class CTransaction
310310

311311
private:
312312
/** Memory only. */
313+
const bool m_has_witness;
313314
const Txid hash;
314315
const Wtxid m_witness_hash;
315316

316317
Txid ComputeHash() const;
317318
Wtxid ComputeWitnessHash() const;
318319

320+
bool ComputeHasWitness() const;
321+
319322
public:
320323
/** Convert a CMutableTransaction into a CTransaction. */
321324
explicit CTransaction(const CMutableTransaction& tx);
@@ -365,15 +368,7 @@ class CTransaction
365368

366369
std::string ToString() const;
367370

368-
bool HasWitness() const
369-
{
370-
for (size_t i = 0; i < vin.size(); i++) {
371-
if (!vin[i].scriptWitness.IsNull()) {
372-
return true;
373-
}
374-
}
375-
return false;
376-
}
371+
bool HasWitness() const { return m_has_witness; }
377372
};
378373

379374
/** A mutable version of CTransaction. */

0 commit comments

Comments
 (0)