李赫 2016年9月10日
一、 智能合約IDE簡介
目前以太坊上支援三種語言編寫智能合約,
Solidity:類似JavaScript,這是以太坊官方推薦語言,也是最流行的智能合約語言。具體用法參加Solidity文檔,地址:https://solidity.readthedocs.io/en/latest/
Serpent:類似Python風格,文檔地址:https://github.com/ethereum/wiki/wiki/Serpent
LLL:類似Lisp風格,目前已經被終止了。
可以根據不同的習慣選擇不同的進階語言,目前最流行的是Solidity。本文所有的智能合約均為Solidity語言編寫。
目前能夠編寫智能合約的IDE有常見幾種:
Mix:是早期以太坊主要的開發IDE,可以支援智能合約和DAPP的編寫、調試,部署,全圖形化介面,但是隨著原創主持人Gavin Wood的離開,慢慢邊緣化,最終被停止開發,整個團隊轉向Remix項目,出於對未來的考慮,不建議學習Mix。
Remix:是原Mix團隊的新作品,目前只有簡單的Debug功能上線,未來可以重點關注一下。
browser-solidity:該項目是智能合約瀏覽器版本的開發環境,可以支援在瀏覽器中直接開發、調試和編譯,對於初學者來說,可以快速上手,不需要安裝,非常方便,直接存取地址使用:https://ethereum.github.io/browser-solidity/,本文採用此IDE進行開發。
Ethereum Studio:第三方公司開發的企業版智能合約線上IDE,功能強大,免費使用,可以作為企業級開發的一個工具,訪問地址:https://live.ether.camp/
Visual Studio 2015:沒錯,就是微軟的VS 2015,微軟已經把以太坊的智能合約編寫功能整合了,可以看出微軟對以太坊的重視。
二、 編寫第一個智能合約
1、 智能合約文法學習方法
智能合約的文法和樣本可以在Solidity的文檔網站http://solidity.readthedocs.io/en/latest/查看,基本上把這些線上文檔看完,已經算精通了,剩下的只是實踐編寫代碼。
2、 樣本合約代碼
首先,我們先給出一個範例程式碼,後面將以這個代碼為例解釋說明智能合約的編寫和調試。
-------------------------------------------------------------------------------------------
contract Votelihe {
struct Candidate {
uint votecount;
string name;
}
struct Voter {
bool voted;
}
mapping(address => Voter) public voters;
Candidate[] public candidates;
function Votelihe() {
candidates.push(Candidate({
name: "lihe",
votecount: 0
}));
candidates.push(Candidate({
name: "dandan",
votecount: 0
}));
}
function Vote_candidate(uint8 numCandidate)
{
if(voters[msg.sender].voted ||numCandidate>candidates.length)return;
candidates[numCandidate].votecount+=1;
voters[msg.sender].voted=true;
}
function Getcount() returns(string,uint,string,uint){
return(candidates[0].name,candidates[0].votecount,candidates[1].name,candidates[1].votecount);
}
}
--------------------------------------------------------------------------------------------------
該代碼建立了一個投票程式,對兩個候選人lihe和dandan進行投票,每個人只有一次投票的機會,最後反饋lihe和dandan的得票結果。各個函數說明如下:
function Votelihe():建構函式,智能合約只運行一次
function Vote_candidate():對候選人進行投票,每個投票者只能投一票
function Getcount():返回當前候選的得票數
3、 使用IDE編寫智能合約
首先我們開啟browser-solidity,IDE的主要功能如下:
將範例程式碼拷貝到左側的代碼編輯框,IDE將自動檢測語法錯誤,並顯示在右側的視窗上,如下圖所示:
可以看到,提示有未聲明的對象,是在14行的錯誤,很明顯是我一個結構對象candidates誤寫為candidates2了,修改一下即可校正通過。
注意,在瀏覽器裡編寫代碼,他是自動儲存在本地瀏覽器緩衝裡面的,只要清除瀏覽器緩衝,代碼不會丟失。
三、調試第一個智能合約
目前browser-solidity有兩種常用的調試方式,一個是採用本地虛擬機器偵錯模式,一個是串連到本地的私人鏈進行調試。
1、 本地虛擬機器偵錯模式
本地虛擬機器調試,就是不串連任何一個節點,在記憶體虛擬出一個以太坊節點進行調試,優點是速度快,配置簡單,缺點是因為只是虛擬調試,可能最後放到真正的區塊鏈節點上運行智能合約會和預想的結果不同。
首先在DEBUG環境設定中,選擇JavaScript VM以設定本地虛擬偵錯模式,如下圖:
設定成功後,可以在帳號狀態列看到可以用的賬戶列表,如下圖
智能合約代碼編寫好後,點擊“Create”按鈕部署智能合約到記憶體中,並進行調試,如果部署成功,會出現智能合約的函數運行按鈕和參數輸入框,然後就可以調試你的智能合約了,如下圖:
運行函數後,會出現相應的交易資料,可以完成整個智能合約調試。
如果想逐步調試智能合約,那麼選擇小蟲子表徵圖,切換到逐步調試介面,即可實現單步運行智能合約,注意這裡的單步運行不是指代碼而是指智能合約編譯後的OPCODE,如下圖。
2、 串連到本地私人鏈調試
串連到本地私人鏈調試,就是通過RPC介面,串連本地的以太坊節點,實際部署並調試智能合約,缺點是速度較慢,配置複雜,優點是能夠真實運行智能合約,最大程度的防止出錯,關於私人鏈的配置,請參考我原先發表的文章《區塊鏈開發(一)搭建基於以太坊的私人鏈環境》。
首先在DEBUG環境設定中,選擇Web3 Provider以設定本地虛擬偵錯模式,同時預設會給出一個串連地址為http://localhost:8545,如果你配置的私人鏈RPC連接埠修改了,記得要改成對應的連接埠,如下圖:
然後,切換到帳號狀態列,此時顯示的可用帳號,應該都是你部署的私人鏈裡面的帳號,如果不是,說明沒有成功串連私人鏈。可能的原因有兩個,一是私人鏈提供的連接埠是用http訪問,而browser-solidity的網頁訪問地址是https,解決的方法就是將browser-solidity訪問地址改為http協議的地址即可http://ethereum.github.io/browser-solidity/;二是系統的時間沒有和網路同步,使用windows系統內建的時間同步功能同步一下即可。三是如果串連到本地私人鏈調試時出現Error: account is locked的錯誤,是因為geth需要解鎖本地的以太坊帳號,在geth的控制台輸入personal.unlockAccount('帳號地址')即可。
四、 其他常見智能合約資源
下面一些例子網站去參考一些成熟的代碼,方便快速迭代學習,常見的例子網站如下:
https://github.com/ethereum/wiki/wiki/Solidity-Collections
http://ether.fund/contracts/
https://github.com/chriseth/solidity-examples
https://github.com/ethereum/dapp-bin
https://github.com/fivedogit/solidity-baby-steps
http://dapps.ethercasts.com
http://ether.fund/contracts
開發架構常用的有3個:
Truffle:說明書地址http://truffle.readthedocs.io/en/latest/
以太坊目前很流行的開發架構Truffle的說明書,這個架構比較流行。
Dapple:說明書地址http://dapple.readthedocs.io/en/master/
這個開發架構是在gitter chart上看到的,感覺用的人不多,先觀察
Meteor:說明書地址https://github.com/ethereum/wiki/wiki/Dapp-using-Meteor
這個開發架構是以太坊官方推薦的,寫進了以太坊的官方wiki,值得學習,當然,以太坊官方經常轉換方向,以後換別的也沒準