使用Solidity創(chuàng)建以太坊(Ethereum)智能合約(Smart Contract)
引言
前面第一章 (位于微博上的鏈接)主要介紹了區(qū)塊鏈的概念,我們知道區(qū)塊鏈分為兩大類,一是以公有鏈為代表的無權(quán)限控制區(qū)塊鏈
,第二是有權(quán)限控制的區(qū)塊鏈
,這個又包括了私有鏈
(Private Blockchain,以O(shè)verstock為代表)和聯(lián)盟鏈
(Consortium Blockchain,以R3為代表),相對于公有鏈來說,這些鏈一般都是沒有電子貨幣,因為他們不需要像公有鏈那樣要靠電子貨幣作為挖礦的獎勵來激勵參與,所以速度也是比較快的。
上一章都是講的抽象的概括,下面我們就深入講一些具體的東西,這樣以便于大家有一個形象的概念,方便理解。我們這一章主要講講公有鏈,以方便講解以及大家去繼續(xù)研究,嘗試,這里選擇在公有鏈領(lǐng)域社區(qū)最為活躍以太坊(Ethereum),對于中國用戶來說,其于2016年9月19號剛剛在中國上海舉辦了DevCon 2區(qū)塊鏈峰會,很多人可能有所印象。第一步,這個東西怎么讀啊?其實這是新構(gòu)造的一個單詞,而非一個已有的英語單詞,其讀作[i'θi:'ri?m]。接下來我們會一起過一下涉及的一些概念,后面我會介紹幾個如何進行太坊開發(fā)的技術(shù)工具,以及兩個比較好用的應(yīng)用框架。
大家都知道,學(xué)習(xí)一個新技術(shù)最好的方式就是親自動手試一把,幾乎學(xué)習(xí)所有新編程語言上來都會寫個HelloWorld
并運行一把,在這一章最后一部分我會手把手的帶領(lǐng)大家創(chuàng)建并運行一個智能合約。
概念
Ethereum:
Ethereum (官方鏈接) ,是個區(qū)塊鏈公有鏈解決方案,如果比特幣的區(qū)塊鏈稱作區(qū)塊鏈1.0的話,那Ethereum可以稱為區(qū)塊鏈2.0 。 其主要特色就是支持可編程
的智能合約。這個開源的系統(tǒng)相當(dāng)于計算機中的操作系統(tǒng)一樣,其是一個平臺,提供了API及接口,以供其上運行不同的程序共享使用。同時因為它本質(zhì)上是去中心化的區(qū)塊鏈
,因此號稱是零宕機,零審查,以及不會有欺詐與人為篡改。就像所有的公有鏈需要激勵機制的“代幣”一樣,它除了底層的區(qū)塊鏈外,還有自己的加密電子貨幣,Ether,即以太幣
,在國內(nèi)有些人戲稱為“姨太”。目前一個“姨太”大約11美元,實時的價格趨勢可以參見 這個交易所鏈接

智能合約
智能合約 (解釋鏈接 ),其實這個概念本身是遠(yuǎn)遠(yuǎn)早于區(qū)塊鏈產(chǎn)生的(早在1994年就出現(xiàn)了)。智能合約,說白了就是自己寫的一段代碼放到區(qū)塊鏈上,在這里可以添加自己需要的業(yè)務(wù)邏輯等,只是這段代碼在創(chuàng)建后不像傳統(tǒng)應(yīng)用是部署到服務(wù)器上運行,而是放到區(qū)塊鏈上,并且自動執(zhí)行(其運行部署都會消耗Gas(氣,也就是若干的以太幣))。各個參與方不需要像以前需要一個或若干個中心節(jié)點/服務(wù)器,大家都各自在自己那里完全按照“合約”執(zhí)行,中間沒有人可以去篡改或者停止,此設(shè)計會大大提高flexibility(靈活性)以及互相不信任的問題。比如有一個智能合約定義的邏輯是:當(dāng)A收到錢后,B就會收到貨物,這些操作都是按照合約自動執(zhí)行,中間不再會有違約或者被人為修改的風(fēng)險。
這些智能合約是以DAPP (Decentralized Application)的形式存在。智能合約是部署在區(qū)塊鏈上,由于區(qū)塊鏈的透明性,這些合約對任何人都是可見的,當(dāng)然這個有利有弊。如果其有bug或者漏洞,就有可能被人抓住并利用,比如2016年6月的The DAO攻擊,就造成相當(dāng)于5千萬美元的以太幣丟失,這也直接導(dǎo)致了以太坊后面的一次更分叉,這塊筆者后面會撰文詳解。
Web 3.0
大家可能聽說過web 1.0, 其是指之前傳統(tǒng)的網(wǎng)頁技術(shù),比如HTML,傳統(tǒng)的JavaScript,VBScript,CSS。而web 2.0 是使用所謂的DHMTL,HTML5, Ajax,等眾多的JavaScript技術(shù),來創(chuàng)作類似于桌面程序效果般的網(wǎng)頁應(yīng)用。Web 2.0這些技術(shù)有個問題,就是過于依賴
中心化的服務(wù)器/第三方機構(gòu),比如除了其應(yīng)該做的提供網(wǎng)頁訪問服務(wù)外,還有驗證,用戶行為記錄分析等。 而這里提出的web 3.0是有如下幾個特性,首先是去中心化
,比如通用的后臺端,使用Swarm與bzz來作為內(nèi)容尋址的存儲系統(tǒng)
,基于區(qū)塊鏈的共識形成機制
,基于Whisper的異步消息機制等,這樣具體的業(yè)務(wù)邏輯都會分發(fā)到每個客戶端去執(zhí)行,而非位于昂貴且易于出問題的少數(shù)中心節(jié)點。
這是剛剛提到的架構(gòu)圖

Solidity
上面說到的這些智能合約一般來說是使用一種特殊的編程語言來創(chuàng)建的,即Solidity,這個語言是以太坊提出并創(chuàng)造的,面向?qū)ο蟮腄SL特定領(lǐng)域編程語言(Domain Specific Language),它是以太坊支持的4種語言(另外三個是Serpent, LLL 和 Mutan),只不過其是最流行的一個語言。從技術(shù)上來講,solidify源代碼會編譯成字節(jié)碼,然后運行于EVM(Ethereum Virtual Machine)上面。如果你看到源代碼后就會覺得其實Solidity是與JavaScript十分類似的語言,如下是一段代碼:
Gavin Wood (Solidity之父)說Solidity就是根據(jù)ECMAScript(是JavaScript,ActionScript等的標(biāo)準(zhǔn)祖先)所創(chuàng)建的,這樣對于大多數(shù)開發(fā)人員來說學(xué)習(xí)曲線會很平滑。
開發(fā)工具
由于發(fā)展時間不是很長,目前市面上可用的開發(fā)環(huán)境IDE不太多。下面介紹下稍微比較成熟可靠的開發(fā)工具。
Microsoft Visual Studio Ethereum 插件
沒錯,就是那個市面上已經(jīng)非常常見的visual studio,也就是dot net的開發(fā)工具,不是一個全新的開發(fā)工具。此開發(fā)集成環(huán)境只需要安裝solidify插件即可。 這個也從側(cè)面可以看到微軟對于以太坊以及區(qū)塊鏈的野心。
安裝此插件后在微軟的Visual Studio后就可以在新建項目時的模板里看到這個Solidity 選項:

當(dāng)選擇此模板后,visual studio他會自動構(gòu)造出一個應(yīng)用的基本文件結(jié)構(gòu)。這樣你可以省去一些每次開發(fā)一個智能合約都要重復(fù)的工作。你就可以集中時間精力到真正業(yè)務(wù)代碼上。
如下就是這個IDE自動生成的代碼
Ethereum Studio
除了背靠微軟這個大旗的visual studio集成開發(fā)環(huán)境外,還有一個方便大家使用的免費的IDE。這個是基于Cloud9平臺的一個在線IDE,其完全運行于瀏覽器中,不用安裝,可以用于任何的操作系統(tǒng)。如下就是這個在線集成開發(fā)環(huán)境的樣子。這個還是比較推薦的開發(fā)環(huán)境:
智能合約應(yīng)用開發(fā)框架
目前比較常用的智能合約構(gòu)架有如下幾個,都是開源并且免費的。這里我們來手把手的創(chuàng)建并運行一個智能合約,來體會一下。
Embark
首先推薦的是這個叫做Embark的框架,他是一個讓你可以輕松開發(fā)部署Dapps的平臺,它支持的功能包括,在JS代碼中部署智能合約,智能合約的熱部署,可以集成grunt等構(gòu)造工具。支持TDD(即測試驅(qū)動的開發(fā))比如支持mocha等測試框架,可以方便的使用IPFS等去中心化的系統(tǒng),支持增量,智能的部署修改過的智能合約等。這個工具是使用nodejs寫的,因此你需要先安裝nodejs的環(huán)境。這個平臺會在你本地啟動一個區(qū)塊鏈服務(wù)模擬器,這樣你就可以完全在本地開發(fā)測試,大大提高了工作效率。如下是啟動后的截圖。Embark的安裝及源代碼位于Gitub這里
首先你需要來安裝Embark以及區(qū)塊鏈模擬器。
# 安裝Embark
npm -g install embark-framework
# 安裝區(qū)塊鏈模擬器
npm -g install ethersim
# 啟動RPC模擬器
embark simulator
啟動的模擬器是下面這個樣子
然后我們?nèi)?chuàng)建一個新的智能合約:
# 創(chuàng)建一個叫做demo的智能合約基礎(chǔ)結(jié)構(gòu)
embark demo
# 進入這個目錄,下面含有配置文件 embark.yaml
cd embark_demo
# 啟動應(yīng)用
embark run
啟動后,首先在后臺看,Emark幫忙使用coffee script等構(gòu)造并部署了合約。
你可以使用瀏覽器試驗一下,比如打開http://localhost:8000
,然后你可以試著輸入個數(shù)值,去試試看看它是不是已經(jīng)能夠響應(yīng)處理你的輸入了:
是不是很神奇,短短兩三分鐘,已經(jīng)從零開始構(gòu)造出一個可以運行的以太坊DAPP
,并運行于區(qū)塊鏈之上。 接下來我們介紹另外一個框架選擇方案。
Truffle
Truffle,是跟前面提到的 Ethereum Studio 同一個公司(ConsenSys)開發(fā)的一個框架, 這個跟前面的embark類似,也是可以提供一個智能合約的開發(fā)測試平臺,他的一個特色就是它可以集成nodejs里面強大的測試功能,比如Mocha, Chai等等. 像Embark一樣,你需要另外安裝運行其他軟件,來啟動以太坊客戶端模擬器,最常用的是EthereumJS TestRPC Github link, 它會在內(nèi)存中啟動一個Ethereum的客戶端, 這樣可以快速測試你開發(fā)的應(yīng)用。
因為這個也是使用nodejs創(chuàng)建的應(yīng)用,因此使用如下命令來安裝此程序,安裝好了啟動此應(yīng)用
#安裝以太坊模擬器
npm install -g ethereumjs-testrpc
# 啟動模擬器
testrpc
啟動后是這樣子的
模擬器啟動好了,接下來執(zhí)行下面的命令來初始化truffle應(yīng)用。
mkdir firstApp
cd firstApp
truffle init
上面最后一個命令就會自動幫你構(gòu)造好的程序框架,包括一些最基本的JavaScript文件,幾個智能合約源代碼,主應(yīng)用程序的HTML代碼及配套的CSS等文件 。如下是這個基本框架:
接下來你可以添加自己的代碼到contracts
目錄下的智能合約文件,也可以什么都不動,因為truffle已經(jīng)自動生成了最基本的框架。
#這個命令會把智能合約源代碼編譯成字節(jié)碼
truffle compile
編譯好的代碼需要部署到區(qū)塊鏈上才可以執(zhí)行,在truffle中這個工作是由migrates
目錄下定義的migrate作業(yè)執(zhí)行的,我們?nèi)バ薷奈募?code>2_deploy_contracts.js為如下:
module.exports = function(deployer) {
// deployer.deploy(ConvertLib);
// deployer.autolink();
// deployer.deploy(MetaCoin);
deployer.deploy(HelloEthereum);
};
然后執(zhí)行如下命令去執(zhí)行代碼部署,它除了把你的智能合約發(fā)布到區(qū)塊鏈之外,還會做一些相關(guān)工作,比如link用到的library等。deployer可以使用promise
的方式 (e.g. .then(function(xx)))來執(zhí)行其他額外的工作等,比如創(chuàng)建一個其他的合約并調(diào)用,等。這個便于你來靈活的擴展應(yīng)用。
truffle migrate
truffle build
結(jié)語
好了,至此我們已經(jīng)了解了什么是以太坊已經(jīng)其上運行的智能合約,DAPP等概念。后面又介紹了開發(fā)智能合約的工具已經(jīng)可復(fù)用的框架,最后又手把手親自做了一個智能合約。這樣大家應(yīng)該對區(qū)塊鏈以及以太坊等公有鏈有了一個形象具體的感覺了吧。如果這里有什么問題或者建議,歡迎通過下面的聯(lián)系方式與我溝通。
Referece
聯(lián)系我:
- phray.zhang@gmail.com (email/郵件,whatsapp, linkedin)
- helloworld_2000 (wechat/微信)
- github
- [簡書 jianshu](http://www.lxweimin.com/users/a9e7b971aafc)
- 微信公眾號:vibex
- webo/微博