试试投票合约 / 学习智能合约#8

in STEEM CN/中文6 years ago

voting.jpg

在16年的时候很多人嘲笑以太坊的功能弱:也就能用在小学生选班长上! Solidity语言中就把这个选班长合约做成一个经典案例了。

找到相关的合约代码研究了下,发现还蛮复杂的。一时间还不知从何入手呢。

去掉些复杂的条件,找到最核心的东东,试了试,还蛮顺利地就实现了。代码如下:

pragma solidity >0.4.23 <0.7.0;

contract Voting {
  mapping (string => uint ) public votesReceived;
  mapping (address => bool) private addrRecoded;
  string[] public candidateList = ["lemool", "jackey", "hello"];

  function totalVotesFor(string memory candidate) view public returns (uint) {
      return votesReceived[candidate];
  }

  function voteForCandidate(string memory candidate) payable public {
    require(!addrRecoded[msg.sender]);
    addrRecoded[msg.sender] = true;
    uint m = msg.value / 0.1 ether;
    votesReceived[candidate] += m;
  }
}

做几点说明:

  1. 将候选人类型设为了"string" 而不是"bytes32",这样可以很方便地交互。"bytes32"是个大坑,现在新版的必须将字符串转成十六过制类型才能存入,否则一个劲地报错!
  2. 投票合约和代币一样,就是做个表格记录候选人的票数,理解这点就很简单了。其它的附加条件可以先不用。
  3. 投票通过"msg.value"来收费,0.1个币一票,充分体现什么叫资本主义。

Coin Marketplace

STEEM 0.05
TRX 0.32
JST 0.078
BTC 66831.29
ETH 1826.86
USDT 1.00
SBD 0.42