¿Qué es el trabajo en cadena?

Si ejecuto la llamada RPC getBlocken el cliente bitcoin-qt, me da un campo llamado chainworkque contiene un hash. No puedo encontrar ninguna información de qué se trata este valor.

Solicitud:

getblock 0000000000000000073dacdd0178da5158bd78c543fbc79bd0dacf56a2021bcc

Resultado:

{
"hash" : "0000000000000000073dacdd0178da5158bd78c543fbc79bd0dacf56a2021bcc",
"confirmations" : 1,
"size" : 182400,
"height" : 304962,
"version" : 2,
"merkleroot" : "b144b39759d4669cb92ca8b9084d68d1f05f1e28e16887bf062f37e3b5f79fd2",
"tx" : [
"3edc72d280edd0a7719670a5f0c97e8991a5bcfcfcfa77620969643f04d021a3",
"841840f8a7863c8fb99e26975d45ff9151b0a5f021fb479aa9ff91a138d3cd3f",
"a01af3f203313cdab4e8977cd2dccbd416872c9d9f76968fc7009f47ad630199"
],
"time" : 1402334610,
"nonce" : 2351732739,
"bits" : "185d859a",
"difficulty" : 11756551916.90395200,
"chainwork" : "0000000000000000000000000000000000000000000086859f7a841475b236fd",
"previousblockhash" : "000000000000000031132699bcb917e7e6ce3cc6cce1f20b6ad36a437436c821"
}
No estoy seguro si se trata de la cadena o de la mejor cadena en los archivos de registro de bitcoin-qt. En bitcointalk dice que los datos hexadecimales de la mejor cadena son solo los primeros bytes del bloque sin formato. Verifiqué si el trabajo en cadena son los primeros bytes del bloque, pero no coincide. Además, la mejor cadena no es el valor de un bloque, define un bloque mientras que el trabajo en cadena cambia en cada bloque. Pero tal vez sea la suma del trabajo puesto en esta cadena, lo comprobaré mañana.

Respuestas (2)

El valor del trabajo en cadena es realmente solo la cantidad total de trabajo en la cadena.

Es el número total de hashes que se espera que hayan sido necesarios para producir la cadena actual, en hexadecimal.

Convirtiendo 0000000000000000000000000000000000000000000086859f7a841475b236fda decimal, obtienes 635262017308958427068157, o 635262 exahashes.

A las tasas de hash de junio de 2014 (100 petahash/s), solo se necesitarían 73 días para realizar esa cantidad de hash, mientras que en realidad tomó más de 5 años. Sin embargo, la tasa de hash ha aumentado tan rápido que el impacto de hace más de unos meses es insignificante.

¿Es este el número de hashes simples o el número de hashes SHA-256 dobles? O, preguntado de otra manera, ¿el hash SHA-256 doble del encabezado cuenta como un solo hash o dos hash?
@ StephenM347 eso en realidad no importa, ya que la cadena solo se usa para comparar diferentes cadenas. Pero en la práctica, una operación SHA-256 doble se cuenta como 1.

La respuesta de Pieter es buena, el valor de la cadena es la cantidad de trabajo esperada en la cadena, expresada como un número entero de 32 bytes, para el trabajo de cálculo de hash SHA-256 doble.

La cadena se utiliza para identificar la cadena correcta, el valor de cadena más grande significa la cadena más fuerte o correcta.

Por cierto, Satoshi inicialmente no se dio cuenta de que elegir la cadena correcta con solo contar bloques permite algunos ataques extremadamente fáciles. La versión 0.1 acaba de contar bloques. Es por eso que el papel solo dice "el más largo". La idea de "trabajo en cadena" se agregó un poco más tarde. Para más detalles sobre esto, consulte aquí .

Solo quiero brindar información sobre cómo surge este valor de 'cadena' , para una mejor o más profunda comprensión de lo que es.

Echemos un vistazo al encabezado del bloque de génesis de Satoshi (parte de la información relacionada):

$ bitcoin-cli getblockhash 0
000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f

$ bitcoin-cli getblockheader 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
{
  ...
  "height": 0,
  ...
  "bits": "1d00ffff",
  "difficulty": 1,
  "chainwork": "0000000000000000000000000000000000000000000000000000000100010001",
  ...
}

Como puede ver arriba, el bloque de génesis tiene una dificultad de '1' y una cadena [0x01,0001,0001] . Si tienes alguna duda sobre qué es una 'dificultad', puedes echarle un vistazo a esta respuesta . Entonces, esa es la definición correcta:

difficulty '1' = chainwork amount [0x01,0001,0001]

Luego, cada vez que se genera un nuevo bloque, solo acumulamos la cadena con el valor de campo de 'dificultad' del nuevo bloque, pero recuerda que para cada dificultad '1' agregamos una cantidad de cadena [0x01,0001,0001].

A medida que crece la cadena de bloques, la dificultad aumentará (oa veces disminuirá ligeramente) poco a poco.

Antes de que cambiara el primer tiempo de dificultad, la altura del bloque de la cadena había llegado a 32255.

$ bitcoin-cli getblockhash 32255
00000000984f962134a7291e3693075ae03e521f0ee33378ec30a334d860034b

$ bitcoin-cli getblockheader 00000000984f962134a7291e3693075ae03e521f0ee33378ec30a334d860034b
{
  ...
  "height": 32255,
  ...
  "bits": "1d00ffff",
  "difficulty": 1,
  "chainwork": "00000000000000000000000000000000000000000000000000007e007e007e00”,
  ...
}

Como puede ver arriba, el valor de la cadena es [0x7e00,0x7e00,0x7e00], que es exactamente la altura [32255]+1 (para el bloque de génesis) multiplicada por [0x01,0001,0001].

[0x7e00,0x7e00,0x7e00] = 32256 * [1.0] * [0x01,0001,0001]

Entonces echemos un vistazo al bloque 32256:

$ bitcoin-cli getblockhash 32256
000000004f2886a170adb7204cb0c7a824217dd24d11a74423d564c4e0904967

$ bitcoin-cli getblockheader 000000004f2886a170adb7204cb0c7a824217dd24d11a74423d564c4e0904967
{
  ...
  "height": 32256,
  ...
  "bits": "1d00d86a",
  "difficulty": 1.182899534312841,
  "chainwork": "00000000000000000000000000000000000000000000000000007e01acd42dd2”,
  ...
}

En el bloque 32256, porque la dificultad aumentó de 1.0 a 1.182899534312841, entonces

 [chainwork value] = [previous chainwork value] + [difficulty] * [0x01,0001,0001]
 [0x7e01,acd4,2dd2] = [0x7e00,0x7e00,0x7e00] + [1.182899534312841] * [0x01,0001,0001]
Upvoted para detalles adicionales.