Block
無法複製塊頭驗證錯誤:時間太舊和時間太新
我們正在玩 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 中有一個獨立的礦工,這是測試這些特定故障的方式。