Добавить данные пользователя в смарт-контракт

Как лучше всего хранить данные пользователей на смарт-контракте? Предположим, у нас есть n пользователей, и мы хотим сохранить имя каждого пользователя и другие его данные. Должны ли мы создавать смарт-контракт индивидуально для каждого пользователя?

Ответы (1)

Создайте такую ​​структуру:

struct User {
    uint256 id;
    bytes32 name;
    // other stuff

    bool set; // This boolean is used to differentiate between unset and zero struct values
}

И создайте сопоставление:

mapping(address => User) public users;

Вы также можете использовать другие значения в качестве индекса, но это только для демонстрации.

Теперь, чтобы создать пользователя, используйте такую ​​функцию:

function createUser(address _userAddress, uint256 _userId, bytes32 _userName) public {
    User storage user = users[_userAddress];
    // Check that the user did not already exist:
    require(!user.set);
    //Store the user
    users[_userAddress] = User({
        id: _userId,
        name: _userName,
        set: true
    });
}

Готово!

РЕДАКТИРОВАТЬ Как вы указали в комментариях, вы хотите сохранить хэш информации о пользователе в смарт-контракте. Это еще проще: просто сохраните хэши в отображении.

Это сопоставление, которое вы используете для хранения хэшей:

mapping(uint256 => bytes32) public userDataHashes;

Теперь функция для установки хэша для идентификатора пользователя становится:

function storeUserDataHash(uint256 _userId, bytes32 _dataHash) public {
    userDataHashes[_userId] = _dataHash;
}
Я не уверен, что ОП спрашивал о контрактных пользователях, это могут быть вообще любые пользователи. Таким образом, сопоставление с адресом может быть неуместным. Но твоя догадка так же хороша, как и моя.
Как сказано, это только для демонстрации
Спасибо за быстрый ответ @henkiedoodle. Вот моя модель приложения. Есть N обычных пользователей, которые ничего не знают о смарт-контрактах. Они войдут на портал, отправят свои документы, в бэкенде будет функция, которая преобразует содержимое файла в хэш с помощью keccak256 и сохранит хэш файла в смарт-контракте. Я запутался в том, должны ли мы каждый раз создавать новый смарт-контракт, когда новый пользователь будет входить на портал?
Нет, вы должны хранить информацию в отображении. Они идеально подходят для этого приложения.
Но в этом случае адрес контракта будет одинаковым для каждого пользователя, как пользователь будет идентифицироваться индивидуально?
Вы используете один контракт для всех пользователей. Чтобы различать пользователей, вытащите их из сопоставления, используя их идентификатор пользователя: bytes32 currentUserHash = userDataHashes[currentUsersId]. Или в web3.js:theContract.userDataHashes(currentUsersId)