Wie berechnet man in Getwork den Wert von Hash1?

(Ich weiß, dass hash1 und midstate irgendwann veraltet sein werden, aber ich bin ein wenig neugierig auf sie)

In Getwork gibt es ein Feld hash1. Von einem Beispielaufruf an Bitcoin erhielt ich seinen Wert als:

'hash1': '00000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000010000'

Wie genau wird der Wert von hash1 berechnet?

Warum werden sie "irgendwann veraltet sein"?
@Geremia, da die Informationen wirklich überflüssig sind - das können Sie selbst berechnen.

Antworten (1)

hash1 ist eine uint256-Null, die von FormatHashBlocks() in main.cpp auf ein Vielfaches von 64 Bytes aufgefüllt und dann in 4-Byte-Blöcken umgekehrt wird.

FormatHashBlocks() setzt direkt nach den 32 Null-Bytes ein 0x80 und am Ende eine 4-Byte-Bitanzahl (00 00 01 00, was 256 Bits bedeutet).

the uint256 zero is:
0000000000000000 0000000000000000 0000000000000000 0000000000000000

it's padded to 64 bytes:
0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000
                                                                    ^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^
has the 80 in the first byte of padding:
0000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000
                                                                    ^^
and the length at the end:
0000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000100
                                                                                                                               ^^^^^^^^
and then has each group of 4 bytes reversed: 12 34 56 78 -> 78 56 34 12
0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000008000000000 0000000000000000 0000000000000000 0000000000010000
                                                                    ^^^^^^^^                                                   ^^^^^^^^

Eine bessere Frage könnte lauten: "Warum wird der Wert von hash1 so berechnet?"

Sie haben nicht gefragt, aber das datavon zurückgegebene Feld getworkist genauso formatiert. Anstelle einer uint256-Null lautet die Eingabe jedoch:

  • Version (4 Bytes)
  • Hash des vorherigen Blocks (32 Bytes)
  • Merkle-Wurzel (32 Bytes)
  • Zeit (4 Bytes)
  • Bits (bezogen auf die Schwierigkeit) (4 Bytes)
  • Einmal (4 Bytes)

Das sind insgesamt 80 Bytes, die von FormatHashBlocks() auf 128 Bytes aufgefüllt werden.

Beispiel:

00000001 (version)
0863bcb701d52fea 0e0c7b0d4696d7e7 8feb125a84e0911b 0000043e00000000 (prev hash)
bc656fe91e44907c 32d1704f900bd7a6 c2fa06386174477f a8b145addebc8d00 (merkle root)
4f35dde3 (time)
1a0c290b (bits)
00000000 (nonce)
0000008000000000 0000000000000000 0000000000000000 } (padding)
0000000000000000 0000000000000000 0000000080020000 } (80 bytes = 640 bits = 0x280)
Es ist also immer 000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000 00000 00000 Interessant...
Ja. Recht. Das ist es.