以太坊是什麼 - 以太坊開發入門指南

本文首發於深刻淺出區塊鏈社區
原文連接:以太坊是什麼 - 以太坊開發入門指南原文已更新,請讀者前往原文閱讀git

不少同窗已經躍躍欲試投入到區塊鏈開發隊伍當中來,但是又感受無從下手,本文將基於以太坊平臺,以通俗的方式介紹以太坊開發中涉及的各晦澀的概念,輕鬆帶你們入門。github

寫在前面

閱讀本文前,你應該大概瞭解區塊鏈是什麼,若是你還不瞭解,歡迎訂閱專欄:區塊鏈技術
指引你從頭開始學區塊鏈技術。算法

以太坊是什麼

以太坊(Ethereum)是一個創建在區塊鏈技術之上, 去中心化應用平臺。它容許任何人在平臺中創建和使用經過區塊鏈技術運行的去中心化應用。數據庫

對這句話不理解的同窗,姑且能夠理解爲以太坊是區塊鏈裏的Android,它是一個開發平臺,讓咱們就能夠像基於Android Framework同樣基於區塊鏈技術寫應用。

在沒有以太坊以前,寫區塊鏈應用是這樣的:拷貝一份比特幣代碼,而後去改底層代碼如加密算法,共識機制,網絡協議等等(不少山寨幣就是這樣,改改就出來一個新幣)。
以太坊平臺對底層區塊鏈技術進行了封裝,讓區塊鏈應用開發者能夠直接基於以太坊平臺進行開發,開發者只要專一於應用自己的開發,從而大大下降了難度。編程

目前圍繞以太坊已經造成了一個較爲完善的開發生態圈:有社區的支持,有不少開發框架、工具能夠選擇。

智能合約

什麼是智能合約

以太坊上的程序稱之爲智能合約, 它是代碼和數據(狀態)的集合。瀏覽器

智能合約能夠理解爲在區塊鏈上能夠自動執行的(由消息驅動的)、以代碼形式編寫的合同(特殊的交易)。安全

智能合約英文是Smart Contract,和人工智能( AI:Artificial Intelligence )的智能沒有關係,最先尼克薩博在95年就提出智能合約的概念,它的概念很簡單,就是將法律條文寫成可執行代碼。當時並無區塊鏈,不過智能合約與區塊鏈最配,咱們知道合同都是要一式兩份、三或四份,不能控制在某一方手中,這也就是去中心化。

比特幣腳本中,咱們講到過比特幣的交易是能夠編程的,可是比特幣腳本有不少的限制,可以編寫的程序也有限,
而以太坊則更加完備(在計算機科學術語中,稱它爲是「圖靈完備的」),讓咱們就像使用任何高級語言同樣來編寫幾乎能夠作任何事情的程序(智能合約)。網絡

智能合約很是適合對信任、安全和持久性要求較高的應用場景,好比:數字貨幣、數字資產、投票、保險、金融應用、預測市場、產權全部權管理、物聯網、點對點交易等等。
目前除數字貨幣以外,真正落地的應用還很少(就像移動平臺剛開始出來同樣),相信1到3年內,各類殺手級會慢慢出現。app

編程語言:Solidity

智能合約的官方推薦的編程語言是Solidity,文件擴展名以.sol結尾。
Solidity語言和JavaScript很類似,用它來開發合約並編譯成以太坊虛擬機字節代碼。框架

還有Viper,Serpent,LLL及Bamboo,建議你們仍是使用Solidity。
更新:Serpent官方已經再也不推薦,建議Serpent的用戶轉換到Viper,他們都是類Python語言。

Browser-Solidity是一個瀏覽器的Solidity IDE, 你們能夠點進去看看,之後咱們更多文章介紹Solidity這個語言。

運行環境:EVM

EVM(Ethereum Virtual Machine)以太坊虛擬機是以太坊中智能合約的運行環境。

Solidity之於EVM,就像之於跟JVM的關係同樣,這樣你們就容易理解了。
以太坊虛擬機是一個隔離的環境,外部沒法接觸到在EVM內部運行的代碼。

而EVM運行在以太坊節點上,當咱們把合約部署到以太坊網絡上以後,合約就能夠在以太坊網絡中運行了。

合約的編譯

以太坊虛擬機上運行的是合約的字節碼形式,須要咱們在部署以前先對合約進行編譯,能夠選擇Browser-Solidity Web IDE或solc編譯器。

合約的部署

在以太坊上開發應用時,經常要使用到以太坊客戶端(錢包)。平時咱們在開發中,通常不接觸到客戶端或錢包的概念,它是什麼呢?

以太坊客戶端(錢包)

以太坊客戶端,其實咱們能夠把它理解爲一個開發者工具,它提供帳戶管理、挖礦、轉帳、智能合約的部署和執行等等功能。

EVM是由以太坊客戶端提供的

Geth是典型的開發以太坊時使用的客戶端,基於Go語言開發。 Geth提供了一個交互式命令控制檯,經過命令控制檯中包含了以太坊的各類功能(API)。Geth的使用咱們以後會有文章介紹,這裏你們先有個概念。

Geth控制檯和Chrome瀏覽器開發者工具裏的面的控制檯是相似的,不過Geth控制檯是跑在終端裏。
相對於Geth,Mist則是圖形化操做界面的以太坊客戶端。

如何部署

