近年来,区块链技术的快速发展催生了去中心化自治组织(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/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/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自带的管理合约…😂
- lib/token/ERC20.sol ERC20代币接口定义
- kernel/IKernel.sol 核心合约接口,用来设置app
- kernel/KernelConstants.sol 用来定义一些核心AppId和命名空间的常量
- kernel/KernelStorage.sol 定义app的保存
- kernel/KernelProxy.sol 核心代理的实现
- kernel/Kernel.sol 核心合约的实现,包括创建和设置app,提供给外界一些查询接口
- factory/DAOFactory.sol DAO工厂,用来产生DAO
- factory/APMRegisteryFactory.sol 用来注册APM,Aragon Package Manager(DAO)
- factory/AppProxyFactory.sol 用来产生一个AppProxy,分为可升级版和压制版(向前?)
- ENS工厂,注意它的警告,仅测试APM使用
- 以太坊虚拟机脚本注册工厂,注意返回的是一个合约类型。
- apps/UnsafeAragonApp.sol 移除石化,注意它的警告,未使用代理功能,是unsafe的。
- apps/AppStorage.sol 用来读取和设置核心合约的地址和appId的值
- apps/AppProxyBase.sol App代理基类合约,用来派生出可升级版和压制版(向前?)
- apps/AppProxyPinned.sol 压制版(向前指向)App代理实现
- apps/AppProxyUpgradeable.sol 可升级版App代理实现
- apps/AragonApp.sol AragonApp实现,强制使用了代理,注意和UnsafeAragonApp比较
- apm/Repo.sol 继承AragonApp,可以从外部初始化(不是构造器中)
- apm/APMRegistry.sol 用来注册APM,APMRegisteryFactory的底层实现
- 根据apm的名字返回编码后的哈希值(bytes32类型)
- evmscript/executors/BaseEVMScriptExecutor.sol 定义脚本开始位置
- evmscript/executors/CallsScript.sol 执行脚本的实现
- evmscript/EVMScriptRegistry.sol 脚本执行管理功能
- evmscript/EVMScriptRunner.sol 运行脚本
- evmscript/IEVMScriptExecutor.sol 定义执行脚本的接口
- evmscript/IEVMScriptRegistry.sol 定义脚本注册的常量和接口
- evmscript/ScriptHelpers.sol 一个脚本帮助库
此文件夹内容为测试合约(略)
不正确之处欢迎大家积极留言指正。
合约GITHUB地址:https://github.com/aragon/aragonOS