说明:因为solidity版本更新,本文在2019年1月4日更新
我们以一个投票合约来说明一下合约的部署和调用
合约代码
pragma solidity ^0.5.0;
contract Votelihe {
struct Candidate {
uint votecount;
string name;
}
struct Voter {
bool voted;
}
mapping(address => Voter) public voters;
//候选人数组
Candidate[] public candidates;
constructor() 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() public view returns( uint[] memory result) {
uint len = candidates.length;
result = new uint[](len);
for (uint i = 0; i < len; i++) {
result[i] = candidates[i].votecount;
}
return result;
}
}
代码说明:
开头声明了两个结构体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和1,1就是我们给第二个候选人投票的结果。