舊文重讀 | 以太坊與黑盒子

本文寫於2017年10月8日,因此,部分非技術論點和目前的發展可能有些偏差。

——————————————————

比特幣講完了,理所當然地,該寫以太坊了。

然而,如同比特幣一樣,這次講以太坊,我也會選取一個另類的,其他介紹以太坊的文章不會採用的視角——我不會分析如何炒以太幣,如何挖礦,以太幣會不會漲,也不會介紹如何寫智能合約,如何在EVM上做應用。這篇的核心是——以太坊是什麼,智能合約是什麼,以及,以太坊尚待解決的問題。

如果說比特幣的系統已經讓很多人覺得不知所云了的話,以太坊的概念比比特幣還要複雜許多。所以,在介紹講解以太坊和智能合約的概念之前,我們來回顧一下比特幣。

之前的文章裡,我主要講了兩個事情:

1,比特幣是什麼:比特幣是人類在數字世界複製最原始的貨幣交易的所有嘗試中,到目前為止,第一個接近成功的,也是唯一接近成功的一個。

2,比特幣的價值是什麼:比特幣的價值,取決於交易量和挖礦公司價值兩者之中較小的一個。

然而,這兩點,是針對想要了解比特幣的人說的。

而如果想要更深入地瞭解區塊鏈技術,我們要換一個角度瞭解一下比特幣——

比特幣的實質,是一個在存在惡意節點的網絡中,大家共同維護的一個記錄相互之間數值轉移的賬本。

然後,為了保證記錄不被篡改,採用了鏈式結構。

為了簡化交易驗證,數據採取了UTXO結構。

為了提高大網絡裡達成共識的效率,採用了工作證明。

為了補償工作證明的花費,引入了挖礦獎勵。

為了簡便和系統的自洽性,將數值和挖礦獎勵統一為一種代幣,而且以增發的形式發給礦工。

這就是比特幣了。

也許有人覺得我又在囉嗦了——

這些不是已經說過一遍了嗎?

對,然而想要理解區塊鏈技術,就必須理解的第一個概念就是——不要相信許多宣傳和科普里說的,似乎比特幣前無古人後無來者一般。以上的每個部分,都不是天經地義,不可改變的。

鏈式結構不是必須的,對於擁有全網共識的區塊鏈而言,鏈式結構更好。而對於沒有全網共識的區塊鏈,DAG(有向無環圖)也是可以的。

UTXO結構不是必須的,將比特幣裡的UTXO結構去掉改成狀態庫結構也不會對安全性有直接的影響。更確切地說,UTXO結構是針對數字貨幣這個特殊的應用,對於狀態庫的一種優化。

工作證明不是必須的,工作證明只是多種共識算法之中的一種,即便在非許可鏈裡,工作證明都不是唯一的方法,POS現在已經完全可用了。

挖礦獎勵不是必須的,挖礦獎勵只是非許可鏈中適用的“理性節點”模型裡面引入的一個概念,而且,如果想引入更復雜一些的機制的話,即便在非許可鏈中挖礦獎勵也可以被取代。

代幣不是必須的,引入代幣只是因為比特幣的本質是個數值交換系統,至於稀缺性,只不過是讓人認為這東西不會無限貶值的噱頭而已。

如果要理解區塊鏈,第一件事,就是要把比特幣的結構模塊化——

其中哪些是區塊鏈的部分,哪些不是區塊鏈的部分。

比特幣,從功能上,只是一套數值交換系統,或者說,一份可靠的賬本。其他的一切,只是為了實現這個系統的手段,而不是目的。算哈希不是目的,發代幣不是目的,所謂稀缺更不是目的。

