合約解析

安全設計

該專案採用了多層次的安全設計,結合了多種區塊鏈安全最佳實踐,主要體現在以下幾個方面:

1. 存取控制機制

專案實現了基於角色的存取控制(RBAC)系統,透過/contracts/facets/AccessControl/Facet.sol/contracts/facets/AccessControl/Base.sol實現。核心特點包括:

  • 角色分級管理(如超級管理者ROLE_SUPER_ADMIN)
  • 函數級權限控制(透過_setFunctionAccess設定特定角色可呼叫的函數)
  • 批次角色分配功能(setUserRoleBulk
  • 權限變更事件記錄(UserRoleUpdatedFunctionAccessChanged

2. 防重入保護

專案廣泛使用了OpenZeppelin的ReentrancyGuardUpgradeable,在關鍵函數上加入nonReentrant修飾符,防止重入攻擊。例如:

  • /contracts/apps/TokenUnlocker/Vault/Facet.sol中的payoutTokenclaimUnlockedTokens等函數
  • /contracts/apps/TuringMarket/OrderMatcher/Facet.sol中的matchOrders函數

3. 簽章驗證與重播攻擊防護

  • 關鍵操作需要使用者和操作員雙重簽章驗證(如investToken函數同時驗證userSigoperatorSig
  • 使用nonce機制確保每個交易只能執行一次(透過_useNonce函數實現)
  • 符合EIP-712標準的結構化資料簽章(在多個合約中使用_getDigest_verifySignature

4. 暫停機制

實現了緊急暫停功能,透過/contracts/facets/Pausable/Facet.sol提供pauseunpause函數,可在發現安全問題時快速暫停合約功能。

5. 轉帳限額控制

透過/contracts/facets/TTOQManager/Base.sol實現了Token轉帳額度限制:

  • _tokenTransferOutQuoteCheck函數監控並限制token轉出數量
  • 可設定每個token的最大轉帳限額(maxTokenTransferOutQuoteMap
  • 超出限額時觸發ExceedsMaxTokenTransferOutQuote錯誤

6. 輸入驗證與錯誤處理

  • 對所有輸入參數進行嚴格驗證(如vaultId有效性、餘額充足性檢查)
  • 使用明確的錯誤訊息而非通用的revert()
  • 狀態變數修改前進行充分的條件檢查

7. 安全的儲存設計

  • 採用獨立的Storage庫和固定儲存槽位(如AccessControlStorageTTOQManagerStorage
  • 使用keccak256雜湊定義唯一儲存位置,避免儲存衝突
  • 內聯彙編存取存儲,提高效率和安全性

8. 模組化與最小權限原則

  • 功能模組化分離(如AccessControl、Pausable、TTOQManager等獨立Facet)
  • 每個Facet只負責特定功能,遵循單一職責原則
  • 權限分配遵循最小權限原則,僅授予必要的權限

整體而言,此專案的安全設計全面涵蓋了存取控制、防重入、重播攻擊防護、緊急暫停、轉帳限額、時間鎖等關鍵安全點,採用了模組化和分層設計,結合了OpenZeppelin的安全庫和自訂安全機制,為合約系統提供了堅實的安全保障。