Difficulty

木本重力井是如何調節難度的?

  • September 11, 2014

Maxcoin 將使用Kimoto Gravity Well (KGW)來調節難度。從我能找到的關於 KGW 的資訊來看,它會在每個區塊之後重新定位並非常快速地調整,例如,當多池添加和收回採礦能力到較小的硬幣網路時。

顯然,KGW = 1 + (0.7084 * (PastBlocksMass/144)^(-1.228))-> Kimoto 的介紹性文章)描述瞭如何計算 Kimoto 重力井。在另一個消息來源中,據說*“如果雜湊率高則應用 KGW,而雜湊率低時應用 1/KGW”*(-> Post on Catcoin 採用 KGW)。

這給我留下了三個問題:

  1. PastBlocksMass指的是什麼?
  2. KGW是否只依賴於找到前一個區塊所需的時間?
  3. 為什麼/如何上面的公式產生所描述的對難度的快速適應?

網路上的解釋都非常模糊和神秘,也許是故意的。這是我的簡單話,只是從上面的評論中閱讀了 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 重力井算法有一個花哨的名字,它決定了有助於評估新難度的塊數。它為高雜湊率變化提供了更少的塊,因此更具適應性。

引用自:https://bitcoin.stackexchange.com/questions/21730