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