diff options
author | Pieter Wuille <pieter@wuille.net> | 2020-09-11 14:33:00 -0700 |
---|---|---|
committer | Pieter Wuille <pieter@wuille.net> | 2020-10-12 02:06:32 -0700 |
commit | 5d62e3a68b6ea9bb03556ee1fbf5678f20be01a2 (patch) | |
tree | de9e5600c4d2a5718861b4331df2344fd8c47838 /src/script | |
parent | 8bd2b4e78452ff69c08c37acf164a6b80e503f13 (diff) |
refactor: keep spent outputs in PrecomputedTransactionData
A BIP-341 signature message may commit to the scriptPubKeys and amounts
of all spent outputs (including other ones than the input being signed
for spends), so keep them available to signature hashing code.
Diffstat (limited to 'src/script')
-rw-r--r-- | src/script/interpreter.cpp | 10 | ||||
-rw-r--r-- | src/script/interpreter.h | 4 |
2 files changed, 9 insertions, 5 deletions
diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp index 2fa7e5e1ab..c322ecb1a0 100644 --- a/src/script/interpreter.cpp +++ b/src/script/interpreter.cpp @@ -1294,10 +1294,12 @@ uint256 GetOutputsSHA256(const T& txTo) } // namespace template <class T> -void PrecomputedTransactionData::Init(const T& txTo) +void PrecomputedTransactionData::Init(const T& txTo, std::vector<CTxOut>&& spent_outputs) { assert(!m_ready); + m_spent_outputs = std::move(spent_outputs); + // Cache is calculated only for transactions with witness if (txTo.HasWitness()) { hashPrevouts = SHA256Uint256(GetPrevoutsSHA256(txTo)); @@ -1311,12 +1313,12 @@ void PrecomputedTransactionData::Init(const T& txTo) template <class T> PrecomputedTransactionData::PrecomputedTransactionData(const T& txTo) { - Init(txTo); + Init(txTo, {}); } // explicit instantiation -template void PrecomputedTransactionData::Init(const CTransaction& txTo); -template void PrecomputedTransactionData::Init(const CMutableTransaction& txTo); +template void PrecomputedTransactionData::Init(const CTransaction& txTo, std::vector<CTxOut>&& spent_outputs); +template void PrecomputedTransactionData::Init(const CMutableTransaction& txTo, std::vector<CTxOut>&& spent_outputs); template PrecomputedTransactionData::PrecomputedTransactionData(const CTransaction& txTo); template PrecomputedTransactionData::PrecomputedTransactionData(const CMutableTransaction& txTo); diff --git a/src/script/interpreter.h b/src/script/interpreter.h index 0ff4c4bc95..64cefc0d6c 100644 --- a/src/script/interpreter.h +++ b/src/script/interpreter.h @@ -15,6 +15,7 @@ class CPubKey; class CScript; class CTransaction; +class CTxOut; class uint256; /** Signature hash types/flags */ @@ -122,11 +123,12 @@ struct PrecomputedTransactionData { uint256 hashPrevouts, hashSequence, hashOutputs; bool m_ready = false; + std::vector<CTxOut> m_spent_outputs; PrecomputedTransactionData() = default; template <class T> - void Init(const T& tx); + void Init(const T& tx, std::vector<CTxOut>&& spent_outputs); template <class T> explicit PrecomputedTransactionData(const T& tx); |