在v1.6版本的Java內核中,我們將發布一些針對網絡中礦工的大調整,以解決過去幾個月我們在Aion網絡上看到的一些問題。讓我們來深入了解一下具體存在哪些問題,以及即將發布的版本中的修復措施如何解決這些問題。
注意: 本文只說明針對Aion網絡上的礦工而進行的修改,本次硬分叉中還包含其他修改。
您也可以直接跳到本文底部,了解礦工和挖礦池需要採取的行動。
關於難度的波動
敏銳的Aion網絡觀察者會發現, 從今年5月開始,Aion歷史難度計算記錄中的難度出現了波動。我們已經追踪到這些波動的來源,其原因是某個地址通過網絡上的一個挖礦池,週期性地貢獻了大量的算力。對難度做一些簡單的平滑處理,我們得到了這張圖,這張圖表示的在幾小時時間中出現的波動情況:
6.3m-6.4m區塊之間的平滑(WMA)難度圖,正如我們所指出的那樣,顯示了難度的振盪模式。
我們懷疑這是該礦工的某種形式的跳幣行為( Coin-hopping),這樣的波動在算力較小的網絡上並不罕見。我們還有理由相信這樣做是為了經濟利益,因為AION頻繁地從礦工賬戶轉移到幣安。這是一個會對我們的解決方案產生影響的假設(我們稍後會看到),我們覺得這個假設成立的可能性很大,因為到目前為止,我們所看到的任何跡像都沒有表明這個人的行為是拜占庭機制的行為。
此外,不管這種攻擊的目的是什麼,其執行都是有缺陷的,導致了類似於勸阻攻擊(Discouragement Attack)的情況,整個網絡(包括該礦工)都會因為他們的行為而損失。我們來解釋一下原因。
關於PoW(工作證明)出塊時間戳
在網絡上可以觀察到的另一個問題是, 系統沒有正確地設定出塊時間戳目標。出現一些時間段,平均時間戳(如果我們通過一覽面板查看,它是一個窗口化的移動平均值)在15-20秒左右。在本文撰稿之時,筆者快速瀏覽了一下,顯示為14.6秒。很明顯,哪裡出了問題!從區塊鏈上抓取5月以來的歷史數據,進行類似的平滑操作,我們可以看到,出塊時間也在以與難度相同的方式波動:
6.3m-6.4m區塊之間的平滑(WMA)難度圖,同樣也顯示了振盪模式。
但這種情況不應該發生,如果難度調整機制正確地以某一出塊時間為目標,那麼它應該不斷地嘗試朝著這個出塊時間調整,即便網絡有波動。此外,我們知道Unity難度調整機制在調整上是相當積極的,這意味著即便是礦力的波動也應該很快能被解決(在區塊內)。
我們發現根本原因在時間戳本身。回想一下,難度調整機制是(從挖礦PoV開始的每個區塊,或每隔一個區塊)對目標出塊時間T進行優化,根據一個公式向上或向下調整難度,該公式以最後一個已知的區塊的delta作為輸入值。當大量產生的區塊的時間戳不正確時,問題就會出現,這意味著難度調整算法是根據礦工提供的錯誤信息進行調整的。在這種情況下,很大一部分正在提交的區塊(同樣是由這一個礦工提交的),是以一秒鐘的出塊時間來提交的,導致難度調整方案錯誤地認為網絡的算力比實際情況要高。這就導致了難度是基於人為抬高的算力基礎上的,因此隨著時間的推移,出塊時間會增加。通過檢查攻擊池出塊時間分佈,可以明確地看到這種情況的發生。
攻擊池的出塊時間(Delta)分佈,注意其明顯偏離指數分佈的概率密度函數。
為什麼不對時間戳實施限制呢?因為:
● PoW(工作證明)時間戳不能被強制執行,沒有任何協議級檢查(只有簡單的邊界檢查)可以強制礦工在這些邊界內誠實地進行時間戳。
● 試探性檢查法過於僵化,無法應對網絡中的大波動,往往會得出極端情況。
還有其他與此相關的問題,我們在最初的Unity交叉出塊共識算法文件中提到過,不在本文的討論範圍內。
勸阻攻擊
這一切導致的是我們前面提到的勸阻攻擊:由於我們的出塊獎勵是恆定的4.5 AION,而現在網絡上的每個礦工的出塊量在減少,因此平均賺取的AION較少(按每秒賺取的AION數考量)。如果礦工在經濟上是理性的,那麼與正確的時間戳相比,這對他們來說也是一種淨損失,因為他們挖出的區塊正在越來越少。
修復措施
我們已經排除了協議執行策略,因此我們的修復措施主要基於經濟激勵。我們發現,一個可行的激勵改變的方法是通過經濟激勵來懲罰這種時間戳行為(我們內部將其稱為+1時間戳)。
修復措施的核心是對出塊獎勵公式的更新,歷史上(在項目存在以來的全部時間中)礦工和質押者的出塊獎勵公式都是靜態的。之後的出塊獎勵發放會基於當前出塊時間,並且會根據挖礦所需時間動態調整。
新舊獎勵函數,這裡用k=0(常數)表示舊函數,新函數是根據當前區塊的出塊時間選擇的獎勵調整線性函數。
我們選擇的函數是(其中Δ代表出塊時間),
f(Δ) = (b/T)•k•Δ+b•(1-k)
● b = 4.5 AION (靜態區塊發行量)
● T = 目標出塊時間(10秒)
● k = 曲線的斜率,我們得出k=0.4。
其影響是:
● 攻擊者會受到相應的懲罰,採用+1時間戳意味著人為地減少出塊獎勵,賺取的獎勵只有之前的60%。
● 在存在+1時間戳行為的情況下,網絡中的其他人會因其正確的時間戳而被獎勵。如在存在較高的出塊時間的情況下,每個區塊的報酬比靜態的4.5 AION要多。
● 在較長的時間內(假設我們達到目標出塊時間),淨發行量不變。
我們將在更新後監測網絡,以確定這些更新是否按照我們的意圖生效,並相應地做出進一步的更改。 我們期望的結果是,這將激勵正確的時間戳,從而達到理想的10秒出塊時間。
我們的礦工和挖礦池該採取的行動
我們試圖從開發角度將影響降到最低,並將該修復措施本地化。希望本文能讓您對這些變化在未來可能對您的影響有一個很好的了解。為了確保平穩過渡,
● 由於這是一個硬分叉改變(否則出塊獎勵不能改變),所有挖礦池和礦工都應該更新到最新的Aion Java內核(v1.6)。
● 挖礦池應將Aion挖礦池軟件Aion Pool 3更新到最新版本(v0.1.2),以便在獎勵分紅中納入動態的出塊獎勵。
希望本文提供的信息對您能有所幫助,感謝閱讀!