1. 程式人生 > >以太坊教程-智慧合約實戰:投票合約

以太坊教程-智慧合約實戰:投票合約

我們以一個投票合約來說明一下合約的部署和呼叫

合約程式碼

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中。
image.png

選擇執行環境

我們採用本地虛擬機器除錯。就是不連線任何一個節點,在記憶體虛擬出一個以太坊節點進行除錯,優點是速度快,配置簡單。
點選Environment,選擇 JavaScript VM。

image.png
設定成功後,可以在賬號狀態列看到可以用的賬戶列表,
image.png
這裡我們隨便選一個就行,每個賬戶都分配了100個以太幣。

部署合約

點選“Create”按鈕部署智慧合約到記憶體中,並進行除錯,如果部署成功,會出現智慧合約的函式執行按鈕和引數輸入框,然後就可以除錯你的智慧合約了

image.png

呼叫合約

那下面我們給候選人投下票試試。
在 Vote_candidate 函式後的輸入框裡填入1,給趙四投一票。然後點選這個函式執行。
image.png

開啟控制檯可以看到合約執行了。
image.png
那怎麼才能知道趙四得到一票了呢。

我們可以在 candidates候選人裡輸入候選人的下標。檢視
image.png
可以看到趙四得到了一票。
然後我們看一下最後的而結果,點選 “Getcount”
image.png
可以看到趙四一票,劉能0票。

掃描下方二維碼,關注微信公眾號:H5開講啦,獲取更多學習資料。

qr.jpg