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