以太坊教程-智慧合約實戰:投票合約
阿新 • • 發佈:2018-12-05
我們以一個投票合約來說明一下合約的部署和呼叫
合約程式碼
pragma solidity ^0.4.0; contract Votelihe { struct Candidate { uint votecount; string name; } struct Voter { bool voted; } mapping(address => Voter) public voters; //候選人陣列 Candidate[] public candidates; function Votelihe() public{ candidates.push(Candidate({ name: "劉能", votecount: 0 })); candidates.push(Candidate({ name: "趙四", votecount: 0 })); } function Vote_candidate(uint8 numCandidate) public { //判斷投票者是否投過票 已經候選人是否存在 if(voters[msg.sender].voted ||numCandidate>candidates.length)return; candidates[numCandidate].votecount+=1; //給候選人得票+1 voters[msg.sender].voted=true; //記錄投票人狀態 } //獲得投票結果 function Getcount() constant public returns(string,uint,string,uint){ return(candidates[0].name,candidates[0].votecount,candidates[1].name,candidates[1].votecount); } }
程式碼說明:
開頭聲明瞭兩個結構體Candidate和Voter。
- Candidate是候選人,儲存有候選人的得票數和候選人名。
- Voter 裡記錄某個地址是否投過票。
- voters是一個對映,和js中的物件類似,儲存了很多地址和這個地址是否投過票。
- candidates 是儲存所有候選人的陣列
- Votelihe是建構函式,在建構函式裡進行初始化,給candidates賦值。這裡添加了連個候選人。
- Vote_candidate 是投票函式,引數是候選人陣列的下標,也就是你要給誰投票
在這個函式中,判斷了某個地址是否投過票(voters[msg.sender].voted
numCandidate>candidates.length
)能進行投票。否則就給某個候選人的votecount屬性加一(candidates[numCandidate].votecount+=1
),並且設定這個地址投過票了(voters[msg.sender].voted=true;
)。 - Getcount 返回候選人得票數
把這段合約程式碼新增到remix中。
選擇執行環境
我們採用本地虛擬機器除錯。就是不連線任何一個節點,在記憶體虛擬出一個以太坊節點進行除錯,優點是速度快,配置簡單。
點選Environment,選擇 JavaScript VM。
設定成功後,可以在賬號狀態列看到可以用的賬戶列表,
這裡我們隨便選一個就行,每個賬戶都分配了100個以太幣。
部署合約
點選“Create”按鈕部署智慧合約到記憶體中,並進行除錯,如果部署成功,會出現智慧合約的函式執行按鈕和引數輸入框,然後就可以除錯你的智慧合約了
呼叫合約
那下面我們給候選人投下票試試。
在 Vote_candidate 函式後的輸入框裡填入1,給趙四投一票。然後點選這個函式執行。
開啟控制檯可以看到合約執行了。
那怎麼才能知道趙四得到一票了呢。
我們可以在 candidates候選人裡輸入候選人的下標。檢視
可以看到趙四得到了一票。
然後我們看一下最後的而結果,點選 “Getcount”
可以看到趙四一票,劉能0票。