如何在 Solidity 中构建 DAO?
本文将帮助我们理解DAO的概念,并帮助我们构建基本DAO。
什么是DAO?
我们可以将DAO看作是基于互联网的实体(比如企业),由其股东(持有代币和比例投票权的成员)集体拥有和管理。在DAO中,决策是通过提案做出的,DAO的成员可以对这些提案进行投票,然后执行它们。
DAO完全由公开可见/可验证的代码管理,没有单独的个人(比如CEO)负责决策制定。
DAO如何工作?
如前所述,DAO由代码控制,但如果运行代码机器的人决定关闭机器或编辑代码,该怎么办呢?
我们需要的是让相同的代码运行在由不同实体托管的一组机器上,这样即使其中一个关闭了,另一个也可以接管。区块链帮助我们解决上述问题,基于EVM的区块链,如以太坊和Polygon,允许我们在公共去中心化账本上运行智能合约。部署在这些网络上的智能合约将传播到网络上的所有节点,这些节点可以查看和验证它,没有任何一方控制网络。
DAO向其成员发放代币,代币代表系统中的投票权。根据所设置的治理,任何人都可以创建对DAO进行更改的提案,并将其提交给规定人数(通过所需的最小百分比/投票数),并在投票时间里进行投票。成员可以对提案进行查看和投票,投票权与成员拥有的代币数量成正比。一旦投票期结束,我们检查提案是否通过,如果通过,则执行。
例如MakerDAO和Aragon。
下图显示了该流程。
接下来,我们将构建自己的DAO。
开始构建
我们将在代码库中使用OpenZeppelin合约,我还将使用来自Patrick Collins的DAO模板的一些代码。
先决条件
我们需要以下工具。
- Node.js:可以从Node.js网站下载最新版本。
- Yarn:我们将使用Yarn作为包管理器。
- Hardhat:我们将使用Hardhat作为我们的本地开发环境。
场景
我们将构建一个DAO,它将做以下工作:
场景1
- 添加一个初始成员。(我们称他们为创始人)。
- 让创始人写一份提案。(提出一个在智能合约上执行的功能)。
- 让创始人投票表决,提案将会通过,因为创始人拥有100%的投票权。
- 执行提案。(智能合约中的功能)
场景2
- 添加一个初始成员(我们称他们为创始人)。
- 增加另一名成员,并向他们发行价值占创始人的20%份额的新代币。
- 让创始人创建一个提案(提议一个要在智能合约上执行的功能)。
- 让创始人和新成员投票表决。“Quorum”设置为“90%”。
- 执行提案(以及智能合约中的功能)。
合约
如前所述,我们将使用OpenZeppelin的治理合约。合约内容如下:
- 治理者合约:治理者合约决定了法定人数所需的投票数量/百分比(例如,如果法定人数是4%,那么只有4%的选民需要投票支持提案通过),投票期限,即投票持续多长时间,投票延迟,即提案创建后多长时间允许成员更改他们拥有的代币数量。治理合约还提供创建提案、投票和执行提案的功能。
- TimeLock:TimeLock合约为不同意系统决定的成员提供在执行决定前退出系统的时间。
- Token:Token合约是一种特殊类型的ERC20合约,它实现了ERC20Votes扩展。这允许将投票权映射到过去余额的快照而不是当前余额,这有助于防止知道有重要提案即将出现并试图通过购买更多代币然后抛售它们来增加他们的投票权的成员投票。
- 目标:这是提案通过投票后执行代码的合约。
代码
让我们开始把这些放在一起。使用Hardhat创建一个空的示例项目。在终端中运行如下命令。
Yarn add - dev hardhat
接下来,让我们使用hardhat创建我们的文件夹结构。
yarn hardhat
我们应该会看到这样的提示。