Dificultad

« Back to Glossary Index

Dificultad de minado:

Ver también: Target

¿Qué es la dificultad?

La dificultad es una medida de lo difícil que es encontrar un hash debajo de un objetivo determinado. La dificultad responde a la pregunta: «¿cuántas veces es más difícil extraer un bloque ahora, en comparación con lo difícil que fue extraer el Bloque Génesis ?». Tiene una estrecha relación con el objetivo, pero no es lo mismo. Más bien tiene una relación inversa donde una dificultad más alta implica un valor objetivo más bajo.

La red Bitcoin tiene una dificultad de bloqueo global. Los bloques válidos deben tener un hash debajo de este objetivo. Los grupos de minería también tienen una dificultad de compartir específica del grupo que establece un límite inferior para los recursos compartidos.

¿Con qué frecuencia cambia la dificultad de la red?

Ver objetivo .

¿Cuál es la fórmula para la dificultad?

dificultad = dificultad_1_target / current_target

el objetivo es un número de 256 bits

dificultad_1_objetivo es el objetivo utilizado en el Bloque Génesis y representa una dificultad de 1.

dificultad_1_ objetivo puede ser diferente para varias formas de medir la dificultad. Tradicionalmente, representa un hash donde los 32 bits iniciales son cero y el resto son uno (esto se conoce como «dificultad de grupo» o «pdiff»). El protocolo Bitcoin representa objetivos como un tipo de punto flotante personalizado con precisión limitada; Como resultado, los clientes de Bitcoin a menudo se aproximan a la dificultad en función de esto (esto se conoce como «bdiff»).

¿Cómo se almacena la dificultad en bloques?

Cada bloque almacena una representación empaquetada en su encabezado de bloque (llamado Bits ) para su objetivo hexadecimal real. El objetivo puede derivarse de Bits a través de una fórmula predefinida. Por ejemplo, si el objetivo empaquetado en el bloque es 0x1b0404cb, el objetivo hexadecimal es:

  0x0404cb * 2 ** (8 * (0x1b - 3)) = 0x00000000000404CB000000000000000000000000000000000000000000000000

Tenga en cuenta que el valor 0x0404cb es un valor con signo en este formato. El mayor valor legal para este campo es 0x7fffff. Para obtener un valor mayor, debe desplazarlo hacia abajo un byte completo. También 0x008000 es el valor válido positivo más pequeño.

¿Cómo se calcula la dificultad?¿Cuál es la diferencia entre bdiff y pdiff?

El objetivo más alto posible (dificultad 1) se define como 0x1d00ffff, lo que nos da un objetivo hexadecimal de

  0x00ffff * 2 ** (8 * (0x1d - 3)) = 0x00000000FFFF0000000000000000000000000000000000000000000000000000

Cabe señalar que la minería agrupada a menudo utiliza objetivos no truncados, lo que pone «dificultad de grupo 1» en

  0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

Entonces la dificultad en 0x1b0404cb es por lo tanto:

  0x00000000FFFF0000000000000000000000000000000000000000000000000000 /
 0x00000000000404CB000000000000000000000000000000000000000000000000 
 = 16307.420938523983 (bdiff)

Y:

  0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF /
 0x00000000000404CB000000000000000000000000000000000000000000000000 
 = 16307.669773817162 (pdiff)

Aquí hay una forma rápida de calcular la dificultad de Bitcoin. Utiliza una serie de Taylor modificada para el logaritmo (puede ver tutoriales en flipcode y wikipedia) y se basa en registros para transformar el cálculo de dificultad:

<source lang = «cpp»>

  1. incluir <iostream>
  2. incluir <cmath>

inline float fast_log (float val) {

  int * const exp_ptr = reinterpret_cast <int *> (& val);
   int x = * exp_ptr;
   const int log_2 = ((x >> 23) & 255) - 128;
   x & = ~ (255 << 23);
   x + = 127 << 23;
   * exp_ptr = x;
  val = ((-1.0f / 3) * val + 2) * val - 2.0f / 3;
   return ((val + log_2) * 0.69314718f);

}

dificultad de flotación (bits int sin signo) {

  cuerpo doble estático max_body = fast_log (0x00ffff), scaland = fast_log (256);
    return exp (max_body - fast_log (bits & 0x00ffffff) + scaland * (0x1d - ((bits & 0xff000000) >> 24)));

}

int main () {

  std :: cout << dificultad (0x1b0404cb) << std :: endl;
    devuelve 0;

} </source>

Para ver las matemáticas para pasar de los cálculos normales de dificultad (que requieren grandes entradas grandes más grandes que el espacio en cualquier número entero normal) al cálculo anterior, aquí hay algo de python:

<source lang = «python»> importación decimal, matemática l = math.log e = math.e

