交易

交易就是傳遞比特幣的腳本

交易包含:

  • 版本
  • 輸入
  • 輸出
  • 鎖定時間

定義 Tx

class Tx:

    def __init__(self, version, tx_ins, tx_outs, locktime):
        self.version = version
        self.tx_ins = tx_ins
        self.tx_outs = tx_outs
        self.locktime = locktime

交易的 raw 格式為:

4 bytes | 版本

VarInt . | 輸入數量

Variable | 輸入

VarInt . | 輸出數量

Variable | 輸出

4 bytes | 鎖定時間


輸出包含:

  • 數量
  • 鎖定腳本 ScriptPubKey (locking script)

定義輸出 TxOut

class TxOut:

    def __init__(self, amount, script_pubkey):
        self.amount = amount
        self.script_pubkey = Script.parse(script_pubkey)

    def __repr__(self):
        return '{}:{}'.format(self.amount, self.script_pubkey)

交易輸出的 raw 格式為:(由左到右)

| 8-bytes | amount

| 1-9 bytes (VarInt) | 鎖定腳本大小

| Variable | 鎖定腳本

一個交易可以有很多個交易輸出


輸入包含:

  • 前一個交易的 hash
  • 前一個交易的 index
  • 解鎖腳本 ScripSig (unclocking script)
  • 序列 Sequence 用來做 RBF

定義輸入 TxIn

class TxIn:

    def __init__(self, prev_tx, prev_index, script_sig, sequence):
        self.prev_tx = prev_tx
        self.prev_index = prev_index
        self.script_sig = Script.parse(script_sig)
        self.sequence = sequence

交易輸入的 raw 格式為:

32 bytes | 交易哈希(此交易為即將要被使用的UTXO的交易)

4 bytes | UTXO 索引

1-9 bytes(VarInt) | 解鎖腳本的大小

Variable | 解鎖腳本

4 bytes | 序列號碼(RBF用)

其中的 Script 參考 Script 章節

輸入不需要數量,每個輸入都要需要驗證

手續費並沒有在輸出被明確寫出,手續費的計算方式是輸出減去段到零錢地址的數量

每個輸入都需要從 UTXO 裡查找


手續費

手續費就是輸入減掉輸出的差額,這是要付給礦工的錢

在 Tx 裡可以很簡單的計算出來

def fee(self):
    input_sum, output_sum = 0
    for tx_in in self.tx_ins:
        input_sum += tx_in.value()

    for tx_out in self.tx_outs:
        output_sum += tx_out.amount

    return input_sum - output_sum

fetch_tx 參考交易驗證裡的解說

TxIn.value 是從 fetch_tx 回來的結果,去找出這次的輸入是以前的哪一個輸出,在求出該輸出的 amount

def value(self, testnet=False):
    tx = self.fetch_tx(testnet=testnet)
    return tx.tx_outs[self.prev_index].amount

results matching ""

    No results matching ""