隔離驗(yàn)證是如何改善比特幣性能表現(xiàn)的
如果說(shuō)2015年在香港舉行的“比特幣擴(kuò)容研討會(huì)”上最令人興奮的提議,那毋庸置疑是開(kāi)發(fā)者Pieter Wuille博士提出的隔離驗(yàn)證(Segregated Witness)。這個(gè)提議受到技術(shù)界人士的好評(píng),隔離驗(yàn)證有望能改善比特幣的性能表現(xiàn),而有些人甚至希望它能提供一種擴(kuò)容的解決方案,幫助比特幣社區(qū)恢復(fù)一定的和諧。
什么是比特幣交易?
為了更好理解隔離驗(yàn)證,最好先了解技術(shù)層面上的比特幣交易。(如果你對(duì)這方面并不陌生,可以直接跳到本文的最后一部分。)
對(duì)于初學(xué)者而言,要認(rèn)識(shí)到很重要的一點(diǎn),比特幣協(xié)議的核心是交易。實(shí)際上,點(diǎn)對(duì)點(diǎn)網(wǎng)絡(luò)上的節(jié)點(diǎn)并不會(huì)相互發(fā)送比特幣,而是互相發(fā)送包含交易數(shù)據(jù)的包(packages)。
在某種程度上,比特幣交易實(shí)際上是一套一套的“鎖”。更具體點(diǎn)說(shuō),每筆交易包含兩個(gè)主要組成部分。其中一半能有效解鎖之前交易中鎖定的比特幣,使用的數(shù)據(jù)片段被稱(chēng)為輸入,輸入包括腳本和如何解鎖輸入的說(shuō)明(稱(chēng)為scriptSigs)。
另外一半由一個(gè)或多個(gè)被稱(chēng)為輸出的新鎖組成,這些鎖會(huì)再次鎖定相同或更少數(shù)量的比特幣,輸出包括名為scriptPubKeys的腳本。因此,比特幣在單筆交易中有效地從輸入轉(zhuǎn)移到輸出,并同時(shí)從一筆交易跳轉(zhuǎn)到另一筆交易。
這條規(guī)則有一種主要的例外。一筆coinbase交易(不要與coinbase交易所混淆了)是礦工在找到新區(qū)塊時(shí)創(chuàng)建的交易,并且當(dāng)中包含了區(qū)塊獎(jiǎng)勵(lì):撰文時(shí)為25個(gè)比特幣(現(xiàn)在是12.5)。此外,礦工可以將交易中解鎖了但沒(méi)有再次鎖定的比特幣增加到coinbase獎(jiǎng)勵(lì)當(dāng)中:簡(jiǎn)單來(lái)說(shuō)就是輸入和輸出的差額,即交易手續(xù)費(fèi)。
所有這些比特幣的“解鎖”和“鎖定”都是由交易發(fā)送方完成的,隨后以數(shù)據(jù)包的形式通過(guò)比特幣網(wǎng)絡(luò)進(jìn)行傳輸。然后,網(wǎng)絡(luò)上的所有節(jié)點(diǎn)都會(huì)檢查這個(gè)解鎖和鎖定過(guò)程是否正確完成。如果沒(méi)有問(wèn)題,他們會(huì)將交易轉(zhuǎn)發(fā)給其他節(jié)點(diǎn)。如果某個(gè)節(jié)點(diǎn)同時(shí)也是一個(gè)礦工,那它就可能會(huì)將交易打包到區(qū)塊中。然而,是否會(huì)被打包進(jìn)區(qū)塊取決于礦工,這就是給礦工手續(xù)費(fèi)的原因。
非常重要的一點(diǎn)是,所有節(jié)點(diǎn)遵循的交易驗(yàn)證規(guī)則與(幾乎)所有礦工使用的規(guī)則是兼容的。如果某些礦工將交易打包進(jìn)其他節(jié)點(diǎn)拒絕的區(qū)塊中,則整個(gè)區(qū)塊將被該節(jié)點(diǎn)視為無(wú)效。如果該節(jié)點(diǎn)是礦工,則可能導(dǎo)致雙花和網(wǎng)絡(luò)分叉。
共識(shí)規(guī)則允許交易同時(shí)以幾種不同的方式來(lái)鎖定(和解鎖)比特幣。但鎖定比特幣的輸出通常至少包括一個(gè)scriptPubKey:“證明你擁有(或者知道)對(duì)應(yīng)于該比特幣地址的公鑰的私鑰?!?/p>
(用私鑰推導(dǎo)出公鑰很容易,但幾乎不可能通過(guò)公鑰推導(dǎo)出私鑰。同樣,通過(guò)公鑰計(jì)算出比特幣地址很容易,但很難通過(guò)比特幣地推導(dǎo)出公鑰。因此,從私鑰計(jì)算出比特幣地址也很容易,但不可能通過(guò)比特幣地址推導(dǎo)出私鑰。這是“單向的”。)
當(dāng)然,用于將比特幣鎖定在scriptPubKey中的比特幣地址是交易接收方提供的。由于接收方使用只有他自己知道的私鑰創(chuàng)建出這個(gè)比特幣地址,因此他是唯一可以創(chuàng)建有效scriptSig的人,也是唯一可以創(chuàng)建新交易并使用被鎖定比特幣的人。
簽名是怎么來(lái)的?
為了證明對(duì)應(yīng)于與比特幣地址的私鑰的所有權(quán),理論上可以在交易的scriptSig中包含私鑰,但是這樣一點(diǎn)都不安全。最重要的是,任何看到交易的人都可以獲取私鑰,并創(chuàng)建一筆新的交易(或更改原始交易),將原始交易中的接收方改成自己。如果真是這樣的話,對(duì)礦工而言偷比特幣就會(huì)是小菜一碟了,因?yàn)樗麄兪翘暨x交易進(jìn)行確認(rèn)的人。
因此,scriptPubys通常要求scriptSig包含一個(gè)或多個(gè)簽名來(lái)解鎖比特幣。
簽名是一種密碼學(xué)技巧,使用私鑰與任意其他數(shù)據(jù)組合來(lái)計(jì)算出唯一的數(shù)字字符串。并且,根據(jù)密碼學(xué)原理,可以使用對(duì)應(yīng)的公鑰來(lái)驗(yàn)證簽名是不是使用該私鑰創(chuàng)建的。因此,簽名既證明了私鑰的所有權(quán),又證明了該私鑰的所有者對(duì)特定數(shù)據(jù)片段的批準(zhǔn),同時(shí)不需要泄露私鑰。
在比特幣中,私鑰通常用于對(duì)交易數(shù)據(jù)進(jìn)行簽名來(lái)減去交易輸入。(包括,scriptPubKeys、鎖定的數(shù)量和一些其他細(xì)節(jié)。)隨后,將簽名和用于使用比特幣的公鑰添加到交易的輸入字段中。這樣也證明了私鑰的所有者確實(shí)打算創(chuàng)建交易并確保它不會(huì)被篡改。
然后,將所有這些交易數(shù)據(jù)(包括此時(shí)的交易輸入)一并哈希運(yùn)算,創(chuàng)建出交易ID,用于標(biāo)識(shí)出特定交易。如果交易隨后被打包入塊,那么礦工會(huì)將交易ID與另一個(gè)交易ID一起哈希運(yùn)算產(chǎn)生新的哈希值。如果有其他兩個(gè)交易ID的哈希值,則再次進(jìn)行哈希處理,一直持續(xù)到只剩下一個(gè)哈希值為止。這種散列結(jié)構(gòu)稱(chēng)為默克爾樹(shù)(Merkle Tree),最終產(chǎn)生的哈希值為默克爾根(Merkle Root)。該默克爾根與其他區(qū)塊數(shù)據(jù)組合以形成區(qū)塊頭(header),用于標(biāo)識(shí)特定區(qū)塊。最后,這個(gè)區(qū)塊頭的哈希值會(huì)被包含在下一個(gè)區(qū)塊的區(qū)塊頭中,從而將區(qū)塊鏈接在一起。
比特幣被認(rèn)為是不可篡改的,因?yàn)樽匪菪缘馗娜我饨灰椎娜魏尾糠侄紩?huì)改變交易ID,進(jìn)而改變區(qū)塊頭。而改變了的區(qū)塊頭不再符合工作量證明的要求,并且由于區(qū)塊頭會(huì)影響后續(xù)區(qū)塊頭的組成,因此它們中的任何一個(gè)都會(huì)被視為無(wú)效。
什么是隔離驗(yàn)證?
由Wuille在香港提出的隔離驗(yàn)證提議是基于Blockstream的側(cè)鏈Elements中所使用的一個(gè)概念,再結(jié)合比特幣核心開(kāi)發(fā)人員Luke Dashjr的補(bǔ)充構(gòu)思。在過(guò)去的幾個(gè)月中,Wuille與比特幣核心開(kāi)發(fā)人員Gregory Maxwell和Eric Lombrozo合作對(duì)隔離驗(yàn)證進(jìn)行了概念化,并計(jì)劃在2016年推出。
因此,對(duì)于不使用隔離驗(yàn)證的比特幣節(jié)點(diǎn)(我們稱(chēng)之為“舊節(jié)點(diǎn)”)的而言,接下來(lái)一些新創(chuàng)建的交易輸出中可能會(huì)使用奇怪的scriptPubKeys。之所以奇怪,是因?yàn)檫@些scriptPubKeys幾乎不能被認(rèn)為是鎖,基本上標(biāo)明了它們不需要簽名,或者說(shuō)看起來(lái)就像“任何人都可以花”。此外,它們還包括一些無(wú)意義的文本。
從舊節(jié)點(diǎn)看來(lái),這些交易是瘋狂的。他們會(huì)以為任何人都可以創(chuàng)建一個(gè)新的scriptSig,來(lái)解鎖這些交易輸出,這意味著這些交易非常不安全。但與此同時(shí),舊節(jié)點(diǎn)也依然會(huì)照常運(yùn)行。畢竟,又不是他們自己的交易出問(wèn)題了。無(wú)意義的文本雖然奇怪,但也不會(huì)導(dǎo)致什么問(wèn)題。因此,它們依然會(huì)確認(rèn)交易有效,并將其轉(zhuǎn)發(fā)給其他節(jié)點(diǎn)。
但是,使用了隔離驗(yàn)證的節(jié)點(diǎn)(我們稱(chēng)之為“新節(jié)點(diǎn)”)會(huì)識(shí)別出其他東西。他們會(huì)在scriptPubKey中看到那些“無(wú)意義的文本”,但并不會(huì)認(rèn)為它們毫無(wú)意義。相反,新節(jié)點(diǎn)會(huì)將這段文本識(shí)別為另一種非常特殊的輸出類(lèi)型。
與典型的交易輸出類(lèi)似,這種新類(lèi)型的輸出需要一個(gè)或多個(gè)簽名才能解鎖比特幣。但與典型輸出不同,這種新類(lèi)型的輸出不需要將簽名包含在后續(xù)事務(wù)的scriptSig中。相反,它需要將簽名包含在交易之外的全新區(qū)域中:隔離見(jiàn)證數(shù)據(jù)區(qū)域。
這個(gè)隔離驗(yàn)證數(shù)據(jù)區(qū)基本上就是一個(gè)帶有簽名和一些附加數(shù)據(jù)的“附加組件”。重要的是,隔離驗(yàn)證區(qū)域被舊節(jié)點(diǎn)完全忽略,但會(huì)被新節(jié)點(diǎn)識(shí)別。此外,它們攜帶的數(shù)據(jù)不會(huì)與交易的其他部分一起哈希處理到交易ID中。
因此,舊節(jié)點(diǎn)和新節(jié)點(diǎn)都將會(huì)認(rèn)為包含隔離驗(yàn)證中的簽名的交易有效。舊節(jié)點(diǎn)會(huì)驗(yàn)證它們,因?yàn)閺乃麄兊慕嵌葋?lái)看,這些交易根本不需要簽名(他們也看不到簽名),而新節(jié)點(diǎn)也會(huì)驗(yàn)證它們,因?yàn)樗璧暮灻挥诟綦x驗(yàn)證區(qū)域中。并且由于舊節(jié)點(diǎn)和新節(jié)點(diǎn)都將交易數(shù)據(jù)哈希處理到相同的交易ID中,所以每個(gè)節(jié)點(diǎn)都認(rèn)可這些區(qū)塊的組成,乃至整個(gè)區(qū)塊鏈的結(jié)構(gòu)。
(值得注意的是,所有或者絕大多數(shù)礦工都應(yīng)該使用隔離驗(yàn)證,以防止雙花和硬分叉,要么就都不使用。如果所有礦工都使用了隔離驗(yàn)證,盡管網(wǎng)絡(luò)上的舊節(jié)點(diǎn)可能會(huì)想知道為什么有些交易沒(méi)有被打包,但由于打包哪些交易是由礦工決定的,而且這些交易也不是他們的交易,所以舊節(jié)點(diǎn)也不會(huì)介意。)
但是還存在一個(gè)問(wèn)題:如果簽名對(duì)區(qū)塊鏈的構(gòu)成沒(méi)有影響,那么區(qū)塊鏈就不能證明交易中包含正確的簽名了。
為了確保簽名都被嵌入到區(qū)塊鏈中,啟用隔離驗(yàn)證的礦工也需要添加一種手段。不僅在所有交易中創(chuàng)建默克爾樹(shù),還要從所有隔離驗(yàn)證中創(chuàng)建一個(gè)默克爾樹(shù),來(lái)將交易的樹(shù)進(jìn)行鏡像。
然后,將隔離驗(yàn)證的默克爾根包含在coinbase交易的輸入字段中。因此,隔離驗(yàn)證的默克爾根會(huì)改變coinbase交易的交易數(shù)據(jù)以及其交易ID,從而影響區(qū)塊頭,并最終影響區(qū)塊鏈的構(gòu)成。
Wuille的隔離驗(yàn)證提議能夠?qū)崿F(xiàn)從比特幣交易中將簽名刪除,同時(shí)保持比特幣的不可篡改,并且不違反任何現(xiàn)有的共識(shí)機(jī)制。