編寫除錯以太坊智慧合約/blockchain
一、 智慧合約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/
Ethereum Studio:第三方公司開發的企業版智慧合約線上IDE,功能強大,免費使用,可以作為企業級開發的一個工具,訪問地址:https://live.ether.camp/
Visual Studio 2015:沒錯,就是微軟的VS 2015,微軟已經把以太坊的智慧合約編寫功能整合了,可以看出微軟對以太坊的重視。
二、 編寫第一個智慧合約
1、 智慧合約語法學習方法
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系統自帶的時間同步功能同步一下即可。
四、 其他常見智慧合約資源
下面一些例子網站去參考一些成熟的程式碼,方便快速迭代學習,常見的例子網站如下:
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,值得學習,當然,以太坊官方經常轉換方向,以後換別的也沒準