Bitcoin-Core

比特幣核心中的 nLockTime

  • September 18, 2020

目前,比特幣維基指出:

作為原始比特幣實現的一部分,nLockTime 是一個欄位,用於指定可以將交易添加到有效區塊的最早時間。後來的比特幣軟分叉允許 nLockTime 指定交易可以添加到有效區塊的最低區塊高度。

順序是否正確?從v0.1.5 開始的原始碼似乎使用了塊高度,而v0.1.6對此進行了擴展以處理時間戳。此外,這種新的排序是否使其成為硬分叉?

Wiki 是不正確的(我寫了原文,我很抱歉)。如問題所示,Wiki 上的排序是倒序的。但是,經過調查,我認為這不是硬分叉。在原始比特幣 0.1 程式碼中,我們找到以下函式

bool IsFinal() const
{
   if (nLockTime == 0 || nLockTime < nBestHeight)
       return true;
   ...
}

在選擇要探勘哪些交易的探勘程式碼中呼叫此函式:

if (tx.IsCoinBase() || !tx.IsFinal())
     continue;

這意味著執行預設比特幣 0.1 程式碼的任何節點都不會探勘交易,除非它的 nLockTime 小於下一個塊的高度。但是,我沒有看到 0.1 中的任何程式碼拒絕具有“非最終”交易的區塊,因此這不是共識規則。

幾個月後,在成為比特幣 0.1.6 一部分的程式碼中,添加了時間鎖定功能:

-    bool IsFinal() const
+    bool IsFinal(int64 nBlockTime=0) const
    {
-        if (nLockTime == 0 || nLockTime < nBestHeight)
+        // Time based nLockTime implemented in 0.1.6,
+        // do not use time based until most 0.1.5 nodes have upgraded.
+        if (nBlockTime == 0)
+            nBlockTime = GetAdjustedTime();
+        if (nLockTime == 0)
+            return true;
+        if (nLockTime < (nLockTime < 500000000 ? nBestHeight : nBlockTime))

同樣的送出還為高度鎖和時間鎖增加了共識執行:

+    // Check that all transactions are finalized (starting around 30 Nov 2009)
+    if (nBestHeight > 31000) // 25620 + 5320
+        foreach(const CTransaction& tx, vtx)
+            if (!tx.IsFinal(nTime))
+                return error("AcceptBlock() : contains a non-final transaction");

簡而言之,在 0.1.0 版本中沒有關於 nLockTime 欄位的共識規則,而 0.1.6 版本添加了包括高度鎖和時間鎖的共識規則。這使得規則更加嚴格,所以我相信這是一個在 31,000 區塊啟動的軟分叉。

也許有趣的是,這是我所知道的最早的軟分叉(在撰寫本文時,它比撰寫本文時 Wiki 的共識版本列表或 BitMex 的共識分叉列表中的任何條目都早)。儘管來得這麼早,但分叉顯然是用心製作的,給了網路大約一個月的時間來升級並提前為潛在的問題做準備。

引用自:https://bitcoin.stackexchange.com/questions/90229