print 0x00ffff * 2 ** (8 * (0x1d – 3)) / float (0x0404cb * 2 ** (8 * (0x1b – 3))) print l (0x00ffff * 2 ** (8 * (0x1d – 3)) / float (0x0404cb * 2 ** (8 * (0x1b – 3)))) print l (0x00ffff * 2 ** (8 * (0x1d – 3))) – l (0x0404cb * 2 ** (8 * (0x1b – 3))) imprimir l (0x00ffff) + l (2 ** (8 * (0x1d – 3))) – l (0x0404cb) – l (2 ** (8 * (0x1b – 3))) imprimir l ( 0x00ffff) + (8 * (0x1d – 3)) * l (2) – l (0x0404cb) – (8 * (0x1b – 3)) * l (2) imprimir l (0x00ffff / float (0x0404cb)) + (8 * (0x1d – 3)) * l (2) – (8 * (0x1b – 3)) * l (2) imprimir l (0x00ffff / float (0x0404cb)) + (0x1d – 0x1b) * l (2 ** 8 ) </source>

¿Cuál es la dificultad actual?

Dificultad actual

¿Cuál es la máxima dificultad?

No hay objetivo mínimo. La dificultad máxima es más o menos: maximum_target / 1 (ya que 0 daría como resultado infinito), que es un número ridículamente enorme (aproximadamente 2 ^ 224).

La dificultad máxima real es cuando current_target = 0, pero no podríamos calcular la dificultad si eso sucediera. (Afortunadamente nunca lo hará, así que estamos bien).

En el caso de Bitcoin (BSV) y Bitcoin Cash (BCH), la dificultad de la red puede aumentar en un máximo del 100% de la dificultad actual en un solo ajuste.

En la implementación original, aún utilizada por Bitcoin Core (BTC), la dificultad puede aumentar en un máximo del 400% de la dificultad actual en un solo ajuste.

¿Puede disminuir la dificultad de la red?

Sí puede. Ver discusión en blanco .

En el caso de Bitcoin (BSV) y Bitcoin Cash (BCH), la dificultad de la red puede ajustarse hacia abajo hasta en un 50% de la dificultad actual en un solo ajuste.

En la implementación original, aún utilizada por Bitcoin Core (BTC), la dificultad de la red puede ajustarse hacia abajo hasta en un 75% de la dificultad actual en un solo ajuste.

¿Cuál es la dificultad mínima?

La dificultad mínima, cuando el objetivo está en el valor máximo permitido, es 1. Esta es la dificultad del bloque Génesis .

¿Qué tasa de hash de red resulta en una dificultad dada?

La dificultad se ajusta cada 2016 bloques en función del tiempo que llevó encontrar los bloques anteriores de 2016. Al ritmo deseado de un bloque cada 10 minutos, los bloques de 2016 tardarían exactamente dos semanas en encontrarse. Si los bloques anteriores de 2016 tardaron más de dos semanas en encontrarse, la dificultad se reduce. Si tomaron menos de dos semanas, la dificultad aumenta. El cambio en la dificultad es proporcional a la cantidad de tiempo durante o menos de dos semanas que los bloques anteriores de 2016 tardaron en encontrar.

Para encontrar un bloque, el hash debe ser menor que el objetivo. El hash es efectivamente un número aleatorio entre 0 y 2 ** 256-1. El desplazamiento para la dificultad 1 es

  0xffff * 2 ** 208

y para la dificultad D es

  (0xffff * 2 ** 208) / D

Por lo tanto, el número esperado de hashes que necesitamos calcular para encontrar un bloque con dificultad D es

  D * 2 ** 256 / (0xffff * 2 ** 208)

o solo

  D * 2 ** 48 / 0xffff

La dificultad se establece de tal manera que los bloques anteriores de 2016 se hubieran encontrado a razón de uno cada 10 minutos, por lo que estábamos calculando (D * 2 ** 48 / 0xffff) hashes en 600 segundos. Eso significa que la tasa de hash de la red era

  D * 2 ** 48 / 0xffff / 600

sobre los bloques anteriores de 2016. Se puede simplificar aún más a

  D * 2 ** 32/600

sin mucha pérdida de precisión.

En la dificultad 1, eso es alrededor de 7 Mhashes por segundo.

Al momento de escribir, la dificultad es 22012.4941572, lo que significa que durante el conjunto anterior de bloques de 2016 se encontró que la tasa de hash promedio de la red era

  22012.4941572 * 2 ** 32/600 = alrededor de 157 Ghashes por segundo.

enlaces relacionados

Atribución

Este contenido se basa en el contenido de https://en.bitcoin.it/wiki/Dificultad bajo Creative Commons Attribution 3.0 . Aunque puede haber sido ampliamente revisado y actualizado, reconocemos a los autores originales.

Ver también: Target

