比特幣 P2PKH 交易 - 兩個問題
嘗試在這裡學習比特幣標準交易腳本的基礎知識。對於 Alice 向 Bob 發送硬幣的交易,Bob 現在正在嘗試贖回它們,我們有連接的 scriptSig 和 scriptPubKey 如下
<Sig> <PubKey> OP_DUP OP_HASH160 <PubkeyHash> OP_EQUALVERIFY OP_CHECKSIG
當我們說收件人必須指定
PubKey
andSig
in 時scriptSig
,到底是什麼Sig
?我的理解是 Bob 正在用他的私鑰簽署整個交易,然後這就是OP_CHECKSIG
驗證。在這種情況下,輸入OP_CHECKSIG
是交易數據和公鑰。請讓我知道這是否正確,如果不正確,那麼究竟OP_CHECKSIG
需要什麼輸入?其次,檢查
scriptSig
’sPubKey
和之間匹配的腳本的第一部分有什麼意義scriptPubKey
?難道我們不能得到一個更簡單的腳本,其中交易的輸出指定公鑰本身而不是公鑰的散列嗎?在這種情況下,我們只需
<Sig> <PubKey> OP_CHECKSIG
,
Sig
Bob 和PubKey
Alice從哪裡來。
簽名是使用私鑰和消息在數學上生成的,但不是消息本身(它在簽名過程中使用消息的雜湊,消息不能僅從簽名中恢復)。它只是一個值(具體來說,它是 2 個數字,稱為 r 和 s),可以根據公鑰和消息驗證它是否是有效的簽名。在這種情況下,消息是交易數據,它也保護交易不被修改,因為如果它被修改,簽名將變得無效。如果您有興趣,可以在此處閱讀有關橢圓曲線數字簽名算法 (ECDSA)的資訊。
事實上,可以只使用公鑰而不使用散列步驟,這被稱為 Pay to Public Key,P2PK,也是一種可接受的輸出類型。但請注意,比特幣地址本身並不是公鑰。要創建這種類型的輸出,發送者必須知道公鑰才能將其放入輸出中。從比特幣地址獲取公鑰是不可能的,因為該地址是該公鑰的散列,以使其更短且更易於通用,因此是非內射陷門函式。