定義
隔離驗證勺良,又稱隔離見證(segregated witness)是由Bitcoin Core(比特幣核心軟件)維護(hù)者之一Pieter Wuille提出的比特幣擴(kuò)展性方案,簡單來講尚困,這種方案就是通過改變比特幣交易結(jié)構(gòu)的方式蠢箩,將交易中簽名的部分單獨(dú)拿出來谬泌,放到另一個叫 witness 的結(jié)構(gòu)當(dāng)中掌实。
比特幣交易數(shù)據(jù)結(jié)構(gòu)是:
TxIn+交易簽名+TxOut
交易ID計算公式:TxId=hash(TxIn+交易簽名+TxOut)
現(xiàn)在的問題是贱鼻,簽名為什么要在這里宴卖,在這里有什么好處?
答案是:中本聰是這么設(shè)計的父丰,所以簽名在這里肝谭。好處嘛,沒什么好處蛾扇,不止是沒有好處攘烛,缺點(diǎn)卻還不少。
1镀首、由于這種設(shè)計医寿,比特幣的交易結(jié)構(gòu)中就憑空的隱藏了不少“秘籍”,比如說:未簽名交易其實就是用了另一個叫 ScriptPubKey 的內(nèi)容蘑斧,先占據(jù)著簽名所需的位置,然后對這個未簽名的交易做簽名须眷,再把簽名的結(jié)果替換進(jìn)去竖瘾。這其實是很麻煩的一件事,既不容易說清楚花颗,也很難用代碼去實現(xiàn)捕传。當(dāng)一個交易中有多個輸入(TxIn)的時候,又要有一套“秘籍”來依次準(zhǔn)備未簽名交易扩劝,依次把簽名替換回去庸论;而當(dāng)一個交易中又涉及到多重簽名的交易時,則有需要另一套約定好的規(guī)則來準(zhǔn)備未簽名交易棒呛,再進(jìn)行簽名后的數(shù)據(jù)替換工作聂示;如果一個交易既涉及多個輸入,又涉及多重簽名呢簇秒?那就是秘籍套秘籍鱼喉,反正是麻煩的要死;有興趣且有能力的童鞋們不妨去翻翻比特幣協(xié)議在各種語言中的實現(xiàn)部分趋观,就會發(fā)現(xiàn)扛禽,無論是 C++、Java皱坛、Python 等語言所編寫的比特幣協(xié)議庫编曼,通常都需要寫非常多的、混亂不堪的代碼來做上述的交易數(shù)據(jù)構(gòu)造工作剩辟,很頭疼掐场,寫過的都懂往扔。
2、將簽名放在交易結(jié)構(gòu)中刻肄,由于簽名的可塑性瓤球,使得交易也就有了可塑性,比如說敏弃,很早以前我就給大家講過的因為橢圓曲線的對稱性卦羡,s和s’都是能被驗證通過的簽名,這種情況下麦到,任何接收到你所廣播的交易的節(jié)點(diǎn)绿饵,都有能力用s’來替換掉s,然后重新廣播瓶颠,重新廣播的交易其實有著相同的內(nèi)容(輸入 TxIn 和輸出 TxOut)拟赊,但卻有著不同的 tx_id (tx_hash),這樣就能達(dá)到混淆視聽的目的粹淋,甚至影響到一些比特幣企業(yè)(如交易所)的服務(wù)吸祟。交易延展性不會直接導(dǎo)致您丟幣,但會影響到個人和企業(yè)對于比特幣交易狀態(tài)的判斷桃移,進(jìn)而可能導(dǎo)致可能出現(xiàn)的資產(chǎn)管理風(fēng)險屋匕。之前,bitcoin-core 在 BIP62 中進(jìn)行過一些試圖努力解決交易延展性問題的嘗試借杰,但從某種意義上來講过吻,交易延展性其實是無法徹底根治的,至少私鑰擁有者可以重新生成一個簽名蔗衡,交易不變但簽名變了纤虽,最終的 tx_id 也就變了,這種情形應(yīng)用于多重簽名的場合绞惦,甚至可能會影響到其它鑰匙的持有人對于交易的判斷逼纸,導(dǎo)致一些潛在的資產(chǎn)風(fēng)險,在當(dāng)前的交易結(jié)構(gòu)下济蝉,我們是無法徹底杜絕這種情況的發(fā)生的樊展;
3、當(dāng)我們需要對交易進(jìn)行簽名時堆生,對每個 TxIn 進(jìn)行簽署的 hash 都是不同的(參見上述的“秘籍”)专缠,所以對于“冷錢包”這種離線簽名的實現(xiàn)方式其實增加了很大的難度,無論是數(shù)據(jù)結(jié)構(gòu)還是代碼的層面淑仆;
也就是說涝婉,將簽名放在交易內(nèi)容中其實沒有任何好處,反而增加的結(jié)構(gòu)的復(fù)雜度和交易延展性的風(fēng)險蔗怠,這顯然是得不償失的墩弯。
那么吩跋,最合理的交易結(jié)構(gòu)到底應(yīng)該是什么樣子的呢?其實很簡單:
TxIns + TxOuts [簽名]
隔離驗證前后比特幣交易結(jié)構(gòu)對比
隔離驗證其實就是把原來的比特幣交易中簽名的部分單獨(dú)拿出來放到另一個叫 witness 的結(jié)構(gòu)中渔工,實現(xiàn)交易ID僅僅與交易內(nèi)容有關(guān)锌钮,解決了同一交易,會有不同ID問題引矩,隔離驗證實施后梁丘,交易ID算法變?yōu)?TxId=hash(TxIn+TxOut) 。
簽名就是要用來進(jìn)行“驗證”的數(shù)據(jù)旺韭,放在另一個地方就是要“隔離”出來氛谜,所以給這件事情起名為“隔離驗證”也就再合理不過的了。
隔離驗證的好處
交易是交易区端,簽名是簽名值漫,對于交易來說,只關(guān)心 TxIn 和 TxOut 就好了织盼,我們都清楚一個比特幣交易其實就是花一筆之前收到的錢杨何,也就是說要用之前收到的 TxOut 作為這一筆交易的 TxIn 然后發(fā)給后續(xù)的 TxOut,隔離之后的交易結(jié)構(gòu)使得當(dāng)您決定好花哪一筆錢沥邻、要花給誰的時候危虱,交易的內(nèi)容就已經(jīng)是確定了的,交易的數(shù)據(jù)就不會再發(fā)生改變了谋国,最終的 tx_id 也就是不變的了。想要驗證簽名迁沫?那就去 witness 里找到對應(yīng)的簽名數(shù)據(jù)驗證一下合法性即可芦瘾,又簡單、有沒有交易延展性的問題集畅。
總結(jié)
隔離驗證其實是對之前不太合理的比特幣交易結(jié)構(gòu)的一次優(yōu)化近弟,開發(fā)者們試圖用一種影響盡可能小的、盡可能向下兼容的挺智、“軟分叉”的方式來實現(xiàn)祷愉,這種改進(jìn)本身(就像是“壓縮格式的公鑰”一樣)是非常合理的,與塊大小之爭沒什么直接的關(guān)系赦颇。
參考資料:
請關(guān)注我的微博:瑞波支付
加入我的QQ群:56937187
我的數(shù)字貨幣小密圈邀請鏈接二鳄,http://t.xiaomiquan.com/N7UNvRV
或者微信掃描小密圈二維碼加入