Warum enthält eine signierte Transaktion ein „Hash“-Feld?

Beim Signieren einer Transaktion mit der go-ethereumBibliothek sieht das resultierende Objekt etwa so aus:

"tx": {
        "nonce": "0x7",
        "gasPrice": "0x77359400",
        "gas": "0x5208",
        "to": "0x9ea773969b2622a0a361fd137b088f90f88bd82f",
        "value": "0x7a120",
        "input": "0x",
        "v": "0x47a",
        "r": "0x1944717416cde8sa47ed607325bfb85a40618da4a6dab9c6e1636609612deddd",
        "s": "0x5480b689ffbab6o7dc58ae5d04369c3841a4fcbc95edecf7cf8608b9bf818e9c",
        "hash": "0x997d39754493fee0581985667s89874a83c8d93b29e0e8802831781b140b87d2"
    }

Ich verstehe den Transaktionsverifizierungsprozess so, dass der öffentliche Schlüssel , der Hash der Transaktion und die r- , s- , v - Werte der Signatur verwendet werden, um zu überprüfen, ob die Transaktion tatsächlich vom privaten Schlüssel des Benutzers signiert wurde .

Was ich anscheinend nicht verstehe, ist, warum das signierte Transaktionsobjekt oft ein "hash"Feld enthält, z. B. https://web3js.readthedocs.io/en/1.0/web3-eth.html#signtransaction

dh meine Vermutung wäre, dass Sie, wenn Sie sich gegen den bereitgestellten Hash wehren, nichts wirklich wehren (der Hash könnte kompromittiert sein). Mein Verständnis ist, dass Sie die Transaktion immer selbst hashen möchten, um zu überprüfen, ob dies tatsächlich der richtige Hash ist, der mit dem privaten Schlüssel des Benutzers signiert wurde.

Was vermisse ich?

Antworten (1)

Das ist der Hash der gesamten Transaktion (alles einschließlich der Signatur). Es wird nicht zur Verifizierung verwendet (was durch die Signatur erfolgt). Stattdessen dient es als globale eindeutige Kennung einer Transaktion, z. B. das, was Sie als Parameter eingeben, um Folgendes zu erhalten:

web3.eth.getTransactionReceipt('txn-hash')
Das macht natürlich Sinn.