1.2.1 以太坊的通俗介紹
1. 以太坊和比特幣的關系
比特幣開創了去中心化密碼貨幣的先河,十多年的時間已經充分檢驗了區塊鏈技術的可行性和安全性。比特幣的區塊鏈事實上是一套分布式的數據庫,如果再在其中加入一個符號——比特幣,并規定一套協議使得這個符號可以在數據庫上安全地轉移,以及無須信任的第三方,這些特征的組合完美地構造了一個貨幣傳輸體系——比特幣網絡。
然而,比特幣系統并不完美,其中協議的擴展性存在不足,例如比特幣網絡里只有一種符號——比特幣,用戶無法自定義另外的符號,這些符號可以是代表公司的股票或者債務憑證等,這就損失了一些功能。另外,比特幣協議定義了一套基于堆棧的腳本語言(可用于實現多重簽名、外帶數據等),然而該腳本語言由于過分強調安全而不具備圖靈完備,因此并不足以構建更高級的應用,如去中心化交易所等。而以太坊從設計上就是為了解決這種擴展性不足的問題。
2. 圖靈機和以太坊的圖靈完備語言
圖靈機(turing machine)是圖靈在1936年發表的On Computable Numbers,with an Application to the Entscheidungsproblem(《論可計算數及其在判定性問題上的應用》)中提出的數學模型。圖靈在文章中證明了只要圖靈機可以被實現,那么就可以用來解決任何可計算問題。
圖靈機模型的結構如圖1-7所示。
● 一條無限長的紙帶被分成一個個相鄰的格子,每個格子都可以寫至多一個字符。
● 一個字符表,即字符的集合,它包含紙帶上可能出現的所有字符。其中包含一個特殊的空白字符,意思是此格子沒有任何字符。
● 一個讀寫頭,可理解為指向其中一個格子的指針。它可以讀取、擦除、寫入當前格子的內容,此外也可以每次向左或右移動一個格子。

