solidity经典案例-----智能投票

这篇具有很好参考价值的文章主要介绍了solidity经典案例-----智能投票。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

案例分析

角色分析:包括主持人、选民
功能分析:

  1. 仅主持人能授权给每个选民1票,即每个参与投票的选民拥有1票投票权。
  2. 选民可以选择将票数委托给其它选民,当然,收委托的选民仍然可以将票数继续委托给其它选民,即存在a—>b–>c–>d,但是,一旦将票数委托给其它选民后,自己将不再有投票的权利
  3. 选民和主持人可以选择任意的提案项目进行投票

代码实例

pragma solidity^0.6.1;

contract ballot{
  //选民结构
   struct Voter{
       uint weight; //可以投票的数量
       bool isVoted;//是否已投
       address delegate;//授权给他人
       uint index;//选择的提案编号
   }

   //提案结构,这里的提案就是要进行投票的项目
   struct Proposal{
       bytes32 name;//投票名称
       uint voteCount;//投票数
   }
   Proposal []public proposals;//提案数组
   address public chairman;//主持人
   mapping(address=>Voter) public voters;//全部选民信息

   //构造函数
   constructor(bytes32[]memory _proposalNames)public{
       chairman=msg.sender;
       voters[chairman].weight=1;//主持人可以投1票
       uint i=0;
        //提案初始化
        for(i=0;i<_proposalNames.length;i++){
            Proposal memory p = Proposal(_proposalNames[i],0);
            //存入提案数组中
            proposals.push(p);
        }
   }
   //授权,仅主持人具有权利,主持人给每个选民一票的权利
   function giveRightToVoter(address _to)public{
       require(msg.sender==chairman,"must be chairman");
       require(!voters[_to].isVoted);
       require(voters[_to].weight==0);
       voters[_to].weight=1;
   }
   //委托,选民可以将投票给自己信任的代表
   function delegate(address _to)public{
       //获取调用函数的账户
       address voter = msg.sender;
       //当前账户必须还未投票
       require(!voters[voter].isVoted,"must not voted");
       //当前账户的可投的票数必须>0
       require(voters[voter].weight>0,"must weight >0");
       //委托的账户不能是自己
       require(_to!=voter);
       //a--->b--->c-->d
       //循环判断待委托人,由于待委托人可能还把票委托给其它人,所以循环判断,直到委托账户地址不存在为止
       while(voters[_to].delegate!=address(0)){
           _to=voters[_to].delegate;
       }
       //执行到这里,_to已经是要委托的那个人,委托给他
       voters[voter].delegate=_to;
       //委托后,认为该选民已经投过票了
       voters[voter].isVoted=true;
       //如果_to已经投过了,自然是无条件支持,直接将自己的票数累加
       if(voters[_to].isVoted){
           uint index = voters[_to].index;
           proposals[index].voteCount+=voters[voter].weight;
       }else{
           voters[_to].weight+=voters[voter].weight;
       }
       voters[voter].weight=0;
   }
   //投票操作
   function vote(uint _index)public{
       require(!voters[msg.sender].isVoted,"must not voted");
       voters[msg.sender].isVoted=true;
       voters[msg.sender].index=_index;
       //增加提案的投票数
       proposals[_index].voteCount+=voters[msg.sender].weight;
   }

   //获取票数最高的提案编号
   function getWinIndex()public view returns(uint){
       uint i=0;
       uint index=0;
       uint maxCount=0;
       for(i=0;i<proposals.length;i++){
           if(proposals[i].voteCount>maxCount){
               maxCount=proposals[i].voteCount;
               index=i;
           }
       }
         return index;
   }
   //获取获胜的提案名称
   function getWinName()public view returns(bytes32){
       uint index=getWinIndex();
       return proposals[index].name;
   }
}

函数功能测试

1. 设置账户

1号为主持人账户,2-8号为选民账户

solidity投票,solidity,Fisco-bcos智能合约开发,区块链

2. 主持人部署合约

输入提案参数:[“0x7465737400000000000000000000000000000000000000000000000000000000”,“0x8535737400000000000000000000000000000000000000000000000000000000”]
solidity投票,solidity,Fisco-bcos智能合约开发,区块链

3. 查询初始化的提案

提案存入到Proposals数组里面,查看只需要输入数组索引即可

solidity投票,solidity,Fisco-bcos智能合约开发,区块链

4.主持人授权给每个选民1票投票权

solidity投票,solidity,Fisco-bcos智能合约开发,区块链

5. 查看选民的票数信息

注意:主持人也有1票权

solidity投票,solidity,Fisco-bcos智能合约开发,区块链

6. 选民将自己的票数委托给其它选民

2号–>3号,3号–>4号,6号–>8号,7号–>6号
注意:选民将票数委托给其它选民后,无论其它选民是否再次将票数委托给自己,自己都将没有投票权
2号–>3号
solidity投票,solidity,Fisco-bcos智能合约开发,区块链
3号票数变为2solidity投票,solidity,Fisco-bcos智能合约开发,区块链
3号–>4号solidity投票,solidity,Fisco-bcos智能合约开发,区块链
3号票数变为0solidity投票,solidity,Fisco-bcos智能合约开发,区块链
4号票数变为3solidity投票,solidity,Fisco-bcos智能合约开发,区块链
6号–>8号solidity投票,solidity,Fisco-bcos智能合约开发,区块链
8号票数变为2solidity投票,solidity,Fisco-bcos智能合约开发,区块链
7号–>6号solidity投票,solidity,Fisco-bcos智能合约开发,区块链
6号票数仍未0,因为选民已经参与过投票,便不可再次参与投票solidity投票,solidity,Fisco-bcos智能合约开发,区块链

