以太坊Dapp终极教程——如何构建一个完整的全栈去中心化应用(三)

2023-11-07

以太坊Dapp终极教程——如何构建一个完整的全栈去中心化应用(一)中,我们已经完成了一切所需的设置;在以太坊Dapp终极教程——如何构建一个完整的全栈去中心化应用(二)中,让我们通过列出将在选举中运行的候选人来继续构建智能合约并完成客户端程序。下面我们来完成投票部分,现在让我们添加在选举中投票的能力。

让我们定义一个选民voters映射到智能合约,以跟踪在选举中投票的账户,如下所示:

contract Election {
    // ...

    // Store accounts that have voted
    mapping(address => bool) public voters;

    // ...
}

现在让我们添加一个投票vote函数:

contract Election {
    // ...

    // Store accounts that have voted
    mapping(address => bool) public voters;

    // ...

    function vote (uint _candidateId) public {
        // require that they haven't voted before
        require(!voters[msg.sender]);

        // require a valid candidate
        require(_candidateId > 0 && _candidateId <= candidatesCount);

        // record that voter has voted
        voters[msg.sender] = true;

        // update candidate vote Count
        candidates[_candidateId].voteCount ++;
    }
}

此函数的核心功能是通过从候选candidates映射中读取候选结构并使用递增运算符(++)将voteCount增加1来增加候选者的投票计数。让我们看看它做的其他一些事情:

  • 1.它接受一个论点。这是一个带有候选者id的无符号整数。
  • 2.它是公开可见的,因为我们想要一个外部帐户来调用它。
  • 它添加了投票给我们刚刚创建的选民映射的帐户。这将使我们能够跟踪选民在选举中投票的情况。我们使用Solidity提供的全局变量msg.sender访问调用此函数的帐户。
  • 它实现了require语句,如果不满足条件,它将停止执行。首先要求选民之前没有投票。我们通过从映射中读取带有msg.sender的帐户地址来完成此操作。如果它在那里,该帐户已经投票。接下来,它要求候选ID有效。候选id必须大于零且小于或等于总候选计数。

现在,你的完整合约代码应如下所示:

pragma solidity ^0.4.2;

contract Election {
    // Model a Candidate
    struct Candidate {
        uint id;
        string name;
        uint voteCount;
    }

    // Store accounts that have voted
    mapping(address => bool) public voters;
    // Read/write candidates
    mapping(uint => Candidate) public candidates;
    // Store Candidates Count
    uint public candidatesCount;

    function Election () public {
        addCandidate("Candidate 1");
        addCandidate("Candidate 2");
    }

    function addCandidate (string _name) private {
        candidatesCount ++;
        candidates[candidatesCount] = Candidate(candidatesCount, _name, 0);
    }

    function vote (uint _candidateId) public {
        // require that they haven't voted before
        require(!voters[msg.sender]);

        // require a valid candidate
        require(_candidateId > 0 && _candidateId <= candidatesCount);

        // record that voter has voted
        voters[msg.sender] = true;

        // update candidate vote Count
        candidates[_candidateId].voteCount ++;
    }
}

测试投票功能

现在让我们为election.js测试文件添加一个测试:

