中位時間 Median Time Past
Median Time Past,中位時間,是 Bitcoin 以前 11 個區塊的時間戳記中位數,作為區塊鏈時間基準的計算方式。

Median Time Past,中位時間,是 Bitcoin 以前 11 個區塊的時間戳記中位數,作為區塊鏈時間基準的計算方式。
Median Time Past 最初用於限制區塊時間戳記的合法範圍。隨著 Bitcoin 協議發展,BIP 113 將其定義為時間鎖定的比較基準,使 nLockTime、OP_CHECKLOCKTIMEVERIFY 與 BIP 68 的相對時間鎖定,都使用 Median Time Past 判斷時間條件。
因此,Median Time Past 是 Bitcoin 時間系統中的重要基準,連結了區塊時間戳記、時間鎖定、礦工行為與軟分叉啟用等機制。
中位時間 基本概念
-
區塊時間戳記
每一個 Bitcoin 區塊標頭都包含一個 32 位元的 Timestamp 欄位。 在 Bitcoin 區塊標頭中,主要包含:- Version
- Previous Block Hash
- Merkle Root
- Timestamp
- Bits
- Nonce
其中 Timestamp 由礦工在建立區塊時自行設定,數值代表 Unix Timestamp,以秒為單位。 由於礦工可以自行設定,區塊時間戳記並不一定精確,也不一定隨區塊高度遞增。
-
中位數計算
Median Time Past 取前 11 個區塊的時間戳記,由小到大排序後,取第 6 個數值作為結果。 使用中位數而不是平均值,可以避免單一區塊的極端時間戳記影響結果。因此,少數礦工即使設定偏離實際的時間戳記,也難以改變 Median Time Past。
-
單調不遞減
由於新區塊的時間戳記必須大於 Median Time Past,Median Time Past 隨著新區塊產生只會維持不變或增加,不會倒退。因此,Median Time Past 比單一區塊時間戳記更適合作為穩定的時間基準。
- 落後實際時間
Median Time Past 取的是前 11 個區塊的中位數,概念上大約對應 6 個區塊之前的時間。 以平均每 10 分鐘一個區塊計算,Median Time Past 通常比實際時間落後約 1 小時。
-
時間鎖定基準
BIP 113 定義時間鎖定的比較基準,不再使用區塊標頭的時間戳記,而是使用 Median Time Past。 適用的時間鎖定包含:- nLockTime 時間模式
- OP_CHECKLOCKTIMEVERIFY
- BIP 68 相對時間鎖定
BIP 113 與 BIP 68、BIP 112 一同透過軟分叉部署,於 2016 年啟用。
中位時間 運作方式
- 取得前 11 個區塊
當節點驗證一個新區塊時,會取得該區塊之前的 11 個區塊。 也就是新區塊的父區塊,以及父區塊之前的 10 個區塊。
- 排序時間戳記
節點取得這 11 個區塊的時間戳記後,將其由小到大排序。 排序依據的是時間戳記的數值,而不是區塊高度的順序。
- 取得中位數
排序完成後,取第 6 個時間戳記,作為 Median Time Past。 Bitcoin Core 透過GetMedianTimePast()計算這個數值。
-
檢查區塊時間戳記
新區塊的時間戳記必須大於 Median Time Past,否則該區塊無效。 此外,節點也不接受時間戳記超過節點本地網路時間 2 小時以上的區塊。因此,區塊時間戳記的合法範圍為:
- 下限:大於 Median Time Past
- 上限:不超過網路時間 + 2 小時
- 檢查時間鎖定
節點驗證區塊中的交易時,會使用 Median Time Past 判斷時間鎖定條件。- nLockTime 時間模式中,Median Time Past 必須大於 nLockTime。
- BIP 68 時間模式中,會比較 UTXO 所在區塊與目前區塊的 Median Time Past 差距。
- 節點驗證
節點根據 Median Time Past 判斷區塊時間戳記是否合法,以及區塊中的時間鎖定交易是否已經可以生效。 只有在這些條件符合後,區塊才可以繼續按照其他共識規則進行處理。
中位時間 使用示例
-
計算 Median Time Past
假設前 11 個區塊的時間戳記依區塊高度順序為:1767225000、1767225600、1767225300、1767226200、1767225900、1767226800、 1767226500、1767227400、1767227100、1767228000、1767227700
由小到大排序後:
1767225000、1767225300、1767225600、1767225900、1767226200、1767226500、 1767226800、1767227100、1767227400、1767227700、1767228000
第 6 個數值為 1767226500,因此 Median Time Past = 1767226500。
-
區塊時間戳記限制
延續上例,Median Time Past = 1767226500下一個區塊的時間戳記必須大於 1767226500。 如果礦工將時間戳記設定為 1767226000,該區塊會被節點視為無效。
即使前一個區塊的時間戳記為 1767227700,下一個區塊仍然可以設定為 1767227000。 因為區塊時間戳記只需要大於 Median Time Past,不需要大於前一個區塊。
-
nLockTime 時間鎖定
假設交易設定:nLockTime = 1767226800 Input 0 → nSequence = 0xfffffffe
目前 Median Time Past = 1767226500,並未大於 nLockTime。
因此,即使礦工將新區塊的時間戳記設定為 1767230000,該交易仍然不能被納入區塊。 必須等到 Median Time Past 超過 1767226800 後,交易才可以被納入區塊。
-
防止礦工提前時間
假設在 BIP 113 之前,時間鎖定使用區塊標頭的時間戳記判斷。礦工可以將區塊時間戳記設定在網路時間 2 小時內的未來時間,提前納入尚未到期的時間鎖定交易,並收取其手續費。
使用 Median Time Past 後,單一礦工無法透過調整自己區塊的時間戳記,讓時間鎖定交易提前生效。
-
相對時間鎖定
假設一個 UTXO 所在區塊對應的 Median Time Past 為 1767226500 並在花費該 UTXO 的交易輸入中,設定 BIP 68 時間模式,低 16 位元的值為 10則 10 × 512 = 5,120 秒
因此,必須等到 Median Time Past 達到 1767226500 + 5120 = 1767231620 之後,該交易輸入的相對時間鎖定條件才會滿足。
Median Time Past 應用
- 時間鎖定驗證
Median Time Past 最重要的現代用途,是作為 Bitcoin 時間鎖定的比較基準。 nLockTime、CLTV 與 BIP 68 的時間模式,都使用 Median Time Past 判斷條件是否滿足。 這讓時間鎖定的生效時間,不會受到單一礦工設定的時間戳記影響。
- 區塊時間戳記驗證
Median Time Past 作為區塊時間戳記的下限,限制礦工不能任意設定過去的時間。 搭配節點的未來時間上限,使區塊時間戳記維持在合理範圍內。
- 軟分叉啟用 Version Bits
BIP 9 的 Version Bits 軟分叉部署機制,使用 Median Time Past 判斷部署的開始時間與逾時時間。 這讓軟分叉的啟用流程,可以使用網路共同認定的時間基準。
- 閃電網路 Lightning Network
Lightning Network 依賴時間鎖定建立延遲、撤銷與安全結算機制。 當使用時間模式的時間鎖定時,條件是否滿足取決於 Median Time Past。 因此,Median Time Past 是時間鎖定可預期性的重要基礎。
Median Time Past 相關 BIP
- BIP 9:Version bits with timeout and delay
- BIP 65:OP_CHECKLOCKTIMEVERIFY
- BIP 68:Relative lock-time using consensus-enforced sequence numbers
- BIP 112:CHECKSEQUENCEVERIFY
- BIP 113:Median time-past as endpoint for lock-time calculations

更多文章