合約解析
安全設計
該專案採用了多層次的安全設計,結合了多種區塊鏈安全最佳實踐,主要體現在以下幾個方面:
1. 存取控制機制
專案實現了基於角色的存取控制(RBAC)系統,透過/contracts/facets/AccessControl/Facet.sol
和/contracts/facets/AccessControl/Base.sol
實現。核心特點包括:
- 角色分級管理(如超級管理者ROLE_SUPER_ADMIN)
- 函數級權限控制(透過
_setFunctionAccess
設定特定角色可呼叫的函數) - 批次角色分配功能(
setUserRoleBulk
) - 權限變更事件記錄(
UserRoleUpdated
、FunctionAccessChanged
)
2. 防重入保護
專案廣泛使用了OpenZeppelin的ReentrancyGuardUpgradeable
,在關鍵函數上加入nonReentrant
修飾符,防止重入攻擊。例如:
/contracts/apps/TokenUnlocker/Vault/Facet.sol
中的payoutToken
、claimUnlockedTokens
等函數/contracts/apps/TuringMarket/OrderMatcher/Facet.sol
中的matchOrders
函數
3. 簽章驗證與重播攻擊防護
- 關鍵操作需要使用者和操作員雙重簽章驗證(如
investToken
函數同時驗證userSig
和operatorSig
) - 使用
nonce
機制確保每個交易只能執行一次(透過_useNonce
函數實現) - 符合EIP-712標準的結構化資料簽章(在多個合約中使用
_getDigest
和_verifySignature
)
4. 暫停機制
實現了緊急暫停功能,透過/contracts/facets/Pausable/Facet.sol
提供pause
和unpause
函數,可在發現安全問題時快速暫停合約功能。
5. 轉帳限額控制
透過/contracts/facets/TTOQManager/Base.sol
實現了Token轉帳額度限制:
_tokenTransferOutQuoteCheck
函數監控並限制token轉出數量- 可設定每個token的最大轉帳限額(
maxTokenTransferOutQuoteMap
) - 超出限額時觸發
ExceedsMaxTokenTransferOutQuote
錯誤
6. 輸入驗證與錯誤處理
- 對所有輸入參數進行嚴格驗證(如vaultId有效性、餘額充足性檢查)
- 使用明確的錯誤訊息而非通用的
revert()
- 狀態變數修改前進行充分的條件檢查
7. 安全的儲存設計
- 採用獨立的Storage庫和固定儲存槽位(如
AccessControlStorage
、TTOQManagerStorage
) - 使用
keccak256
雜湊定義唯一儲存位置,避免儲存衝突 - 內聯彙編存取存儲,提高效率和安全性
8. 模組化與最小權限原則
- 功能模組化分離(如AccessControl、Pausable、TTOQManager等獨立Facet)
- 每個Facet只負責特定功能,遵循單一職責原則
- 權限分配遵循最小權限原則,僅授予必要的權限
整體而言,此專案的安全設計全面涵蓋了存取控制、防重入、重播攻擊防護、緊急暫停、轉帳限額、時間鎖等關鍵安全點,採用了模組化和分層設計,結合了OpenZeppelin的安全庫和自訂安全機制,為合約系統提供了堅實的安全保障。