UltrafastSecp256k1 3.50.0
Ultra high-performance secp256k1 elliptic curve cryptography library
Loading...
Searching...
No Matches
bip144.hpp
Go to the documentation of this file.
1#ifndef SECP256K1_BIP144_HPP
2#define SECP256K1_BIP144_HPP
3
4// ============================================================================
5// BIP-144: Segregated Witness (Peer Services) — Witness Serialization
6// ============================================================================
7// Implements the witness transaction serialization format and wtxid computation:
8//
9// [nVersion][marker][flag][txins][txouts][witness][nLockTime]
10//
11// Where marker=0x00, flag=0x01 indicate a witness transaction.
12//
13// Also provides:
14// - wtxid computation (double-SHA256 of witness-serialized transaction)
15// - txid computation (double-SHA256 of legacy serialization, no witness)
16// - witness commitment (for coinbase witness commitment)
17//
18// Reference: BIP-144, https://github.com/bitcoin/bips/blob/master/bip-0144.mediawiki
19// ============================================================================
20
21#include <array>
22#include <cstdint>
23#include <cstddef>
24#include <vector>
25
26namespace secp256k1 {
27
28// A single witness item (byte vector)
29using WitnessItem = std::vector<std::uint8_t>;
30
31// Witness stack for one input
32using WitnessStack = std::vector<WitnessItem>;
33
34// A transaction input for BIP-144 serialization
35struct TxInput {
36 std::array<std::uint8_t, 32> prev_txid; // LE txid
37 std::uint32_t prev_vout;
38 std::vector<std::uint8_t> script_sig; // scriptSig (usually empty for segwit)
39 std::uint32_t sequence;
40};
41
42// A transaction output for BIP-144 serialization
43struct TxOut {
44 std::uint64_t value;
45 std::vector<std::uint8_t> script_pubkey;
46};
47
48// Witness transaction data
49struct WitnessTx {
50 std::uint32_t version;
51 std::vector<TxInput> inputs;
52 std::vector<TxOut> outputs;
53 std::vector<WitnessStack> witness; // One WitnessStack per input
54 std::uint32_t locktime;
55};
56
57// Serialize a transaction in witness format (BIP-144).
58// Returns the full serialized bytes:
59// [nVersion][0x00][0x01][vin][vout][witness][nLockTime]
60std::vector<std::uint8_t> witness_serialize(const WitnessTx& tx) noexcept;
61
62// Serialize a transaction in legacy format (no marker/flag, no witness).
63// Returns: [nVersion][vin][vout][nLockTime]
64std::vector<std::uint8_t> legacy_serialize(const WitnessTx& tx) noexcept;
65
66// Compute txid: double-SHA256 of legacy serialization (LE byte order).
67std::array<std::uint8_t, 32> compute_txid(const WitnessTx& tx) noexcept;
68
69// Compute wtxid: double-SHA256 of witness serialization (LE byte order).
70// For coinbase: wtxid is defined as 32 zero bytes.
71std::array<std::uint8_t, 32> compute_wtxid(const WitnessTx& tx) noexcept;
72
73// Compute witness commitment hash for coinbase:
74// SHA256(SHA256(witness_root || witness_nonce))
75// witness_root: merkle root of wtxid tree
76// witness_nonce: 32-byte nonce from coinbase witness (typically all zeros)
77std::array<std::uint8_t, 32> witness_commitment(
78 const std::array<std::uint8_t, 32>& witness_root,
79 const std::array<std::uint8_t, 32>& witness_nonce) noexcept;
80
81// Check if a transaction has non-empty witness data.
82bool has_witness(const WitnessTx& tx) noexcept;
83
84// Compute the weight of a transaction (BIP-141 weight units).
85// weight = base_size * 3 + total_size
86// Where base_size is legacy serialization size,
87// and total_size is witness serialization size.
88std::uint64_t tx_weight(const WitnessTx& tx) noexcept;
89
90// Compute virtual size (vsize) = ceil(weight / 4)
91std::uint64_t tx_vsize(const WitnessTx& tx) noexcept;
92
93} // namespace secp256k1
94
95#endif // SECP256K1_BIP144_HPP
std::uint64_t tx_weight(const WitnessTx &tx) noexcept
std::array< std::uint8_t, 32 > compute_txid(const WitnessTx &tx) noexcept
std::vector< std::uint8_t > WitnessItem
Definition bip144.hpp:29
std::array< std::uint8_t, 32 > witness_commitment(const std::array< std::uint8_t, 32 > &witness_root, const std::array< std::uint8_t, 32 > &witness_nonce) noexcept
std::array< std::uint8_t, 32 > compute_wtxid(const WitnessTx &tx) noexcept
std::vector< WitnessItem > WitnessStack
Definition bip144.hpp:32
std::vector< std::uint8_t > legacy_serialize(const WitnessTx &tx) noexcept
bool has_witness(const WitnessTx &tx) noexcept
std::uint64_t tx_vsize(const WitnessTx &tx) noexcept
std::vector< std::uint8_t > witness_serialize(const WitnessTx &tx) noexcept
std::uint32_t prev_vout
Definition bip144.hpp:37
std::array< std::uint8_t, 32 > prev_txid
Definition bip144.hpp:36
std::uint32_t sequence
Definition bip144.hpp:39
std::vector< std::uint8_t > script_sig
Definition bip144.hpp:38
std::vector< std::uint8_t > script_pubkey
Definition bip144.hpp:45
std::uint64_t value
Definition bip144.hpp:44
std::vector< TxOut > outputs
Definition bip144.hpp:52
std::vector< TxInput > inputs
Definition bip144.hpp:51
std::uint32_t locktime
Definition bip144.hpp:54
std::uint32_t version
Definition bip144.hpp:50
std::vector< WitnessStack > witness
Definition bip144.hpp:53