從計算機科學(xué)角度看區(qū)塊鏈
比特幣(Bitcoin)像是在大洋中默默積累的氣流,一舉登陸后給各界帶來了巨大的沖擊。比特幣在過去幾年里火箭式增值,引發(fā)無限想象力,無窮的區(qū)塊鏈項目,也引無數(shù)英雄竟折腰。
參與區(qū)塊鏈運動的人群大致分三類,當(dāng)然中間也有交集。一類是所謂“幣圈”的, 包括炒幣的,做交易所的,做錢包的,以及韭菜和割韭菜的等等;一類是找落地應(yīng)用項目的,從跨境支付的到搠源有機豬肉的,五花八門,真真假假,虛虛實實;還有就是所謂“鏈圈”的,目的是研究區(qū)塊鏈基本技術(shù)的發(fā)展,這其中包含實實在在懂點門道的,也有一大幫滿口名詞班門弄斧的程咬金。本文著重討論區(qū)塊鏈技術(shù), 通過從計算機科學(xué)角度分析區(qū)塊鏈的來龍去脈,糾正一些廣為流傳的誤區(qū),也指出目前很多日新月異的新一代鏈項目,其實多是在迷途上狂奔的野馬,其最終結(jié)果無非是跑肥了野馬,跑爽了騎馬人,跑沒了糧草,也跑壞了大家對區(qū)塊鏈技術(shù)的信心。
比特幣為什么 surprising,到底解決了計算機科學(xué)上的共識問題嗎?
很多人把區(qū)塊鏈稱為自互聯(lián)網(wǎng)以來最革命性的技術(shù),其中常提到的一點就是 “去中心化”。區(qū)塊鏈其實可以去中心也可以不去中心,兩者之間沒有必然聯(lián)系。比特幣是去中心的設(shè)計。乍看之下,它解決了分布式系統(tǒng)中的所謂 “共識”問題,就是說在分布式系統(tǒng)中多個節(jié)點在某件事情上保持看法一致。 分布式系統(tǒng)可以簡單的想象為多臺通過互聯(lián)網(wǎng)連接著的電腦。互聯(lián)網(wǎng)的連接不一定可靠(譬如可能掉線),信息傳播需要時間,而且傳播時間不固定甚至沒有上限。加上多臺電腦各自的鐘表時間也是不能保證同步的(原因同 上),有的電腦可能還故意造假,因此分布式共識問題在通常情況下是無解的。這是學(xué)術(shù)研究的結(jié)論,是搞分布式系統(tǒng)的專家們的共識。
比特幣并沒有解決傳統(tǒng)意義上的共識問題,而是把問題轉(zhuǎn)化了,一方面通過 區(qū)塊鏈的序號作為虛擬時間,一方面通過“挖礦”的經(jīng)濟動力來促使比特幣鏈的不斷延伸。這就是為什么比特幣在理論上永遠可逆,永遠可以分叉的原因,因為它達到的共識不是絕對的。用經(jīng)濟因素來(在實踐上,不是從理論 上)解決分布式系統(tǒng)共識算法是中本聰?shù)奶觳胖e。
比特幣系統(tǒng)為什么慢?10 分鐘結(jié)算其實是 feature,不是 bug!
自從比特幣熱絡(luò)起來,不少人抱怨系統(tǒng)的結(jié)算速度(TPS)太慢。不少人花 精力試圖給比特幣提速,也有不少人提出新的區(qū)塊鏈系統(tǒng),試圖解決速度問題。抱怨比特幣速度慢的,都是沒看出門道的。當(dāng)然懂計算機科學(xué)的也未必 都懂得為什么比特幣結(jié)算系統(tǒng)慢。殊不知那是設(shè)計的 feature,不是 bug。
其實挖礦難度決定了結(jié)算速度,而這個難度是可調(diào)的,所以結(jié)算速度也是可 長可短的。假想如果結(jié)算時間縮稱一秒,也就是說挖礦難度降為一秒鐘,那會出現(xiàn)什么情況呢?就是常常千萬個礦工同時挖到礦。那時候怎么決定哪位幸運礦工分到獎勵呢?選出一個幸運礦工又是個共識問題,循環(huán)了!再設(shè)想若是結(jié)算時間變成一小時會怎樣?因為挖礦難度的提升,極少可能多個礦工同時挖到礦,產(chǎn)生沖突或臨時分鏈(temporary fork)的可能性很低。所以,結(jié)算時間沒必要太慢,但絕不能太快。這樣就看清楚了那些要給比特幣鏈加速的想法是多么的外行。中本聰在有關(guān)比特幣的文檔中并沒有詳細闡述其系統(tǒng)設(shè)計的淵源,不知是歪打正著,還是有的放矢。
再延伸一下,只要是通過純挖礦來做共識的公開鏈,結(jié)算速度都不可能太快。 以太坊不也計劃要從 PoW 下車了嗎?現(xiàn)在再出個以太坊類的東西來忽悠人, 估計就不容易了。我這里說清楚了,可能以后不再有喊著給比特幣提速來做 ICO 的了。
還想鉆研這個題目的同學(xué)們,可以比照大家都用的局部網(wǎng)以太網(wǎng)(Ethernet) 的經(jīng)驗。在局部網(wǎng)上,如果多個節(jié)點同時“說話”(傳輸數(shù)據(jù)),就會造成沖突。沖突發(fā)生后,各節(jié)點知道數(shù)據(jù)沒有傳出去,再重新試一下??墒侨绻蠹叶季o接著重新試傳,還會沖突,造成網(wǎng)絡(luò)堵塞。如果大家都等待某個固定時間再試,一樣會沖突。所以,以太網(wǎng)設(shè)計是各節(jié)點等待一個隨機時間再試傳,這樣就大大降低了沖突率,實現(xiàn)了高速的數(shù)據(jù)傳送。這個等待隨機時間的辦法適用于比特幣嗎?明顯不行,因為會有不自覺的礦工基于經(jīng)濟利益爭著再試,大家都爭,又回到原點,沒解決問題。
以太坊能成為支撐千萬個應(yīng)用的基礎(chǔ)鏈嗎?
比特幣是單一目的的區(qū)塊鏈,設(shè)計緊湊卻考慮周全,可以說接近完美 。其中少許留了一點空地,原意是留點做評論或者留言的,中本聰本人就在第一塊中留下一句話來說明比特幣鏈啟動的時間。頭腦靈活的人就把這塊地拿來做顏色幣(colored coin)等等。但畢竟活動空間不大,做不了太多的事情。
以太坊(Ethereum)應(yīng)運而生,號稱是可以寫萬能的智能合約的區(qū)塊鏈平臺。 一時間巨額資金涌進,無數(shù)人開始在以太坊的基礎(chǔ)上開發(fā)各種應(yīng)用(包括所 謂 DApp,也就是分布式應(yīng)用),還有更極端的所謂分布式自治系(DAO)。
大家都在以太坊一個鏈上做應(yīng)用,是個什么概念?就像是微軟推出一個系統(tǒng)叫做 Windows,然后全世界人民寫程序都運行在同一臺電腦上的同一個 Windows 系統(tǒng)。這樣一個系統(tǒng)能支持那么多人那么多應(yīng)用嗎?根本不可能。 看看身邊的情況,大家各自使用自己的電腦或手機,需要通訊的時候通通訊, 需要協(xié)同的時候協(xié)同一下,需要購物的時候去一下購物網(wǎng)站。其余時間各自干各自的事。若是互聯(lián)網(wǎng)試圖以一臺全世界共享巨型機的模式,是不可能發(fā)展起來的。以太坊背道而馳,不知是真的不懂還是故意忽悠。作為發(fā)幣的平臺,以太坊歪打正著很成功 。做別的有沒有戲,還待觀察。
智能合約有希望嗎?所謂圖靈完整是好事還是壞事?
我先引別人的一句話,“以太坊上的智能合約既沒有智能也不是合約。”用可編程的計算機語言來表達合約,就存在根本性的約束。譬如,合約寫成代碼后是“定死”了的,哪來的智能。要能隨機應(yīng)變的智能,必須事先考慮好各種變化的可能。而在現(xiàn)實世界中,再緊湊的合約也有預(yù)想不到考慮不周的時候,或者雙方對合約的內(nèi)容有不同認知。現(xiàn)實世界中合約各方還可以坐下來商量,修改合約。在以太坊上,這些修改和商議或者仲裁的功能怎么實現(xiàn)?
跟隨著以太坊的智能合約被很多人滿嘴跑火車的另外一個詞就是圖靈完整 (Turing Complete),好像這是個什么偉大的功能。其實若要真的想做智能合約,圖靈完整又是一個背道而馳的思路。為什么這么講?設(shè)計過計算機程序設(shè)計語言的人都知道,一個程序語言的限制越少,功能越強,程序員越容易出錯。譬如, 大家常用的 C 語言就是這樣一個例子。它功能強,是因為它出身是系統(tǒng)級的語言,做操作系統(tǒng)用的,需要這么強大的靈活性。但是作為寫應(yīng)用程序的需求來說,可以說到處是陷阱。后來推出的 Java 語言,增加了很多限制,譬如 type safety 和 garbage collecTIon,把很多程序員容易掉陷阱的地方都回避開了,因此成為企業(yè)級應(yīng)用的首選語言。
回到區(qū)塊鏈的智能合約這個問題。要想安全可靠地寫合約,合約語言必須進 一步縮減功能,加入很多約束。跟律師打過交道的都知道,合同一般分類有范本的,律師從來不愿意從頭起草,而是在范本的基礎(chǔ)上寫合約。這就是因為范本提供了很多約束條件,經(jīng)歷過時間的考驗和不斷的更新,不容易犯錯誤。律師的范本就類似高級程序語言設(shè)計中的 type 和 pattern。前段時間以太坊上的 DAO 出現(xiàn)被攻擊的事件,就是因為合約代碼中的錯誤。所以說,對于寫智能合約的程序語言來說,少反而是多。另外,真正要設(shè)計一個智能合約的語言,恐怕從一開始就要考慮如何結(jié)合形式驗證(formal verificaTIon) 技術(shù)來證明每個合約的正確性,把可證明性(verifiability 或 provability)設(shè)計到語言的結(jié)構(gòu)內(nèi)。
交易下鏈是解決辦法嗎?
因為鏈上交易速度慢,產(chǎn)生了不少下鏈的項目,就是說把交易在鏈下(或鏈 外)實現(xiàn),然后再跑到鏈上去統(tǒng)一匯總。咋看起來,似乎有一定道理。但仔細分析起來,問題就來了。區(qū)塊鏈之所以被看好,是因為鏈上有不少好的功能,譬如內(nèi)容不可篡改等等。把交易拿到鏈外,就失去了這些功能的支持,帶來附加的風(fēng)險。譬如,兩個節(jié)點之間的小額支付,看起來日常的可以在鏈下做,積累到一定時間或規(guī)模時再到鏈上結(jié)一次漲??墒擎溚膺@些交易,怎么保證其正確性呢?如果在還未結(jié)賬之前,一方系統(tǒng)出故障丟失了賬本,另一方就可以賴賬。這種在鏈上不可能發(fā)生的情景就會在鏈外發(fā)生。主張下鏈交易的人,似乎都不怎么強調(diào)下鏈所帶來的這些問題。
還有一個下鏈的場景,就是交易所和錢包。很多問題都出在這些鏈的端點,包括技術(shù)上的安全問題,也包括非技術(shù)類的信任問題。譬如有些網(wǎng)站號稱幫用戶管理各種幣,這跟陌生人要你銀行卡密碼沒啥兩樣。還有的所謂冷錢包,大都出自無名廠家,售價只有幾十塊錢,粗制濫造,卻被拿來管理巨額資產(chǎn),怎么會不出問題呢?而且出了問題找不到人負責(zé),幣被轉(zhuǎn)走了又不可逆。如何把這些幣的管理和使用做到大眾可以安全方便操作的程度,還有很長的路。
什么是區(qū)塊鏈的正確發(fā)展方向?
說了這么多,指出了不少廣為流傳的誤區(qū),戳穿了不少神話和假話,算是打擊了一大片。這并不是說我不看好區(qū)塊鏈的技術(shù)。比特幣的成長,用市場力量推動了幾個事情。一個是證明了人人有公鑰加密系統(tǒng)的時代已經(jīng)到來,是大家可以接受的。一個是分布式系統(tǒng)的共識算法在冷了很多年之后再度被密切關(guān)注,吸引了很多學(xué)者和博士生積極研究。還有就是吸引了這么多錢砸到這個領(lǐng)域,雖然被犧牲掉了很多,但畢竟有些錢會落到對的地方,總要做出點事情來。
區(qū)塊鏈的發(fā)展,被比作新一代互聯(lián)網(wǎng)。從原則上講,要真正借鑒互聯(lián)網(wǎng)成功發(fā)展幾十年的經(jīng)驗,而不是簡單照著 web 1.0 的方式搞各種炒作。今后的正確發(fā)展方向是把互聯(lián)網(wǎng)成功的精髓在區(qū)塊鏈領(lǐng)域發(fā)揚光大。要做到這一點,需要扎實的知識背景,強大的研究功力,和豐富的實戰(zhàn)經(jīng)驗。具體怎么做,今天沒時間繼續(xù)寫了,這里先賣個關(guān)子,且聽下回分解。