Solidity

修飾符的未聲明標識符錯誤

  • November 7, 2022

我是solidity的新手,對為什麼會收到這個未聲明的標識符錯誤感到困惑:

我有這個修飾符:

modifier isRegistered(uint ID_num){
   require (Array[ID_num].exists, "Object DNE");
   _;
}

然後我在這個函式中呼叫它,但我得到了未聲明的標識符錯誤。

function newAdoption(address addy1, address addy2) public isRegistered(ID_number){

}

我在哪裡錯了?

newAdoption 函式的修飾符中的“ID_number”不存在。

您不應該依賴使用者輸入,因為任何使用者都可以傳遞任何值,因此不值得信任。

我不知道你想做什麼,但你應該嘗試這樣的模式:

 struct MyUser {
   bool exists;
   address userAddress;
 }

 mapping (address => MyUser) public myUsers;

 modifier isRegistered(address userAddress){
   require (myUsers[userAddress].exists, "Object DNE");
   _;
 }

 function newAdoption(address addy1, address addy2) public isRegistered(msg.sender){

}

這樣,您的智能合約會檢查聯繫它的地址是否是使用者。

編輯:為了讓它更簡單,你也可以這樣做:


 mapping (address => bool) public myUsers;

 modifier isRegistered(address userAddress){
   require (myUsers[userAddress], "Object DNE");
   _;
 }

 function addUser(address _newUser) external onlyOwner() {
      myUsers[_newUser] = true;
}

 function newAdoption(address addy1, address addy2) public isRegistered(msg.sender){

}

它顯示該錯誤的原因是因為ID_number在函式範圍內不存在。當然,您在此合約中沒有任何具有名稱的狀態變數,ID_number並且函式參數也沒有該名稱。

因此ID_number必須是該函式的參數(因為當您使用修飾符時,參數已經包含在函式範圍內)或屬於該範圍的任何其他變數。

function newAdoption(address addy1, address addy2) public isRegistered(addy2){

}

function newAdoption(address addy1, address addy2) public isRegistered(any_variable_that_lies_in_this_scope){

}

希望能幫助到你。

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