跟大家一起學習區塊鏈技術系列之一 比特幣之鎖定時間和序號

所有簽名哈希類型簽名的時候都要包含一個東西是鎖定時間,比特幣核心代碼裡用變量nLockTime表示。鎖定時間表示相應交易最早打包到區塊鏈的時間。

Locktime讓簽名者可以創建一個時間鎖定的交易,將來的某個時間交易被打包到區塊鏈,給簽名者反悔的機會。

如果簽名者反悔了,簽名者可以創建一個非鎖定的交易,這個交易的輸入跟時間鎖定的那個交易一樣。在鎖定時間到來之前,新的交易被打包到區塊鏈上,這使得原來時間鎖定的交易失效。

當快接近鎖定時間時,必須要小心。點對點的網絡允許區塊時間比實際時間早兩個小時,所以這個locktime交易可能在正式過期的前兩個小時打包到區塊鏈上了。此外,塊不是以確定的時間間隔創建,因此任何取消重要交易的嘗試都應在locktime到期前幾個小時來實施。

以前版本的Bitcoin Core提供了這個功能,防止交易簽名者使用上述方法來取消時間鎖定的交易,但為了防止拒絕服務攻擊,禁用了這個功能的必要部分。但是每個輸入中有四個字節作為序號遺留下來了。該序號旨在允許多個簽名者去更新交易;當他們更新完交易,他們統一將每個輸入的序號設置0xffffffff,允許這個交易被加入一個區塊,即使它的locktime還沒過期。

即使在今天,將所有序號設置為0xffffffff(Bitcoin Core中的默認值)仍然可以禁用時間鎖定,因此,如果要使用locktime,至少一個輸入的序號低於最大值。既然序號沒其他用處,將任何序號設置為零就可以啟用locktime。

Locktime本身是一個無符號的4字節整數,可以通過兩種方式進行解析:

  • 如果小於500萬,則將locktime解析為塊高度。該交易可以打包到該高度或更高的塊。

  • 如果大於等於500萬,則使用UTC解析。交易可以被打包到塊時間大於locktime的任何塊。


分享到:


相關文章: