通過一段時間的研究塘砸,今天對以太坊開發(fā)做一個總結虫溜。
一:以太坊是什么
以太坊(Ethereum)是一個建立在區(qū)塊鏈技術之上, 去中心化應用平臺霞捡。它允許任何人在平臺中建立和使用通過區(qū)塊鏈技術運行的去中心化應用蚀狰。
很多同學應該對這句話不理解愉昆,姑且可以理解為以太坊是區(qū)塊鏈里的Android,它是一個開發(fā)平臺麻蹋,讓我們就可以像基于Android Framework一樣基于區(qū)塊鏈技術寫應用跛溉。
其實在沒有以太坊之前,寫區(qū)塊鏈應用是這樣的:拷貝一份比特幣代碼扮授,然后去改底層代碼如加密算法芳室,共識機制,網絡協(xié)議等等(很多山寨幣就是這樣糙箍,改改就出來一個新幣)渤愁。
以太坊平臺對底層區(qū)塊鏈技術進行了封裝,讓區(qū)塊鏈應用開發(fā)者可以直接基于以太坊平臺進行開發(fā)深夯,開發(fā)者只要專注于應用本身的開發(fā)抖格,從而大大降低了難度。目前圍繞以太坊已經形成了一個較為完善的開發(fā)生態(tài)圈:有社區(qū)的支持咕晋,有很多開發(fā)框架雹拄、工具可以選擇。
二:智能合約
那么什么是智能合約:以太坊上的程序稱之為智能合約掌呜。(它是代碼和數據(狀態(tài))的集合)
也可以理解為在區(qū)塊鏈上可以自動執(zhí)行的(由事件驅動的)滓玖、以代碼形式編寫的合同(特殊的交易)
在比特幣腳本中,我們講到過比特幣的交易是可以編程的质蕉,但是比特幣腳本有很多的限制势篡,能夠編寫的程序也有限,而以太坊則更加完備(在計算機科學術語中模暗,稱它為是“圖靈完備的”)禁悠,讓我們就像使用任何高級語言一樣來編寫幾乎可以做任何事情的程序(智能合約)。
智能合約非常適合對信任兑宇、安全和持久性要求較高的應用場景碍侦,比如:數字貨幣、數字資產、投票瓷产、保險站玄、金融應用、預測市場、產權所有權管理、物聯(lián)網荣倾、點對點交易等等。目前除數字貨幣之外灾常,真正落地的應用還不多(就像移動平臺剛開始出來一樣)霎冯,相信1到3年內铃拇,各種殺手級會慢慢出現(xiàn)。
三:編程語言:Solidity
智能合約的默認的編程語言是Solidity沈撞,文件擴展名以.sol結尾慷荔。Solidity是和JavaScript相似的語言,用它來開發(fā)合約并編譯成以太坊虛擬機字節(jié)代碼缠俺。
1显晶、運行環(huán)境:EVM
EVM(Ethereum Virtual Machine)以太坊虛擬機是以太坊中智能合約的運行環(huán)境。(Solidity之于EVM壹士,就像之于跟JVM的關系一樣磷雇,這樣大家就容易理解了。以太坊虛擬機是一個隔離的環(huán)境躏救,在EVM內部運行的代碼不能跟外部有聯(lián)系唯笙。)
2、合約的編譯
以太坊虛擬機上運行的是合約的字節(jié)碼形式盒使,需要我們在部署之前先對合約進行編譯崩掘,可以選擇Browser-Solidity Web IDE或solc編譯器。
3少办、合約的部署
在以太坊上開發(fā)應用時苞慢,常常要使用到以太坊客戶端(錢包)。平時我們在開發(fā)中英妓,一般不接觸到客戶端或錢包的概念挽放,它是什么呢?
3.1:以太坊客戶端(錢包)
以太坊客戶端蔓纠,其實我們可以把它理解為一個開發(fā)者工具辑畦,它提供賬戶管理、挖礦贺纲、轉賬航闺、智能合約的部署和執(zhí)行等等功能。
EVM是由以太坊客戶端提供的
Geth是典型的開發(fā)以太坊時使用的客戶端,基于Go語言開發(fā)潦刃。 Geth提供了一個交互式命令控制臺侮措,通過命令控制臺中包含了以太坊的各種功能(API)。Geth的使用我們之后會有文章介紹乖杠,這里大家先有個概念分扎。
Geth控制臺和Chrome瀏覽器開發(fā)者工具里的面的控制臺是類似的,不過Geth控制臺是跑在終端里胧洒。
相對于Geth畏吓,Mist則是圖形化操作界面的以太坊客戶端。
3.2:如何部署
智能合約的部署是指把合約字節(jié)碼發(fā)布到區(qū)塊鏈上卫漫,并使用一個特定的地址來標示這個合約菲饼,這個地址稱為合約賬戶。
以太坊中有兩類賬戶:
1列赎、外部賬戶
該類賬戶被私鑰控制(由人控制)宏悦,沒有關聯(lián)任何代碼。
2包吝、合約賬戶
該類賬戶被它們的合約代碼控制且有代碼與之關聯(lián)饼煞。
和比特幣使用UTXO的設計不一樣,以太坊使用更為簡單的賬戶概念诗越。
兩類賬戶對于EVM來說是一樣的砖瞧。
外部賬戶和合約賬戶的區(qū)別和關系是:一個外部賬戶可以通過創(chuàng)建和用自己的私鑰來對交易進行簽名,來發(fā)送消息給另一個外部賬戶或合約賬戶嚷狞。
在兩個外部賬戶之間傳送消息是價值轉移的過程块促。但從外部賬戶到合約賬戶的消息會激活合約賬戶的代碼,允許它執(zhí)行各種動作(比如轉移代幣感耙,寫入內部存儲褂乍,挖出一個新代幣,執(zhí)行一些運算即硼,創(chuàng)建一個新的合約等等)逃片。
只有當外部賬戶發(fā)出指令時,合同賬戶才會執(zhí)行相應的操作只酥。
合約部署就是將編譯好的合約字節(jié)碼通過外部賬號發(fā)送交易的形式部署到以太坊區(qū)塊鏈上(由實際礦工出塊之后褥实,才真正部署成功)。
3.3:運行
合約部署之后裂允,當需要調用這個智能合約的方法時只需要向這個合約賬戶發(fā)送消息(交易)即可损离,通過消息觸發(fā)后智能合約的代碼就會在EVM中執(zhí)行了。
3.4:Gas
和云計算相似绝编,占用區(qū)塊鏈的資源(不管是簡單的轉賬交易僻澎,還是合約的部署和執(zhí)行)同樣需要付出相應的費用貌踏。
以太坊上用Gas機制來計費,Gas也可以認為是一個工作量單位窟勃,智能合約越復雜(計算步驟的數量和類型祖乳,占用的內存等),用來完成運行就需要越多Gas秉氧。
任何特定的合約所需的運行合約的Gas數量是固定的眷昆,由合約的復雜度決定。
而Gas價格由運行合約的人在提交運行合約請求的時候規(guī)定汁咏,以確定他愿意為這次交易愿意付出的費用:Gas價格(用以太幣計價) * Gas數量亚斋。
Gas的目的是限制執(zhí)行交易所需的工作量,同時為執(zhí)行支付費用攘滩。當EVM執(zhí)行交易時帅刊,Gas將按照特定規(guī)則被逐漸消耗,無論執(zhí)行到什么位置轰驳,一旦Gas被耗盡厚掷,將會觸發(fā)異常弟灼。當前調用幀所做的所有狀態(tài)修改都將被回滾级解, 如果執(zhí)行結束還有Gas剩余,這些Gas將被返還給發(fā)送賬戶田绑。
注:如果沒有這個限制勤哗,就會有人寫出無法停止(如:死循環(huán))的合約來阻塞網絡。
因此實際上(把前面的內容串起來)掩驱,我們需要一個有以太幣余額的外部賬戶芒划,來發(fā)起一個交易(普通交易或部署、運行一個合約)欧穴,運行時民逼,礦工收取相應的工作量費用。
3.5:測試網絡:私有鏈
有些同學就會問了涮帘,我沒有以太幣拼苍,要怎么進行智能合約的開發(fā)?
答案是創(chuàng)建自己的以太幣私有測試網絡调缨,通常也稱為私有鏈疮鲫,我們可以用它來作為一個測試環(huán)境來開發(fā)、調試和測試智能合約弦叶。
通過上面提到的Geth很容易就可以創(chuàng)建一個屬于自己的測試網絡俊犯,以太幣想挖多少挖多少,也免去了同步正式網絡的整個區(qū)塊鏈數據伤哺。
另一個創(chuàng)建測試網絡的方法是使用testrpc燕侠,testrpc是在本地使用內存模擬的一個以太坊環(huán)境者祖,對于開發(fā)調試來說,更方便快捷绢彤。而且testrpc可以在啟動時幫我們創(chuàng)建一堆存有資金的測試賬戶咸包。
進行合約開發(fā)是,可以在testrpc中測試通過后杖虾,再部署到Geth中去烂瘫。
四:Dapp(去中心化的應用程序)
以太坊社區(qū)把基于智能合約的應用稱為去中心化的應用程序(Decentralized App)。如果我們把區(qū)塊鏈理解為一個不可篡改的數據庫奇适,智能合約理解為和數據庫打交道的程序坟比,那就很容易理解Dapp了,一個Dapp不單單有智能合約嚷往,比如還需要有一個友好的用戶界面和其他的東西葛账。
五:Truffle
Truffle是Dapp開發(fā)框架,他可以幫我們處理掉大量無關緊要的小事情皮仁,讓我們可以迅速開始寫代碼-編譯-部署-測試-打包DApp這個流程籍琳。
六:總結
我們現(xiàn)在來總結一下,以太坊是平臺贷祈,它讓我們方便的使用區(qū)塊鏈技術開發(fā)去中心化的應用趋急,在這個應用中,使用Solidity來編寫和區(qū)塊鏈交互的智能合約势誊,合約編寫好后之后呜达,我們需要用以太坊客戶端用一個有余額的賬戶去部署及運行合約(使用Truffle框架可以更好的幫助我們做這些事情了)。為了開發(fā)方便粟耻,我們可以用Geth或testrpc來搭建一個測試網絡查近。
注:為了方便大家理解,對一些概念做了類比挤忙,有些嚴格來不是準確