3步! 老司机教你如何在以太坊上构建基于Token去中心化投票系统!

640?wx_fmt=gif

640?wx_fmt=jpeg

作者 | Doug Crescenzi

译者 | 王柯凝

出品 | CSDN、区块链大本营


如果想在以太坊平台上构建一个去中心化的自治系统,其实有很多种不同的方法可供你选择。其中,最常用的方法之一就是,选民使用代币(Token)代表投票。你拥有的代币越多,就意味着你可以投的票数就越多。


事实上,基于代币的去中心化投票系统有很多种类型,但基本上都要遵循一些固有的约定。通常来说,工作流程如下:


  • 某一选民提交一份提案 

  • 其他选民对该提案投赞成或反对票

  • 一旦议案的票数达到预定阈值,则会触发投票成功或失败动作

是不是超级简单?


然而,在构建一个基于代币的去中心化应用程序的实际操作中,我们还是会遇到很多困难与挑战。其中,最大的挑战之一就是选民欺诈行为。除此之外,投票的状态如何管理?一些代币独有的特性如何与相应的自治机制相结合?同样也是我们所要面临的挑战。


那么,下面我们就来实操一下吧!


现在,假设我们想要创建两个交互的智能合约:

  • Token智能合约:包含一个钱包地址和余额的映射。

  • 自治合约:管理投票系统。

在这里,选民使用代币余额对提案进行投票,而代币余额则表示选民可以对某一特定提案投票的票数。


首先,我们先假设某一选民提交提案


我们需要创建一个函数,允许选民向自治智能合约提交提案。


代码如下:


640?wx_fmt=png


在允许选民提交提案之前,首先需要验证这些选民是否拥有投票资格。在我们这个案例中,选民的代币余额必须大于0。另外,我们使用onlyEligibleVoter修改器来检查选民是否拥有投票资格:


640?wx_fmt=png


一旦确定该选民拥有投票资格,submitProposal函数就会将该选民的代币余额传递给votesReceived变量,然后再将这个值作为参数传递给addProposal函数:


640?wx_fmt=png


如上所示,addProposal函数将为该提案生成一个唯一ID,并创建一个提案对象,用来监控提案收到的票数、提案是否已通过以及提案的投票截止日期。


添加提案后,submitProposal函数将返回提案的唯一ID值,并触发ProposalSubmitted事件,供前端使用。


第二种情况是,其他选民可以投赞成或反对票。


现在,我们需要创建一个函数,来处理选民对该特定提案的投票。


在这个函数里,首先使用一个if语句,判断选民是否被阻止投票:如果选民未被阻止投票,就需要确定选民的代币余额是多少,然后再将该余额值添加到该提案的votesReceived变量中。


640?wx_fmt=png


然后,我们就可以查看,经过投票,该提案是否已经通过了

  • 如果提案通过,将会触发VotesSubmitted事件,并调用endVote函数;

  • 如果没通过,将会触发VotesSubmitted事件,并返回True,表示系统已经收到并成功处理了选民的投票。

第三种情况是,投票通过并触发相应的动作


这并不是说我们已经成功创建了一个允许选民创建提案和提交选票的函数。下面,我们来看看,如果提案获得了足够多的票数后,会发生什么。


submitVote函数将会调用if语句,检查是否已经收到足够的票数使提案通过:


640?wx_fmt=png


如果投票系统已经接收到足够多的票数,则会调用endVote函数:


640?wx_fmt=png


在这里,我们使用require语句和voteSuccessOrFail函数,确保该提案已经获得足够多的票数:


640?wx_fmt=png


如果投票通过,将会调用一个将Proposal的passed变量更新为True的函数。

如何防止选民欺诈行为?


在创建一个基于代币的去中心化投票应用程序的过程中,我们面临的最大挑战就是——选民的欺诈行为。比如,哪些因素会影响选民对提案进行投票?然后将代币发送给另外一个钱包地址进行重复投票?


你还记不记得有一个名为blocked的映射?


640?wx_fmt=png

我们用该映射来检查选民是否被阻止投票:

  • 如果选民已经投票或提交了提案,并且还处于投票期间,我们就会阻止该选民进行投票。

  • 如果选民被阻止投票,只有等到投票期结束,他们才能转移自己的代币。

为了在我们的Token智能合约中实现这一点,我们将使用whenNotBlocked修改器:


640?wx_fmt=png


然后,我们就可以在智能合约中的transfer和transferFrom 函数中使用修改器,这两个函数继承于OpenZeppelin的ERC-20Token智能合约。


640?wx_fmt=png


