Solidity
Solidity中結構映射的條件檢查?
struct User { string username; string password; address userid; bool isAdmin; } mapping (uint => User) users; function checkIfUserExists(address userid) public returns(bool) { for (uint o = 0; o < totalUsers; o++) { if (users[o].userid == userid) { return true; } else{ return false; } }
這總是返回 false?? 即使映射中存在使用者標識..
遵循一些簡單的風格指南將使您的問題更容易理解和解決!正如評論中的goodvibration所說,這不是儲存使用者並檢查他/她是否存在的最佳方式
struct User { string username; string password; address userid; bool isAdmin; } mapping (uint => User) users; function checkIfUserExists(address _userid) public returns(bool) { for (uint index = 0; index < totalNumberOfUsers; index++) { if (users[index].userid == _userid) { return true; } } return false; }
只是為了其他遇到這種情況的人的利益而插話。
@Majd 關於邏輯錯誤是正確的。即便如此,這也有額外的錯誤。
循環是一種
for
反模式。它的存在不是問題,但使用者數量沒有上限,因此迭代次數沒有上限,因此它的 gas 成本是眾所周知的反模式。更多資訊:https ://blog.b9lab.com/getting-loopy-with-solidity-1d51794622ad在鏈上儲存使用者名、密碼和使用者 ID 是沒有意義的。每個人都可以看到此資訊,並且會增加成本。沒有必要這樣做,因為乙太坊交易簽名可確保所有使用合約的人都經過可靠的身份驗證。
相反,將他們的地址映射到使用者配置文件。
如果需要收集其他資訊或授予加入系統的權限
isUser
,則適合使用 , 。在大多數情況下,這將是不必要的去匿名化和不必要的侵入。假設所有使用者都存在可能完全沒問題。這將減少struct
到單個屬性 - 一些使用者是管理員。pragma solidity 0.5.1; contract UserExample { struct UserStruct { // string username; // use the address // string password; // don't store this on chain // address userid; bool isUser; // only needed if there is user initialization bool isAdmin; } mapping(address => UserStruct) public userStructs; function isUser(address user) public view returns(bool) { return userStructs[user].isUser; } }
另請參閱:Solidity 是否有解決良好且簡單的儲存模式?
希望能幫助到你。