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