Transactions
為什麼地址不包含完整的 scriptPubKey?
這是一個普遍的問題,但讓我們假設一個 P2PKH 交易。P2PKH 地址以“1”開頭,發送者將其合併到 scriptPubKey 中:
OP_DUP OP_HASH160 <PublicKeyHash> OP_EQUALVERIFY OP_CHECKSIG
為什麼地址只包含
<PublicKeyHash>
ScriptPubKey 而不是包含腳本命令的完整 scriptPubKey?在目前場景下,錢包軟體需要辨識地址並自行組裝 scriptPubKey。如果將完整的腳本程式碼包含在地址中,錢包軟體就不必理解它,只需將 scriptPubKey 設置為等於地址中包含的任何內容。
在我看來,這對於未來類型的前向兼容性非常有用,其中不需要升級錢包軟體來理解一些新的交易形式。
這有幾個原因,一些是歷史原因,一些是最近的:
起初,地址可能並不打算涵蓋比特幣腳本可以做的所有事情。它們是收件人不線上的情況的備份(我們呼叫地址仍然是地址,因為它們最初是您連接到請求 a 的 IP 地址
scriptPubKey
)。因此,在引入它們時,關注尺寸可能比考慮靈活性更重要。請注意,地址有一個“版本字節”(用於升級格式,而不是用於辨識山寨幣)。後來,當 P2SH 被引入時,對靈活性的擔憂完全消失了:P2SH 允許在一個固定大小的地址中傳達*任何可花費性問題。*此外,它消除了發送者需要創建更大輸出的擔憂。我使用多重簽名錢包這一事實並不意味著您在發送給我時必須支付更高的費用。
當引入 SegWit 時,出於效率和安全性的原因,P2SH 不再足以對任何輸出進行編碼。儘管無論如何都需要一種新格式,但我們仍然選擇不提出可以編碼任意
scriptPubKey
s 的東西。BIP173 中給出的推理:
- **為什麼不為所有 scriptPubKeys 創建一個通用的地址格式?**這會導致對現有 scriptPubKey 類型地址的混淆。此外,如果曾經引入了與 scriptPubKeys 沒有一對一映射的地址(例如基於 ECDH 的地址),那麼擁有一個完全通用的舊地址類型將允許使用舊地址格式重新解釋生成的 scriptPubKeys,如果將比特幣發送給他們,就會導致資金損失。