如何编写Solidity函数获取以太坊DApp全量注册用户完整信息
安全警示
绝对不要在智能合约中存储用户私钥,以太坊链上所有合约存储数据对所有人公开可见,你现在的合约存储用户私钥的设计存在致命安全漏洞,所有存储的私钥可以被任何人直接查询到,会直接导致用户资产100%被盗,必须立刻移除所有private_key相关的存储、写入、返回逻辑。
现有代码修复
你当前的createNewUser函数没有将新注册用户的地址存入registeredArray数组,导致Listofuser返回的是空数组,先修改这个函数,新增一行写入逻辑:
function createNewUser(address userAcc,string memory _id,string memory firstName,string memory lastName,string memory emailId,string memory _private_key) public { User storage user = users[userAcc]; users[userAcc] = User(userAcc,_id,firstName,lastName,emailId,true,_private_key); walletAccount[emailId] = userAcc; // 新增这行,把用户地址加入注册数组 registeredArray.push(userAcc); }
获取所有用户完整信息的函数实现
Solidity 0.8.0及以上版本支持直接返回结构体数组,你可以新增如下view函数:
function getAllUsers() public view returns(User[] memory) { // 初始化和注册数组长度相同的User数组 User[] memory allUsers = new User[](registeredArray.length); // 遍历注册数组,逐个取出用户信息 for(uint i = 0; i < registeredArray.length; i++) { address userAddr = registeredArray[i]; allUsers[i] = users[userAddr]; } return allUsers; }
如果你的项目使用的Solidity版本低于0.8.0,不支持返回结构体数组,可以改为返回多个独立数组分别对应用户的各个字段:
function getAllUsersInfo() public view returns( address[] memory walletAddresses, string[] memory userIds, string[] memory firstNames, string[] memory lastNames, string[] memory emailIds ) { uint len = registeredArray.length; walletAddresses = new address[](len); userIds = new string[](len); firstNames = new string[](len); lastNames = new string[](len); emailIds = new string[](len); for(uint i = 0; i < len; i++) { User storage user = users[registeredArray[i]]; walletAddresses[i] = user.wallet_address; userIds[i] = user.userId; firstNames[i] = user.first_name; lastNames[i] = user.last_name; emailIds[i] = user.email_id; } }
内容的提问来源于stack exchange,提问作者george singh
相关产品推荐
相关产品推荐

