Wie können wir der ID, die in unserem Smart Contract in Ethereum erstellt wurde, eine eindeutige Hash-ID zuweisen?

Ich verwende Trüffel, Ganache und web3. Ich initialisiere die Benutzer-ID im Smart Contract, während ich den Smart Contract bereitstelle. Ab sofort läuft alles über den Account[0] von Ganache.

Jetzt möchte ich Funktionen wie: Wenn ## Heading ##I eine Benutzer-ID in Smart Contract erstelle, muss ihr ein eindeutiger Hash zugewiesen werden, der von der Blockchain angegeben wird.

Dafür habe ich keine Ahnung, wie wir neu erstellte Benutzer in das Konto von Ganache integrieren können.

Gibt es dafür eine andere Möglichkeit oder hat jemand einen Link dazu?

Antworten (1)

Sie benötigen lediglich eine Methode addUser(name), die einen neu erstellten Benutzer hinzufügt.

Der Hash kann dann berechnet werden, um keccak256()einen bytes32Hash zu generieren. Nun kommt es auf den Anwendungsfall an, wie Sie es speichern möchten. Vielleicht eine Struktur von Benutzerdetails oder eine Zuordnung mit uintid => stringHash.

Ab sofort läuft alles über den Account[0] von Ganache.

Ja, das ist Standard. Wenn Sie dies erwähnen, möchten Sie wahrscheinlich, dass nur account[0]oder der Vertragsbereitsteller in der Lage ist, Benutzer hinzuzufügen. In diesem Fall müssen Sie nur einen require(msg.sender==admin)Administrator haben, der während der Vertragsbereitstellung zugewiesen wird.

Bearbeiten

Ich habe Ihre Frage noch einmal gelesen. Wenn Sie denken, dass jeder Vertragsbenutzer direkt ein zugeordnetes Konto hat. Nein! Sie müssen mehr erklären, was Sie erreichen wollen.

Aktualisieren

Nach Ihrem Kommentar sieht es so aus, als müssten Sie dem Benutzer eine Adresse zuweisen. TestRPC/Ganachefunktioniert anders.

Dies sind die standardmäßig erstellten Konten unter IHRER Kontrolle. Sie können die öffentliche Adresse der Konten leicht preisgeben, aber das löst keinen Zweck. Warum? Weil der Benutzer seinen eigenen privaten Schlüssel haben sollte, um irgendeine Art von Transaktionen durchzuführen.

Dazu kommt es jetzt ganz darauf an. Die Nutzer sollen und sollen eigene Accounts anlegen und ihnen die öffentliche Adresse mitteilen. Diese Adresse soll nun beim Vertrag bleiben.

Aber wenn Sie dies trotzdem tun und als Administrator für den Benutzer dienen möchten, wählen Sie einfach ein Konto aus, sagen Sie account[5]. Platzieren Sie es in einer lokalen Datenbank (optional), die account[5]Benutzername zugewiesen ist 123user. Erstellen Sie eine Zuordnung im Vertrag, rufen Sie die Funktion auf, um die Adresse zuzuweisen. Wenn Sie die Funktion aufrufen, übergeben Sie einfach die Adresse von account[5]und den Benutzernamen. Ruhe alles folgt.

Ein besserer Weg wird sein, bip39/ bip44Wallets zu generieren.

Ich habe viele Benutzer in meinem System, ab jetzt dient es zu Demozwecken, also sagen wir, ich habe 10 Benutzer in meinem System, in denen ich sie derzeit aus dem Konstruktor erstelle, und ja, alles wird über das Konto [0] erledigt. Und Ganache hat auch 10 Konten. Wenn ich also einen Benutzer zur Blockchain hinzufüge, muss die Adresse dem ersten Benutzer zugewiesen werden, dann die zweite Adresse dem zweiten Benutzer. In Zukunft können wir also die Transaktionsdetails eines bestimmten Benutzers von dieser Adresse abrufen, nicht anhand der Benutzer-ID, was ich derzeit tue. Also, wie können wir es erreichen?
Meine Antwort aktualisiert
Ok, wenn ich nicht den lokalen DB-Ansatz verwenden möchte und ab jetzt nur die Dinge tun möchte, wie wenn ich Benutzer1 hinzufüge, muss es Konto[0] zugeordnet werden, dann Benutzer2 mit Konto[1] und dann Wir können die Transaktion anhand der Kontoadresse abrufen. Wie erreichen Sie dies mithilfe des Adressdatentyps in Solidity?
Rufen Sie dann, wie gesagt, einfach die Kontoadresse mit auf web3, rufen Sie die Vertragsmethode auf, die eine Zuordnung aktualisiert uint userId => address account. Das ist es. Ruhe gibt es viel zu erklären.
Aber wie können wir die Adresse des Kontos erhalten, sagen wir, ich stelle den Vertrag wie folgt bereit: "deployer.deploy(AssetContract,[2001014800086] , {from:web3.eth.accounts[1],gas: 6700000})". Bedeutet, dass es von Konto [1] bereitgestellt wird, sodass ich in meinem Vertrag die Benutzer-ID "2001014800086" msg.sender zuordnen kann, was Konto [1] ist. Wenn ich nun eine andere Benutzer-ID im obigen Code-Snippet übergebe, wie kann ich diese ID dann dem Konto [2] zuordnen?
Dies liegt daran, dass Sie nur den Vertrag bereitstellen und die ID im Konstruktoraufruf einrichten. Um ihn ohne ihn zu aktualisieren, erstellen Sie eine Funktion, die Adresse und ID akzeptiert. Übergeben Sie die Kontoadresse: web3.eth.accounts[2]und ID. Diese Methode wird also die Änderungen in der Festigkeit vornehmen.
Ich schlage vor, dass Sie bitte ein grundlegendes Solidity-Tutorial wie cryptozombies.io machen :)
Ja, ich habe dieses Beispiel erwähnt. Was ich jetzt mache. Ich übergebe alle Konten an meinen Smart Contract und weise eine Kontoadresse nach der anderen den 3 Benutzer-IDs in Schleife zu, die ich während der Migration wie folgt übergebe: deployer.deploy(AssetContract,[2001014800086,2001014800087,2001014800088],web3.eth .Konten, {Gas: 6700000})
cool :) Sie können die Antwort akzeptieren, wenn sie Ihr Problem gelöst hat.