智能合約的部署是指把合約字節碼發佈到區塊鏈上,並使用一個特定的地址來標示這個合約,這個地址稱爲合約帳戶。

以太坊中有兩類帳戶:

  • 外部帳戶
    該類帳戶被私鑰控制(由人控制),沒有關聯任何代碼。
  • 合約帳戶
    該類帳戶被它們的合約代碼控制且有代碼與之關聯。
和比特幣使用UTXO的設計不同,以太坊使用更爲簡單的帳戶概念。
兩類帳戶對於EVM來講是同樣的。

外部帳戶與合約帳戶的區別和關係是這樣的:一個外部帳戶能夠經過建立和用本身的私鑰來對交易進行簽名,來發送消息給另外一個外部帳戶或合約帳戶。
在兩個外部帳戶之間傳送消息是價值轉移的過程。但從外部帳戶到合約帳戶的消息會激活合約帳戶的代碼,容許它執行各類動做(好比轉移代幣,寫入內部存儲,挖出一個新代幣,執行一些運算,建立一個新的合約等等)。
只有當外部帳戶發出指令時,合同帳戶纔會執行相應的操做。

合約部署就是將編譯好的合約字節碼經過外部帳號發送交易的形式部署到以太坊區塊鏈上(由實際礦工出塊以後,才真正部署成功)。

運行

合約部署以後,當須要調用這個智能合約的方法時只須要向這個合約帳戶發送消息(交易)便可,經過消息觸發後智能合約的代碼就會在EVM中執行了。

Gas

和雲計算類似,佔用區塊鏈的資源(不論是簡單的轉帳交易,仍是合約的部署和執行)一樣須要付出相應的費用(天下沒有免費的午飯對不對!)。
以太坊上用Gas機制來計費,Gas也能夠認爲是一個工做量單位,智能合約越複雜(計算步驟的數量和類型,佔用的內存等),用來完成運行就須要越多Gas。
任何特定的合約所需的運行合約的Gas數量是固定的,由合約的複雜度決定。
而Gas價格由運行合約的人在提交運行合約請求的時候規定,以肯定他願意爲此次交易願意付出的費用:Gas價格(用以太幣計價) * Gas數量。

Gas的目的是限制執行交易所需的工做量,同時爲執行支付費用。當EVM執行交易時,Gas將按照特定規則被逐漸消耗,不管執行到什麼位置,一旦Gas被耗盡,將會觸發異常。當前調用幀所作的全部狀態修改都將被回滾, 若是執行結束還有Gas剩餘,這些Gas將被返還給發送帳戶。

若是沒有這個限制,就會有人寫出沒法中止(如:死循環)的合約來阻塞網絡。

所以實際上(把前面的內容串起來),咱們須要一個有以太幣餘額的外部帳戶,來發起一個交易(普通交易或部署、運行一個合約),運行時,礦工收取相應的工做量費用。

以太坊網絡

有些着急的同窗要問了,沒有以太幣,要怎麼進行智能合約的開發?能夠選擇如下方式:

選擇以太坊官網測試網絡Testnet

測試網絡中,咱們能夠很容易得到免費的以太幣,缺點是須要發很長時間初始化節點。

使用私有鏈

建立本身的以太幣私有測試網絡,一般也稱爲私有鏈,咱們能夠用它來做爲一個測試環境來開發、調試和測試智能合約。
經過上面提到的Geth很容易就能夠建立一個屬於本身的測試網絡,以太幣想挖多少挖多少,也免去了同步正式網絡的整個區塊鏈數據。

使用開發者網絡(模式)

相比私有鏈,開發者網絡(模式)下,會自動分配一個有大量餘額的開發者帳戶給咱們使用。

使用模擬環境

另外一個建立測試網絡的方法是使用testrpc,testrpc是在本地使用內存模擬的一個以太坊環境,對於開發調試來講,更方便快捷。並且testrpc能夠在啓動時幫咱們建立10個存有資金的測試帳戶。
進行合約開發時,能夠在testrpc中測試經過後,再部署到Geth節點中去。

更新:testrpc 如今已經併入到Truffle 開發框架中,如今名字是Ganache CLI。

Dapp:去中心化的應用程序

以太坊社區把基於智能合約的應用稱爲去中心化的應用程序(Decentralized App)。若是咱們把區塊鏈理解爲一個不可篡改的數據庫,智能合約理解爲和數據庫打交道的程序,那就很容易理解Dapp了,一個Dapp不僅僅有智能合約,好比還須要有一個友好的用戶界面和其餘的東西。

Truffle

Truffle是Dapp開發框架,他能夠幫咱們處理掉大量可有可無的小事情,讓咱們能夠迅速開始寫代碼-編譯-部署-測試-打包DApp這個流程。

總結

咱們如今來總結一下,以太坊是平臺,它讓咱們方便的使用區塊鏈技術開發去中心化的應用,在這個應用中,使用Solidity來編寫和區塊鏈交互的智能合約,合約編寫好後以後,咱們須要用以太坊客戶端用一個有餘額的帳戶去部署及運行合約(使用Truffle框架能夠更好的幫助咱們作這些事情了)。爲了開發方便,咱們能夠用Geth或testrpc來搭建一個測試網絡。

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

本文完,這些概念你都明白了麼?如今你能夠開始開發了,看看智能合約開發環境搭建及Hello World合約

相關文章
相關標籤/搜索