1. 程式人生 > >以太坊原始碼解讀(1)以太坊核心概念

以太坊原始碼解讀(1)以太坊核心概念

一、定義

以太坊是一個開源的帶有智慧合約功能的公共區塊鏈平臺。

特點: 1、支援智慧合約,以太坊不是給使用者一系列預先設定好的操作,而是充分允許使用者按照自己的意願建立複雜的邏輯操作; 2、以太坊同時還構建了較完整的、開源的生態系統:有底層的geth、程式設計的solidity、合約線上瀏覽器browser-solidity、合約錢包Mist/wallet、前端開發框架Treffle,以及在此基礎上執行的各種開源Dapp等等。

二、以太坊的發展階段

以太坊的完整發展路線分為四個階段,階段之間的切換需要通過硬分叉來實現,即:

“前沿”(Frontier)  2015年7月30日 “家園”(Homestead)  2016年3月14日 “大都會”(Metropolis)  第一階段2017年10月15日,第二階段尚未確定 “寧靜”(Serenity)  尚未確定

目前,以太坊正處於第三階段“大都會”,這個階段主要有四個特性,即零知識證明的執行、權益證明的早期實施、智慧合約更為靈活和穩定、抽象賬戶的應用。由於這些特性不會一次性被引入,而通過兩個階段進行引入,這個兩個階段就是分別命名為“拜占庭”和“君士坦丁堡”的兩次硬分叉。也就是說,目前以太坊處於“拜占庭”硬分叉階段。

三、核心概念

EVM

EVM是以太坊中智慧合約的執行環境。它不僅被沙箱封裝起來,事實上它被完全隔離,也就是說執行在EVM內部的程式碼不能接觸到網路、檔案系統或者其它程序。甚至智慧合約之間也只有有限的呼叫。

EVM不是基於暫存器,而是基於棧的虛擬機器。因此所有的計算都在一個被稱為棧的區域執行。棧最大有1024個元素,每個元素256位元。對棧的訪問只限於其頂端,無法只訪問棧上指定深度的那個元素,在那之前必須要把指定深度之上的所有元素都從棧中移除才行。當然可以把棧上的元素放到storage或者memory中。

儲存,主存(Storage, Memory )

每個賬戶有一塊持久化記憶體區域被稱為儲存。其形式為key-value,key和value的長度均為256位元。在合約裡,不能遍歷賬戶的儲存。相對於另外兩種,儲存的讀操作相對來說開銷較大,修改儲存更甚。一個合約只能對它自己的儲存進行讀寫。

第二個記憶體區被稱為主存。合約執行每次訊息呼叫時,都有一塊新的,被清除過的主存。主存可以以位元組粒度定址,但是讀寫粒度為32位元組(256位元)。操作主存的開銷隨著其增長而變大(平方級別)。

賬戶

外部賬戶:被公鑰-私鑰對控制,其地址由公鑰決定,沒有程式碼,可通過建立和簽名一筆交易從一個外部賬戶傳送訊息。 合約賬戶:被儲存在賬戶中的程式碼控制,每當合約賬戶收到訊息,合約內部的程式碼就會被啟用,允許它對內部儲存進行讀取/寫入/傳送其他訊息和建立合約。

交易

交易是指從外部賬戶發出的簽名資料包,包含交易接收者、用於確認傳送者的簽名、交易額度、要傳送的資料、GasLimit、GasPrice。 GasLimit通過需要支付的燃料來對計算步驟進行限制,防止合約程式碼出現指數型爆炸和無限迴圈。

當一個交易的目標賬戶是一個合約賬戶,那麼合約賬戶裡的程式碼就會與交易裡的資料(payload)一同執行。 如果交易目標賬戶是零賬戶,代表要建立一個合約,交易的payload就是一個合約程式碼的ABI,ABI作為EVM位元組碼執行,輸出真正的合約程式碼被永久儲存。這個過程就是“部署合約”。

訊息呼叫

合約可以通過訊息呼叫的方式呼叫其他合約,或者傳送以太幣到非合約賬戶。訊息呼叫和交易非常類似,他們都有一個訊息源、一個目標、資料負載、以太幣、gas和返回資料。

事實上,每個交易都可以被認為是一個頂層訊息呼叫,這個訊息呼叫會依次產生更多的訊息呼叫。呼叫層數被限制為1024。

gas

以太坊上的每筆交易都會被收取一定數量的gas,gas的目的是限制執行交易所需的工作量,同時為執行支付費用。當EVM執行交易時,gas將按照特定規則被逐漸消耗。

gas price(gas價格,以太幣計)是由交易建立者設定的,傳送賬戶需要預付的交易費用 = gas price * gas amount。 如果執行結束還有gas剩餘,這些gas將被返還給傳送賬戶。

無論執行到什麼位置,一旦gas被耗盡(比如降為負值),將會觸發一個out-of-gas異常。當前呼叫幀所做的所有狀態修改都將被回滾。

指令集

EVM所支援的指令編碼,EVM所有的指令都針對256位這個基本的資料單位進行操作。此外合約可以訪問當前區塊的相關屬性,比如它的編號和時間戳。

日誌(Logs)

在區塊層面,可以用一種特殊的可索引的資料結構來儲存資料。這個特性被稱為日誌,Solidity用它來實現事件。合約建立之後就無法訪問日誌資料,但是這些資料可以從區塊鏈外高效的訪問。因為部分日誌資料被儲存在布隆過濾器(Bloom filter) 中,我們可以高效並且安全的搜尋日誌,所以那些沒有下載整個區塊鏈的網路節點(輕客戶端)也可以找到這些日誌。

以太坊的世界狀態

包括每一個賬戶的餘額、合約程式碼、賬戶的儲存、Nounce值。 以太坊的狀態轉換是指在一個交易發生時,以太坊從一個正確的狀態S轉到下一個正確的狀態S'的轉換過程。

共識演算法的兩種實現

以太坊共識演算法對外暴露的介面是Engine介面,共識演算法由兩種實現體: 1、Ethash演算法:基礎運算能力,是目前以太坊基於POW工作量證明的一個共識引擎(也叫挖礦演算法)。 2、Clique演算法:基於“同行”認證,網路中的每一個區塊是由某一個認證節點進行認證的,其他節點僅需要驗證認證資訊來判斷該區塊是否合法。

也就是說,以太坊的共識演算法是系統提供的一個介面,實現可插拔式的,只要實現了共識演算法就可以被引用。Ethash和Clique都是Engine介面的兩種實現。