因為比特幣的區塊鏈是專用在貨幣上的,把它改造為用於表示其他應用是很有挑戰性的。在比特幣世界裡,你會發現有許多人偏愛把比特幣或者別的區塊鏈作為去中心化的平台。在本節,我們來分析兩種方法。
方法1:直接在比特幣基礎上
區塊鏈融合自然而然的出發點是比特幣。這也是我們在前面11.1節智能汽車例子裡用的辦法。直接使用比特幣的好處就是容易實現——代碼容易運行,比特幣網絡有很強的挖礦能力,共識過程沒有瑕疵。然而,我們必須在比特幣上做些修改才能用於我們的例子。比如,用於授權比特幣交易的加密要等同於用於打開車門的加密。有時候對比特幣的修改是不可能的,而且從根本上說,如果你有非常複雜的涉及不同方的合約,用比特幣的區塊鏈不一定能足夠勝任或者不可分割地執行。為了展示用比特幣區塊鏈的危險性,我們研究一下如何構建一些中性的非中介化的應用程序。
首先,我們來研究眾籌服務。在2015年,最廣泛使用的眾籌網站是Kickstarter, 它通過一個中心化的網站,連接了創業者和資金提供方。我們欣賞Kickstarter的想法,但希望通過建造一個完全去中心化的替代系統。這個系統需要讓創業者能要求投資人捐款,但是在收到一定預先設定數額之前,創業者不能花掉任何一分錢。所有的這些都是沒有中介的。
用比特幣的技術實現這樣的眾籌服務,需要創業者創建一個特定輸入的交易(輸入數可以隨著進程而改變)和一個支付給自己的輸出,比如支付1 000個比特幣(BTC)。這個交易將在潛在的資助者中流傳。任何資助者都可以把資助額加在交易的輸入上,並且數字化簽名他們的輸入和總輸出。只有到所有輸入等於或者大於輸出的時候,創業者才能取得這筆交易的所有輸入(見圖11.1)。因為簽名形式有限,我們要用到比特幣一些鮮為人知的功能,才能花掉最後的交易額。雖然這在當今的比特幣系統能做到,但是我們必須鑽研到比特幣裡很少人知道的角落。這並不是一個日常見到的標準比特幣交易。
圖11.1 通過比特幣眾籌
註:由不同資助者發起的多輸入的單筆交易。每個資助者簽下他們的輸入和輸出。只有在累積輸入數額達到或者超過輸出,該交易才有效。
另一個案例:支付證明費用(paying for a proof)。這個案例初看起來好像奇怪,但是它有很重要的應用。為了表示清楚,我們假設有個哈希函數H和一個大家都知道的數字y, y是H輸入x後產生的輸出。愛麗絲知道這個x的數值,鮑勃為了知道這個x值,願意支付給愛麗絲。廣義上講,H可以是任何計算程序,鮑勃希望知道他感興趣的能夠產生特定結果的輸入值。這個問題的進一步演變是,鮑勃也許願意支付一定的費用,讓這個輸入值公開在區塊鏈上。
為了安全地實現這筆交易,我們必須確認交易的不可分割性。愛麗絲只有提交正確的輸入才能收到錢。而鮑勃一收到輸入必須承擔支付責任。記得我們在第10章的不可分割的交叉鏈互換協議中,展示了如何綁定支付和呈現哈希函數輸入值。類似的方法可以用在這裡。
這些例子顯示了直接使用比特幣區塊鏈的重要局限性。在每個例子中,我們必須把複雜的真實世界交易編譯成比特幣的概念。這不一定總能實現。在智能汽車的例子裡,我們假設該車用ECDSA簽名技術來驗證汽車的主人。這就允許我們使用區塊鏈和遙控器相同的公/私密鑰來開鎖並發動汽車。在眾籌例子中,創業者只能拿到他們要求的數額,不能多也不能少。如果資助的金額大於需求的,多出的部分就成為交易費用。最後,在支付證明費用的例子裡,如果函數H不是比特幣語言所支持的哈希函數,那麼連接支付和公開數字這種模式就很困難。
如果你不能,或者不想把應用程序強行套入比特幣的交易體系,那麼可以選擇使用附著幣,我們在第9章討論過附著幣。這樣比特幣就成為數據存儲,因此比特幣的腳本語言如何表達就與之無關。這種用附著幣的方式,不僅可以構建很多其他應用,還可以使應用透明化。重新回到賣車的例子,如果區塊鏈中對象的顏色是公開的(比如以有顏色的貨幣來表示),任何人都可以通過檢查區塊鏈得知汽車在何時購買,以什麼價格,而不用知道買賣雙方的真實身份。這種方式在某種情況下很有用。在對它不利的時候,顏色的對象可以不對外公開。
然而,這種附著幣有重大缺陷。附著幣的用戶無法依靠比特幣的礦工來驗證交易(因為礦工無法瞭解附著幣的交易語言含義)。這意味著所有附著幣的用戶必須以全網節點的方式運行。SPV也不可能。只要在構建的時候存在使得共識無法達成的漏洞,附著幣就會變得很不穩定。如果兩個附著幣對一個交易的有效性持不同意見,會導致這個貨幣形成兩個分叉貨幣。這會導致災難性的後果。相反,如果由礦工來驗證交易,這種不同意見的情況就會很少發生。如果這種情況真的發生了,那麼它很快就會引起注意並且很可能解決,而不會導致貨幣分叉。
從另一方面考慮,無論我們是否用附著幣,用比特幣的初始範疇外的交易會加重或者「污染」比特幣的區塊鏈。在比特幣世界,這個問題雙方爭執不下。我們不選邊站,但是我們要指出有一個解決的辦法:就像我們在9.1節看到的,僅僅把比特幣當成時間戳服務,而不是當成數據存儲。目前有剛剛起步的服務,提供另外的區塊鏈或者數據存儲服務。其中有一個服務是通過比特幣區塊鏈做時間戳服務。這就像第9章討論過的時間戳服務,但是多了每10分鐘一次哈希計算,而不是每週一次在新聞報紙上。用比特幣當時間戳只要每區塊(或者每次服務或者協議)一次交易。不完美的地方就是,很難找到像比特幣區塊鏈這樣容易獲得並且廣泛複製留存的外部數據存儲。同時,一般的非比特幣數據存儲更加中心化。
總的來說,不管是否使用嵌套技術,比特幣的區塊鏈誕生了許多創新的應用。這些通過比特幣區塊鏈產生的應用,受到用戶和礦工的廣泛接受。因此,使用比特幣區塊鏈是一個安全且容易實現的選擇。
方法2:另類區塊鏈
去中心化的另一個方法是使用另類區塊鏈,也有幾個選擇方案。最明顯的方法就是,使用一個全新的區塊鏈,有自己的規則、功能和貨幣(也就是另類幣)。另一個方案是,使用我們在第10章學過的側鏈。這個方案的主要不同在於側鏈的貨幣是1︰1的比例方式與比特幣掛鉤。有高級腳本語言的側鏈可以滿足複雜合約的要求,也能做到去中介化。但是,側鏈需要對比特幣進行修改,這些修改目前到2015年還沒有進展。
第三個選擇是用已經存在的另類區塊鏈,這個區塊鏈能夠支持新的應用程序。截至2015年,我們在第10章討論過的以太坊體系,是最有潛力的去中心化加密貨幣應用程序平台。從概念上看,以太坊是去中心化的複雜合約的理想平台。當然,以太坊也面臨實際的挑戰:至少到2015年,它還沒有達到比特幣同等水平的成熟度、接受度和挖礦計算力,也沒有接受相應水平的安全性考驗。無論如何,這是一個令人著迷的去中心化複雜合約的精美實驗。未來,以太坊體系或者其他體系有可能蓬勃發展。