¿Cómo regula la dificultad el Kimoto Gravity Well?

muro

¿Cómo regula la dificultad el Kimoto Gravity Well?

Maxcoin utilizará el Kimoto Gravity Well (KGW)para regular la dificultad. Por lo que pude encontrar sobre el KGW, se reorienta después de cada bloque y se ajusta muy rápidamente, por ejemplo, cuando los grupos múltiples agregan y retraen el poder de minería a una red de monedas más pequeña.

Aparentemente, KGW = 1 + (0.7084 * (PastBlocksMass/144)^(-1.228))( -> Publicación introductoria de Kimoto ) describe cómo calcular el pozo de gravedad de Kimoto. En otra fuente, se afirmó que "se aplica KGW si la tasa de hash es alta, y 1/KGW cuando la tasa de hash es baja" ( -> Publicación sobre la adopción de KGW por parte de Catcoin ).

Esto me deja con tres preguntas:

  1. ¿A qué se PastBlocksMassrefiere?
  2. ¿KGW solo se basa en el tiempo requerido para encontrar el bloque anterior?
  3. ¿Por qué/cómo la fórmula anterior produce la adaptación rápida descrita de la dificultad?

Juan T.

Aquí es donde se implementa KGW en Megacoin. github.com/megacoin/megacoin/blob/master/src/main.cpp#L1276

muro

Eso ayudó: PastBlocksMass aparentemente es un conteo de bloques hasta un parámetro máximo o el bloque de génesis. Desafortunadamente, no hay comentarios y la función en sí toma una serie de parámetros.

cronos

Las explicaciones en la web son todas muy vagas y místicas, tal vez a propósito. Aquí está mi opinión en palabras simples, solo leyendo el código fuente de megacoin del comentario anterior.

El objetivo es tener una forma más adaptable de ajustar la dificultad en lugar de solo promediar los últimos bloques de 2016 como bitcoin. Esto es necesario debido a los multigrupos que pueden cambiar la moneda que están extrayendo, y puede ocurrir un cambio repentino en la tasa de hash (aumentando o disminuyendo). Especialmente cuando un grupo múltiple cambia, te quedas atascado demasiado tiempo con una dificultad demasiado alta.

El algo hace un bucle hacia atrás a través de los bloques, comenzando desde el actual. El PastBlocksMasses solo el número de bloques, por lo que comienza en uno y aumenta en cada bucle.

En cada bucle se calcula un factor de ajuste, que es el tiempo de bloque objetivo dividido por el tiempo de bloque real, de forma acumulativa, por lo que en el bucle 10 tendríamos el tiempo objetivo de 25 minutos dividido por el tiempo que realmente tomó calcular el último diez cuadras Cuando aumenta el hashrate, obtenemos tiempos más cortos y un factor de ajuste mayor a uno y viceversa.

El bucle finaliza cuando el factor de ajuste promedio es mayor que kimoto-value, o menor que 1/kimoto-value. Para entender esto, mire este script de python y una trama de ejemplo:

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()

El guión produce una figura como esta Pozo de gravedad Kimoto.

Muestra dos ejemplos construidos cuando el hashrate aumenta y cuando cae durante un día. Lo mejor es jugar con diferentes configuraciones por un tiempo para tener una idea de lo que está sucediendo.

Ves que las líneas cruzan la fórmula de Kimoto en algún punto. Aquí es cuando el algoritmo sale y usa este factor de ajuste para calcular un nuevo objetivo/dificultad. Para factores de ajuste grandes esto sucede antes que para los más cercanos a uno. Esto es para tener una adaptación rápida si el hashrate cambia mucho, y una más lenta si no, entonces queremos un período más largo para obtener un mejor promedio. Los parámetros de la fórmula de Kimoto se ajustan de tal manera que uno se ajusta aproximadamente en un día a un cambio del 10 % y en siete días a un cambio del 1,2 %. Un mínimo de 144 bloques determinan la nueva dificultad y un máximo de 4032 (0,25 días o 7 días para un bloque de 2,5 minutos).

Resumen: el algoritmo del pozo de gravedad de Kimoto tiene un nombre elegante y determina el número de bloques que contribuyen a la evaluación de la nueva dificultad. Proporciona menos bloques para cambios de alta tasa de hash y, por lo tanto, es más adaptable.

muro

Gracias, esto es muy útil. Una cosa que no estoy seguro de haber entendido: qué sucede cuando no se alcanza el mínimo de 144 bloques o se supera el máximo de 4032 bloques. ¿Se utiliza entonces el KGW o no se utiliza?

cronos

El mínimo es de 144 bloques. Entonces, si el factor de ajuste es mayor que 1+0.7084, entonces se toma el factor para 144 bloques. En 4032, el algoritmo se detiene y se toma el promedio de 4032 sin importar nada. KGW da una respuesta para ambos casos límite.

muro

Bien, gracias, ahora entiendo lo que quisiste decir con esa oración. Excelente respuesta, muchas gracias.