¿Qué es la dificultad?

La dificultad es una medida de lo difícil que es encontrar un hash debajo de un objetivo determinado. La dificultad responde a la pregunta: «¿cuántas veces es más difícil extraer un bloque ahora, en comparación con lo difícil que fue extraer el Bloque Génesis ?». Tiene una estrecha relación con el objetivo, pero no es lo mismo. Más bien tiene una relación inversa donde una dificultad más alta implica un valor objetivo más bajo.

La red Bitcoin tiene una dificultad de bloqueo global. Los bloques válidos deben tener un hash debajo de este objetivo. Los grupos de minería también tienen una dificultad de compartir específica del grupo que establece un límite inferior para los recursos compartidos.

¿Con qué frecuencia cambia la dificultad de la red?

Ver objetivo .

¿Cuál es la fórmula para la dificultad?

dificultad = dificultad_1_target / current_target

el objetivo es un número de 256 bits

dificultad_1_objetivo es el objetivo utilizado en el Bloque Génesis y representa una dificultad de 1.

dificultad_1_ objetivo puede ser diferente para varias formas de medir la dificultad. Tradicionalmente, representa un hash donde los 32 bits iniciales son cero y el resto son uno (esto se conoce como «dificultad de grupo» o «pdiff»). El protocolo Bitcoin representa objetivos como un tipo de punto flotante personalizado con precisión limitada; Como resultado, los clientes de Bitcoin a menudo se aproximan a la dificultad en función de esto (esto se conoce como «bdiff»).

¿Cómo se almacena la dificultad en bloques?

Cada bloque almacena una representación empaquetada en su encabezado de bloque (llamado Bits ) para su objetivo hexadecimal real. El objetivo puede derivarse de Bits a través de una fórmula predefinida. Por ejemplo, si el objetivo empaquetado en el bloque es 0x1b0404cb, el objetivo hexadecimal es:

  0x0404cb * 2 ** (8 * (0x1b - 3)) = 0x00000000000404CB000000000000000000000000000000000000000000000000

Tenga en cuenta que el valor 0x0404cb es un valor con signo en este formato. El mayor valor legal para este campo es 0x7fffff. Para obtener un valor mayor, debe desplazarlo hacia abajo un byte completo. También 0x008000 es el valor válido positivo más pequeño.

¿Cómo se calcula la dificultad?¿Cuál es la diferencia entre bdiff y pdiff?

El objetivo más alto posible (dificultad 1) se define como 0x1d00ffff, lo que nos da un objetivo hexadecimal de

  0x00ffff * 2 ** (8 * (0x1d - 3)) = 0x00000000FFFF0000000000000000000000000000000000000000000000000000

Cabe señalar que la minería agrupada a menudo utiliza objetivos no truncados, lo que pone «dificultad de grupo 1» en

  0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

Entonces la dificultad en 0x1b0404cb es por lo tanto:

  0x00000000FFFF0000000000000000000000000000000000000000000000000000 /
 0x00000000000404CB000000000000000000000000000000000000000000000000 
 = 16307.420938523983 (bdiff)

Y:

  0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF /
 0x00000000000404CB000000000000000000000000000000000000000000000000 
 = 16307.669773817162 (pdiff)

Aquí hay una forma rápida de calcular la dificultad de Bitcoin. Utiliza una serie de Taylor modificada para el logaritmo (puede ver tutoriales en flipcode y wikipedia) y se basa en registros para transformar el cálculo de dificultad:

<source lang = «cpp»>

  1. incluir <iostream>
  2. incluir <cmath>

inline float fast_log (float val) {

  int * const exp_ptr = reinterpret_cast <int *> (& val);
   int x = * exp_ptr;
   const int log_2 = ((x >> 23) & 255) - 128;
   x & = ~ (255 << 23);
   x + = 127 << 23;
   * exp_ptr = x;
  val = ((-1.0f / 3) * val + 2) * val - 2.0f / 3;
   return ((val + log_2) * 0.69314718f);

}

dificultad de flotación (bits int sin signo) {

  cuerpo doble estático max_body = fast_log (0x00ffff), scaland = fast_log (256);
    return exp (max_body - fast_log (bits & 0x00ffffff) + scaland * (0x1d - ((bits & 0xff000000) >> 24)));

}

int main () {

  std :: cout << dificultad (0x1b0404cb) << std :: endl;
    devuelve 0;

} </source>

Para ver las matemáticas para pasar de los cálculos normales de dificultad (que requieren grandes entradas grandes más grandes que el espacio en cualquier número entero normal) al cálculo anterior, aquí hay algo de python:

<source lang = «python»> importación decimal, matemática l = math.log e = math.e

