如何在沒有公鑰的情況下驗證現有的 Pay to Public Key Hash 交易?
這些是我的理解或假設。
簽署文件只需要密鑰和消息,如下所示
SignDocument(secret key, message) => signature
簽名驗證需要公鑰、簽名和消息如下
VerifySignature(signature, message , public key)
scriptPubKey 的目的是用於驗證 P2PKH 交易簽名的腳本。
很明顯,我們需要公鑰來驗證交易,但現有的交易數據沒有公鑰數據,只有公鑰的散列。
我可以很容易地理解 Pay to Public Key 交易,因為公鑰是交易數據的一部分。
如果公鑰沒有儲存在區塊鏈中,那麼如何在沒有公鑰的情況下驗證 P2PKH 交易?
<http://www.righto.com/2014/02/bitcoins-hard-way-using-raw-bitcoin.html>解釋了手動簽署交易,並幫助了我很多(在 Andreas 的線上可讀書籍“Mastering Bitcoin”旁邊) )。查看之前的範例 tx:https ://blockchain.info/rawtx/e46a88ed211c1ee7f34f0f4828611da52404c3282416ae1e3b7096f9dddc6c4e?format= hex 可以看到本節中的 sigscript:
483045022100B8E264B50017806D4095740E5523188C78884DCFCBA3AA7C1E608F28A1A763AF0220159680F7870BE5B46B6CD3110629AEAB221E6D658DD396AE319B071E0D2B3396015456E1021499EECC365ABA655BA
分解時,它看起來像這樣:
48: OP_DATA_0x48: push hex 48 (decimal 72) bytes on stack 30: OP_SEQUENCE_0x30: type tag indicating SEQUENCE, begin sigscript 45: OP_LENGTH_0x44: length of R + S 02: OP_INT_0x02: type tag INTEGER indicating length 21: OP_LENGTH_0x20: this is SIG R (33 Bytes) 00B8E264B5001780:6D4095740E552318 8C78884DCFCBA3AA:7C1E608F28A1A763 AF 02: OP_INT_0x02: type tag INTEGER indicating length 20: OP_LENGTH_0x20: this is SIG S (32 Bytes) 159680F7870BE5B4:6B6CD3110629AEAB 221E6D658DD396AE:319B071E0D2B3396 01: OP_SIGHASHALL: this terminates the ECDSA signature (ASN1-DER structure) 21: OP_DATA_0x21: length compressed Public Key (X9.63 form, 33 Bytes) 0214A307355361CC:5571154EEBA68E7F 4799F5520656E1AA:6BA5E80BA65C6AA1 90
OP_DATA_0x21 之後的最後一行是 pubkey,它允許驗證簽名。對應的比特幣地址為:1FNtjbmxmGyt3MvHpWjhoR4ztTabUox3vp。
這整個結構是交易“輸入”的一部分。這表明所有者擁有簽署 tx 的正確私鑰,因此他被允許使用資金。現在規範“Pay 2 Public Key Hash”是輸出相關的,也就是“資金應該去哪裡”。這是此交易中輸出結構的一部分。這個字元串:
76A914E1315C0FA59687EF4E035C184151CFCB096BE4EE88AC
可以分解為:
76: OP_DUP A9: OP_HASH160 14: OP_Data14 (= decimal 20) E1315C0FA59687EF:4E035C184151CFCB 096BE4EE 88: OP_EQUALVERIFY AC: OP_CHECKSIG This is a P2PKH script
在 OP_DATA_14 之後包含公鑰雜湊。你可以base58check編碼這個值,它返回這個比特幣地址:1MXiAjDmJzySYm6Re6vV3WgSP7rVc57LMh
所以回到你的問題(“如何在沒有公鑰的情況下驗證現有的 Pay to Public Key Hash 交易?”):我認為它的措辭不符合比特幣的邏輯。您必須通過簽名證明您能夠花費資金,這是在 tx 的輸入部分完成的。是的,因此您需要公鑰,並且此公鑰通常附加在簽名之後。措辭“p2pkh tx”指定了與輸出相關的資金支出方式。你也可以花在一個多重簽名上,甚至是一個智能合約交易上。這不會改變輸入/簽名/公鑰部分的規則。