Block

無法複製塊頭驗證錯誤:時間太舊和時間太新

  • May 14, 2020

我們正在玩 regtest,我們無法複製此處管理的兩個塊驗證錯誤 <https://github.com/bitcoin/bitcoin/blob/5b24f6084ede92d0f493ff416b4726245140b2c1/src/validation.cpp#L3493-L3499>

我們理解這一點GetBlockTime並且nAdjustedTime值接近 osnow()時間,因此手動移動 os 時鐘可以觸發驗證錯誤。

但我們無法:(

重現“過時”的步驟

  • 啟動比特幣 regtest 守護程序
  • 我的 101 塊
  • 將 os 時鐘改變 1h
  • 挖一個新區塊

我們希望得到“時間太舊”的驗證錯誤,但我們沒有錯誤

重現“時間太新”的步驟

  • 啟動比特幣 regtest 守護程序
  • 開採 101 個街區
  • 將作業系統時鐘向前更改 3 小時
  • 挖一個新區塊

我們希望得到“時間太新”的驗證錯誤,但我們沒有錯誤

既然你說你正在改變你的作業系統時鐘,我假設你正在使用比特幣核心的內置礦工進行 regtest。該礦工將嘗試不產生無效塊。

為了避免time-too-old失敗,它將取中間時間+1和網路調整時間(基本上是OS時間)之間的最大值。因此,當您將時鐘設置得太遠時,它最終會創建一個比有效中位時間早 1 秒的塊。

您沒有收到time-too-new錯誤,因為比特幣核心在該檢查中使用的是系統時間,而不是中位時間。太新的塊將在時間過去後生效。所以它使用作業系統時間進行檢查,而不是中值時間。因此,當您將作業系統時鐘設置為未來 3 小時時,它會生成一個帶有未來 3 小時時間戳的塊,並將其與未來 3 小時的作業系統時鐘進行比較。這個比較發現塊不是太新,所以不會失敗。

為了測試這些特定的錯誤,您需要實現自己的礦工來生成具有您要使用的參數的塊。Bitcoin Core 的測試套件在 python 中有一個獨立的礦工,這是測試這些特定故障的方式。

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