當然,手段有兩個層面——技術上實現這個系統的手段,以及商業上吸引別人來使用這個系統的手段。這裡,我們只關注前者,因為對於前者的誤解,遠比後者多得多,很多我看到很多自稱比特幣專家的科普文章裡將技術上的手段當成是商業上的手段。例如,認為十分鐘的區塊間隔是為了讓礦不那麼快挖完,認為稀缺性是比特幣的本質,認為密碼學的加密是為了匿名性,認為工作證明是唯一的共識算法所以挖礦獎勵是不可或缺的,於是得出結論代幣是區塊鏈必不可少的部分等等……

那麼,有人該疑惑了,比特幣的價值難道不是匿名和稀缺嗎?如果只是一個數值交換系統,那它的意義何在?

那麼,我們用另一種說法來定義一下“價值”。

這裡,我們不再考慮比特幣的價值,也不考慮貨幣系統的價值,我們考慮一下世界上任何東西的價值。

其實歸根結底,就是一句話——

一個東西的價值,取決於它能不能做別人想做而做不了的事情。

數值交換系統,別人想做嗎?

當然,之前的文章裡已經寫過了所謂“死神幣”了,一個安全的數值交換系統,本質上,就可以作為支付系統或者貨幣系統。所以,從信用卡公司到支付寶再到政府,誰不想做一個安全的數值交換系統?

然而,比特幣做的事情,別人做的了嗎?

這個問題,會有兩種答案——

有些人認為,做不了。因為目前能做得到的,都是中心化系統,而中心化系統是有原罪的,誰也無法絕對保證某個中心不會突然崩潰?

而我則在前面的文章中提了我的觀點——去中心化系統並不天然比中心化系統安全有保障,所以,比特幣目前不要和說和主流交易系統比,就算和非主流交易系統比都差著量級。然而,相比於其他的虛擬貨幣,比特幣還是有著巨大的優勢。而且,比特幣安全性的擔保,至少也在百億美元的量級。

所以,我們可以說,比特幣最大的價值,就是創造了一個至少需要百億美元才能摧毀的,去中心化的數值交換系統。

——————————————————————————————————

然而,以上的部分,是從比特幣的角度去寫的。

比特幣的核心,是個數值交換系統。多說一句的話,叫去中心化的,安全的數值交換系統。其中,去中心化是指它沒有一箇中心節點,而安全是指只要惡意節點是少數,這個系統都能正常工作。

而其他的,例如,鏈式結構;UTXO;工作證明;代幣……都是可替換的,都是手段。

然而,如果反過來看呢?

能不能還用這些技術,把數值交換系統換成別的呢?

如果你也產生了這種疑問,恭喜你,你對於區塊鏈已經入門了。

的確,數值交換系統是應用。

將這個應用去中心化的技術,也即,之前提到的一系列的手段的結合,叫做區塊鏈。

我們這裡先不談區塊鏈的部分,我們來討論一下整個區塊鏈領域最熱門的,被認為能夠改變世界的應用——

智能合約。

很多人對於這個理解的不對——他們覺得智能合約就是電子合約,就是把合約電子化了存在區塊鏈上使其無法篡改。

不,這樣的合約一點也不智能。

舊文重讀 | 以太坊與黑盒子

所謂的“智能”合約,是指在雙方達成協議,簽署之後,能夠不需要通過第三方就強制執行合約上的內容,無法單方面撤銷或者反悔的合約。

聽起來是不是很玄幻?

其實一點也不,正相反,實際上比特幣就已經達到了某種“智能的效果”。

首先,將去中心化和賬本這兩個概念拋出腦海,比特幣是個去中心化的交易系統——讓我們姑且只想“系統”這兩個字。

不妨叫它“智能交易系統”,將它想成一個給定輸入就會給出確定輸出的黑盒子或者一個機器。

它的功能是這樣的:

舊文重讀 | 以太坊與黑盒子

當輸入的交易簽名正確,金額正確,輸入沒有被使用過的時候,輸出一個新的記錄這些交易的賬本存起來同時發佈到網上。

同時,當輸入無效的時候,啥也不做。

