«Имя» члена не найдено или не отображается после поиска, зависящего от аргумента, в хранилище строк ref

У меня есть такой код, и я хочу установить свое имя, фамилию и возраст в своей структуре, поэтому я хочу установить их и использовать с моими функциями.

вот мой код:


pragma solidity >=0.4.0 <0.7.0;

contract NewHello{
    address owner;
    
    constructor()public{
        owner = msg.sender;
    }
    
    modifier onlyOwner (){
        require(msg.sender == owner);
        _;
    }
    
    struct user{
        string name;
        string surname;
        uint age;
    }
    
    user[] new_user;
    mapping(address => string) public users; // contains a name for every address
    
    function updateUser(address _address, string memory name,string memory surname,uint age) public onlyOwner {
        user memory new_user = user(name,surname,age);
        users[_address] = user(name,surname,age);
        
    }
    function getUser(address _address) public view returns(string memory name ,string memory surname,uint age) {
        //if(users[_address].age == 0) throw;
        return (users[_address].name,users[_address].surname,users[_address].age); 
    }
}

Я получаю 2 ошибки, первая из них:

TypeError: Type struct NewHello.user memory is 
not implicitly convertible to expected type string storage ref. 
users[_address] = user(name,surname,age);
                  ^--------------------^

TypeError: Member "name" not found 
or not visible after argument-dependent lookup in string storage ref.

кто-нибудь может мне помочь, пожалуйста?

Не проще ли использовать такое отображение: mapping(address => user) public users?
что мне делать вы можете мне помочь?

Ответы (1)

Используйте отображение, например:

mapping(address => user) public users

Каждый адрес будет иметь пользователя. Вы можете улучшить это, если вы используете msg.sender вместо адреса (параметр функции), потому что вам не нужно указывать адрес, и каждый пользователь может изменить свои данные и увидеть их ( onlyOwnerв этом случае вам нужно удалить модификатор) .

pragma solidity >=0.4.0 <0.7.0;

contract NewHello{ 

    address owner;

    constructor()public{
        owner = msg.sender;
    }

    modifier onlyOwner (){
        require(msg.sender == owner);
        _;
    }

    struct user{
        string name;
        string surname;
        uint age;
    }
    mapping(address => user) public users; // contains a user for every address

    function updateUser(address _address, string memory name, string memory surname, uint age) public onlyOwner {
        users[_address] = user(name, surname, age);
    }

    function getUser(address _address) public view returns(string memory name, string memory surname, uint age) {
         //if(users[_address].age == 0) throw;
        return (users[_address].name, users[_address].surname, users[_address].age);        
    }
}