本智慧合約方案主要有三大模組:聯合治理模組、公司模組、專案模組,合約互動主要發生在這三大模組的合約之間。
聯合治理模組:提案與投票系統,聯合公司成員管理系統,聯合公司間資金流轉系統;
公司模組:單個公司管理系統,單個公司內部資金流轉系統;
專案模組:多個公司的聯合專案管理,單個公司的內部專案管理。
其中,“聯盟管理模組”集中管理“公司模組”合約和“專案模組”合約,管理機制主要為“投票-註冊”;公司合約、專案合約在實現對應介面合約方法的基礎上自定義業務邏輯,並以單獨合約的形式上鍊。
合約功能上,主要有以下幾點:
· 投票註冊功能,只有投票數超過一定比率,新公司才能成為聯合公司一員,新專案才能認定為聯合專案;
· 專案管理功能,如專案管理員的設定;
· 基於角色的許可權控制,自定義角色和許可權;
· 資金流轉,包括公司之間的資金流轉(涉及跨合約呼叫)和公司內部的資金流轉;
· 資金髮行功能,依據投票決定是否發行資金。
關鍵邏輯的合約程式碼實現
這裡介紹專案中一些關鍵邏輯的合約程式碼實現,以“儲存類智慧合約”的所有權轉移為例。
本專案採取了“儲存、邏輯、控制”分層設計的思路,部署者在部署“儲存類智慧合約”後必須轉移合約所有權關係給控制器類智慧合約,儲存類合約方法如下:
function transferOwnership(address newOwner) public onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
上述“newOwner”引數必須為對應的“控制器合約”地址。這樣,“儲存類智慧合約”透過修飾器“modifier onlyOwner()”保證了只有對應的“控制器智慧合約”才可以修改“儲存類智慧合約”的資料。
部署完成後在“控制器合約”中透過如下方法可驗證是否已具備“儲存類合約”的所有權。
function checkUCOBNodeStorageSafety() public view returns (bool) {
return ucobNodeStorage.owner()==address(this);
}
控制器類智慧合約的程式碼邏輯可以升級,透過投票來決定是否升級。
function changeUCOBNodeStorageOwner(bytes32 proposalId) public {
require(proposalPassed(proposalId,...));
...
ucobNodeStorage.transferOwnership(UCOBNodeControllerAddress);
...
}
當投票透過後,“儲存類智慧合約”的所有權關係會轉移到新的“控制器合約”地址上,資料不變,但是業務邏輯“升級”了。