Solidity

預期為 ‘)’ 但得到標識符 if(string name != users姓名___n一種米和name){ ^–^

  • June 28, 2019
pragma solidity >=0.4.0 <0.7.0;

contract NewHello{

   mapping(address => string) public users; // contains a name for every address

   function updateUser(string memory name) public {
       if(string name != users[name]){
           users[msg.sender] = name; // set name for address
       }

   }
   function getUser(address userAddress) public view returns(string memory) {
       return users[userAddress]; // return address name
   }
}

好吧,我有 2 個功能拳頭,一個設置名稱,第二個獲得名稱。

我的目標是:我想檢查使用者。如果使用者未註冊,則註冊此使用者而不是使用 getUser 函式返回使用者名。

當我編譯我的契約時,我給出了這樣的錯誤:預期的’)‘但是得到了標識符 if(string name != users$$ name $$){ ^–^

我的 getUser 函式。效果很好。我可以獲得我想要的結果,但我無法修復 userUpdate 函式。

我該怎麼辦 ?任何人都可以幫助我:)

關於 Solidity 中的錯誤處理,您可以在此處閱讀。

使用require代替if:應該使用 require 函式來確保在執行之前無法檢測到的有效條件。這些條件包括輸入,或滿足合約狀態變數,或驗證呼叫外部合約的返回值。

如果使用 ,則不需要將使用者的地址作為參數傳遞msg.sender,即消息的發送者。

關於字元串比較,您可以獲取兩個字元串的雜湊值並進行比較。

通過您的實際實施,使用者可以更改他們的名稱:

pragma solidity >=0.4.0 <0.7.0;

contract NewHello {

   mapping(address => string) public users; // contains a name for every address

   function updateUser(string memory name) public {
       require(keccak256(abi.encodePacked(name)) != keccak256(abi.encodePacked(users[msg.sender])));
       users[msg.sender] = name; // set name for address
   }

   function getUser(address userAddress) public view returns(string memory) {
       return users[userAddress]; // return address name
   }
}

另一種解決方案:如果只想檢查使用者是否註冊,則需要檢查是否有與使用者地址關聯的名稱。您可以將字元串轉換為類型bytes,然後檢查長度是否為 0。

pragma solidity >=0.4.0 <0.7.0;

contract NewHello {

   mapping(address => string) public users; // contains a name for every address

   function updateUser(string memory name) public {
       require(bytes(users[msg.sender]).length == 0);
       users[msg.sender] = name; // set name for address
   }

   function getUser(address userAddress) public view returns(string memory) {
       return users[userAddress]; // return address name
   }
}

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