近年来,区块链技术的快速发展催生了去中心化自治组织(DAO)。目前比较典型的DAO有The DAO、Steemit、Digix DAO、Aragon 等。其中建立在 Aragon上的智能合约系统被称为 AragonOS。 |
Aragon 其实是一个道平台,任何人都可以在上面创建和管理DAO。它通过注册Dapp的方式来扩展DAO的功能或者应用,目前已经提供了五个公共应用的示例实现,任何DAO都可以自己开发Dapp并注册用来扩展DAO。
本文主要列举Aragon用来创建和管理DAO这部分的框架合约(AragonOS),不包括测试合约。
AragonOS 使用 truffle构建工程,所有合约放在contracts目录下。
一、acl文件夹
acl/IACL.sol 一个接口,只定义了初始化和是否有权限这两个函数
acl/IACLOracle.sol 一个接口,只有一个是否能执行的函数
acl/ACLSyntaxSugar.sol 语法糖 就是快速将bytes32、uint、或者address转换后放入一个uint数组并返回
acl/ACLHelpers.sol 用来解码一些数据
二、common文件夹
common/IForwarder.sol 一个接口,用来进行Forwarder相关的判定
common/IForwarderFee.sol 一个定义forward费用的接口
common/Uint256Helpers.sol 将一个uint256转化为uint64的库,当溢出时会报错
common/TimeHelpers.sol 获得当前块高度和当前块创建时间,返回uint256和uint64两个版本
common/UnstructuredStorage.sol 一个库,使用内联汇编来获取或者设置某个地址的数据,根据数据类型分成多个方法
common/Initializable.sol 继承TimeHelper,初始化继承时间,语义上怪怪的。用来判断是否初始化和进行初始化,使用blockNumber判断,而不是平常使用一个变量判断(也许是因为有延时初始化功能)
common/IsContract.sol 很简单的通过地址的代码长度用来决定是不是合约账号
common/Petrifiable.sol 使用uint256最大值来设置延时初始化的blockNuber,永远也不会达到,一般用来石化合约
common/Autopetrified.sol 在部署时石化Petrifiable合约实例,使之不能初始化
common/ConversionHelpers.sol 一个库,用来uint256[]和bytes 的相互转换
common/DepositableStorage.sol 读取或设置是否可以存款(发送ETH到某个合约)
common/EtherTokenConstant.sol 用地址0代表eth,非地址0代表erc20代币
common/IVaultRecoverable.sol 一个接口,用来指明资产保险箱合约
common/VaultRecoverable.sol 用来转移资产(ETH和ERC20代币)注意该合约包含未实现方法,因此为一个抽象的合约(0.6.0才有abstract关键字),不能部署
common/SafeERC20.sol 一个用来安全转移erc20代币的库
common/ReentrancyGuard.sol 防止重入攻击,类似线程锁的方式,转移前设置变量为true,转移全部完成后设置变量为false
comon/DelegateProxy.sol 委托调用并且返回执行环境
common/DepositableDelegateProxy.sol 向合约发送eth并进行验证和委托调用
三、 lib文件夹
lib/ens/AbstractENS.sol 以太坊上的域名系统(ENS)接口
lib/ens/ENS.sol ENS的实现
lib/ens/PublicResolver.sol 一个简单的使用ENS的实现
lib/math/Math.sol 一个进行比较的数学库
lib/math/SafeMath.sol 对两个uint256进行防溢出算术操作(除法其实没有用处,为了统一还是存在库中)
lib/math/SafeMath8.sol 同上,适用于uint8
lib/math/SafeMath64.sol 同上,适用于uint64
lib/misc/ERCProxy.sol 用来定义ERC代理的一些常量和接口
lib/misc/Migrations.sol truffle自带的管理合约…
智能合约
dao