區塊鏈與密碼學全民課堂第3-4講:硬核“拆解”以太坊

買賣虛擬貨幣

導語:本課堂用通俗易懂的系列內容為大家呈現區塊鏈與密碼學領域相關知識。這裡有知識也有故事,從感興趣到有樂趣,全民課堂等你來學。

這個系列中的課程內容首先從比特幣著手進行入門介紹,再延伸至區塊鏈的相關技術原理與發展趨勢,然後深入淺出地依次介紹在區塊鏈中應用的各類密碼學技術。歡迎大家訂閱本公眾號,持續進行學習。

【本課堂內容全部選編自PlatON首席密碼學家、武漢大學國家網路安全學院教授、博士生導師何德彪教授的《區塊鏈與密碼學》授課講義、教材及網際網路,版權歸屬其原作者所有,如有侵權請立即與我們聯絡,我們將及時處理。】

3.3

區塊鏈2.0:可程式設計區塊鏈

上一期我們“拆解”了區塊鏈1.0的代表,比特幣。這一期我們繼續拆解之旅,物件是區塊鏈2.0——可程式設計區塊鏈的代表,以太坊。

比特幣的區塊鏈架構主要圍繞支援密碼貨幣的實現,雖然它有一定的靈活性,但用來支撐密碼貨幣以外的應用場景還顯得非常侷限。

區塊鏈2.0的核心理念是把區塊鏈作為一個可程式設計的分散式信用基礎設施,支撐智慧合約應用,對金融領域更廣泛的場景和流程進行最佳化的應用,與過去比特幣區塊鏈作為一個虛擬貨幣支撐平臺區別開來。

在比特幣後,出現很多被稱為區塊鏈2.0的平臺,其中最具代表性的是以太坊平臺。

以太坊系統結構圖

以下討論以太坊和比特幣架構不同的幾個主要方面。

賬戶設計

比特幣沒有賬戶的概念。每個使用者的餘額都是從他們在區塊鏈上的UTXO計算出來的。以太坊的設計是將區塊鏈作為一個通用的管理物件狀態轉換的去中心化平臺,賬戶就是有狀態的物件。以太坊則有兩種型別的賬戶:一種是外部所有賬戶(EOA),另一種是合約賬戶。

外部所有賬戶就是我們一般意義上的使用者賬戶,它由私鑰控制。

合約賬戶是一種特殊的可程式設計賬戶,合約存在以太坊區塊鏈上,它是程式碼(功能)和資料(狀態)的集合。合約受程式碼控制並由外部所有賬戶啟用。

外部所有賬戶的狀態就是餘額,而合約賬戶的狀態可以是餘額、程式碼執行情況,以及合約的儲存。

以太坊網路的狀態就是所有賬戶的狀態,該狀態由每個區塊的交易來更新,同時需在全網形成共識。使用者和以太坊區塊鏈的互動需要透過對賬戶的交易來實現。

區塊鏈設計

比特幣採用Merkle樹來將交易的雜湊值組成二叉樹,頂層節點的雜湊值相當於整個交易清單的指紋,可以用來校驗交易清單。以太坊的區塊鏈的每個區塊不但儲存著交易清單,還儲存最新的狀態。以太坊的狀態包含一個鍵值表,其中鍵是地址,值是賬戶裡宣告的變數。

以太坊區塊報文頭中存放了3個根雜湊值:一個是交易的Merkle根雜湊值(比特幣只存這一個),另外一個是狀態的根雜湊值,還有一個是收據的根雜湊值。

另外一個和比特幣的不同是,以太坊的區塊鏈中的每個區塊儲存區塊鏈號和區塊難度。

賬戶的狀態經常被改變,新的賬戶也經常被插入,鍵在儲存裡也被經常插入和刪除。還要求樹的根雜湊只是與樹的資料有關,與更新的順序無關。Patricia(帕特里夏)樹是符合這些要求的資料結構,以太坊採用的Merkle Patricia樹儲存資料。

Patricia樹,或稱壓縮字首樹,是一種更節省空間的字首樹。對於基數樹的每個節點,如果該節點是唯一的兒子的話,就和父節點合併。

Patricia樹示意圖

PoW機制

以太坊吸取了比特幣的教訓,專門設計了非常不利於計算的模型,它採用了I/O密集的模型,I/O慢,計算再快也沒用,對專用積體電路則不是那麼有效。以太坊的PoW(工作量證明)演算法叫Ethash演算法(是一個經過修改的Dagger-Hashimoto演算法)。

該演算法對GPU友好。一是考慮如果只支援CPU,擔心易被木馬攻擊;二是現在的視訊記憶體都很大。

輕型客戶端的演算法不適於挖礦,但易於驗證。

快速啟動演算法中,主要依賴於Keccake256。

資料來源除了傳統的Block頭部,還引入了隨機數陣列DAG(Directed Acyclic Graph,有向無環圖)(Vitalik提出)

一個世代(Epoch),含有30000Blocks,一個世代裡使用相同的隨機數陣列。

隨機數陣列分為三個層次:種子值、快取值和資料,種子值很小。根據種子值生成快取值,快取層的初始值為16M,每個世代增加128K。在快取層之下是礦工使用的資料值,資料層的初始值是1G,每個世代增加8M。

過程中使用了Keccak-512演算法,結果為64Bytes。

核心部分使用的資料單位是128Bytes,資料層面每一個元素都依賴於快取層的256個元素。

