以太坊智慧合約開發第二篇:理解以太坊相關概念

marser發表於2018-04-10

原文發表於:以太坊智慧合約開發第二篇:理解以太坊相關概念

很多人都說比特幣是區塊鏈1.0,以太坊是區塊鏈2.0。在以太坊平臺上,可以開發各種各樣的去中心化應用,這些應用構成了以太坊的整個生態。目前,以太坊是區塊鏈世界裡生態建設最好的底層公鏈。本篇將以通俗易懂的方式介紹以太坊開發中涉及到的相關概念,帶領大家輕鬆入門。

以太坊

以太坊(Ethereum)是一個建立在區塊鏈技術之上的、圖靈完備的去中心化應用平臺。它允許任何人在平臺中通過智慧合約技術開發、部署和使用去中心化應用。

>  有沒有感到和ios、Android平臺有點類似?

在以太坊未問世之前,寫區塊鏈的應用是這樣的:拷貝一份比特幣程式碼,然後去改底層程式碼如加密演算法、共識機制、網路協議等等。2013、2014年那時候的很多山寨幣就是這樣,改改比特幣程式碼就造出來一個新幣。

以太坊平臺對底層區塊鏈技術進行了封裝,讓區塊鏈應用開發者可以直接基於以太坊平臺進行開發,開發者只要專注於應用本身的開發,從而大大降低了難度。

>  目前圍繞以太坊已經形成了一個較為完善的開發生態圈:社群支援、開發框架、開發工具等等。

智慧合約

網路上關於智慧合約的解釋都很晦澀。我們可以簡單的理解為在區塊鏈上,由事件驅動、以程式碼形式存在、可執行的特殊交易合同。它是程式碼、資料的集合。

智慧合約非常適合對信任、安全和永續性要求較高的應用場景,比如:數字貨幣、數字資產、投票、保險、金融應用、預測市場、產權所有權管理、物聯網、點對點交易等等。

目前除數字貨幣之外,真正落地的應用還不多。和移動網際網路剛興起之時各種各樣、各行各業的APP推陳出新一樣,去中心化應用的市場在初期肯定有一個紅利期。對此有興趣的開發者,可抓住機會。

Solidity

Solidity是一門和JavaScript類似的程式語言,副檔名以 .sol 結尾。它用於智慧合約的開發,並能編譯成以太坊虛擬機器位元組碼,部署到以太坊底層區塊鏈網路上。

EVM

EVM即以太坊虛擬機器,全稱是Ethereum Virtual Machine。它是以太坊智慧合約的執行環境。

> EVM是由以太坊節點提供。每個以太坊節點中都包含EVM
> Solidity之於EVM,就像Java跟JVM的關係一樣
> 以太坊虛擬機器是一個隔離的環境,在EVM內部執行的程式碼不能跟外部有聯絡

EVM執行在以太坊節點上,當我們把合約部署到以太坊區塊鏈網路上之後,合約就可以在以太坊網路中執行了。

合約編譯

以太坊虛擬機器上執行的是合約的位元組碼。這就需要我們在部署之前先對合約進行編譯。

> 推薦使用solc編譯器。

以太坊客戶端(節點)

一個以太坊客戶端就是一個以太坊節點。它提供賬戶管理、數字資產管理、挖礦、轉賬、智慧合約的部署和執行等等功能。對於我們開發者來說,它就是一個開發者工具。

Geth是典型的以太坊客戶端。Geth這個名字是Go Ethereum開源專案的簡稱。它是基於Go語言開發且實現了Ethereum協議的客戶端軟體。 Geth提供了一個互動式命令控制檯,通過命令來操作以太坊的各種功能(API)。

> Geth是全節點客戶端,會一直同步以太坊區塊鏈上的所有資料。目前資料量已經幾十G,不久就會上百G。
> 在開發過程中,我們推薦使用以太坊區塊鏈的私有鏈Ganache,免去同步以太坊全部區塊資料的麻煩。在後續的文章中會介紹Ganache。

賬戶

