Fügen Sie Benutzerdaten zu Smart Contract hinzu

Was ist der beste Weg, um Benutzerdaten in Smart Contracts zu speichern? Angenommen, wir haben eine Anzahl von Benutzern und möchten jeden Benutzernamen und seine anderen Details speichern. Sollten wir dann für jeden Benutzer einen Smart Contract erstellen müssen?

Antworten (1)

Erstellen Sie eine Struktur wie folgt:

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

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

Und erstellen Sie eine Zuordnung:

mapping(address => User) public users;

Sie können auch andere Werte als Index verwenden, aber dies dient nur der Demonstration.

Um nun einen Benutzer zu erstellen, verwenden Sie eine Funktion wie diese:

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
    });
}

Und fertig!

BEARBEITEN Wie Sie in den Kommentaren angegeben haben, möchten Sie den Hash der Benutzerinformationen in einem Smart Contract speichern. Das ist noch einfacher: Speichern Sie einfach die Hashes in einem Mapping.

Dies ist die Zuordnung, die Sie zum Speichern der Hashes verwenden:

mapping(uint256 => bytes32) public userDataHashes;

Jetzt wird die Funktion zum Festlegen eines Hashs für eine Benutzer-ID wie folgt:

function storeUserDataHash(uint256 _userId, bytes32 _dataHash) public {
    userDataHashes[_userId] = _dataHash;
}
Ich bin mir nicht sicher, ob das OP nach Vertragsbenutzern gefragt hat, könnte es sich im Allgemeinen um beliebige Benutzer handeln. Daher ist eine Zuordnung zur Adresse möglicherweise nicht angemessen. Aber deine Vermutung ist so gut wie meine.
Wie gesagt, dies dient nur der Demonstration
Vielen Dank für die schnelle Antwort @henkiedoodle. Hier ist mein Anwendungsmodell. Es gibt N allgemeine Benutzer, die nichts über Smart Contracts wissen. Sie melden sich bei einem Portal an, reichen ihre Dokumente ein, es wird eine Funktion im Backend geben, die den Dateiinhalt mit keccak256 in Hash konvertiert und den Datei-Hash im Smart Contract speichert. Ich bin verwirrt, sollten wir jedes Mal einen neuen Smart Contract erstellen, wenn sich ein neuer Benutzer beim Portal anmeldet?
Nein, Sie sollten die Informationen in einem Mapping speichern. Sie sind perfekt für diese Anwendung.
Aber in diesem Fall wäre die Vertragsadresse für jeden Benutzer gleich, wie würde ein Benutzer individuell identifiziert?
Sie verwenden einen Vertrag für alle Benutzer. Um zwischen Benutzern zu unterscheiden, ziehen Sie sie anhand ihrer Benutzer-ID aus der Zuordnung heraus: bytes32 currentUserHash = userDataHashes[currentUsersId]. Oder in web3.js:theContract.userDataHashes(currentUsersId)