Inside Bitcoin
Opening the selected file…
Inside Bitcoin
Opening the selected file…
The code behind the network, with room to understand it.
Release published 2026-10-28 · Snapshot fetched 2026-11-01. Latest stable release at fetch time; development branches and Git history are excluded. Only the selected code window and visible folders load here.
501return btck_txid_equals(impl(), other.impl()) != 0;502}504bool operator!=(const TxidApi& other) const505{506return btck_txid_equals(impl(), other.impl()) == 0;507}509std::array<std::byte, 32> ToBytes() const510{511std::array<std::byte, 32> hash;512btck_txid_to_bytes(impl(), reinterpret_cast<unsigned char*>(hash.data()));513return hash;514}515};517class TxidView : public View<btck_Txid>, public TxidApi<TxidView>518{519public:520explicit TxidView(const btck_Txid* ptr) : View{ptr} {}521};523class Txid : public Handle<btck_Txid, btck_txid_copy, btck_txid_destroy>, public TxidApi<Txid>524{525public:526Txid(const TxidView& view)527: Handle(view) {}528};530template <typename Derived>531class OutPointApi532{533private:534auto impl() const535{536return static_cast<const Derived*>(this)->get();537}539friend Derived;540OutPointApi() = default;542public:543uint32_t index() const544{545return btck_transaction_out_point_get_index(impl());546}548TxidView Txid() const549{550return TxidView{btck_transaction_out_point_get_txid(impl())};551}552};554class OutPointView : public View<btck_TransactionOutPoint>, public OutPointApi<OutPointView>555{556public:557explicit OutPointView(const btck_TransactionOutPoint* ptr) : View{ptr} {}558};560class OutPoint : public Handle<btck_TransactionOutPoint, btck_transaction_out_point_copy, btck_transaction_out_point_destroy>, public OutPointApi<OutPoint>561{562public:563OutPoint(const OutPointView& view)564: Handle(view) {}565};567template <typename Derived>568class WitnessStackApi569{570private:571auto impl() const572{573return static_cast<const Derived*>(this)->get();574}576friend Derived;577WitnessStackApi() = default;579public:580size_t CountItems() const581{582return btck_witness_stack_count_items(impl());583}585std::vector<std::byte> GetItem(size_t index) const586{587struct Item { const btck_WitnessStack* stack; size_t index; };588Item item{impl(), index};589return write_bytes(&item, +[](const Item* c, btck_WriteBytes w, void* ud) {590return btck_witness_stack_get_item_at(c->stack, c->index, w, ud);591});592}594MAKE_RANGE_METHOD(Items, Derived, &WitnessStackApi<Derived>::CountItems, &WitnessStackApi<Derived>::GetItem, *static_cast<const Derived*>(this))595};597class WitnessStackView : public View<btck_WitnessStack>, public WitnessStackApi<WitnessStackView>598{599public:600explicit WitnessStackView(const btck_WitnessStack* ptr) : View{ptr} {}601};603class WitnessStack : public Handle<btck_WitnessStack, btck_witness_stack_copy, btck_witness_stack_destroy>, public WitnessStackApi<WitnessStack>604{605public:606WitnessStack(const WitnessStackView& view)607: Handle(view) {}608};610template <typename Derived>611class TransactionInputApi612{613private:614auto impl() const615{616return static_cast<const Derived*>(this)->get();617}619friend Derived;620TransactionInputApi() = default;622public:623OutPointView OutPoint() const624{625return OutPointView{btck_transaction_input_get_out_point(impl())};626}628uint32_t GetSequence() const629{630return btck_transaction_input_get_sequence(impl());631}633WitnessStackView GetWitnessStack() const634{635return WitnessStackView{btck_transaction_input_get_witness_stack(impl())};636}638std::vector<std::byte> GetScriptSig() const639{640return write_bytes(impl(), btck_transaction_input_get_script_sig);641}642};644class TransactionInputView : public View<btck_TransactionInput>, public TransactionInputApi<TransactionInputView>645{646public:647explicit TransactionInputView(const btck_TransactionInput* ptr) : View{ptr} {}648};650class TransactionInput : public Handle<btck_TransactionInput, btck_transaction_input_copy, btck_transaction_input_destroy>, public TransactionInputApi<TransactionInput>651{652public:653TransactionInput(const TransactionInputView& view)654: Handle(view) {}655};657template <typename Derived>658class TransactionApi659{660private:661auto impl() const662{663return static_cast<const Derived*>(this)->get();664}666public:667size_t CountOutputs() const668{669return btck_transaction_count_outputs(impl());670}672size_t CountInputs() const673{674return btck_transaction_count_inputs(impl());675}677TransactionOutputView GetOutput(size_t index) const678{679return TransactionOutputView{btck_transaction_get_output_at(impl(), index)};680}682TransactionInputView GetInput(size_t index) const683{684return TransactionInputView{btck_transaction_get_input_at(impl(), index)};685}687uint32_t GetLocktime() const688{689return btck_transaction_get_locktime(impl());690}692TxidView Txid() const693{694return TxidView{btck_transaction_get_txid(impl())};695}697MAKE_RANGE_METHOD(Outputs, Derived, &TransactionApi<Derived>::CountOutputs, &TransactionApi<Derived>::GetOutput, *static_cast<const Derived*>(this))699MAKE_RANGE_METHOD(Inputs, Derived, &TransactionApi<Derived>::CountInputs, &TransactionApi<Derived>::GetInput, *static_cast<const Derived*>(this))701std::vector<std::byte> ToBytes() const702{703return write_bytes(impl(), btck_transaction_to_bytes);704}705};707class TransactionView : public View<btck_Transaction>, public TransactionApi<TransactionView>708{709public:710explicit TransactionView(const btck_Transaction* ptr) : View{ptr} {}711};713class Transaction : public Handle<btck_Transaction, btck_transaction_copy, btck_transaction_destroy>, public TransactionApi<Transaction>714{715public:716explicit Transaction(std::span<const std::byte> raw_transaction)717: Handle{btck_transaction_create(raw_transaction.data(), raw_transaction.size())} {}719Transaction(const TransactionView& view)720: Handle{view} {}721};723class PrecomputedTransactionData : public Handle<btck_PrecomputedTransactionData, btck_precomputed_transaction_data_copy, btck_precomputed_transaction_data_destroy>724{725public:726explicit PrecomputedTransactionData(const Transaction& tx_to, std::span<const TransactionOutput> spent_outputs)727: Handle{btck_precomputed_transaction_data_create(728tx_to.get(),729reinterpret_cast<const btck_TransactionOutput**>(730const_cast<TransactionOutput*>(spent_outputs.data())),731spent_outputs.size())} {}732};734template <typename Derived>735bool ScriptPubkeyApi<Derived>::Verify(int64_t amount,736const Transaction& tx_to,737const PrecomputedTransactionData* precomputed_txdata,738unsigned int input_index,739ScriptVerificationFlags flags,740ScriptVerifyStatus& status) const741{742auto result = btck_script_pubkey_verify(743impl(),744amount,745tx_to.get(),746precomputed_txdata ? precomputed_txdata->get() : nullptr,747input_index,748static_cast<btck_ScriptVerificationFlags>(flags),749reinterpret_cast<btck_ScriptVerifyStatus*>(&status));750return result == 1;