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


推荐阅读:



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



好文!点好看」哟~


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值