木本重力井是如何調節難度的?
Maxcoin 將使用
Kimoto Gravity Well (KGW)
來調節難度。從我能找到的關於 KGW 的資訊來看,它會在每個區塊之後重新定位並非常快速地調整,例如,當多池添加和收回採礦能力到較小的硬幣網路時。顯然,
KGW = 1 + (0.7084 * (PastBlocksMass/144)^(-1.228))
(-> Kimoto 的介紹性文章)描述瞭如何計算 Kimoto 重力井。在另一個消息來源中,據說*“如果雜湊率高則應用 KGW,而雜湊率低時應用 1/KGW”*(-> Post on Catcoin 採用 KGW)。這給我留下了三個問題:
PastBlocksMass
指的是什麼?- KGW是否只依賴於找到前一個區塊所需的時間?
- 為什麼/如何上面的公式產生所描述的對難度的快速適應?
網路上的解釋都非常模糊和神秘,也許是故意的。這是我的簡單話,只是從上面的評論中閱讀了 megacoin 原始碼。
目標是有一種更具適應性的方式來調整難度,而不是像比特幣那樣僅僅平均最後的 2016 個區塊。這是必要的,因為多池可能會轉換他們正在探勘的硬幣,並且可能會發生雜湊率的突然變化(增加或減少)。尤其是當多池切換時,您會因難度太高而卡住太久。
算法從目前塊開始向後循環遍歷塊。這
PastBlocksMass
只是塊的數量,因此它從 1 開始並在每個循環中增加。在每個循環中計算一個調整因子,即目標塊時間除以實際塊時間,以累積方式,因此在循環 10 中,我們將 25 分鐘的目標時間除以計算最後一個實際花費的時間十個街區。當雜湊率增加時,我們會得到更短的時間和大於 1 的調整因子,反之亦然。
只要平均調整因子大於
kimoto-value
或小於 ,循環就會結束1/kimoto-value
。要理解這一點,請查看此 python 腳本和範例圖:from pylab import * one_day = 1440 / 2.5 # how many 2.5 min blocks per day nmin = one_day / 4 # PastBlocksMin nmax = one_day * 7 # PastBlocksMax x = arange(nmin, nmax) # PastBlocksMass # start with 2.5 minute blocktime + some noise t0 = 2.5 + randn(nmax) / 4 t1 = 2.5 + randn(nmax) / 4 # t0 has 20% more hashrate, so shorter blocktime in the beginning t0[:one_day] = 2.5 / 1.2 + randn(one_day) / 4 # t1 has higher blocktime in the beginning t1[:one_day] = 2.5 / 0.9 + randn(one_day) / 4 s = arange(nmax) adjust0 = (arange(1, nmax + 1) * 2.5 ) / cumsum(t0) adjust1 = (arange(1, nmax + 1) * 2.5 ) / cumsum(t1) # the magic function def kimoto(x): return 1 + (0.7084 * pow((double(x)/double(144)), -1.228)); plot(x/one_day, kimoto(x)) plot(x/one_day, 1/kimoto(x)) plot(s/one_day, adjust0) plot(s/one_day, adjust1) legend(["kimoto","1/kimoto", "20% increase in hashrate", "10% drop in hashrate"]) xlabel("days") ylabel("adjustment factor (target/actual blocktime)") show()
該腳本會生成這樣的圖形。
它顯示了當雜湊率增加和下降一天時的兩個構造範例。最好是使用不同的設置玩一段時間,以了解正在發生的事情。
您會看到線條在某個點穿過 Kimoto 公式。這是算法退出並使用此調整因子來計算新目標/難度的時候。對於較大的調整因子,這種情況發生的時間比接近 1 的要早。這是為了在雜湊率變化很大時進行快速調整,如果不是,則進行較慢的調整——然後我們需要更長的時間來獲得更好的平均值。Kimoto 公式的參數以這樣一種方式調整,即在 1 天內大致調整為 10% 的變化,在 7 天內大致調整為 1.2% 的變化。最少 144 個區塊決定新難度,最多 4032 個(0.25 天或 7 天,2.5 分鐘的區塊時間)。
總結:Kimoto 重力井算法有一個花哨的名字,它決定了有助於評估新難度的塊數。它為高雜湊率變化提供了更少的塊,因此更具適應性。