Si ejecuto la llamada RPC getBlock
en el cliente bitcoin-qt, me da un campo llamado chainwork
que 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"
}
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 0000000000000000000000000000000000000000000086859f7a841475b236fd
a 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.
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]
tim s
dennis kriechel