在中心化的場景下,以上的功能,你隨便搞一臺服務器招幾個程序員花2兩天寫個軟件就能實現。

然而,想要去中心地實現同樣的功能,就得用到比特幣那一大堆東西了。

於是,現在我們有了這個去中心化的“智能交易系統”。

聽起來不錯,但是,就像我說的,這不是區塊鏈唯一能做的。

區塊鏈能做什麼呢?

你們聽說過安利,呃不對,圖靈嗎?

舊文重讀 | 以太坊與黑盒子

沒聽說過不要緊,只要知道,簡單來說就是,圖靈當年設想了一下人類所有的思維活動,發現其實一切計算,一切思考,無非是幾個簡單的邏輯動作。於是,他就設計了一個可以模擬一切人類思考和計算行為的機器,叫做圖靈機。

換句話說,只要人類能完成的計算、思考和邏輯推理,圖靈機都能做。最簡單的,你的電腦就是一臺圖靈機。

而區塊鏈的黑盒子,也可以是個圖靈機,換句話說,你能想到的,區塊鏈都能做。

而以太坊,就是一個接近圖靈機的黑盒子。

——————————————————————————————————

現在,我們來考慮一個兩人下象棋,並且有彩頭的遊戲。這個彩頭,我們姑且就算是這個鏈上的數字貨幣。

舊文重讀 | 以太坊與黑盒子

我們可以把黑盒子設計成這樣:

輸入:雙方各10個數字貨幣。接下來,雙方每人一步輸入自己走的每步。

黑盒子的功能很簡單,就是一個象棋程序,它按照規則判定每個人每步是否符合規則,並且,當一方的帥或者將被吃掉的時候,系統會判定那方負(我們先不考慮認輸的情況)。

輸出:新的賬本,同時寫入20個數字貨幣轉入贏家的賬戶。

舊文重讀 | 以太坊與黑盒子

這個黑盒子,姑且稱之為“智能下棋系統”,看起來其實和之前的“智能交易系統”差不多,只不過,需要判定的東西不是一次輸入的,而是分許多次輸入的。

這就是智能合約嗎?聽起來不厲害啊!

的確,如果一個區塊鏈只不過是一個象棋+積分程序,那麼確實不厲害。

但是,別忘了,以太坊是(接近)圖靈完備的。

換句話說,以太坊的黑盒子,是臺計算機而不是下象棋的遊戲機!

象棋在計算機裡是什麼呢?是個軟件,或者說,是個程序。

而對於以太坊也同樣,我們可以把以上的功能寫成程序放進去。

換句話說,以太坊這個黑盒子可以這麼玩:

輸入:象棋程序。

輸入:雙方各10個數字貨幣。接下來,雙方每人一步輸入自己走的每步。

黑盒子:按照輸入的象棋程序中規定的規則讀取雙方的輸入,判定雙方收入的合法性,以及最終得出結果,按照象棋程序規定輸出。

輸出:更新賬本,20個數字貨幣轉入贏家的賬戶。

舊文重讀 | 以太坊與黑盒子

一個圖靈完備的黑盒子,代表你能夠輸入任何程序供其執行。

於是,從這個角度看,區塊鏈又是什麼呢?

區塊鏈簡單說,就是一個把這個黑盒子從你的家裡的電腦或者某個機房的服務器上,搬到一個去中心的,不安全的網絡中的技術。為了讓這個黑盒子能在這種環境中運行,區塊鏈主要乾了兩件事——

1,用密碼學防止內存中的數據被篡改。

2,用公式算法保證只要大部分節點是好的,這個黑盒子就能正常工作。

而區塊鏈技術,是獨立於這個黑盒子的內容的。這個黑盒子裡,小到任何一種單一的功能,例如數值交換,大到可以執行(幾乎)任何程序的圖靈機,都可以裝進去。

