區塊鏈技術:以太坊源碼解讀,開源智能合約功能的公共區塊鏈平臺

區塊鏈技術:以太坊源碼解讀,開源智能合約功能的公共區塊鏈平臺

特點:

1、支持智能合約,以太坊不是給用戶一系列預先設定好的操作,而是充分允許用戶按照自己的意願創建複雜的邏輯操作;

2、以太坊同時還構建了較完整的、開源的生態系統:有底層的geth、編程的solidity、合約在線瀏覽器browser-solidity、合約錢包Mist/wallet、前端開發框架Treffle,以及在此基礎上運行的各種開源Dapp等等。

以太坊的發展階段

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

“前沿”(Frontier) 2015年7月30日

“家園”(Homestead) 2016年3月14日

“大都會”(Metropolis) 第一階段2017年10月15日,第二階段尚未確定

“寧靜”(Serenity) 尚未確定

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

這裡有一個概念叫“難度炸彈”。“難度炸彈”可以說是從以太坊被設計之初就確定了,因為以太坊從一開始就目標先通過POW來建立生態,在“寧靜”階段的時候徹底轉為POS模式,降低挖礦對硬件的依賴。這樣的轉變勢必會遭到前期花費大量投資去購買挖礦設備的礦工的抵制。為了防止這些礦工不接受新的規則從而產生硬分叉,以太坊設計者在計算區塊難度的時候加入了“難度炸彈”這個參數。難度炸彈指的是計算難度時除了根據出塊時間和上一個區塊難度進行調整外,加上了一個每十萬個區塊呈指數型增長的難度因子。

核心概念

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接口的兩種實現。


分享到:


相關文章: