Solidity

讓我在智能合約中的價值只能由所有者訪問?

  • March 17, 2022

大家好,我正在嘗試將游戲 Chinese Whisper 實現為智能合約。它按預期工作,但我有兩個問題。我將快速解釋合約的想法:因此 WalletA 可以通過在 changeOwner 函式中設置耳語來向 WalletB 發送消息。我有 isOwner 修飾符,它檢查使用者是否是所有者,並且只允許那個人閱讀 WalletA 之前設置的目前耳語。以下是目前狀態的契約:

contract ChineseWhisper {

   address private owner;
   string whisper;
   
   // event for logging
   event OwnerSet(address indexed oldOwner, address indexed newOwner);
   
   // modifier to check if caller is owner
   modifier isOwner() {
       require(msg.sender == owner, "Caller is not owner");
       _;
   }
   
   /**
    * @dev Set contract deployer as owner and set whisper to default value
    */
   constructor() {
       owner = msg.sender;
       whisper = "Let the game begin";
       emit OwnerSet(address(0), owner);
   }

   /**
    * @dev Changes owner and sets sent message as new whisper
    * @param newOwner address of new owner
    * @param message message for setting the whisper
    */
   function changeOwner(address newOwner, string memory message) public isOwner {
       emit OwnerSet(owner, newOwner);
       whisper = message;
       owner = newOwner;
   }

   /**
   * @dev Return current whisper
   * @return whisper of last owner
   */
   function getWhisper() public isOwner returns (string memory) {
       return whisper;
   }

   /**
    * @dev Return owner address 
    * @return address of owner
    */
   function getOwner() external view returns (address) {
       return owner;
   }
}

但是有兩個問題!

第一個已經在切換所有者時,可以在etherscan上看到輸入(包括耳語)(這裡的範例只需點擊輸入為UTF-8:https ://rinkeby.etherscan.io/tx/0x7b5b9114d55bed65eb6ded536973846674cb6d5a46ff09282516451045cb78c3 )

第二個問題是使用web3js查詢目前耳語時,繞過了isOwner函式

const runGetWhisper = async (contract, walletAdress) => {
 contract.methods
   .getWhisper()
   .call({ from: walletAdress })
   .then((res) => {
     console.log(res);
   })
   .catch((err) => {
     console.log(err.message);
   });
};

理論上,我可以更改“from”值,這樣任何通過呼叫 getOwner() 知道 currentOwner 的人都可以使用該 walletAdress 來查詢目前值。

關於如何解決這兩個問題的任何想法?

我同意Meriadoc你不能在乙太坊中隱藏任何東西。你的第一個問題如果你的契約在 etherscan 上得到驗證,那麼它總是在 etherscan 中解碼。您的第二個問題通過簡單的 if else 條件解決。

查看更新後的 getWhisper 函式。

   function getWhisper() public view returns (string memory) {
       if (msg.sender == owner){
       return whisper;
       }
       else{
           return "You are not allowed";
       }
   }

不可能在區塊鏈上保守任何秘密——etherscan 總是可以訪問你合約中的任何儲存槽。使其真正保密的唯一方法是對只有消息接收者知道的消息使用某種加密算法。

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