Contract-Invocation

智能合約上的使用者白名單

  • February 23, 2022

假設我有這個智能合約,只能由一組已知使用者(有限的地址列表)呼叫。

實現此邏輯的明顯方法是簡單地跟踪列表中的這些地址,並在呼叫函式時驗證地址,儘管我需要考慮一些限制:

  • 我不能在契約上公開這些地址。所以不能在合約上儲存地址列表。
  • 我對可以列入白名單的使用者數量沒有限制。該契約中可能有幾百萬使用者被列入白名單。

我找不到解決這個問題的好方法,我認為這應該很常見。我正在考慮進行基於令牌的驗證,但不確定這在智能合約中是否可行。這個案例有什麼解決方案嗎?

以前使用者的答案對於數百萬可能的使用者列表並不適用——您將花費數十億的汽油來添加所有使用者,這顯然太多了。你想要的是一個 Merkle 樹,它幾乎可以免費添加任意數量的使用者。是一個很好的例子,應該提供你想要的。

您可以使用私有欄位和公共 set 方法解決您的兩個問題。

contract MyToken is Ownable {
   mapping(address -> bool) whiteListUsers; // this is private
   modifier onlyWhiteListed() {
       require(whiteListUsers[msg.sender], "Only whitelist allowed");
       _;
   }

   function addToWhiteList(address[] users) public onlyOwner {
       for (int i = 0; i < users.length; i++) {
           whiteListUsers[users[i]] = true;
       }
   }

   function doSomething() public onlyWhiteListed() {
        // your logic
   }
   
}

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