這才是區塊鏈技術之所以引起這麼大的熱潮的原因,單單是數值交換系統的話,其實真的沒什麼好興奮的,比特幣之後的各種山寨幣,沒哪個進入了主流視野。

——————————————————————————————————

關於區塊鏈技術,我以後會慢慢詳述。

在這裡,我們繼續看這個黑盒子。

區塊鏈的黑盒子,由於工作原理,和我們能夠想象的家用電腦,有很大區別。

在家用電腦中,如果讀取速度沒問題的話,輸出結果的速度,僅僅和運算速度相關。換句話說,不管你跑啥東西,CPU或者GPU算完了,輸出結果就好了。

然而在區塊鏈裡,運算速度不是瓶頸,瓶頸是輸出結果。因為區塊鏈的每個節點算出結果之後,所有結果都要漫長的全網共識過程才算是系統的最終輸出。因此,這個黑盒子的性能是非常有限的。有限體現在兩個方面:

1,首先,輸出速度是有限的,算得再快沒用,只要結果的數據量大,或者節點太多,最終輸出速度都會卡在這裡。

2,其次,如果某個運算需要調用結果而不是內存的話,效率會非常低下。因為每次調用都等於你算完了,但是你要等其他所有人都算完決定結果之後,才能繼續進行下一步。

於是,如果你是某個區塊鏈應用的設計師,你要怎麼做呢?

你肯定得避免結果的調用,先把所有的東西存在內存裡。例如,你想算A+B+C+D,在區塊鏈系統裡,先算A+B,然後所有節點對對答案確定了結果,然後再加C,再對答案,最後再加D,這種方案顯然是最差的。更有效率的做法是算A+B,結果存在內存裡,然後不用對答案再加C,再加D,最後再對一次答案,得出最終結果。

兩者輸出是一樣的,然而,對於某些應用,我們卻無法使用後者。

例如價值交換體系。

價值交換體系之中,交易之間是互相依存的。A拿到工資,從銀行取錢,然後訂了外賣。那麼關係是,B公司付錢給銀行C,然後C把錢給A,A再付給外賣D。如果想最高效的實現這一系列動作,當然是每個節點自行生成這一串交易記錄最終彙總記錄到賬本上。然而,這套邏輯放在現實生活中是很難成立的,D管A要錢的時候,想要獲得的是現金,而不是A說:“相信我,我馬上發工資瞭然後我會從銀行取錢,取出來的錢裡面有一部分會是你的。”換句話說,在現實生活中,有些支付場景可以接受以上的邏輯,但更多的時候,交易的前提是之前的交易要確定才行。

以上,是目前任何採用區塊鏈技術設計這個黑盒子的時候面臨的第一個問題——性能不足。

——————————————————————————————————

第二個問題,則是一個結合了技術,法律和倫理的複雜問題。

假設我們設計了一個盒子,然而,發現這個盒子跟我們想要的功能不一樣,怎麼辦?

然後,如果結果出了岔子,那麼誰為此負責?

接下來,如果有人利用了這個岔子獲得了他按照設計思路不該獲得的好處,那麼,這種行為是否應該被允許?

從一個理想的角度想,答案是很簡單的——自然是設計者負責,出了岔子造成的損失,自然也是設計者負責賠償,而利用了漏洞得到的好處,不該被認為是犯罪。

然而,現實要比理想複雜得多。

最著名的例子,就是以太坊上的DAO事件。

DAO是一個以太坊成立之初就高調成立的,認為去中心化和以太坊可以解決一切問題的組織,他們致力於將所有的東西智能合約和代碼化。然後,某一次,某個智能合約出了問題,導致黑客利用漏洞轉走了360萬的以太幣。

最終的結果,是以太坊採取硬分叉逆轉了這個結果,然而,導致了以太坊從此分叉成了如今的以太坊和以太坊經典。這裡,我們不去管這件事本身,也不去評價這個決定以及幾方的對錯,我們來看看這件事揭示的問題——

