scriptSig 和 scriptPubKey 之間有什麼關係?
場景:A 向 B 發送 1 BTC。
scriptSig出現在輸入腳本中。
scriptSig = <sig> <pubKey>
- 這裡,公鑰是發送者 A 的公鑰(這是對應於他的比特幣地址的公鑰,其中有一些未使用的交易)。
scriptSig 的 sig 部分是什麼?
腳本公鑰
scriptPubKey = OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
pubKeyHash = 接收者公鑰的雜湊值(在我們的例子中是 B)。
- 發送方(A)只有接收方(B)的比特幣地址,那麼他如何從他的比特幣地址中獲取 pubKeyHash?
現在,這是我到目前為止的理解:
- 輸入腳本攜帶有關發送者“先前交易”的資訊,並使用索引指向“先前交易”的適當“輸出”部分。前一筆交易的輸出是發件人 (A) 的總可用餘額,可以聲稱將比特幣發送給收件人 (B)。
- 此輸入腳本還用於驗證發送者 (A) 是否是先前交易的參考輸出中持有的比特幣的實際所有者。
- 輸出腳本告訴我們,發送者想要轉移多少比特幣給接收者,它還提到了接收者的比特幣地址。
問題:
- scriptSig 中的公鑰與 scriptPubKey 中的公鑰不同?
- 如果收件人不共享相同的公鑰,如何驗證發件人的簽名資訊?
- 我嘗試理解 wiki 上給出的範例,該範例顯示了腳本如何以基於堆棧的方式執行,但無法理解。
我還有一些問題,但我想我會用不同的問題問他們,而不是把它完全放在這裡。
謝謝。
首先,兩個匹配腳本用於兩個不同的交易,一個將資金轉移到一個地址(交易A),另一個花掉這些資金(交易B)。由
scriptPubKey
創建 Transaction A的使用者創建。它基本上將聲明條件添加到正在創建的輸出中。如果使用者可以證明他擁有輸出,則使用者只能聲稱並因此花費與輸出相關的比特幣。這就是交易B和交易
scriptSig
發揮作用的地方。假設使用者想在某處發送一些資金。他創建了一筆新交易,並向其中添加輸出,直到他有足夠的金額來支付所需的金額。現在他必須證明他擁有這些輸出,他通過提供聲明它們所需的輸出來做到這一點,即匹配地址的公鑰和匹配私鑰的簽名。交易A的發送者還不知道公鑰,但知道公鑰的散列,因為他知道他想發送到的地址。地址只不過是公鑰的散列。因此,發送方現在知道了將資金發送給接收方所需的一切。
當接收方想要再次花費資金時,他將輸入提供給
scriptPubKey
. 正如您所看到的,scriptPubKey
包括獲取推送到堆棧上的公鑰、複製它、對其進行散列並將其與輸出目的地的公鑰的散列進行比較。如果它們匹配,我們仍然在堆棧上同時擁有簽名和公鑰,用於OP_CHECKSIG
查看輸入是否附加了有效簽名。
我也有同樣的問題,並且花了很長時間試圖理解它並最終破解了它。
“發件人(A)只有收件人(B)的比特幣地址,那麼他如何從他的比特幣地址中獲取 pubKeyHash?”
關鍵是發件人 (A) 不需要從“他的”比特幣地址獲取 pubKeyHash,因為它不相關。(我也想知道同樣的事情!)
想想scriptPubKey首先發生。A 用 B 的比特幣地址代替
<pubKeyHash>
. 這就是 A 完成的工作。A 所說的是“1 BTC 現在屬於 B,但是……只有 B 可以證明他是 B 提供給我的比特幣地址的真正所有者”。現在從圖片中取出A。B 出現在他的錢包裡,他看到這 1 BTC 金額出現了。所以從技術上講,B“擁有”它。但是為了讓 B 消費,也就是發送給其他人,B 需要證明他給 A 的比特幣地址確實是他的。這就是scriptSig的用武之地。所以這
<sig> <pubKey>
是 B 的責任,B 無論如何都知道所有這些資訊。在閱讀了很多關於這方面的文章之後,開發者的文件解釋了它是最好的。<https://bitcoin.org/en/developer-guide#transactions>你只需要慢慢讀幾遍。
開發文件還回答了您的其他問題**“scriptSig 的 sig 部分是什麼?”**
… Bob 簽署的數據包括前一個交易的 txid 和輸出索引、前一個輸出的 pubkey 腳本、Bob 創建的讓下一個接收者花費此交易的輸出的 pubkey 腳本,以及要花費給下一個接收者的 satoshis 數量.