[kernel] Expose reusable PrecomputedTransactionData in script valid

This commit is contained in:
Josh Doman
2025-12-23 18:48:56 -05:00
parent ead849c9f1
commit 44e006d438
4 changed files with 220 additions and 73 deletions

View File

@@ -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));