Solidity语言学习(三)——智能合约编程案例一投票系统

下面我们会编写一个智能合约,通过实际的代码分析来了解使用Solidity语言编写智能合约。

下面的这个合约相对复杂一些,但是展示了许多Solidity的特性。它实现了一个简单的投票系统。当然,电子投票的关键是如何为投票人分配权限给正确的投票人,阻止那些非法的投票人。虽然这里我们没有实现所有的功能,但是可以代理投票,同时自动计算票数且整个投票过程完全透明。

我们为每一个选票创建一个合同,并提供了一个简称。合同的创建者也就是chairperson有权将投票权分配到每个地址。

被分配了投票权的地址就可以他们自己投票,也可以将投票权代理给他们信任的人。

投票结束,winningProposal()将会返回获得票数最多的选票。


pragma solidity ^0.4.22;

/// 附带代理的投票系统
contract Ballot {

    // 这里声明了一个复杂的数据类型,它代表了一个独立的投票者。
    struct Voter {
        uint weight;//  投票者拥有的投票权重
        bool voted;// 投票者是否已经投票,若为true则已经投票
        address delegate;//  投票者指定的代理
        uint vote;// 投票者所投的提案
    }

    // 这里声明了一个提案类
    struct Proposal {
        bytes32 name;// 提案简称 (最多 32 bytes)
        uint voteCount;// 提案的投票数统计
    }

    address public chairperson;

    // 这里声明了一个mapping,存储了每一个Voter的address
    mapping(address => Voter) public voters;

     // 一个用来存储提案的动态数组
    Proposal[] public proposals;

    //构造函数,初始化投票系统,初始化提案
    function Ballot(bytes32[] proposalNames) public {
        chairperson = msg.sender;
        voters[chairperson].weight = 1;

        // 为每一个提案名称创建一个提案对象,并存储到数组里
        for(uint i=0; i winningVoteCount){
                winningVoteCount = proposals[p].voteCount;
                winningProposal_ = p;
            }
        }
    }

    // 调用winningProposal,获取提案库里获胜的提案,返回提案的名称。
    function winnerName() public view returns (bytes32 winnerName_){
        winnerName_ = proposals[winningProposal()].name;
    }
}

你可能感兴趣的:(Solidity语言学习(三)——智能合约编程案例一投票系统)