交易
交易就是傳遞比特幣的腳本
交易包含:
- 版本
- 輸入
- 輸出
- 鎖定時間
定義 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