Как Биткойн проверяет подпись, если адреса хэшируются в одну сторону

Я застрял в понимании транзакций Биткойн. Итак, владелец должен подписать транзакцию своим закрытым ключом, тогда майнеры смогут проверить, соответствует ли эта подпись его открытому ключу. Однако открытый ключ хэшируется тремя функциями (RIPEMD160, SHA256 и Base58), и получить исходный открытый ключ ECDSA по адресу невозможно. Так как же на самом деле работает проверка транзакции?

Ответы (1)

Открытый ключ ECDSA «включен» в новую транзакцию (часть scriptSig).

Подробности

Это пример вывода транзакции (доступен только хэш открытого ключа):

"scriptPubKey": {
    "asm": "OP_DUP OP_HASH160 059be22aadc3bef6b673cb7a16247a0b7403d943 OP_EQUALVERIFY OP_CHECKSIG",
    "hex": "76a914059be22aadc3bef6b673cb7a16247a0b7403d94388ac",
    "reqSigs": 1,
    "type": "pubkeyhash",
    "addresses": [
      "mg2cQz9Y3ugyjfq8b2wTcW4veemgTBKxkX"
    ]
  }

Пубключ по указанному выше адресу 03788e5414ebec4a38032be706ae0c13870e320d916bb087ab7258fcf8c0111cbf(но он не виден в блокчейне до тех пор, пока вывод не будет потрачен. Его знает только получатель указанного выше вывода.)

Использование этого вывода в качестве ввода в более поздней транзакции приведет к:

"scriptSig": {
            "asm": "304402203b47249bfe6528dcf297c5888ad608a5c7227ea9f878df09a265c3318c1482e202204e8a8f17da505a6d20ceb4eb63fba2d8e2c5d0a792a0e280dcb18adeec68a05d[ALL]03788e5414ebec4a38032be706ae0c13870e320d916bb087ab7258fcf8c0111cbf",
            "hex": "47304402203b47249bfe6528dcf297c5888ad608a5c7227ea9f878df09a265c3318c1482e202204e8a8f17da505a6d20ceb4eb63fba2d8e2c5d0a792a0e280dcb18adeec68a05d012103788e5414ebec4a38032be706ae0c13870e320d916bb087ab7258fcf8c0111cbf"
          },
  • ( 3044... является подписью ECDSA в кодировке DER)
  • ( 03788... является публичным ключом)
Как это расшифровывается? Разве SHA256 не только в одну сторону?
SHA256 — это односторонняя хэш-функция. Да. Вы не можете декодировать хэш открытого ключа в открытый ключ. Только получатель монет имеет соответствующий открытый ключ (в своем кошельке). Не надо "декодировать".
Итак, означает ли это, что получатель обладает открытым ключом? Но это не объясняет, как другие люди не могут имитировать подпись отправителя, если его открытый ключ неизвестен...
Думаю, теперь я понимаю. Итак, для ввода ScriptSig содержит как нехешированный публичный ключ отправителя, так и подпись, а вывод содержит адрес получателя, верно?
Верно. Ввод = открыть публичный ключ (больше не актуально)
Выход = хеш (публичный ключ) (никто не знает, что открытый ключ ожидает получателя)