ETHASH框架主要分為兩個部分,一是DAG的生成,二是用Hashimoto來計算最終的結果。

ETHASH的框架

DAG主要流程

DAG分為三個層次:種子層、快取層、資料層。三個層次是逐漸增大的。

種子層很小,依賴上個世代的種子層。

快取層的第一個資料是根據種子層生成的,後面的根據前面的一個來生成,它是一個序列化的過程。其初始大小是16M,每個世代增加128K.每個元素64位元組。

資料層就是要用到的資料,其初始大小1G,現在約2G,每個元素128位元組。資料層的元素依賴快取層的256個元素

快取層計算流程示意圖

資料層計算流程示意圖

Hashimoto主要流程

Hashimoto的整個流程是記憶體密集型,具體如下:

1

頭部資訊和隨機數結合在一起,做一個Keccak-512運算,獲得初始的單向雜湊值Mix[0],128位元組。

2

透過另外一個函式(Fetch DAG),對映到DAG上,獲取一個值,與Mix[0]混合得到Mix[1],迴圈64次後得到Mix[64],128位元組。

3

經過後處理過程,得到 mix final 值,32位元組。再經過計算,得出結果。

4

把它和目標值相比較,小於則挖礦成功。難度值大,目標值小,就越難(前面需要的 0 越多)。

注:為防止礦機,mix function函式也有更新過。

Hashimoto主要流程示意圖

驗證流程

當礦工廣播區塊到網路中後,如何才能校驗區塊來完成一定工作量呢?

校驗方案是採用 hashimotoLight 計算出在指定Nonce下的執行結果 result 和 digest。根據本地計算結果應該和區塊的MixDigest值一致,且result低於給定的目標值 target,則說明Seal校驗透過,表明該區塊來完成一定量的工作量。

回到 hashimotoLight 方法,此方法是直接利用快取實時計算出資料線來參與校驗,和 hashimotoFull 類似。因為資料集也是透過快取生成,如果沒有資料集可以直接使用快取計算。這樣對於普通節點,只需要利用 16MB 的快取便可以輕鬆完成 PoW 校驗,按需生成所需要的資料集的資料項。

計算與圖靈完備

以太坊作為通用的區塊鏈平臺,需要提供比比特幣更強大的計算能力,選擇了圖靈完備的計算環境——以太坊虛擬機器( Environment Virtual Machine ,EVM)。這就意味著在EVM上可以做所有的能想得到的計算、包括無限迴圈。以太坊採用經濟的方法來保證以太坊平臺的安全:

以太坊要求每個交易要給出最大的計算步驟,交易的發起人要提供Gas作為交易費以供礦工把交易加進區塊。

如果實際執行超過了該最大計算步驟,計算將被終止,而交易費會歸挖到區塊的礦工所有。

以太坊網路的每個節點都執行EVM並執行合約程式碼。

EVM高階語言

比特幣不提供高階語言的支援,以太坊則提供高階語言讓使用者編寫智慧合約。以太坊的高階語言最後會編譯成在EVM中執行的EVM位元組碼(bytecode),部署在以太坊區塊鏈上。以太坊提供3種程式語言:Solidity、Serpent和LLL。

以太坊P2P網路

RLPx協議

以太坊節點間採用RPLx編碼及認證的通訊傳輸協議來傳輸訊息包。節點可以自由地在任何TCP埠釋出和接受連線,預設的埠是30303。

目前正式版的RLPx實現了以下功能:單一協議的UDP節點發現,ECDSA簽名的UDP,加密握手/認證,節點永續性,加密/認證TCP,TCP幀處理。

Whisper協議

Whisper協議是DApp間通訊的通訊協議。Whisper結合了DHT (Distributed Hash Table)和資料包訊息系統(如UDP),因此同時具有以上兩種協議的特性。Whisper提供多索引,非單一的記錄,也就是說同一記錄可以有多個鍵,有些鍵可能和別的記錄一樣。使用場景有以下幾種:

DApp需要把少量的資訊釋出出去,而這些釋出的資訊要保留相當一段時間。例如一個外匯交易所將一個貨幣的掛牌賣價釋出出去,這個賣價可能需要保留幾分鐘或幾天時間。

DApp需要發訊號給其他DApp,希望它們參與對某個交易的協同。

DApp之間需要提供非實時的提示或通常的通訊,例如聊天室應用等。

DApp需要提供暗通訊,也就是通訊的雙方除了知道對方的雜湊值外,不知道對方更多的底細。

事件

以太坊中的事件是一個以太坊日誌和事件監測協議的抽象。日誌的記錄中提供合約的地址,一組最多4個議題和一些任意長度的二進位制資料。事件利用現有的應用程式二進位制介面(ABI)功能來解析日誌記錄。

根據一個事件名和一些列的事件引數,可以分為兩個系列:建立了索引的和沒有索引的。建了索引的(最多有3個)是用來和事件的Keccak雜湊簽名一起作為議題的日誌記錄;沒有建立索引的用來組成事件的位元組陣列。

以太坊的拆解就講到這裡,以太坊開創了智慧合約時代,將區塊鏈從1.0時代大跨地帶入到2.0時代,下一期我們將進入區塊鏈3.0時代:價值網際網路。如果區塊鏈可以連結全球將會是什麼樣子呢?敬請期待~

同學們可以關注PlatON公眾號,持續學習哦。我們下節課見啦。

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;