Solidity

希望使用者決定哪些組織可以訪問他們的數據

  • March 13, 2021

我正在研究一個概念,使用者可以允許某些組織查看他們的數據。我想將權限儲存在私有乙太坊區塊鏈上。我認為智能合約將是可行的方法,但我無法真正理解它。

我是否需要為每個使用者創建一份契約,讓他們在其中規定哪些組織應該訪問他們的數據?

如果我使用契約,使用者是否可以更改哪些組織可以訪問他們的數據,例如使用者想要更改為另一個組織?

我可以在現有契約中添加更多組織嗎?

如果契約不是這裡的方式,有人可以給我指出正確的方向嗎?

預期流程的圖像(簡化的頂部更深入底部): 在此處輸入圖像描述

編輯:

我從契約開始可能不正確,但讓我們將其視為虛擬碼:

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;
}

我可以在現有契約中添加更多組織嗎?

當然。在簡單的範例中,所有可能的地址都已假定存在,因此無需添加任何內容,但您可以定義業務規則(即“添加”在您的應用程序上下文中的含義)並編寫流程。

如果契約不是這裡的方式,有人可以給我指出正確的方向嗎?

現在是大問題。

你會發現在區塊鏈上保守秘密幾乎是不可能的,因為區塊鏈針對透明度進行了優化。您可以使用它來記錄誰應該有權訪問機密,並且可以使用它來驗證資訊(這是機密的真實副本),但它不是儲存機密本身的好地方。

希望能幫助到你。

引用自:https://ethereum.stackexchange.com/questions/94542