Ich verstehe die Rolle, die die Nonce im Block-Header spielt, um einen Hash für einen gültigen Arbeitsnachweis zu berechnen.
Aber was ich frage, ist: Berücksichtigen wir die Nonce in der prevBlockHash
Berechnung des vorherigen Blocks, weil sie ja bereits im Blockkopf steht (für die Proof-of-Work-Berechnung) und es dumm wäre, eine calcPrevBlockHash
Funktion zu schreiben, die berechnet den Header des vorherigen Blocks durch Ignorieren der Nonce?
Oder gibt es eine bestimmte Sicherheitseigenschaft oder Zusicherung, die wir erhalten, wenn wir die Nonce in die prevBlockHash
Berechnung des nachfolgenden Blocks einbeziehen?
Sie könnten beispielsweise argumentieren, dass wir den Zeitstempel hashen, weil wir die Zeit erfassen möchten, zu der der Block generiert wurde. Siehe Antwort hier: Warum die Zeitstempelkomponente des Blockheaders? Ich denke, Sie können dasselbe für das Nonce-Feld argumentieren.
Aber ich behaupte, dass wir die Nonce immer noch im Block-Header haben könnten und sie nicht während der prevBlockHash
Berechnung des nachfolgenden Blocks hashen, und die Dinge würden immer noch funktionieren. Sie wären immer noch (a) in der Lage, diesen Block zu validieren, und (b) nicht in der Lage, mit den Transaktionen im Block herumzuspielen, da dies das hashMerkeRoot
Feld ändern und den Block somit ungültig machen würde.
Nach den Kommentaren denke ich, dass Ihre Frage auf Folgendes hinausläuft:
Könnten wir für das
prevBlockHash
Feld eines Block-Headers bei der Berechnung des Hashs des Headers des vorherigen Blocks dessen Nonce-Wert ausschließen?
Ich kann mir keine praktischen oder Sicherheitsprobleme vorstellen, die sich daraus ergeben würden. Ein Hash von allem außer der Nonce würde immer noch alle wichtigen Daten aus dem Block zertifizieren, einschließlich der darin enthaltenen Transaktionen, und seine eigenen prevBlockHash
, die alle vorherigen Blöcke als Referenz enthalten.
Es hätte jedoch keinen Sinn, dies zu tun. Wir müssen bereits den Hash des vorherigen Headers einschließlich der Nonce berechnen, um zu überprüfen, ob es sich um einen Proof-of-Work der entsprechenden Schwierigkeit handelt. Danach können wir diesen Wert genauso gut als "Block-ID" für alle Zwecke verwenden, einschließlich der prevBlockHash
. Die Berechnung eines anderen Hash-Werts, mit Ausnahme der Nonce, würde mehr Code, mehr Entwicklerzeit und mehr Rechenzeit erfordern; würde Potenzial für Fehler im Hash-Code selbst hinzufügen; und würde zu einer Menge potenzieller Verwirrung führen, wenn Leute versuchen, nachzuverfolgen, welcher Teil des Codes welchen Hash verwendet. All dies im Austausch für keinerlei Vorteil, soweit ich das beurteilen kann.
Ja, du hast Recht. Ohne die Nonce könnten wir immer noch gültige Blöcke generieren. Um jedoch einen anderen Hash zu erhalten, müssen wir die Eingabe für den Hash ändern. Die Eingabe für den Hash ist der Blockheader.
Wenn es keine Nonce gäbe, müssten wir für jeden Versuch etwas anderes am Blockheader ändern. Das würde nur den Zeitstempel oder die Merkle-Wurzel übrig lassen. Andere Header-Elemente sind festgelegt.
Der Zeitstempel ist eklig, weil wir möchten, dass er die tatsächliche Zeit anzeigt. Also müssten wir die Merkle-Wurzel ändern.
Die Merkle-Wurzel, die durch Hashing aller Transaktionen im Merkle-Baum, in dem sie aufgelistet sind, berechnet wird. Wenn wir zB die Coinbase oder die Reihenfolge der Transaktionen im Baum ändern, könnten wir auch eine andere Kombination zum Ausprobieren gewinnen. Aber dazu müssten wir die Merkle-Wurzel neu berechnen.
Stattdessen fügen wir direkt eine Nonce in den Header ein, die es uns ermöglicht, denselben Blockkandidaten für eine Reihe verschiedener Hashing-Versuche zu verwenden.
Daher wird die Nonce verwendet, um Zufälligkeit in den Blockheader einzuführen . Deshalb ist es
a) muss geändert werden und
b) muss im Blockheader stehen. ;)
prevBlockHash
(im nächsten Block) berücksichtigt werden muss.prevBlockHash
Hash beziehe, während Sie sich auf die Proof-of-Work-Hash-Berechnung beziehen. Ich frage nur, ob Dinge kaputt gehen würden (oder ob Sie eine wichtige Sicherheitseigenschaft verlieren würden), wenn Sie eine calcPrevHash
Funktion schreiben würden, die das Nonce-Feld ignoriert. Ich habe die Frage noch einmal umgeschrieben, um dies klarer zu machen.
Jestin
Kostas
Nate Eldredge
Kostas
Nate Eldredge
Kostas
prevBlockHash
.Kostas
prevBlockHash
Hash aufnehmen müssen? Oder ist es so etwas wie: "Nun, es ist Teil des Headers, weil wir es dort brauchen, um den Proof-of-Work zu berechnen. Wir müssen es eigentlich nicht einbeziehen, wenn wir dasprevBlockHash
Ding machen (bekommen wir nicht keine zusätzlichen Garantien), aber es wäre übertrieben, einecalcPrevBlockHash
Funktion zu programmieren, die das Feld ignoriertnonce
, also schließen wir es einfach auch in unsereprevBlockHash
Berechnung ein."Nate Eldredge
Kostas
hashBlockHeader()
verwenden Sie für die Proof-of-Work-Berechnung und dieprevBlockHash
Berechnung jetzt. (Hinweis: erfundene Funktionsnamen.) Ich frage mich nur: Wenn SieprevBlockHash
mit einercalcPrevBlockHash()
Funktion rechnen würden, die das Nonce-Feld ignoriert, würde das irgendetwas kaputt machen? Würden Sie alle Sicherheitseigenschaften verlieren, die Sie derzeit haben würden?Kostas