圖1-7 圖靈機模型的結構
● 一個狀態寄存器,它追蹤運算過程中整個機器的每一個狀態(運行或終止)。當這個狀態從運行變為終止,則運算結束,機器停機并交回控制權。簡單來說,它對應著有限狀態機里的“狀態”。
● 一個有限的指令集,它記錄著讀寫頭在特定情況下應該執行的行為。可以想象讀寫頭隨身有一本操作指南,里面記錄著很多條類似于“當你身處編號53的格子并看到其內容為0時,擦除,改寫為1,并向右移一格;此外,令下一狀態為運行”這樣的命令。其實在某種意義上,這個指令集就對應著程序員所寫的程序。
在計算開始前,紙帶可以是完全空白的,也可以在某些格子里預先寫上部分字符作為輸入。運算開始時,讀寫頭從某一位置開始,嚴格按照此刻的配置,即當前所處位置和當前格子內容來一步步地對照指令集進行操作,直到狀態變為停止,運算結束。而后紙帶上留下的信息,即字符的序列(比如…011001…)便作為輸出,由人來解碼為自然語言。
圖靈機是一種抽象的計算模型,將人們使用紙筆進行數學運算的過程進行抽象,由虛擬的機器代替人類進行數學運算。圖靈機的本質是人類思維在異度空間的映射,數據則是這種映射和其自運行的結果。
注意,以上只是圖靈機模型的內容,而非具體的實現。所謂的紙帶和讀寫頭都只是圖靈提出的抽象概念。例如,算盤雖然不是圖靈機(因為它沒有無限長的紙帶,即無限的存儲空間),但它的行為與圖靈機一致:每一串算珠都是紙帶上的一格,一串算珠上展示的數字記錄著當前格中的字符(可以是空白,可以是1、2、3、4、5);人類的手即讀寫頭,可以更改每串算珠的狀態;算盤的運行遵循人腦中的算法(選擇、循環、因果、條件等),當算法結束,算盤停機。
在計算機領域或者自動機領域,我們研究的一切問題都是計算問題,可泛指一切與計算相關的問題。
圖靈完備性是針對一套數據操作規則而言的概念,該數據操作規則可以是計算機里具體實現了的指令集,也可以是一種編程語言,當這套規則可以實現圖靈機模型里的全部功能時,就稱它具有圖靈完備性。編程語言圖靈不完備的常見原因有循環或遞歸受限(無法寫不終止的程序,如while(true){}; ),因為這會導致無法實現類似數組或列表這樣的數據結構(不能模擬紙帶),采用這樣的編程語言實現的程序在功能上就有局限性。因此,判定圖靈完備的簡單方法就是看該語言是否具備if…else控制流、while循環等功能。如今主流的編程語言(C++、Java、Python等)都是圖靈完備的語言。
當然圖靈不完備也不總是沒有意義的,有些場景需要限制語言本身,如限制循環和遞歸,可以保證該語言編寫的程序一定是終止的。例如,比特幣腳本語言就被特意設計為非圖靈完備的,具有一定的局限性,它基于堆棧,遵循從左向右處理的簡單原則(類似FORTH語言),沒有循環語句和復雜的條件控制語句。恰恰由于存在這種局限性,也就沒辦法執行一些死循環或者一些能夠導致DOS攻擊的惡意代碼,從而也就避免了比特幣網絡受到DOS攻擊。
以太坊上運行的程序又稱為智能合約,可以理解為在區塊鏈上(以太坊基于區塊鏈技術架構)可以自動執行的(由事件驅動的)、以代碼形式編寫的合同(特殊的交易)。其默認采用的編程語言是Solidity,它和JavaScript相似,是一種圖靈完備的編程語言(可以實現一切計算功能),用來開發合約并編譯成以太坊虛擬機字節代碼(源文件擴展名以.sol結尾)。這就使得以太坊比特幣系統更加具備擴展性,可以用來開發基于區塊鏈技術的各種去中心化應用(decentralized application,DApp)。
3. 區塊鏈、去中心化應用、比特幣、以太坊之間的關系
以太坊是一個建立在區塊鏈技術之上的去中心化應用平臺,它允許任何人在平臺中建立和運行基于區塊鏈技術的DApp。簡單來說,如果去中心化應用是App,那么以太坊是Android平臺?;贏ndroid Framework可以開發Android App,那么基于以太坊可以開發出基于區塊鏈技術的DApp。
(1)區塊鏈是一種綜合技術,因比特幣的實現架構(數據區塊、鏈式迭代、共識算法)而得名。
(2)去中心化應用程序是一種新的數據記錄與傳播的方案,可以在大規模分布式網絡中實現數據記錄的實時性、一致性、合法性和可信性(深圳大學,張勝利)。
(3)在以太坊出現之前,實現區塊鏈去中心化應用的唯一方式是修改比特幣的源代碼,例如加密算法、共識機制、網絡協議等,這樣修改出來的應用通常應用于數字貨幣領域,如果需要應用于其他領域,則其工作量將是非常浩大的。
(4)以太坊平臺對底層區塊鏈技術進行了封裝,區塊鏈應用開發者可以直接基于以太坊平臺進行開發,開發者只需要專注于應用本身的開發,從而大大降低了難度。
目前已經圍繞以太坊形成了一個較為完善的開發生態圈,有開源社區的支持,可以選擇多種開發框架和工具。借助以太坊,可以創建更加豐富的去中心化應用程序(不再局限于數字貨幣領域),可以實現去中心化自治組織、跨組織協同應用,是一種提高數據主權、改善生產關系、高效率建立信任的“社會編程”框架。
4. 區塊鏈應用的三大架構類型
隨著區塊鏈技術的不斷發展,區塊鏈應用程序(即基于區塊鏈技術的DApp)在宏觀上演化出了三種架構:公有鏈、私有鏈和聯盟鏈。這三種架構并沒有絕對的優勢與劣勢,需要根據不同的應用場景來選擇合適的區塊鏈架構類型。
(1)公有鏈:公有的區塊鏈,讀寫權限對所有人開放。任何人都可以隨時進入公有鏈系統中讀取數據、發送可確認交易、競爭記錄存儲,因為沒有任何人或機構可以控制或者篡改其中數據的讀寫,公有鏈通常被認為是完全去中心化的。公有鏈一般會通過某種獎勵機制(通常是代幣)鼓勵參與者競爭記賬,來確保數據的安全性。比特幣、以太坊都是典型的公有鏈。主要特點:所有數據公開透明;是高度去中心化的分布式數據庫,數據幾乎無法篡改;吞吐量低,運作速度慢。
(2)私有鏈:私有的區塊鏈,讀寫權限由某個組織和機構控制,參與節點的資格會被嚴格限制。由于參與的節點是有限和可控的,因此私有鏈往往具有極快的交易速度、更好的隱私保護、更低的交易成本,不容易被惡意攻擊,并且能夠做到身份認證等特殊安全要求。主要特點:屬于中心化數據庫,能防止機構內單節點篡改數據;運作成本低(無須獎勵機制)、交易速度非常快。螞蟻金服的區塊鏈應用是典型的私有鏈應用。
(3)聯盟鏈:聯盟區塊鏈本質上是私有鏈的一種,只是私有程度低(讀寫權限對通過授權并加入聯盟的所有節點開放,由聯盟內成員節點共同維護),因此比純粹的私有鏈更具可信度,但其權限設計要求比私有鏈更復雜。主要特點:由若干個機構共同參與管理,具備一定的去中心化屬性,是公有鏈和私有鏈的結合版。1.3.3節介紹的Fabric超級賬本就是典型的聯盟鏈應用框架。