Was ist Kettenarbeit?

Wenn ich den RPC-Aufruf getBlockauf dem bitcoin-qt-Client ausführe, erhalte ich ein Feld mit dem Namen chainwork, das einen Hash enthält. Ich kann keine Informationen finden, worum es sich bei diesem Wert handelt.

Anfrage:

getblock 0000000000000000073dacdd0178da5158bd78c543fbc79bd0dacf56a2021bcc

Ergebnis:

{
"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"
}
Ich bin mir nicht sicher, ob es sich um das Kettenwerk oder um die beste Kette in den Protokolldateien von Bitcoin-qt handelt. Auf Bitcointalk heißt es, dass die Hex-Daten der besten Kette nur die ersten Bytes des Rohblocks sind. Ich habe überprüft, ob Chainwork die ersten Bytes des Blocks sind, aber es stimmt nicht überein. Auch die beste Kette ist nicht der Wert eines Blocks, sie definiert einen Block, während sich die Kette bei jedem Block ändert. Aber vielleicht ist es die Summe der Arbeit, die in diese Kette gesteckt wurde, ich werde das morgen überprüfen

Antworten (2)

Der Chainwork-Wert ist wirklich nur die Gesamtmenge an Arbeit in der Kette.

Es ist die Gesamtzahl der Hashes, die voraussichtlich erforderlich waren, um die aktuelle Kette zu erzeugen, in hexadezimaler Form.

Wenn Sie in Dezimalzahlen umwandeln, erhalten Sie 635262017308958427068157 0000000000000000000000000000000000000000000086859f7a841475b236fdoder 635262 Exahashes.

Bei den Hash-Raten vom Juni 2014 (100 Petahash/s) würde es nur 73 Tage dauern, um so viele Hashes durchzuführen, während es in Wirklichkeit über 5 Jahre dauerte. Die Hash-Rate ist jedoch so schnell gestiegen, dass die Auswirkungen von vor mehr als ein paar Monaten vernachlässigbar sind.

Ist dies die Anzahl der einzelnen Hashes oder die Anzahl der doppelten SHA-256-Hashes? Oder, anders gefragt, zählt doppeltes SHA-256-Hashing des Headers als ein einzelner Hash oder als zwei Hashes?
@ StephenM347 das spielt eigentlich keine Rolle, da das Kettenwerk nur zum Vergleich verschiedener Ketten verwendet wird. Aber in der Praxis wird eine doppelte SHA-256-Operation als 1 gezählt.

Pieters Antwort ist gut, der Chainwork-Wert ist der erwartete Arbeitsaufwand in der Kette, ausgedrückt als 32-Byte-Ganzzahl, für die doppelte SHA-256-Hash-Berechnungsarbeit.

Das Kettenwerk wird verwendet, um die richtige Kette zu identifizieren, der größte Kettenwerkwert bedeutet die stärkste oder die richtige Kette.

Übrigens war Satoshi anfangs nicht klar, dass die Auswahl der richtigen Kette durch einfaches Zählen von Blöcken einige extrem einfache Angriffe ermöglicht. Version 0.1 hat nur Blöcke gezählt. Deshalb steht auf dem Papier nur „am längsten“. Etwas später kam die Idee der „Kettenarbeit“ hinzu. Einzelheiten hierzu finden Sie hier .

Ich möchte nur einige Informationen darüber geben, wie dieser „Kettenwerk“-Wert zustande kommt , um besser oder tiefer zu verstehen, was es ist.

Werfen wir einen Blick auf den Header des Genesis-Blocks von Satoshi (Teil der zugehörigen Informationen):

$ bitcoin-cli getblockhash 0
000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f

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

Wie Sie oben sehen, hat der Genesis-Block eine Schwierigkeit von 1 und ein Kettenwerk von [0x01,0001,0001]. Wenn Sie eine Frage dazu haben, was eine „Schwierigkeit“ ist, können Sie sich diese Antwort ansehen . Also, das ist die richtige Definition:

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

Dann akkumulieren wir jedes Mal, wenn ein neuer Block generiert wird, einfach die Verkettung mit dem Feldwert „Schwierigkeit“ des neuen Blocks, aber denken Sie daran, dass wir für jede „1“-Schwierigkeit einen Verkettungsbetrag [0x01,0001,0001] hinzufügen.

Wenn die Blockchain wächst, wird die Schwierigkeit nach und nach zunehmen (oder manchmal leicht abnehmen).

Bevor sich die erste Schwierigkeitszeit änderte, hatte die Kettenblockhöhe 32255 erreicht.

$ bitcoin-cli getblockhash 32255
00000000984f962134a7291e3693075ae03e521f0ee33378ec30a334d860034b

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

Wie Sie oben sehen können, ist der Chainwork-Wert [0x7e00,0x7e00,0x7e00], was genau der Höhe [32255]+1 (für den Genesis-Block) mal [0x01,0001,0001] entspricht.

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

Dann werfen wir einen Blick auf Block 32256:

$ bitcoin-cli getblockhash 32256
000000004f2886a170adb7204cb0c7a824217dd24d11a74423d564c4e0904967

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

Bei Block 32256, weil die Schwierigkeit dann von 1,0 auf 1,182899534312841 steigt

 [chainwork value] = [previous chainwork value] + [difficulty] * [0x01,0001,0001]
 [0x7e01,acd4,2dd2] = [0x7e00,0x7e00,0x7e00] + [1.182899534312841] * [0x01,0001,0001]
Upvoted für zusätzliche Details.