当然,这种算法也有自身的缺点,即会抑制选民投票,因为如果选民处于blocked锁定状态,他们就无法转移代币。这篇文章也介绍了其他几种使用ERC-20 Token进行安全投票的方法。



精华总结


  • 构建基于代币的去中心化投票应用程序并没有绝对“正确”的方法,这由具体用例决定。

  • 大多数基于代币的去中心化投票应用程序会遵循以下流程:选民提交提案→其他选民投支持或反对票→一旦提案的投票达到预定阈值,投票就会显示通过或失败,并触发相应的行动。

  • 在创建基于代币的去中心化投票应用程序时,选民欺诈是最大的挑战之一,当然,也可以使用ERC-20 Token来避免这一问题。

  • 另外一个挑战就是,选民的投票状态如何管理?一些代币独有的特性如何与相应的自治机制相结合?

  • 最后,对于受干扰应用程序来说,基于代币的投票系统是的一个强大的自治机制,但同时,也引入了一定的风险。


640?wx_fmt=jpeg


— END —


640?wx_fmt=png


推荐阅读:


  • 20万赚200万,48岁创业者是这样吊打小鲜肉的!

  • 以太坊升级完成你也做不出爆款应用, 就因为你不知道这个!

  • 跨界打击, 23秒绝杀700智能合约! 41岁遗传学博士研究一年,给谷歌祭出秘密杀器!

  • 如果中本聪没说错,这场战争美国输定了!

  • 如今,你感受到内存技术的“思维速度”了吗?

  • “SQL 被低估了!”

  • 万万没想到你们竟是这样的程序员 | 程序员有话说

  • 90后美女学霸传奇人生:出身清华姚班,成斯坦福AI实验室负责人高徒

  • 月入5万,程序员夫人们过上"贵妇"生活了吗?


点击“阅读原文”,打开 APP 获取更多干货哟!



好文!点好看」哟~


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/16225.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

新版以太坊Ethereum库ethersV5.0配合后端Golang1.18实时链接区块链钱包(Metamask/Okc)以及验签操作

区块链去中心化思想无处不在,比如最近使用个体抗原自检替代大规模的中心化核酸检测,就是去中心化思想的落地实践,避免了大规模聚集导致的交叉感染,提高了检测效率,本次我们使用Ethereum最新的ethersV5.0以上版本链接去…

以太坊Geth Trie源码解析

引言 Merkle Patricia Trie 是一种经过改良的、融合了默克尔树(Merkle Trie)和前缀树(Patricia Trie)两种树结构优点的数据结构,是以太坊中用来存储键值数据对(Key, Value)的重要树形数据结构。…

以太坊编程-Geth

前提:开发环境为Windows版本 一、下载安装 geth安装官网地址:https://geth.ethereum.org/downloads/ 安装时,根据提示一步一步安装即可 安装完成之后,需要进行配置环境变量 二、创世区块部署 新建.json文件:新建记事…

国华小状元1号年金险怎么样?好不好?

很多家长开始为孩子做好未来的教育准备,有一些家长过来私信学姐,少儿年金险有没有必要给孩子买一个? 正巧,学姐测评了一款少儿年金险,是国华人寿旗下的——国华小状元1号少儿年金保险。 听说保障内容不错&#xff1f…

风电场运营实践 | 麒麟信安助力国华投资山东公司集控中心实现安全智慧化运营

国华能源投资有限公司旗下山东分公司(简称:国华投资山东公司)的集控中心是山东省覆盖风电场装机规模最大的集控中心。日前,依托于部署的麒麟信安操作系统、麒麟信安服务器虚拟化等产品,国华投资山东公司智慧新能源集控…

约瑟夫环问题——数据结构p76页(耿国华主编)

约瑟夫环问题 题目: 约瑟夫问题的一种描述是:编号为1,2,……,n的n个人按顺序顺时针方向围坐一圈,每人持有一个密码(正整数)。开始时任选一个整数作为报数上限m,从第一个人…

数据结构用c语言描述第二版高等教育出版社,耿国华《数据结构-C语言描述(第2版)》,高等教育出版社...

《数据结构用C语言描述(第2版)》根据教育部计算机类专业教学指导委员会制定的“数据结构与算法”课程大纲和《全国硕士研究生入学统一考试计算机专业基础综合考试大纲》的要求而编写,跟踪技术发展需要,教材体系科学,内容简洁实用。《数据结构用C语言描述(第2版)》共10章。内…

oracle xe gentoo,Oracle在gentoo下安装

