什麼是時間扭曲攻擊,它一般是如何工作的?
我試圖了解最近瀕臨的時間扭曲攻擊,但由於該攻擊在所有 POW 區塊鏈中都是普遍的,我想我也可以在這裡問,因為這裡的人……更有知識。
我不明白程式碼的細節。
但我假設,在比特幣中,每 2016 個區塊都有一個難度參數。也許是一個整數。這樣在此期間開采的所有 2016 塊都需要具有小於該整數的雜湊值。
每當開採 2016 個區塊時,都會重新計算此難度。每個人都會遍歷整個 2016 年的區塊,並取最早的時間戳,取最新的時間戳,計算探勘這些區塊需要多長時間,並決定下一個 2016 區塊的新難度整數。
但是時間扭曲是如何工作的呢?我讀了一些東西,礦工開始送出帶有大漂移時間戳的塊(我認為比特幣是 2 小時?),但與要探勘 2016 個塊(300 多個小時)的平均時間相比,2 小時相對較小。在區塊中增加或減少 2 小時將如何導致挖礦難度大幅降低?
對於礦工來說,大幅降低難度,他不需要:
- 多數算力,因此他可以建構所有 2016 塊。
- 以某種方式更改此 2016 塊中的所有時間戳,從而顯著降低難度
- 利潤……(但到那時人們可能還是放棄了鏈條)
但是一旦我們到達第 1 點,我們就……有點麻煩了,只是時間扭曲讓情況變得更糟???
謝謝!
比特幣協議(共識規則)對區塊頭中的時間戳有兩個相關規則:
- 節點不會接受時間戳超過兩個小時的區塊。
- 一個節點不會接受一個區塊,除非它的時間戳大於前 11 個區塊的中位數。在比特幣中,我們稱之為過去中位時間(MTP)。
正如您在問題中提到的,難度變化是根據 2,016 塊難度期間的第一個和最後一個塊的時間計算的。(從技術上講,那裡存在一個錯誤,但這在這裡並不重要。)
鑑於上述規則,如果所有礦工都同意,他們可以簡單地將前 2,015 個區塊的時鐘增加一秒 MTP 的最小量,然後將時間設置為未來兩小時。這基本上會讓他們的難度略有降低,但想想當他們添加最後一個稍微未來的數據點時 MTP 會發生什麼:實際中位數根本沒有太大變化。實際時間戳以秒為單位,但這裡有一組 11 個時間戳,以從目前時間為單位的天數為單位:
[-13, -13, -13, -13, -13, -13, -13, -13, -13, -13, 0]
上面的中位數是-13,這意味著礦工在難度期結束時創建了稍微未來的區塊後,他們不需要將時間戳向前移動超過最小一秒——所以下一個困難期從 -13 天開始。
在下一個難度週期結束時,礦工再次將時間戳向前移動,因此協議認為需要 28 天才能挖出塊——預期速度的一半——因此將難度降低了大約一半. 現在用於 MTP 的值如下所示:
[-27, -27, -27, -27, -27, -27, -27, -27, -27, -27, 0]
因此礦工可以繼續保持過去的時間戳並重複攻擊,每個週期都降低難度,直到他們用不到 2,016 秒的時間生產 2,016 個區塊,此時他們無法進一步降低難度,因為 MTP 功能需要在每個塊的中位數上至少增加一秒的時間。
現在,您的主要問題是這種攻擊如何在沒有大多數礦工勾結的情況下進行。現在您已經了解了攻擊如何與所有參與的礦工一起工作,應該清楚的是,選擇中值時間可以讓攻擊礦工幸運地找到可靠的塊,以防止中值時間向前跳躍到一個誠實值。例如,假設這些是前 11 個區塊的時間,按照區塊鏈順序:
[-27, 0, -27, 0, -27, 0, -27, 0, -27, 0, -27]
如果您對這些數字進行排序以找到中位數,即使 5/11(45%)的雜湊率在準確探勘,它也是 -27。但是等等,這不是說攻擊礦工擁有 55% 的算力嗎?也許不會,因為擁有大約 30% 或更多算力的大型礦工可以通過自私的挖礦攻擊獲得優於其他礦工的優勢,或者礦工可以簡單地威脅要嘗試讓其他礦工過時(“孤兒”)準確的時間戳,導致那些誠實的礦工收入減少。
我自己並不認為比特幣上的攻擊特別有可能,因為它執行速度很慢且公開可見,但協議設計人員在更改參數時確實需要牢記這一點,因為這些更改可能會使攻擊更容易執行。