Skip to content

Commit ce93531

Browse files
committed
Permit full precomputation in PrecomputedTransactionData
At verification time, the to be precomputed data can be inferred from the transaction itself. For signing, the necessary witnesses don't exist yet, so just permit precomputing everything in that case.
1 parent e841fb5 commit ce93531

File tree

2 files changed

+7
-7
lines changed

2 files changed

+7
-7
lines changed

src/script/interpreter.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1420,7 +1420,7 @@ uint256 GetSpentScriptsSHA256(const std::vector<CTxOut>& outputs_spent)
14201420
} // namespace
14211421

14221422
template <class T>
1423-
void PrecomputedTransactionData::Init(const T& txTo, std::vector<CTxOut>&& spent_outputs)
1423+
void PrecomputedTransactionData::Init(const T& txTo, std::vector<CTxOut>&& spent_outputs, bool force)
14241424
{
14251425
assert(!m_spent_outputs_ready);
14261426

@@ -1431,9 +1431,9 @@ void PrecomputedTransactionData::Init(const T& txTo, std::vector<CTxOut>&& spent
14311431
}
14321432

14331433
// Determine which precomputation-impacting features this transaction uses.
1434-
bool uses_bip143_segwit = false;
1435-
bool uses_bip341_taproot = false;
1436-
for (size_t inpos = 0; inpos < txTo.vin.size(); ++inpos) {
1434+
bool uses_bip143_segwit = force;
1435+
bool uses_bip341_taproot = force;
1436+
for (size_t inpos = 0; inpos < txTo.vin.size() && !(uses_bip143_segwit && uses_bip341_taproot); ++inpos) {
14371437
if (!txTo.vin[inpos].scriptWitness.IsNull()) {
14381438
if (m_spent_outputs_ready && m_spent_outputs[inpos].scriptPubKey.size() == 2 + WITNESS_V1_TAPROOT_SIZE &&
14391439
m_spent_outputs[inpos].scriptPubKey[0] == OP_1) {
@@ -1478,8 +1478,8 @@ PrecomputedTransactionData::PrecomputedTransactionData(const T& txTo)
14781478
}
14791479

14801480
// explicit instantiation
1481-
template void PrecomputedTransactionData::Init(const CTransaction& txTo, std::vector<CTxOut>&& spent_outputs);
1482-
template void PrecomputedTransactionData::Init(const CMutableTransaction& txTo, std::vector<CTxOut>&& spent_outputs);
1481+
template void PrecomputedTransactionData::Init(const CTransaction& txTo, std::vector<CTxOut>&& spent_outputs, bool force);
1482+
template void PrecomputedTransactionData::Init(const CMutableTransaction& txTo, std::vector<CTxOut>&& spent_outputs, bool force);
14831483
template PrecomputedTransactionData::PrecomputedTransactionData(const CTransaction& txTo);
14841484
template PrecomputedTransactionData::PrecomputedTransactionData(const CMutableTransaction& txTo);
14851485

src/script/interpreter.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ struct PrecomputedTransactionData
168168
PrecomputedTransactionData() = default;
169169

170170
template <class T>
171-
void Init(const T& tx, std::vector<CTxOut>&& spent_outputs);
171+
void Init(const T& tx, std::vector<CTxOut>&& spent_outputs, bool force = false);
172172

173173
template <class T>
174174
explicit PrecomputedTransactionData(const T& tx);

0 commit comments

Comments
 (0)