mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-03-27 16:05:39 +01:00
[kernel] Expose reusable PrecomputedTransactionData in script valid
This commit is contained in:
@@ -367,6 +367,7 @@ public:
|
||||
const CType* get() const { return m_ptr.get(); }
|
||||
};
|
||||
|
||||
class PrecomputedTransactionData;
|
||||
class Transaction;
|
||||
class TransactionOutput;
|
||||
|
||||
@@ -385,7 +386,7 @@ private:
|
||||
public:
|
||||
bool Verify(int64_t amount,
|
||||
const Transaction& tx_to,
|
||||
std::span<const TransactionOutput> spent_outputs,
|
||||
const PrecomputedTransactionData* precomputed_txdata,
|
||||
unsigned int input_index,
|
||||
ScriptVerificationFlags flags,
|
||||
ScriptVerifyStatus& status) const;
|
||||
@@ -626,29 +627,30 @@ public:
|
||||
: Handle{view} {}
|
||||
};
|
||||
|
||||
class PrecomputedTransactionData : public Handle<btck_PrecomputedTransactionData, btck_precomputed_transaction_data_copy, btck_precomputed_transaction_data_destroy>
|
||||
{
|
||||
public:
|
||||
explicit PrecomputedTransactionData(const Transaction& tx_to, std::span<const TransactionOutput> spent_outputs)
|
||||
: Handle{btck_precomputed_transaction_data_create(
|
||||
tx_to.get(),
|
||||
reinterpret_cast<const btck_TransactionOutput**>(
|
||||
const_cast<TransactionOutput*>(spent_outputs.data())),
|
||||
spent_outputs.size())} {}
|
||||
};
|
||||
|
||||
template <typename Derived>
|
||||
bool ScriptPubkeyApi<Derived>::Verify(int64_t amount,
|
||||
const Transaction& tx_to,
|
||||
const std::span<const TransactionOutput> spent_outputs,
|
||||
const PrecomputedTransactionData* precomputed_txdata,
|
||||
unsigned int input_index,
|
||||
ScriptVerificationFlags flags,
|
||||
ScriptVerifyStatus& status) const
|
||||
{
|
||||
const btck_TransactionOutput** spent_outputs_ptr = nullptr;
|
||||
std::vector<const btck_TransactionOutput*> raw_spent_outputs;
|
||||
if (spent_outputs.size() > 0) {
|
||||
raw_spent_outputs.reserve(spent_outputs.size());
|
||||
|
||||
for (const auto& output : spent_outputs) {
|
||||
raw_spent_outputs.push_back(output.get());
|
||||
}
|
||||
spent_outputs_ptr = raw_spent_outputs.data();
|
||||
}
|
||||
auto result = btck_script_pubkey_verify(
|
||||
impl(),
|
||||
amount,
|
||||
tx_to.get(),
|
||||
spent_outputs_ptr, spent_outputs.size(),
|
||||
precomputed_txdata ? precomputed_txdata->get() : nullptr,
|
||||
input_index,
|
||||
static_cast<btck_ScriptVerificationFlags>(flags),
|
||||
reinterpret_cast<btck_ScriptVerifyStatus*>(&status));
|
||||
|
||||
Reference in New Issue
Block a user