智能合約鏈游開發(fā)詳情丨智能合約鏈游系統(tǒng)開發(fā)(開發(fā)方案)及源碼分析
合約分層
WeIdentity采用分層設計模式,即將合約分為邏輯合約、數(shù)據(jù)合約、及權(quán)限合約。
邏輯合約:它專注于數(shù)據(jù)的邏輯處理和對外提供接口,通過訪問數(shù)據(jù)合約獲得數(shù)據(jù),對數(shù)據(jù)做邏輯處理,寫回數(shù)據(jù)合約。一般情況下,控制器合約不需要存儲任何數(shù)據(jù),它完全依賴外部的輸入來決定對數(shù)據(jù)合約的訪問。
數(shù)據(jù)合約:它專注于數(shù)據(jù)結(jié)構(gòu)的定義、數(shù)據(jù)內(nèi)容的存儲和數(shù)據(jù)讀寫的直接接口。
權(quán)限合約:它專注于判斷訪問者的角色,并基于判斷結(jié)果確定不同操作的權(quán)限。
當前的WeIdentity權(quán)限管理的挑戰(zhàn)是:
合約在鏈上部署之后,攻擊者可能會繞過SDK直接以DApp的形式訪問合約。因此合約層面必須要有自完善的權(quán)限處理邏輯,不能依賴SDK。
數(shù)據(jù)合約是公開的,因此數(shù)據(jù)合約的操作也需要進行權(quán)限管理。
WeIdentity的權(quán)限管理依賴于一個獨立的RoleManager權(quán)限管理器合約,它承擔了合約所有的權(quán)限檢查邏輯。WeIdentity的權(quán)限粒度是基于角色和操作的二元組,這也是當前大多數(shù)智能合約權(quán)限控制的通用做法。開發(fā)模式I35詳細7O98開發(fā)O7I8,它的設計要點包括:
將角色和操作權(quán)限分別存儲。
設計一個權(quán)限檢查函數(shù)checkPermission()供外部調(diào)用,輸入?yún)?shù)為「地址,操作」的二元組。
對角色和權(quán)限分別設計增刪改函數(shù)供外部調(diào)用。
所有WeIdentity的數(shù)據(jù)合約里需要進行權(quán)限檢查的操作,都通過外部合約函數(shù)調(diào)用的方式,調(diào)用checkPermission()。
所有WeIdentity依賴權(quán)限管理器的合約,需要有更新權(quán)限管理器地址的能力。
WeIdentity的權(quán)限管理有以下特性:開發(fā)流程及源碼:MrsFu123
優(yōu)秀的可擴展性。WeIdentity的權(quán)限控制合約使用外部調(diào)用而非繼承(如ds-auth和OpenZepplin的Role智能合約實現(xiàn)角色管理方式)方式實現(xiàn)。在權(quán)限控制合約升級的場景中,外部調(diào)用方案只需簡單地將權(quán)限管理器合約地址更新即可,極大地提升了靈活度。
使用tx.origin而非msg.sender進行調(diào)用源追蹤。這是因為用戶的權(quán)限和自己的DID地址唯一綁定。因此所有權(quán)限的驗證必須要以最原始用戶地址作為判斷標準,不能單純地依賴msg.sender。此外,WeIdentity的權(quán)限控制合約需要支持更大的可擴展性,以支持更多公眾聯(lián)盟鏈的參與成員自行實現(xiàn)不同的Controller。因此,需要通過tx.origin追蹤到調(diào)用者的WeIdentity DID,并根據(jù)DID確定權(quán)限。