it("allows a voter to cast a vote", function() {
    return Election.deployed().then(function(instance) {
      electionInstance = instance;
      candidateId = 1;
      return electionInstance.vote(candidateId, { from: accounts[0] });
    }).then(function(receipt) {
      return electionInstance.voters(accounts[0]);
    }).then(function(voted) {
      assert(voted, "the voter was marked as voted");
     
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

以太坊Dapp终极教程——如何构建一个完整的全栈去中心化应用(三) 的相关文章

  • ChatGPT常见错误解决和封号情形说明

    1 ChatGPT国内能用吗 答 ChatGPT官网国内IP不能 包括港澳台 最好用美国IP 所以需要魔法才能访问官网 这块内容懂得都懂 不敢写教程 只能各位自行搞定 搞不定还是老实用国内的 2 登录遇到ChatGPT高峰期 解决办法 遇到
  • 深度学习-无监督学习(2)

    一 简介 接续上一节我们对无监督学习的介绍 接下来我们将对其中的两大模块展开介绍 在介绍之前会对流行数据让大家有一定的了解 二 无监督学习 数据流形 流形学习的目标是在保持特征特性的同时 将原来位于高维空间中的数据嵌入到低维空间中 这是可能
  • gcc 4.9 g++ gfortran 安装

    Linux编译安装GCC 4 9 0 有需要的朋友可以参考下 Linux下编写C C 程序自然缺不了一个优秀的编译器 Linux下比较常见的自然是GCC了 最近GCC也出到了4 9 0版本 对于C 11 14也有了更好的支持了 所以 今天我

随机推荐

  • 5.4 龙贝格算法

    为什么有龙贝格算法 龙贝格算法是一种数值积分方法 用于计算定积分的数值近似值 它是基于复合梯形法和复合辛普森法的推广和拓展 可以达到更高的精度 相较于复合梯形法和复合辛普森法 龙贝格算法的收敛速度更快 且误差更小 因此在计算积分时更加精确
  • Restful API注解之@PathVariable和@JsonView详解

    对于restful API的使用可以查看我之前的文章SpringMVC开发restful API查询请求 本文将在restful API的基础上介绍 PathVariable和 JsonView注解的详细使用方式 一 PathVariabl
  • 国王分金币(超详细版)

    描述 国王将金币作为工资 发放给忠诚的骑士 第一天 骑士收到一枚金币 之后两天 第二天和第三天 每天收到两枚金币 之后三天 第四 五 六天 每天收到三枚金币 之后四天 第七 八 九 十天 每天收到四枚金币 这种工资发放模式会一直这样延续下去
  • 数据结构:数组模拟栈

    实现一个栈 栈初始为空 支持四种操作 push x 向栈顶插入一个数 x pop 从栈顶弹出一个数 empty 判断栈是否为空 query 查询栈顶元素 用数组模拟栈 栈 先进后出 include
  • 基于Python的Streamlit框架数据可视化

    背景 性能测试和授权软件每周周会前都需要手工统计数据到excel文档形成周报 人工统计费时费力 excel文档也不美观 所以萌生了用数据可视化展示周报的想法 由于不太懂web开发 html css这些 网上浏览了一番 发现已经有大佬基于Py
  • 2022 年面向开发人员的七个优秀 Java IDE

    ava是最强大的编程语言之一 目前用于30亿台设备的开发 每天约有70万开发人员使用它 它一直是开发大量应用程序的重要组成部分 它提供了一些惊人的功能 例如易于学习和理解 高度安全 平台独立性 极其安全等等 Java IDE 集成开发环境
  • C#:通过字符串(文本)调用控件

    TextBox tb TextBox this GetType GetField tb Runtime System Reflection BindingFlags NonPublic System Reflection BindingFl
  • Scanner类在Java中的使用

    一 前言 在学习Java的过程中 我们很容易看得到诸如 从键盘中输入 这就需要我们新手 不针对大佬 大佬绕路即可 哈哈哈哈 学习其中的知识 今天就来给大家讲一下Scanner的使用方法 二 知识点 1 导包 import java util
  • 解决npm切换国内源-nrm ls 命令*不显示的问题

    解决npm切换国内源 nrm ls 命令 不显示的问题 解决方案 此时不显示 nrm ls 解决方案 进入本地全局包安装目录 例AppData Roaming npm node modules nrm nrm目录下打开cli js文件 找到
  • 攻防世界--WEB题之robots

    问题描述 难度系数 一颗星 题目来源 Cyberpeace n3k0 题目描述 X老师上课讲了Robots协议 小宁同学却上课打了瞌睡 赶紧来教教小宁Robots协议是什么吧 题目场景 点击获取在线场景 题目附件 暂无 题目分析 这个题由题
  • python基础练习题(一)

    参考 一 单选题 1 Python中 运算符比较两个对象的值 下列选项中哪一个是is比较对象的因素 4 0分 A id B sum C max D min id 命令查看变量的地址 2 在python中 字符串s abc 那么执行表达式s
  • vue2以ElementUI为例构建notify便捷精美提示

    我们先引入一个 第三方UI库 这里 我们以elementUI为例 先引入依赖 npm install element ui save 然后 在 main js 入口文件中 引入一下 import ElementUI from element
  • MSYS2 如何添加国内源

    用MSYS2 pacman S 安装包的速度让你怀疑人生 所以需要将源换成国内源 步骤 lt 1 gt 打开MSYS2软件内的 etc pacman d 其中有3个文件 mirrorlist mingw32 mirrorlist mingw
  • Nacos未授权访问漏洞(CVE-2021-29441)

    目录 漏洞描述 影响范围 环境搭建 漏洞复现 声明 本文仅供学习参考 其中涉及的一切资源均来源于网络 请勿用于任何非法行为 否则您将自行承担相应后果 本人不承担任何法律及连带责任 加粗样式 漏洞描述 Nacos 是阿里巴巴推出来的一个新开源
  • 百度Apollo(二):障碍物感知模块

    Apollo感知模块具有识别障碍物和交通灯的能力 其中 Apollo解决的障碍物感知问题 1 高精地图ROI过滤器 HDMap ROI Filter 2 基于卷积神经网络分割 CNN Segmentation 3 MinBox 障碍物边框构
  • jenkins构建前、构建、构建后操作

    因为使用docker部署的jenkins存在目录映射问题 所以直接部署jenkins 部署参考 构建前操作 思路 使用ssh到目标服务器下发命令 查询启动的node服务 分析不同的服务器启动的服务 备份服务对应代码 构建 思路 jenkin
  • linux 创建 svn 库

    cd data svn mkdir p itvalue chown R windmaker windmaker itvalue svnadmin create data svn itvalue cd itvalue cd conf vim
  • freeimage ubuntu安装

    sudo apt get install libfreeimage dev sudo apt get install libfreeimage 编译安装地址 https github com Kanma FreeImage This dis
  • es6 求两个数组的差集

    let arr 1 2 3 4 5 let arr01 1 2 3 4 5 6 7 8 9 let arr02 arr01 filter x gt arr every y gt y x console log arr02
  • 以太坊Dapp终极教程——如何构建一个完整的全栈去中心化应用(三)

    在以太坊Dapp终极教程 如何构建一个完整的全栈去中心化应用 一 中 我们已经完成了一切所需的设置 在以太坊Dapp终极教程 如何构建一个完整的全栈去中心化应用 二 中 让我们通过列出将在选举中运行的候选人来继续构建智能合约并完成客户端程序