Почему подписанная транзакция включает поле «хэш»?

При подписании транзакции с помощью go-ethereumбиблиотеки результирующий объект выглядит примерно так:

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

Как я понимаю процесс проверки транзакции, так это то, что открытый ключ , хэш транзакции и значения r , s , v подписи используются для проверки того, что транзакция действительно была подписана закрытым ключом пользователя .

Чего я не могу понять, так это почему подписанный объект транзакции часто включает "hash"поле, например https://web3js.readthedocs.io/en/1.0/web3-eth.html#signtransaction

т.е. мое предположение состоит в том, что если вы проверяете предоставленный хэш, то на самом деле вы ничего не проверяете (хеш может быть скомпрометирован). Насколько я понимаю, вы всегда хотите хэшировать транзакцию самостоятельно, чтобы убедиться, что это действительно правильный хэш, подписанный закрытым ключом пользователя.

Что мне не хватает?

Ответы (1)

Это хэш всей транзакции (все, включая подпись). Он не используется для проверки (что делается с помощью подписи). Вместо этого он служит глобальным уникальным идентификатором транзакции, например, это то, что вы вводите в качестве параметра для получения:

web3.eth.getTransactionReceipt('txn-hash')
Конечно, это имеет смысл.