Solidity
希望使用者決定哪些組織可以訪問他們的數據
我正在研究一個概念,使用者可以允許某些組織查看他們的數據。我想將權限儲存在私有乙太坊區塊鏈上。我認為智能合約將是可行的方法,但我無法真正理解它。
我是否需要為每個使用者創建一份契約,讓他們在其中規定哪些組織應該訪問他們的數據?
如果我使用契約,使用者是否可以更改哪些組織可以訪問他們的數據,例如使用者想要更改為另一個組織?
我可以在現有契約中添加更多組織嗎?
如果契約不是這裡的方式,有人可以給我指出正確的方向嗎?
編輯:
我從契約開始可能不正確,但讓我們將其視為虛擬碼:
pragma solidity >=0.5.0; contract UserPermissions { string private notpermitted; mapping(address => mapping(bytes32 => mapping(address => bool))) permissions; constructor() public { notpermitted = "You do not have permission to view this users data"; } function setPermissions(address they, bytes topic, bool allowed) external { permissions[msg.sender][topic][they] = allowed; } function getPermitted(address they, bytes topic){ if (permissions[they][topic][msg.sender] = true) { //if permission is granted return this return permissions[they][topic][msg.sender]; } else { return notpermitted; }; } function getOwnPermitted(){ //returns list of all permissions this acount has granted } }
還有一個問題需要解決,但首先要直接解決小問題。
我是否需要為每個使用者創建一份契約,讓他們在其中規定哪些組織應該訪問他們的數據?
可能不是。單個合約可以儲存一個系統資料庫,每個使用者在其中儲存一個合適的結構,例如權限和授權使用者的映射。就像是:
// user => permission => authorizedUsers => true/false // bool isAllowed = permissions[me][topic][you]; mapping(address => mapping(bytes32 => mapping(address => bool))) permissions;
如果我使用契約,使用者是否可以更改哪些組織可以訪問他們的數據,例如使用者想要更改為另一個組織?
是的。你需要一個函式讓他們這樣做。鑑於上述假設的資料結構並假設一個人只能管理自己的權限空間……
function setPermission(address they, bytes topic, bool allowed) external { permissions[msg.sender][topic][they] = allowed; }
我可以在現有契約中添加更多組織嗎?
當然。在簡單的範例中,所有可能的地址都已假定存在,因此無需添加任何內容,但您可以定義業務規則(即“添加”在您的應用程序上下文中的含義)並編寫流程。
如果契約不是這裡的方式,有人可以給我指出正確的方向嗎?
現在是大問題。
你會發現在區塊鏈上保守秘密幾乎是不可能的,因為區塊鏈針對透明度進行了優化。您可以使用它來記錄誰應該有權訪問機密,並且可以使用它來驗證資訊(這是機密的真實副本),但它不是儲存機密本身的好地方。
希望能幫助到你。