Solidity
預期為 ‘)’ 但得到標識符 if(string name != users姓名___n一種米和name){ ^–^
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 } }