print 0x00ffff * 2 ** (8 * (0x1d – 3)) / float (0x0404cb * 2 ** (8 * (0x1b – 3))) print l (0x00ffff * 2 ** (8 * (0x1d – 3)) / float (0x0404cb * 2 ** (8 * (0x1b – 3)))) print l (0x00ffff * 2 ** (8 * (0x1d – 3))) – l (0x0404cb * 2 ** (8 * (0x1b – 3))) imprimir l (0x00ffff) + l (2 ** (8 * (0x1d – 3))) – l (0x0404cb) – l (2 ** (8 * (0x1b – 3))) imprimir l ( 0x00ffff) + (8 * (0x1d – 3)) * l (2) – l (0x0404cb) – (8 * (0x1b – 3)) * l (2) imprimir l (0x00ffff / float (0x0404cb)) + (8 * (0x1d – 3)) * l (2) – (8 * (0x1b – 3)) * l (2) imprimir l (0x00ffff / float (0x0404cb)) + (0x1d – 0x1b) * l (2 ** 8 ) </source>

¿Cuál es la dificultad actual?

Dificultad actual

¿Cuál es la máxima dificultad?

No hay objetivo mínimo. La dificultad máxima es más o menos: maximum_target / 1 (ya que 0 daría como resultado infinito), que es un número ridículamente enorme (aproximadamente 2 ^ 224).

La dificultad máxima real es cuando current_target = 0, pero no podríamos calcular la dificultad si eso sucediera. (Afortunadamente nunca lo hará, así que estamos bien).

En el caso de Bitcoin (BSV) y Bitcoin Cash (BCH), la dificultad de la red puede aumentar en un máximo del 100% de la dificultad actual en un solo ajuste.

En la implementación original, aún utilizada por Bitcoin Core (BTC), la dificultad puede aumentar en un máximo del 400% de la dificultad actual en un solo ajuste.

¿Puede disminuir la dificultad de la red?

Sí puede. Ver discusión en blanco .

En el caso de Bitcoin (BSV) y Bitcoin Cash (BCH), la dificultad de la red puede ajustarse hacia abajo hasta en un 50% de la dificultad actual en un solo ajuste.

En la implementación original, aún utilizada por Bitcoin Core (BTC), la dificultad de la red puede ajustarse hacia abajo hasta en un 75% de la dificultad actual en un solo ajuste.

¿Cuál es la dificultad mínima?

La dificultad mínima, cuando el objetivo está en el valor máximo permitido, es 1. Esta es la dificultad del bloque Génesis .

¿Qué tasa de hash de red resulta en una dificultad dada?

La dificultad se ajusta cada 2016 bloques en función del tiempo que llevó encontrar los bloques anteriores de 2016. Al ritmo deseado de un bloque cada 10 minutos, los bloques de 2016 tardarían exactamente dos semanas en encontrarse. Si los bloques anteriores de 2016 tardaron más de dos semanas en encontrarse, la dificultad se reduce. Si tomaron menos de dos semanas, la dificultad aumenta. El cambio en la dificultad es proporcional a la cantidad de tiempo durante o menos de dos semanas que los bloques anteriores de 2016 tardaron en encontrar.

Para encontrar un bloque, el hash debe ser menor que el objetivo. El hash es efectivamente un número aleatorio entre 0 y 2 ** 256-1. El desplazamiento para la dificultad 1 es

  0xffff * 2 ** 208

y para la dificultad D es

  (0xffff * 2 ** 208) / D

Por lo tanto, el número esperado de hashes que necesitamos calcular para encontrar un bloque con dificultad D es

  D * 2 ** 256 / (0xffff * 2 ** 208)

o solo

  D * 2 ** 48 / 0xffff

La dificultad se establece de tal manera que los bloques anteriores de 2016 se hubieran encontrado a razón de uno cada 10 minutos, por lo que estábamos calculando (D * 2 ** 48 / 0xffff) hashes en 600 segundos. Eso significa que la tasa de hash de la red era

  D * 2 ** 48 / 0xffff / 600

sobre los bloques anteriores de 2016. Se puede simplificar aún más a

  D * 2 ** 32/600

sin mucha pérdida de precisión.

En la dificultad 1, eso es alrededor de 7 Mhashes por segundo.

Al momento de escribir, la dificultad es 22012.4941572, lo que significa que durante el conjunto anterior de bloques de 2016 se encontró que la tasa de hash promedio de la red era

  22012.4941572 * 2 ** 32/600 = alrededor de 157 Ghashes por segundo.

enlaces relacionados

Atribución

Este contenido se basa en el contenido de https://en.bitcoin.it/wiki/Dificultad bajo Creative Commons Attribution 3.0 . Aunque puede haber sido ampliamente revisado y actualizado, reconocemos a los autores originales.

https://wiki.bitcoinsv.io/index.php/Difficulty

« Back to Glossary Index