1,我們的社會不是代碼組成的,即便法律也不是代碼組成的,否則,也就沒有什麼量刑範圍,也就不需要法院了。“代碼即是法律”,聽起來很美好,相信DAO的人也是這麼想的,而當這件事發生之後,最矛盾的大約也是這些人——如果代碼是法律,那麼作為法律制定者的程序員們是否負擔得起起可能造成的後果。

要知道,任何程序都是有bug的,而任何程序員也都是會犯錯的。

舊文重讀 | 以太坊與黑盒子

2,沒人知道一個bug可能會造成什麼樣的後果,例如DAO,它並不是類似的情況第一次出現,然而,之前的問題並沒有導致硬分叉,這多少也表明了以太坊社區的態度——也就是之前說的,理想化的態度。然而,DAO最終硬分叉的決定,以及最終分成了以太坊和以太坊經典的結果,不光是以太坊社區的矛盾,也將是整個智能合約和未來區塊鏈應用的矛盾——不存在什麼通用的解決方案,當意外造成的損失足夠大,整個社區就必須抉擇,是遵守遊戲規則,導致整個系統無人問津;還是破壞遊戲規則,破壞整個系統的邏輯。

3,DAO的黑客沒有受到起訴,他自己也不認為自己做了錯誤的事情——代碼就是法律,他做的事是代碼所許可的。然而,這還只是DAO,一個本身就存在於以太坊世界的組織。而如果智能合約的主體變成了真實世界的企業和人,而在真實世界中也有同樣的合約的紙質版的時候,問題就來了——哪個具有法律效力呢?如果兩者由於程序bug出現了不一致,法律應該保護哪個的合法性?

以上三個問題,實際上是目前智能合約面臨的最大問題。

很多人都在描繪區塊鏈的前景,在未來社會中,一切都通過智能合約實現。但是,即便區塊鏈技術進步到那個程度,在智能合約這方面,還會遇到以上的挑戰——1,需要大量懂法律和編程的專門人才將現實中的合約翻譯成智能合約;2,需要相關的法律規定當兩者不符的時候,如何解決。

而在這兩個問題解決之前,智能合約很難用來解決現實中的問題。

——————————————————————————————————

智能合約的第三個問題,是專用和通用之間的矛盾。

回到黑盒子——我們說了,黑盒子可以是任何東西,可以用來解決某個具體問題,只有有限的功能,也可以圖靈完備,換句話就是啥都能做。這很好理解,我們生活中充滿了這兩類東西,無論是芯片還是電腦還是服務器,都有專用的和通用的。

也正和其他的專用和通用的機器一樣,採用區塊鏈技術的黑盒子也有相同的優勢和劣勢——

專用的:做同樣的事情效率更高,結構更簡單。

通用的:結構更復雜。

但在區塊鏈的世界裡,還存在著另外一個問題——

區塊鏈是個去中心化的方案,通常情況下,這個黑盒子的價值不僅於它能做什麼掛鉤,還和它究竟有多可靠掛鉤。而它的可靠程度,和使用它的人數量掛鉤。

於是,我們發現了專用的黑盒子在區塊鏈應用中的問題——數字貨幣的受眾也許還可以接受,但是,如果你做一個專用於房子交易的區塊鏈,那麼怎麼吸引足夠的用戶加入使得這個區塊鏈擁有足夠高的可靠度(高到可以擔保房屋交易)就會成為一個問題,

所以,現在,更多的區塊鏈項目都想把這個黑盒子設計成,或者,至少,宣傳成通用的。

然而通用的黑盒子,拋開一切設計和實現上的難點,假設代碼從易用性,功能性和效率都完美,還是有一個重要的問題——

圖靈完備和萬能是有區別的。

圖靈機只說了它能做(幾乎)一切事情,但是沒說它的效率。

家用電腦和銀河超算可都是圖靈機。

這就導致了一個問題——