补充: 解决ORACLE10G安装界面中文乱码问题,修改以下变量使安装界面为英文。 export LC_CTYPEen_US.UTF-8 以下为原文 1.OS:Gentoo-linux-2.6.23-rc5 Oracle:Oracle Database 10g Release 2 (10.2.0.1.0) for Linux x86 下载地址: 2.使用管理员账户建立Or…

童国华正式执掌大唐电信集团

近日,国资委在其官方网站发布公告,对电信科学技术研究院(也就是业内熟知的“大唐电信科技产业集团”)进行了人事任免。 经研究,任命童国华为电信科学技术研究院党组院长,免去真才基的电信科学技术研究院院长…

计算机导论与c语言耿国华pdf,计算机导论与C语言

计算机导论与C语言 耿国华 电子工业出版社 出版时间: 2005-9 出版社: 电子工业出版社 作者: 耿国华 Tag标签: 无 内容概要 全书共16章,内容分为两大部分。第一部分为计算机导论部分,包括计算机的基本概念、…

数据结构-用C语言描述耿国华版总结笔记(上篇)

数据结构-----用C语言描述 两年前的考研笔记了,再回首,不忍唏嘘,时间过得真快。 下篇:https://blog.csdn.net/weixin_38244174/article/details/90707831 第一章绪论 (1)数据结构:相…

数据结构 耿国华 第三版

前言:本人在各大网站都查过答案,但是答案版本和第三版都不一样,只是有个别大题重复,在以下整理的答案为自己所做,如有不对之处,不承担任何后果。 第三章 B 考察队列的应用C C C 取一个n和i 自己试试就行了…

数据结构-用C语言描述耿国华版总结笔记(下篇)

第六章 树与二叉树 (一)二叉树 1.1树相关术语: 度(一个结点的子树个数);结点的层次(从该结点开始往下有多少层);树的度(树中所有结点的度的最大值&a…

c语言程序设计答案 耿国华,数据结构---C语言描述-(耿国华)-课后习题答案

数据结构---C语言描述-(耿国华)-课后习题答案 第一章 习题答案2、√3、 (1)包含改变量定义的最小范围(2)数据抽象、信息隐蔽(3)数据对象、对象间的关系、一组处理数据的操作(4)指针类型(5)集合结构、线性结构、树形结构、图状结构(6)顺序存储、非顺序存储(7)一对一、一对多、多…

数据结构c语言描述耿国华,数据结构c语言描述耿国华习题及答案

数据结构c语言描述耿国华习题及答案 第一章 习题答案 2、 √ 3、 (1 )包含改变量定义的最小范围(2)数据抽象、信息隐蔽(3 )数据对象、对象间的关系、一组处理数据的操作(4 )指针类型(5 )集合结构、线性结构、树形结构、图状结构(6 )顺序存储、非顺序存储(7 )一对一、一对多、多…

《人人都能玩赚ChatGPT》:一份简明易懂的ChatGPT技术指南

在科技日新月异的时代,人工智能无疑成为了当之无愧的热点话题。对于许多对前沿技术感兴趣的人来说,掌握聊天机器人技术似乎是一个遥不可及的梦想。然而,一本名为《人人都能玩赚ChatGPT》的书籍正在改变这一现状。本书由黄小刀和刘楚宾两位老师…

手把手教你向国际知名翻译公司Transperfect投递简历

手把手教你向国际知名翻译公司Transperfect投递简历 之前已经跟大家聊过为什么要向国外翻译公司投递简历,其实核心就一点,就是想要真正翻倍儿地提高单价收入,只能往国外走一走。 那么现在我们以Transperfect为例介绍下如何操作,其…

3名离职员工窃取公司源码,半年狂赚 1.5 亿元;苹果成全球首家市值超 3 万亿美元公司;《孤岛惊魂》源码被公开|极客头条...

「极客头条」—— 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧。 整理 | 梦依丹 出品 | CSDN(ID:CSDNnews) 一分钟速览新闻点&#…

野心藏住不住了!OpenAI或在悄悄聘请国际承包商,以培训其软件工程方面的人工智能。

OpenAI或在悄悄聘请国际承包商,以培训其软件工程方面的人工智能。本文将通过一场针对敏捷专家职位的ChatGPT工作面试指导中抽取的七个问题揭晓ChatGPT的真实水平。 外媒Semafor的一份报告显示,OpenAI已悄悄聘请了数百名国际承包商,以培训其…

替家长向ChatGPT问了10个问题,个个问到了心坎上!

长江日报 多地中小学校陆续开学 孩子们重返校园 不少家长表示: 有期待、有烦扰、有开心…… 有些家长开玩笑地问道: 孩子开学了 作为家长,我该如何为自己庆祝一下? 新学期,想让孩子考进班里前三 有什么诀窍吗&#xff…