近年來,區塊鏈技術的快速發展催生了去中心化自治組織(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自帶的管理合約…😂
- lib/token/ERC20.sol ERC20代幣接口定義
四、kernel文件夾
- kernel/IKernel.sol 核心合約接口,用來設置app
- kernel/KernelConstants.sol 用來定義一些核心AppId和命名空間的常量
- kernel/KernelStorage.sol 定義app的保存
- kernel/KernelProxy.sol 核心代理的實現
- kernel/Kernel.sol 核心合約的實現,包括創建和設置app,提供給外界一些查詢接口
五、factory文件夾
- factory/DAOFactory.sol DAO工廠,用來產生DAO
- factory/APMRegisteryFactory.sol 用來註冊APM,Aragon Package Manager(DAO)
- factory/AppProxyFactory.sol 用來產生一個AppProxy,分爲可升級版和壓制版(向前?)
- ENS工廠,注意它的警告,僅測試APM使用
- 以太坊虛擬機腳本註冊工廠,注意返回的是一個合約類型。
六、apps文件夾
- 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文件夾
- apm/Repo.sol 繼承AragonApp,可以從外部初始化(不是構造器中)
- apm/APMRegistry.sol 用來註冊APM,APMRegisteryFactory的底層實現
- 根據apm的名字返回編碼後的哈希值(bytes32類型)
八、evmscript文件夾
- evmscript/executors/BaseEVMScriptExecutor.sol 定義腳本開始位置
- evmscript/executors/CallsScript.sol 執行腳本的實現
- evmscript/EVMScriptRegistry.sol 腳本執行管理功能
- evmscript/EVMScriptRunner.sol 運行腳本
- evmscript/IEVMScriptExecutor.sol 定義執行腳本的接口
- evmscript/IEVMScriptRegistry.sol 定義腳本註冊的常量和接口
- evmscript/ScriptHelpers.sol 一個腳本幫助庫
九、test文件夾
此文件夾內容爲測試合約(略)
不正確之處歡迎大家積極留言指正。