交易的結(jié)構(gòu)
Version
Txin[]
prevout : txID + index
sig
nSequence
Txout[]
value
scriptPubkey
LockTime
bitcoin交易的鎖定方法
bitcoin 交易提供了3種交易鎖定的方式
- 通過交易的
LockTime
字段鎖定交易- 通過該字段,用來鎖定一個交易荸频。
- 如果該字段的值 小于LOCKTIME_THRESHOLD(500000000);則標(biāo)識該交易的鎖定高度
- 如果該字段的值大于等于 LOCKTIME_THRESHOLD徙硅,則標(biāo)識使用高度鎖定。
- 通過交易的
nSequence
字段鎖定某個指定的交易輸入(使用BIP168進行檢測)- 通過該字段用來鎖住一個交易中的指定輸入
- 通過鎖定腳本,鎖定某個交易輸出(添加了某個特殊的操作碼)
- 通過添加操作碼脾猛,在鎖定腳本上鎖定一個交易的指定輸出。
在交易進交易池鱼鸠,打包區(qū)塊時猛拴,以及驗證區(qū)塊有效性時羹铅,都會判斷交易的成熟度。對于未成熟的交易愉昆,不允許進入進入交易池职员,不允許打包。
詳細(xì)解釋
在交易池中跛溉,交易的輸入分為兩種:來自于UTXO的輸出焊切,來自于交易池中其它未確認(rèn)交易的輸出。
如果一個交易的所有輸入都來自于UTXO:
如果要獲取該交易所有輸入 通過nSequence
字段來標(biāo)識的鎖定時間戳芳室;
第一步:是先判斷該nSequence
字段是否用來鎖定
- 如果某個交易輸入的
nSequence
字段最高bit(1 << 31)位被設(shè)置专肪,標(biāo)識該字段沒有啟用鎖定功能;否則啟用了鎖定功能
第二步:判斷nSequence
字段使用了哪種鎖定功能
- 如果第22bit位被設(shè)置堪侯,則標(biāo)識啟用了時間戳鎖定的功能嚎尤;否則標(biāo)識啟用了高度鎖定的功能
- 對于時間戳的鎖定功能:該交易輸入的鎖定時間為,它的父區(qū)塊的中位數(shù)時間戳 + 鎖定字段的值* (1<< 9) - 1
- 對于高度鎖定功能:該交易輸入的鎖定高度為, 該輸入的 utxo高度 + 鎖定字段的值 - 1
第三步:依據(jù)這些依賴于 nSequence
字段進行鎖定的交易輸入伍宦,記錄他們的高度芽死,并去除交易池中的交易輸入,獲取該交易剩下的 utxo集的最高的塊索引次洼,用來作為緩存关贵,可以標(biāo)識剛才計算的交易的鎖定時間和鎖定高度什么時候失效。
第四步:比較鎖定的時間戳和鎖定高度
- 只有當(dāng)這個交易所有輸入的 最大鎖定時間和最大鎖定高度 大于當(dāng)前Tip區(qū)塊時滓玖,這個交易才被允許打包到下一個區(qū)塊中坪哄。
對于交易池中的交易,它的輸出形成的臨時utxo 在集合中的高度為 MEMPOOL_HEIGHT(0x7FFFFFFF)势篡,在計算鎖定時間和鎖定高度時翩肌,它的高度被臨時賦值為 Tip + 1;
則當(dāng)交易池中某交易依賴于交易池中其他交易的輸出
- 且該輸出還使用
nSequence
字段進行時間戳鎖定時禁悠,它的鎖定時間的計算相當(dāng)于當(dāng)前Tip區(qū)塊的中位數(shù)時間 + 鎖定字段的值 * (1 << 9) - 1
;所以它肯定在當(dāng)前正在打包的區(qū)塊中成熟念祭,所以不會在當(dāng)前區(qū)塊時被打包。 - 該輸出使用
nSequence
字段進行高度鎖定碍侦,它的鎖定高度相當(dāng)于當(dāng)前正在打包的區(qū)塊高度 + 鎖定字段的值 - 1