以太坊中賬戶分為兩類:

  • 外部賬戶(EOA)

    該類賬戶被公鑰-私鑰對控制(使用者),沒有關聯任何程式碼
    外部賬戶的地址由公鑰衍生而來

  • 合約賬戶(CA)

    該類賬戶為智慧合約分配的賬戶,被合約程式碼控制且有程式碼與之關聯
    智慧合約的部署會把合約位元組碼釋出到區塊鏈上,並使用一個特定的地址來標示這個合約,這個地址就是為合約賬戶

合約賬戶儲存了程式碼,外部賬戶則沒有。除了這點之外,這兩類賬戶對於EVM來說都是一樣的。

合約部署就是將編譯好的合約位元組碼,通過外部賬號以傳送交易的形式部署到以太坊區塊鏈網路上(由實際礦工出塊之後,才會真正部署成功)。

外部賬戶與外部賬戶之間交易僅僅是轉賬。但是外部賬戶到合約賬戶,是可以啟用各種操作的。

執行

合約部署後,當需要呼叫這個智慧合約的方法時,只需要向這個合約賬戶傳送訊息(交易)即可,通過訊息觸發後智慧合約的程式碼就會在EVM中執行了。

Gas

Gas即礦工費。以太坊上每筆交易的執行(被礦工打包)都會被收取一定數量的gas。gas的目的是限制執行交易所需的工作量,同時為執行支付費用。當EVM執行交易時,gas將按照特定規則被逐漸消耗,無論執行到什麼位置,一旦gas被耗盡,將會觸發一個 out of gas 異常。當前呼叫幀所做的所有狀態修改都將被回滾。如果執行結束,還有gas剩餘,這些gas將會返還給傳送賬戶。因此,我們需要一個有以太幣餘額的外部賬戶,來為發起的交易支付gas。

如果沒有這個限制,就會出現無法停止(如:死迴圈)的合約來阻塞以太坊區塊鏈網路

gas可以認為是一個工作量單位,智慧合約越複雜(計算步驟的數量、型別、佔用的記憶體等等),所需的gas就越多。gas的最小單位是wei,1eth=10^18wei=10^9gwei

GasLimit: 願意支付礦工費的上限

GasPrice: 礦工費單價

gas = GasLimit * GasPrice

去中心化應用(Dapp)

Dapp全稱是Decentralized App。以太坊社群把基於智慧合約的應用稱為去中心化的應用。如果我們把區塊鏈理解為一個不可篡改的分散式賬本資料庫,智慧合約理解為和資料庫打交道的程式,那就很容易理解Dapp了。一個Dapp不單單有智慧合約,還需要有一個友好的使用者介面和其他的業務程式。

Truffle

Truffle是目前最流行的Dapp開發框架,它可以幫我們處理掉很多繁瑣的事情,讓我們更專注於智慧合約的開發,迅速開始編碼-編譯-部署-測試-打包Dapp的流程。

總結

我們現在來總結一下。以太坊是平臺,它讓我們方便的使用區塊鏈技術開發去中心化的應用。應用中,我們可以使用Solidity來編寫和區塊鏈互動的智慧合約,合約編寫好後之後,我們通過一個有餘額的賬戶將合約部署到以太坊節點上,並執行合約(使用Truffle框架可以更好的幫助我們做這些事情)。為了開發方便,我們可以用以太坊私有鏈Ganache來搭建一個測試網路。

注:本文中為了方便大家理解,對一些概念做了類比,有些嚴格來說不是準確。不過我認為對於初學者,也沒有必要把每一個概念掌握的很細緻和準確。學習是一個逐步深入的過程,很多時候我們會發現,過一段後,我們會對同一個東西有不一樣的理解。

智慧合約開發QQ群:753778670
智慧合約開發QQ群


目前有幾套區塊鏈實踐的視訊課程(視訊+原始碼),需要的可加我微信(kuangwenjie)私信我(付費):

  • 『區塊鏈』從零構建以太坊(Ethereum)智慧合約到專案實戰
  • 基於Ethereum & IPFS的去中心化Ebay區塊鏈專案開發實戰
  • HyperLedger(超級賬本)Fabric

相關文章