比特幣中交易延展性問題
交易延展性 (Transaction Malleability)
當交易被簽名時,簽名並沒有覆蓋交易中所有的資料 (比如位於 txin 中的 scriptSig,由於 scriptSig 中包含公鑰和簽名資料,不可能對自身自簽名),而交易中所有的資料又會被用來生成交易的雜湊值來作為該交易的唯一標示。如此,儘管不常見的,比特幣網路中的一個節點能夠改變你傳送的交易 (通過改變 txin 中的簽名(橢圓曲線演算法中可能存在兩個有效的簽名等原因),導致該交易的雜湊值發生變化。
注意,攻擊者僅僅能夠改變該雜湊值,交易中的 txout 是無法進行改變的,因此比特幣最終也許會轉入你原本打算的地址中。然而,這確實意味著,例如,在任何情況下,接收一系列未確認交易的鏈是不安全的,因為未確認交易的雜湊值可能會發生變化,而隨後的交易中的 txin 會依賴於先前交易的雜湊值。即使交易得到了一個確認,也是不安全的,因為區塊鏈可能會被重新調整。此外,客戶端必須一直掃描收到的交易,假定一個 txout 是存在的,因為先前建立該筆交易的客戶端可能是不安全的 (可能會發兩筆同樣 txout 的交易)
簽名延展性 (Signature Malleability)
延展性的第一種形式就是簽名本身。每一個簽名恰好有一個 DER-encoded ASN.1 octet representation,但是 OpenSSL 並沒有強制,只要一筆簽名沒有極度的改變,它就是可接受的。此外,對於每一個 ECDSA signature(r,s),這個 signature(r,-s(mod N)) 是相同訊息的一個有效簽名。
在 363742 區塊高度處,BIP66 軟分叉強制區塊鏈中所有新交易遵循 DER-encoded ASN.1 標準。仍然需要進一步的努力來關閉 DER 簽名其它可能的延展性問題。
簽名仍然是可以被擁有相應私鑰的人改變的。
解鎖指令碼延展性 (scriptSig Malleability)
比特幣中使用的簽名演算法沒有簽署 scriptSig 中的任何資料。因為對整個 scriptSig 簽名是不可能的,scriptSig 包含簽名本身。這意味著,附件的資料能被新增到 scriptSig 中,額外的資料會先於所需的簽名和公鑰壓入棧中。類似的 OP_DROP 能被新增,使得最終棧的狀態與 scriptPubKey 執行之前的狀態相同。
阻止 scriptSig 延展性正在被考慮當中。目前,如果交易 txin 的 scriptSig 中若包含除了簽名與公鑰之外其它資料,則該交易被認為是不標準的,不會被節點轉發。最終,這個規則會強制在 scriptPubKey 執行完之後,棧中只剩下一個元素。然而,要做到這樣,需要比特幣隨後的擴充套件。
隔離驗證 (segregated witness) 通過將 scriptSig 從交易的 txin 中分離出來,放入到一個新新增的 witness 欄位中,來解決相關延展性問題,由於簽名資料從交易中分離出來,使得交易結構尺寸變小,可以使得區塊能容納更多的交易,側面達到了輕微擴容的目的,有關隔離驗證的知識,請 goolge BIP 141-145。 +