作者 | Doug Crescenzi

译者 | 王柯凝

出品 | CSDN、区块链大本营

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

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

  • 某一选民提交一份提案

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

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

是不是超级简单?

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

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

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

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

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

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

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

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

代码如下:


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

如何防止选民欺诈行为?

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

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

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

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

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

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

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

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

精华总结


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

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

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

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

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

— END —

推荐阅读:

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

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

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

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

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

  • “SQL 被低估了!”

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

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

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

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

好文!点「好看」哟~

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

  1. diy计算机组装注意事项,自己组装电脑要注意什么?DIY老司机教你装机注意事项...

    相比品牌机,组装电脑的优势在于个性化的DIY硬件定制,让玩家可以自由选择适合自己的配置,可以说可玩度非常高.如今,电脑硬件设计已经十分人性化,网上还有很多直播教程,用视频的方式直观地教大家装机,不过要 ...

  2. kstools工具是什么牌子_2020年平衡车推荐,电动平衡车哪个牌子好?老司机教你如何选购电动平衡车...

    2020年平衡车推荐,电动平衡车哪个牌子好?老司机教你如何选购电动平衡车 随着我国科技的发展,生活水平的提高,在很多地方都出现了电动平衡车的身影,人们将电动平衡车当做短距离代步的工具,也是非常实用的. ...

  3. java复制屏幕文本内容_网页上的文字内容不给复制?电脑老司机教你输入一串代码,轻松复制...

    原标题:网页上的文字内容不给复制?电脑老司机教你输入一串代码,轻松复制 我们有时候需要一些资料就会去网上查资料,有的时候我们需要把这些资料的文字给复制下来.但并不是所有的资料都能直接复制的,不是登陆账 ...

  4. win10系统升级没有声音?老司机教你怎么重新安装声卡驱动

    win10系统升级没有声音?老司机教你怎么重新安装声卡驱动:http://www.xiaobaixitong.com/win10jiaocheng/29265.html https://www.xit ...

  5. 山西计算机等级考试科目一模拟试题,考驾照科目一试题100题,老司机教你两招,让你轻松考过!...

    原标题:考驾照科目一试题100题,老司机教你两招,让你轻松考过! 很多学员都在问考驾照科目一试题100题,那么小编就分享一下考驾照科目一试题100题吧,这些考驾照科目一试题100题,考驾照的你值得拥有 ...

  6. 老司机教你用C语言制作简单实用的撩妹神器!

    你以为C语言就是提供一种编译.处理低级存储器.产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言吗?你以为C语言就只是以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌 ...

  7. 可变车道怎么走不违章_可变车道不敢走?老司机教你正确的行驶方式,再也不怕违章了...

    原标题:可变车道不敢走?老司机教你正确的行驶方式,再也不怕违章了 我国现在的道路交通情况无需做过多的介绍,朋友们每天都在亲身感受,为了缓解这些糟糕的交通状况,交通部门出台了一系列措施,改善交通状况. ...

  8. 扫地机器人能过凸起地面吗_老司机教你一眼看穿扫地机器人的套路

    原标题:老司机教你一眼看穿扫地机器人的套路 说到扫地机器人,想必大家都不陌生.它虽然很早就出现了,但确是近两年才走入人们视线的.敢于吃螃蟹的人有的已经体会到了扫地机器人带给我们的便利,有的用了几次感觉 ...

  9. 一步步教你开发、部署第一个去中心化应用(Dapp) - 宠物商店

    今天我们来编写一个完整的去中心化(区块链)应用(Dapps), 本文可以和编写智能合约结合起来看. 写在前面 阅读本文前,你应该对以太坊.智能合约有所了解,如果你还不了解,建议你先看以太坊是什么 除此 ...

最新文章

  1. JVM 中的守护线程
  2. 头部电商平台如何在大促时,优雅的赚钱?
  3. Lampp Xampp配置SSL及自动http重定向https
  4. Elasticsearch 实战2:ES 项目实战(二):基本操作、批处理、高级查询
  5. 大数据行业发展迅速的原因
  6. 一、Java编程环境
  7. 嵌入式学习(一)嵌入式c语言
  8. 计算不规则四边形(多边形)的面积
  9. java 获取当前第几周_java 计算当前日期是今年的第几周 和 该周的开始日期及结束日期...
  10. Unity Shader graph 毒液
  11. HR面试问题-离职原因
  12. Pattern Recognition期刊投稿经验
  13. 基层管理者必备的能力和素质
  14. MySQL Partition 相关使用总结
  15. 数字 IC 技能拓展(22)原码、反码、补码、移码的区别与联系
  16. FAQ是什么?如何高效地打造一个好的FAQ?
  17. ubuntu 挂载文件后,文件权限属于root,只能读不能写解决办法
  18. 手撸一款第三方链克钱包
  19. php intersect,PHP中的array_intersect()函数
  20. 强化学习在智能交通灯中的应用

热门文章

  1. Conda各平台安装配置和使用Python环境(保姆级教程)
  2. 一篇文章带你了解新能源汽车整车控制器VCU 硬件在环(HiL)仿真测试方案
  3. 字符串中大小写转换输出
  4. strtol()函数介绍
  5. 关于QQ的相关代码收集整理
  6. Verilog中任务task的使用
  7. 利用积分区域的对称性计算重积分
  8. Barbalat引理与类李雅普诺夫引理,及它们在自适应控制系统设计的应用
  9. bootloader的功能介绍
  10. KAZE与SIFT算法比较