7.选民进行投票

经过上轮的投票委托,现在选民情况为:1号有1票,4号有3票,8号有2票,1号投—>提案1,4号投–>提案2,8号投–>提案2

solidity投票,solidity,Fisco-bcos智能合约开发,区块链
solidity投票,solidity,Fisco-bcos智能合约开发,区块链
solidity投票,solidity,Fisco-bcos智能合约开发,区块链

8. 获取票数最高的提案编号

提案1有4票,提案2有2票
solidity投票,solidity,Fisco-bcos智能合约开发,区块链

9.获取票数最高的提案名称

solidity投票,solidity,Fisco-bcos智能合约开发,区块链文章来源地址https://www.toymoban.com/news/detail-795016.html

到了这里,关于solidity经典案例-----智能投票的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 多线程四大经典案例

    本节内容很重要, 希 望 大 家 可 以 好 好 看 看 , 一 起 加 油~ 1.单线模式 1.1饿汉模式 1.2懒汉模式 2.阻塞式队列 2.1阻塞队列是什么 2.2生产者消费者模型 2.3标准库中的阻塞队列 2.4阻塞队列的实现 3.定时器 3.1定时器是什么 3.2标准库中的定时器 3.3实现定时器 4.线程池 4.1什么

    2023年04月27日
    浏览(49)
  • 国内外大数据经典案例研究

    大数据时代的来临使得产生的数据量呈爆炸式增长,各行各业均面临着海量数据的分析、处理问题。如何运用大数据技术从海量数据中挖掘出有价值的信息,将是今后企业发展的一个巨大挑战。点评收集研究了国内外大数据应用的经典案例,希望可以对读者有所启示。 1 、塔

    2024年02月05日
    浏览(77)
  • 路由器故障排错三大经典案例

    对于网络管理员来说,熟悉与掌握路由排错的思路和技巧是非常必要的。小编将通过三例典型的路由故障排错案例进行分析。 案例1 不堪重负,路由器外网口关闭 1、网络环境 某单位使用的是Cisco路由器,租用电信30MB做本地接入和l0MB教育网双线路上网,两年来网络运行稳定,

    2024年02月05日
    浏览(47)
  • Python递归的几个经典案例

    当我们碰到诸如需要求阶乘或斐波那契数列的问题时,使用普通的循环往往比较麻烦,但如果我们使用递归时,会简单许多,起到事半功倍的效果。这篇文章主要和大家分享一些和递归有关的经典案例,结合一些资料谈一下个人的理解,也借此加深自己对递归的理解和掌握一

    2024年02月05日
    浏览(48)
  • MySQL学习指南&笔记&经典案例句

    该文章是一篇关于MySQL的一个学习的笔记或是指南,该文章中有很多的经典的案例可进行相应的练习和参考,后期的话会持续更新关于数据库系统方面的文章。 关于综合案例的话可以对该篇文章进行查阅和学习也附加了相应的问题和sql句: MySQL综合应用练习(直接拷贝到自己空

    2024年02月05日
    浏览(48)
  • 阿里后端开发:抽象建模经典案例

    在互联网行业,软件工程师面对的产品需求大都是以具象的现实世界事物概念来描述的,遵循的是人类世界的自然语言,而软件世界里通行的则是机器语言,两者间跨度太大,需要一座桥梁来联通,抽象建模便是打造这座桥梁的关键。基于抽象建模,不断地去粗取精,从现实

    2024年02月09日
    浏览(96)
  • 【入门Flink】- 02Flink经典案例-WordCount

    需求:统计一段文字中,每个单词出现的频次 基本思路:先逐行读入文件数据,然后将每一行文字拆分成单词;接着按照单词分组,统计每组数据的个数。 1.1.数据准备 resources目录下新建一个 input 文件夹,并在下面创建文本文件words.txt words.txt 1.2.代码编写 打印结果如下:(

    2024年02月06日
    浏览(72)
  • C#中的反射(Reflection)使用经典案例

    C#中的反射(Reflection)是.NET框架提供的一种强大的运行时元编程机制,它允许程序在运行时获取类型信息、创建对象实例、调用方法、访问字段和属性等,而这些操作在编译时可能是未知的。以下是几个使用反射的典型场景: 1. 动态加载和调用类的方法 假设有一个库包含多

    2024年02月02日
    浏览(44)
  • C++动态规划经典案例解析之合并石子

    区间类型问题,指求一个数列中某一段区间的值,包括求和、最值等简单或复杂问题。此类问题也适用于动态规划思想。 如 前缀和 就是极简单的区间问题。如有如下数组: 现给定区间信息 [3,6] ,求区间内所有数字相加结果。即求如下图位置数字之和。 Tips: 区间至少包括

    2024年02月11日
    浏览(39)
  • 手搭手Ajax经典基础案例省市联动

    环境介绍 技术栈 springboot+mybatis-plus+mysql 软件 版本 mysql 8 IDEA IntelliJ IDEA 2022.2.1 JDK 1.8 Spring Boot 2.7.13 mybatis-plus 3.5.3.2 pom.xml application.yml配置文件 数据库表 MybatisX逆向工程 逆向工程:通过数据库表接口,逆向生成java工程结构 实体类、mapper接口、mapper映射文件、Service接口、serv

    2024年02月08日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包