為什麼選擇每 2 週調整一次難度(而不是 2 天或每幾個區塊)?
每隔一段時間(即 2 週)調整一次難度與每個區塊調整一次難度有什麼好處?
nullc 在Reddit上回答了這個問題。
調整每個塊(或通常更快)會增加使用者對孤立攻擊的脆弱性。
假設我設法隔離了您的節點,以便它只與我的節點通信——而不是特別嚴重的攻擊。然後使用一些挖礦算力(也許我也隔離了——這更難,或者我為自己買單)我在一個隔離的分叉中探勘塊。起初,由於難度高,塊來得很慢,但是如果它更新每個塊,難度就會下降並且速度會加快。一段時間後,分叉像真實網路一樣每小時產生 6 個區塊(難度較低)。
IIRC 的數學計算表明,保持所有時間常數相同,持續更新的攻擊成本大約是更新間隔 = 視窗更新的一半。
這也許不是最大的問題,但這種改變並不是完全免費的。
重疊更新也有一些數學/實現複雜性——因為每個塊都處於不同的難度,所以你不想“雙重應用”之前的慢/快塊的效果,這些塊的影響你已經部分合併了(所以你需要以第 N 個根縮放您的更新)。一堆山寨幣弄錯了,最終導致了不穩定/振蕩的難度更新!
還有針對持續更新的奇怪的分叉激勵攻擊:假設我在我的區塊上玩時間戳,以便後續區塊的難度會稍微高一些。這意味著如果在我的高度有一個具有忠實時間戳的競爭區塊,我的繼任者將始終在與另一個繼任者的區塊競賽中獲勝,因為我的分叉背後有一些無限量的額外工作。這會激勵礦工不斷低估他們的時間。從理論上講,這種不良激勵也存在於比特幣中,但只是在 2016 年視窗的最後一個區塊中——非常罕見,可能不值得一試。更新每個塊會使問題出現在每個塊中。
這可以修復,例如不要使用來自最新塊的數據進行調整,而是使用來自至少 N 個塊舊的塊的時間戳(將 N 設置得足夠高以使該深度的分叉任意少見),以便通常所有分叉有同樣的困難。但是現在您需要考慮另一個參數和權衡。
還有一個相關的外來攻擊:你知道嗎,在比特幣中,保持網路雜湊率的任何恆定比例的攻擊者,無論多麼小(例如,0.000001%,它只需要隨網路擴展)最終都會超過誠實鏈,如果他攻擊的時間夠長嗎?他只是繼續在他的叉子上挖礦,最終他很幸運並且比他應該更快地獲得一個塊。他不斷地將時間戳設置得盡可能低,以便他的難度上升最快。為什麼最快?Poisson變數的變異數等於期望值,因此他走運和誇大工作的機率會更高。他們的難度上升,最終他們再次幸運。經過一些幸運塊後,他用更多的“工作”炸毀了整個真實鏈!
事實證明,如果你從比特幣中插入數字,這種攻擊對於目前行為來說並不是一個實際問題。例如,您提出了數万億年的預期成功時間——除了具有大量算力並且可能以其他方式進行攻擊的攻擊者。但是增加這些攻擊時間的是 2016 年緩慢的更新——攻擊者不僅需要一個幸運方塊來增加他的難度,他需要 2016 年,所以他獲得它們的低機率提高到 2016 年的力量!然後,他還將遇到每個視窗 4 倍難度變化的限制。
4x/0.25x 難度變化規則也是另一個複雜因素。規則中的任何非線性都會引發戰略行為:例如,將其撞到軌道上並更快地出塊,因為知道它不會被相等且相反的減速所滿足。在比特幣中,4x/0.25x 規則設置得足夠遠,它不容易被擊中,並且(IIRC)從未被擊中,所以可能存在一些奇怪的激勵這一事實並不重要。如果您想以最簡單的方式保持每 2016 塊 4 倍的相同限制,您可以將限制提高到 1/2016 次方,…命中,這顯然很糟糕。可能有一些方法可以解決這個問題……或者完全放棄這些限制。但這只是需要考慮更多的權衡/激勵/風險。
最後,如果時間常數不變——響應一個階躍事件仍然需要很長時間,所以勝利最多也相當適中。
Difficult 從根本上說是一種安全機制,與其他機制一樣,有很多方法可以改變它,從而在典型情況下改進事情——但真正定義其性能的是惡意和罕見情況下的行為。平均而言,任何一種安全措施都會比一些不太安全的替代方案更糟糕……
無論如何,我不知道我會反對經過深入研究的更改(儘管我不相信我們甚至不知道我們對這個主題不了解的內容),包括正確實施更頻繁更新的更改(但是也許不是每個街區),但現在你已經聽到了一些反對它的觀點,正如你所要求的。