Complicación

De Bitcoin Wiki
Saltar a: navegación, buscar

La complicación (eng, "Difficulty") es una unidad de medida, que muestra, por cuanto es difícil encontrar gesh, que será más abajo del objetivo, propuesto por el sistema (target).

Principios de funcionamiento[editar]

En la red Bitcoin para todos los bloques hay una complicación global. El bloque, para esto que considerarse correcto, debe tener gesh más abajo del objetivo declarado (target).

La complicación en la red Bitcoin se cambia cada 2016 bloques. Ajusta las cuentas por la fórmula siguiente:

difficulty = difficulty_1_target / current_target

donde difficulty – la complicación, y target – 256 bites.

Difficulty_1_target Puede aceptar los significados distintos. Tradicionalmente esto es gesh, 32 que primero la pala son 0, la otra parte es compuesta por las unidades (esto se llama también pdiff o pool difficulty). Bitcoin la acta presenta el objetivo (target), como el tipo con el punto que nada y la exactitud limitada. A menudo, fundando en estos datos, Bitcoin los clientes determinan la complicación.

Almacenaje de la complicación en los bloques[editar]

Cada bloque guarda en él la versión embalada (llamado “Bits” o "la Pala") el objetivo hexadecimal.

Usando la fórmula siguiente, de cada bloque es posible recibir su objetivo. Por ejemplo, si el objetivo embalado en el bloque tiene el tipo 0x1b0404cb, su versión hexadecimal se verá del modo siguiente:

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

El significado máximo para este campo - 0x7fffff, mínimo compone 0x008000.

El objetivo máximamente posible (a la complicación 1) es determinado como 0x1d00ffff que en la variante hexadecimal tiene el tipo:

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

Es más abajo presentado el modo rápido del cálculo de la complicación de la red Bitcoin. Para hacer logarifmo él usa la versión cambiada serie de Taylor y se funda en логах para la transformación del cálculo de la complicación.

#include <iostream>
#include <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);
}

float difficulty(unsigned int bits)
{
    static double 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 << difficulty(0x1b0404cb) << std::endl;
    return 0;
}

Complicaciones máxima corriente y mínima[editar]

Se puede conocer la complicación corriente habiendo aprovechado de la Bitcoin-orden getDifficulty. En vista de que no hay objetivo mínimo (target), aproximadamente contar la complicación máxima se puede del modo siguiente: maximum_target / 1 (porque 0 llevará la ecuación al infinito) que es el número inimaginable (~ 2 224 grados). La complicación mínima equivale 1.

Cambio de la complicación[editar]

La complicación se cambia cada 2016 bloques, fundando en el tiempo, que fue necesario para la posición de 2016 bloques anteriores. Si el bloque se encontrará cada 10 minutos (como esto reflexionaba primeramente para la emisión uniforme), la posición de 2016 bloques ocupará exactamente 2 semanas. Si 2016 bloques anteriores eran encontrados por el plazo más 2 de las semanas – la complicación será reducida, si es más pequeño - la complicación será aumentada. Más (o es más pequeño) el tiempo era gastado a la posición de 2016 bloques anteriores, se disminuirá más (o se aumentará) la complicación.

Para la posición del bloque gesh debe ser menos de objetivo (el principio del trabajo proof-of-work). Gesh es el número casual de 0 hasta 2*256-1.

La complicación es declarada así, como si encontremos 2016 bloques anteriores con la periodicidad de las vez en 10 minutos.

El tiempo medio de la posición del bloque ajusta las cuentas solo por la fórmula: time = difficulty * 2 ** 32 / hashrate, donde difficulty es la complicación corriente de la red Bitcoin, hashrate esta cantidad de gesh, que su miner encuentra por segundo y time este tiempo medio (en los segundos) entre la posición por usted del bloque.