Transactions

如何在沒有公鑰的情況下驗證現有的 Pay to Public Key Hash 交易?

  • November 7, 2017

這些是我的理解或假設。

簽署文件只需要密鑰和消息,如下所示

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”指定了與輸出相關的資金支出方式。你也可以花在一個多重簽名上,甚至是一個智能合約交易上。這不會改變輸入/簽名/公鑰部分的規則。

引用自:https://bitcoin.stackexchange.com/questions/62174