Solidity
映射結構數據的儲存/檢索
我想將結構數據儲存在映射中,即如果我有如下所述的學生結構,那麼我應該能夠擁有無數學生並使用錢包地址區分他們。
我想明智地儲存學生數據帳戶,並允許通過錢包地址檢索這些數據。
我已經編寫了以下程式碼,但我只能檢索最近
setData()
的數據呼叫。contract FormSubmit{ struct Student { string email; string password; string address1; string address2; string city; string state; string zip; } mapping(address => Student) Students; function setData(address _address, string memory _email, string memory _password, string memory _address1, string memory _address2, string memory _city, string memory _state, string memory _zip) public { Students[_address].email = _email; Students[_address].password = _password; Students[_address].address1 = _address1; Students[_address].address2 = _address2; Students[_address].city = _city; Students[_address].state = _state; Students[_address].zip =_zip; } function getData(address _address) public view returns(string memory, string memory, string memory, string memory, string memory, string memory, string memory){ return(Students[_address].email, Students[_address].password, Students[_address].address1, Students[_address].address2, Students[_address].city, Students[_address].state, Students[_address].zip); }}
請幫我
編輯
您可以在 getData 中看到我正在獲取最後儲存的學生的資訊,而不是儲存在同一地址上的前一個學生的資訊。
它在我的最終工作正常。
嚴肅地說,如果我
setData()
用所有填充了參數的函式參數呼叫然後呼叫,getData()
那麼我可以通過將學生數據儲存在不同的錢包地址下來區分學生數據。然而,將這樣的敏感資訊添加到像乙太坊這樣的公共區塊鏈中是一個可怕的案例。學生錢包可能不會受到其相關私鑰的公開賣淫的保護,但話雖如此,您似乎將儲存密碼和電子郵件地址,這讓我認為該智能合約可能用於某種 dApp 中需要某種額外的深度網路訪問。
我會比較把它放在乙太坊網路上,在不穿內衣的情況下跑過荊棘叢的速度非常快(TLDR:我不推薦)。
使用以下方法獲取和設置保存在一個特定地址上的多個學生
contract FormSubmit{ struct Student { string email; } event SetData ( uint studentId ); mapping(address => Student[]) Students; function setData(address _address) public { // this enables you to retreive a student detail // using the array index as id uint studentId = students.length; Student student = Student(_email); Students[_address].push(student); emit SetData(studentId); } function getData(address _address, uint _studentId ) public view returns(string memory){ return(Students[_address][_studentId].email); }}