如果這個黑盒子真的是通用圖靈機,那麼,不管我扔進去什麼,只要符合規則,它都得執行才行。

極端點說,我扔進去一個死循環,整個系統就卡了。

你可以說,“那我們檢測一下你的程序是不是死循環就行了”,但是這是做不到的——這就是著名的“停機問題”,一個程序是否會停機是無法檢測的。

所以,從這個角度,在真正的實現上,這個黑盒子不可能是圖靈完備的——否則就會面臨“停機問題”。

以太坊採用了一個非常聰明的方法——給所有的運算加上了“運算費”,例如,做一個乘法,請付5塊錢,做一個哈希,請付100塊錢。

然而,這個錢是付給打包這個程序進區塊的節點的,換句話說,需要整個系統承擔的運算,收到獎勵的只有一個人。

這在運算代價遠小於之前我們提過的共識代價的情況下,問題不大——因為現在的情況是,1,算出結果不是問題,瓶頸是達成共識。2,由於前述的原因,目前沒有需要執行特別複雜運算的智能合約。然而,如果區塊鏈普及開來,智能合約功能越來越豐富,以太坊當前的運算獎勵分配方式是不合理的。

例如,一臺超算,也許會覺得添加某個需要運算很久的合約(程序)小菜一碟,因此,在他看來,將這筆合約寫進鏈裡賺取獎勵是合算的;然而,當這個合約加入之後,每當有人執行這個合約,所有其他節點都會被迫去運行這個合約。這就會造成整個網絡的運算負擔,最終導致運算能力小的節點拒絕接受使用這個合約的交易,或者運算能力不足的節點退出。

總而言之,如果這個盒子是通用的,則設計者需要通過別的方式對於這個盒子的功能進行限制,以防停機,以及保證執行的合約都在大部分節點的能力範圍之內。

這就導致了區塊鏈發展過程中的分歧,也是類以太坊式的區塊鏈的困境——

我們究竟是需要一個面對具體應用,實現具體功能,提供可量化的安全性,一蹴而就的專用區塊鏈呢。

還是一個類圖靈完備,但是需要對於寫入的程序加以各種限制,同時還面臨著各種程序bug可能導致的風險,需要邊使用邊修改邊更新的通用區塊鏈呢?

兩條路都有人選,但是相比而已,後者更容易拿到錢。

前者,需要有真正懂得區塊鏈作用並且有去中心化需求的企業的投資,而現在這種企業全世界都沒有幾家。

後者來錢更加容易的原因是,可以做成公有鏈自己發行代幣。

以太坊選擇了後者——

我並不認為以太坊是個完美的系統,然而,相比於比特幣,它也從來沒有標榜過自己是完美的。

因此,它不會受困於“去中心化”這種意識形態之爭,vatalik buterin以及開發者們,從頭到尾都牢牢控制著以太坊的決策權,完全不用擔心硬分叉帶來的阻力。

它也不會被礦工和POW絆住腳步,算力**從一開始就說明了,礦工不會永遠掌握以太坊。

它甚至可以完全不顧社區或者支持者的意見,它願意承認自己的錯誤,修改自己的錯誤,並且不懼怕繼續犯錯誤,例如DAO:沒錯,DAO犯了錯,那麼就硬分叉把錯誤回滾——我們不是一個,也並不想做一個“無法篡改的賬本”,我們的野心更大,因此,在實現野心之前,一切的錯誤,都只不過是我們學習的過程而已。

拜占庭硬分叉升級在即,儘管,拜占庭升級離他們理想中的黑盒子還相去甚遠,然而,至少,它們沒有被高漲的以太幣價格衝昏頭腦,沒有忘記一開始他們想要的是什麼。

因此,即便以太坊現在幾乎實現不了任何有意義的功能,儘管我認為Vitalik Buterin的文章不忍卒讀,然而,我還是要說——

以太坊走在一條正確的道路上。

相關推薦

推薦中...