Transaction Serialization

medium · bitcoin, serialization, tx

Transaction Serialization (Bitcoin-style)

Implement a simplified Bitcoin legacy transaction format. Scripts are treated as opaque byte slices.

Types

type Outpoint struct {
    TxID  [32]byte
    Index uint32
}

type TxIn struct {
    Prev      Outpoint
    ScriptSig []byte
    Sequence  uint32
}

type TxOut struct {
    Value        uint64
    ScriptPubKey []byte
}

type Transaction struct {
    Version  int32
    Inputs   []TxIn
    Outputs  []TxOut
    LockTime uint32
}

func SerializeTx(tx Transaction) []byte
func DeserializeTx(data []byte) (Transaction, bool)
func TxID(tx Transaction) [32]byte

Format

version (4 bytes LE)
input_count (CompactSize)
  for each input:
    prev_txid (32 bytes)
    prev_index (4 bytes LE)
    script_len (CompactSize)
    script_sig (script_len bytes)
    sequence (4 bytes LE)
output_count (CompactSize)
  for each output:
    value (8 bytes LE)
    pk_script_len (CompactSize)
    pk_script (pk_script_len bytes)
locktime (4 bytes LE)

Notes

  • TxID is SHA256(SHA256(SerializeTx(tx))).
  • DeserializeTx should return ok=false if parsing fails or if trailing bytes remain after a full transaction.
  • CompactSize decoding must reject non-canonical encodings.
Run tests to see results
No issues detected
    Join Discord