交易延展性 (Transaction Malleability)
當(dāng)交易被簽名時(shí),簽名并沒有覆蓋交易中所有的數(shù)據(jù) (比如位于 txin 中的 scriptSig,由于 scriptSig 中包含公鑰和簽名數(shù)據(jù),不可能對(duì)自身自簽名),而交易中所有的數(shù)據(jù)又會(huì)被用來(lái)生成交易的哈希值來(lái)作為該交易的唯一標(biāo)示。如此,盡管不常見的,比特幣網(wǎng)絡(luò)中的一個(gè)節(jié)點(diǎn)能夠改變你發(fā)送的交易 (通過改變 txin 中的簽名(橢圓曲線算法中可能存在兩個(gè)有效的簽名等原因),導(dǎo)致該交易的哈希值發(fā)生變化。
注意,攻擊者僅僅能夠改變?cè)摴V担灰字械?txout 是無(wú)法進(jìn)行改變的,因此比特幣最終也許會(huì)轉(zhuǎn)入你原本打算的地址中。然而,這確實(shí)意味著,例如,在任何情況下,接收一系列未確認(rèn)交易的鏈?zhǔn)遣话踩?,因?yàn)槲创_認(rèn)交易的哈希值可能會(huì)發(fā)生變化,而隨后的交易中的 txin 會(huì)依賴于先前交易的哈希值。即使交易得到了一個(gè)確認(rèn),也是不安全的,因?yàn)閰^(qū)塊鏈可能會(huì)被重新調(diào)整。此外,客戶端必須一直掃描收到的交易,假定一個(gè) txout 是存在的,因?yàn)橄惹皠?chuàng)建該筆交易的客戶端可能是不安全的 (可能會(huì)發(fā)兩筆同樣 txout 的交易)。
簽名延展性 (Signature Malleability)
延展性的第一種形式就是簽名本身。每一個(gè)簽名恰好有一個(gè) DER-encoded ASN.1 octet representation,但是 OpenSSL 并沒有強(qiáng)制,只要一筆簽名沒有極度的改變,它就是可接受的。此外,對(duì)于每一個(gè) ECDSA signature(r,s),這個(gè) signature(r,-s(mod N)) 是相同消息的一個(gè)有效簽名。
在 363742 區(qū)塊高度處,BIP66 軟分叉強(qiáng)制區(qū)塊鏈中所有新交易遵循 DER-encoded ASN.1 標(biāo)準(zhǔn)。仍然需要進(jìn)一步的努力來(lái)關(guān)閉 DER 簽名其它可能的延展性問題。
簽名仍然是可以被擁有相應(yīng)私鑰的人改變的。
解鎖腳本延展性 (scriptSig Malleability)
比特幣中使用的簽名算法沒有簽署 scriptSig 中的任何數(shù)據(jù)。因?yàn)閷?duì)整個(gè) scriptSig 簽名是不可能的,scriptSig 包含簽名本身。這意味著,附件的數(shù)據(jù)能被添加到 scriptSig 中,額外的數(shù)據(jù)會(huì)先于所需的簽名和公鑰壓入棧中。類似的 OP_DROP 能被添加,使得最終棧的狀態(tài)與 scriptPubKey 執(zhí)行之前的狀態(tài)相同。
阻止 scriptSig 延展性正在被考慮當(dāng)中。目前,如果交易 txin 的 scriptSig 中若包含除了簽名與公鑰之外其它數(shù)據(jù),則該交易被認(rèn)為是不標(biāo)準(zhǔn)的,不會(huì)被節(jié)點(diǎn)轉(zhuǎn)發(fā)。最終,這個(gè)規(guī)則會(huì)強(qiáng)制在 scriptPubKey 執(zhí)行完之后,棧中只剩下一個(gè)元素。然而,要做到這樣,需要比特幣隨后的擴(kuò)展。
隔離驗(yàn)證 (segregated witness) 通過將 scriptSig 從交易的 txin 中分離出來(lái),放入到一個(gè)新添加的 witness 字段中,來(lái)解決相關(guān)延展性問題,由于簽名數(shù)據(jù)從交易中分離出來(lái),使得交易結(jié)構(gòu)尺寸變小,可以使得區(qū)塊能容納更多的交易,側(cè)面達(dá)到了輕微擴(kuò)容的目的,有關(guān)隔離驗(yàn)證的知識(shí),請(qǐng) goolge BIP 141-145。https://github.com/bitcoin/bips
------------------