難度目標在哪裡插入?
所有礦工在任何時候都必須對“難度目標”達成共識,才能獲得正確的隨機數(作為工作量證明的答案)。
假設現在目標已經更新(這意味著已經發現了 2016 個區塊),問題是“誰”計算這個新目標,以便每個礦工達到解決下一個工作量證明所需的相同目標堵塞?
攻擊者不可能操縱目標值來欺騙其他礦工,使他們為工作量證明獲得錯誤的隨機數,這是真的嗎?
換句話說,每個礦工怎麼知道目標值已經改變了?
–> 是區塊鏈最後一個區塊的區塊頭嗎?
如果是這樣,這種方法是否有責任實現一個獨特的目標?
假設已發現 2016 個區塊,並且必須使用以下等式更新目標:
時間 = (難度 x 2^32) / 網路的雜湊算力
這樣對嗎?我不清楚如何確定網路的散列能力值。
PS 假設對手解決了工作量證明,然後生成了一個新塊,但在更新目標時偽造了該塊的時間戳以欺騙網路。由於目標將使用塊的時間戳進行更新。
假設礦工是區塊鏈的最新版本,他可以根據先前區塊的數據計算難度。可以在其他答案中找到有關如何計算難度的說明。
事實上,給定一個特定的鏈,難度的計算總是給出相同的結果。每個礦工都可以自己計算這個新的難度,結果是一樣的,因為計算是基於 2016 區塊槽的。不需要知道網路的雜湊率,通過查看它們的時間戳來知道生成 2016 塊需要多少時間就足夠了。
此外,塊頭還通過nBits 欄位對目標門檻值進行編碼。原因可以在這個答案中找到。
PS:為了讓一個塊被認為是有效的,它的時間戳也必須是有效的,即它必須是:
大於前 11 個區塊的時間戳中值,小於網路調整時間 + 2 小時。
所以“攻擊”的效果非常有限。
因為難度計算是確定性的,所以每個人都可以獨立計算難度。鑑於他們已經就區塊鏈(哪些區塊以何種順序)達成共識,他們都應該計算相同的值。通過這種方式,該協議永遠不會依賴於信任任何人正確的難度是什麼。
另外,請記住,不僅僅是礦工不得不被愚弄接受工作不足的區塊。完整節點也會在收到區塊時對其進行驗證,並且會拒絕不具有滿足其自己計算的難度要求的隨機數的區塊。由於全節點在中繼塊中起著重要作用,因此不應忽視這一點。
如果您想查看難度計算是如何執行的,請查看以下程式碼:https ://github.com/bitcoin/bitcoin/blob/master/src/pow.cpp