智能合约实战-投票合约
2018-04-10 本文已影响8人
DavieKong
我们以一个投票合约来说明一下合约的部署和调用
合约代码
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
这里我们随便选一个就行,每个账户都分配了100个以太币。
部署合约
点击“Create”按钮部署智能合约到内存中,并进行调试,如果部署成功,会出现智能合约的函数运行按钮和参数输入框,然后就可以调试你的智能合约了
image.png调用合约
那下面我们给候选人投下票试试。
在 Vote_candidate 函数后的输入框里填入1,给赵四投一票。然后点击这个函数执行。
image.png
打开控制台可以看到合约执行了。
image.png
那怎么才能知道赵四得到一票了呢。
我们可以在 candidates候选人里输入候选人的下标。查看
image.png
可以看到赵四得到了一票。
然后我们看一下最后的而结果,点击 “Getcount”
image.png
可以看到赵四一票,刘能0票。