Bitcoin-Core
比特幣核心中的 nLockTime
目前,比特幣維基指出:
作為原始比特幣實現的一部分,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 的共識分叉列表中的任何條目都早)。儘管來得這麼早,但分叉顯然是用心製作的,給了網路大約一個月的時間來升級並提前為潛在的問題做準備。