http://www.kqlcn.com/

[译]区块链民主 - 如何开发通过投票运行的合约

译文出自:登链翻译计划[1]

  译者:Tiny熊[2]

  当你为某事投赞成票时,你如何知道实际上会完成什么事情?你怎么知道承诺会兑现?

  在本文中,我将简要介绍区块链如何改变民主。如何通过区块链民主程序,把承诺变成了行动。

  我并不是要说我们可以或应该废除政治并建立技术专家制,但是我将展示如何运行一个投票系统,如果投票通过,该系统将自动制定执行。

  你可以称之为不可阻挡的民主。

概念设计

  首先,请让我以两种智能合约来设置场景:

  智能合约是一个不可变的程序。智能合约中编码好的规则无法更改。部署后,也无法停止。

  智能合约还可以触发其他智能合约的操作。例如,智能合约可以触发另一个合约以将资金释放到某个帐户,或授予某人执行某些交易的权限。

  根据这些概念,我们可以编写运行公平投票程序的智能合约。每个人都能看到的明确规则, 在该智能合约中,我们可以包含一个提案,该提案是对另一个智能合约中的功能的调用。

  无论如何,投票都会进行。如果投票通过,无论如何都将执行该提案。

以太坊和民主

  投票是民主的支柱之一,也是以太坊的核心组成部分之一。

  通常认为Vitalik Buterin[3]突破了比特币,提议以太坊上创建一个平台,允许在该平台上使用我们上面描述的原则来实施民主组织。

  这些基于区块链的民主组织被称为去中心化自治组织[4],简称DAO(Decentralized Autonomous Organizations)。DAO由其利益相关者指导,规则编码在区块链智能合约中,没有中心控制。

  当你对某事投票时,你如何知道实际上会完成什么事情?你怎么知道承诺会兑现?

  阅读DAO的维基百科文章[5]非常有趣。它揭示了早期DAO的概念是如何构思的,以及它是多么的强大。Daniel Larimer[6](他由BitShares,Steem和EOS.IO项目成名)提出并 最早于2013年在BitShares 实现了该概念。然后你也知道The DAO(Đ)[7],该组织在遭到黑客入侵[8]前吸引到了所有流通中的14%的以太币投资到该组织中。

  但是, “The DAO” 的消亡并不意味着“ DAO组织”的消亡。去中心化自治组织还活着并且很好[9],因为死亡的 The DAO的漏洞已广为人知,而且很容易避免。

  Vlad Farcas[10]和我开始了一个玩具DAO项目[11],因为我们想学习如何应用民主模式。通过编写DAO,我了解了区块链中民主流程的可能性,这让我大吃一惊。这就是为什么我要写这个。

  介绍结束,让我们深入研究代码。我们应该怎么做?

制定智能合约提案

  考虑以下合约:

contractProposal{

  addresspublictargetContract;

  bytespublictargetCall;

  ///@paramtargetContract_执行提案的目标合约

  ///@paramtargetCall_执行提案的目标函数(abi编码及参数)

  constructor(

  addresstargetContract_,

  bytesmemorytargetCall_,

  )public{

  targetContract=targetContract_;

  proposalData=targetCall_;

  }

  ///@dev执行投票的提案

  functionenact()externalvirtual{

  (boolsuccess,)=targetContract.call(targetCall);

  require(success,“Failedtoenactproposal.”);

  }

  }

  该合约具有一些底层的魔法,但解释起来并不难。在部署时,它需要另一个合约的地址和一个函数调用。调用enact()时,它将在目标合约上执行函数调用。

  可以使用web3.js[12]对提案进行编码。在javascript中,下面的示例中部署了一个提案,该提案在执行时将铸造一个ERC20代币。

token=awaitERC20Mintable.new(‘Token’,‘TKN’,18);

  proposalData=web3.eth.abi.encodeFunctionCall(

  {

  type:‘function’,

  name:‘mint’,

  payable:false,

  inputs:[

  {name:‘account’,type:‘address’},

  {name:‘amount’,type:‘uint256’},

  ],

  },

  [owner,‘1’]

  );

  proposal=awaitProposal.new(token.address,proposalData);

  web3.eth.abi.encodeFunctionCall有点冗长,但实际上唯一做的就是将函数签名和参数包装在32个字节的数据中(参考文档[13])。

  它的第一个参数表示函数签名,称为mint(铸币函数),是非付费的函数,其address参数称为account,另一个uint256参数称为amount。第二个参数则是为参数赋值,使用在其他地方定义的owner帐户,而铸币的数量为1。

  有更简单的方法可以让一个合约调用在另一个合约上的函数。现在也许很难理解为什么我们会以这种复杂的方式来做这件事情。

  继续阅读,现在我们将使该提案民主化。让我们看看制定提案的合约,它需要经过成功的投票之后执行。

一币一票

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。