Signature
你只簽署交易的前一個輸出嗎?
我需要確認我了解交易在比特幣網路中的運作方式。好的,所以:
- Alice 是一個網路節點。Alice 想將比特幣發送給網路中的某個人。Alice 正在使用她的錢包創建交易。
- 每筆交易都有輸入和輸出。每筆交易的輸入只是對以前向 Alice 地址發送資金的其他一些較舊交易的一些先前輸出的引用。
- 為了發送比特幣,Alice 需要通過使用她的錢包在進行交易時生成的她來解決
scriptPubKey
先前交易輸出中給出的難題。scriptSig
基本上,愛麗絲只需要通過簽署新交易來證明她控制著私鑰(與以前發送比特幣的地址有關)。我做對了這些步驟嗎?
我在探索時開始感到困惑,
hash type
因為我看到很多句子說交易的輸出是正確簽名的。根據我的理解(從上面),我假設先前的輸出已正確簽名?因此,新交易的輸入被認為是有效的。但我找不到對此的確認。我錯過了什麼嗎?謝謝!
在創建比特幣交易時,每個輸入都明確說明消耗了哪些未使用的**交易輸出 (UTXO)(通過由 對於標準輸出格式,這樣的證明是由與先前鎖定資金的公鑰對應的私鑰創建的簽名。我認為實際上不清楚的是簽名到底在簽名什麼。
txid:vout
想像自己簽了一份契約。在契約上簽名表明您已完全理解並同意該契約。簽名並不意味著脫離契約的上下文,當然也不應該被困在另一份契約上。
同樣,比特幣交易的簽名送出到交易的特定上下文!如果簽名只是在沒有上下文的情況下對輸入進行簽名,則攻擊者可以從未經確認的交易中獲取大量輸入,並將它們重新組合成交易,支付給攻擊者自己。
幸運的是,在比特幣中,我們實際上可以強制簽名在脫離上下文時是無效的。每個簽名都送出完整的交易指令集,即哪些 UTXO 在輸入中花費,哪些 UXTO 在輸出中創建以及交易的元資訊。(顯然,一個簽名不能送出給其他輸入的簽名,因為這會導致無法解析的遞歸。)這種對交易結構的承諾稱為sigHash。預設情況下,將使用簽名類型(或“sigHash 標誌”)從整個交易建構 sigHash
SIGHASH_ALL
。@darosior 簡要介紹了其他 sighash 標誌,但您可以在(Raghav Sood 關於所有類型的 sighash 標誌的文章)中閱讀更多相關資訊。