Zuerst dachte ich, ich könnte einfach Folgendes verwenden private
:
mapping (address => bytes32) private userPassword;
und so prüfen Sie einfach, ob das eingegebene Passwort richtig ist:
function enter(bytes32 password) {
if (password == userPassword[msg.sender])
//do smth
}
Aber dann habe ich das in solidity docs gelesen:
Alles, was in einem Vertrag steht, ist für alle externen Beobachter sichtbar. Wenn Sie etwas privat machen, wird nur verhindert, dass andere Verträge auf die Informationen zugreifen und diese ändern, aber sie sind dennoch für die ganze Welt außerhalb der Blockchain sichtbar.
Also, wenn ich es richtig verstanden habe, kann jeder die Werte der gespeicherten Passwörter sehen, selbst wenn ich die "private" Sichtbarkeit verwende. Wie soll ich dann Informationen speichern, die nicht öffentlich sein sollten?
Benutzer (Verträge, vertrauenswürdige Maschinen, andere Verträge) werden anhand ihrer Ethereum-Adresse identifiziert.
Anstatt ihre Kennwörter zu speichern, verwenden Sie msg.sender
sie zur Authentifizierung.
Da niemand unbefugt teilnehmen soll, benötigen Sie eine Liste mit berechtigten Adressen. Sie erstellen Funktionen zum Hinzufügen/Entfernen von Benutzern und stellen sicher, dass nur der autorisierte Administrator (normalerweise Eigentümer genannt) auf diese Vertragsfunktionen zugreifen darf.
Die Zugriffskontrollliste wäre eine Liste von Ethereum-Adressen.
Einige organisatorische Ideen hier: Gibt es gut gelöste und einfache Speichermuster für Solidity?
Und hier: https://medium.com/@robhitchens/solidity-crud-part-1-824ffa69509a
Ich hoffe es hilft.
Wenn ich Ihre Anforderungen richtig verstehe, können Sie den folgenden Ansatz implementieren:
reveal
, um Verwirrung zu vermeiden. Nach der Erklärung des Frageautors: "Meinem Vertrag nur mit dem Passwort beitreten" können Sie meine Lösung als Ticket zum Beitritt zu einem Vertrag ansehen, der während der reveal
Phase validiert wird.Speichern Sie Passwörter nicht wie empfohlen, verwenden Sie stattdessen msg.sender zur Authentifizierung
Wie Jakub betonte, können Sie keccak256 verwenden, um geheime Passwörter zu speichern und zu überprüfen. Zwei Probleme bei dieser Methode:
Durch die Eingabe des Klartext-Passworts während des Zugriffs wird es jedem angezeigt, der den Pool für ausstehende Transaktionen überwacht. Ein Angreifer kann dann gegen Ihren Benutzer antreten und das Passwort verwenden, indem er eine entsprechende Transaktion generiert und einen höheren Gaspreis angibt, der früher ausgeführt wird als der Ihres legitimen Benutzers.
Sobald das Passwort verwendet wurde, ist es nicht mehr geheim.
Es gibt nichts, was Sie tun können, um 1. abzuschwächen, abgesehen davon, dass Sie bei der Verwendung des Passworts zunächst einen unerschwinglich hohen Benzinpreis verwenden.
Um 2. abzumildern, können Sie den Benutzer auffordern, einen neuen Passwort-Hash zu generieren und anzugeben, der zusammen mit dem Passwort gesendet werden muss, um ein neues One-Use-Passwort für das nächste Mal zu erstellen. Spülen wiederholen.
Wenn ich deine Frage richtig verstanden habe,
Das Vertragsbereitstellungskonto sollte die zulässigen Benutzer lange vor oder nach der Bereitstellung kennen.
Für Ihren Fall müssen Sie alle Benutzer kennen, während die Bereitstellung eingeführt wird.
Eine andere Option besteht darin, jedem zu erlauben, RequestRegister anzufordern, einen eventTrigger davon zu haben, Ihre einmalige Authentifizierungslogik auszuführen und die Absenderadresse in der Liste der zugelassenen Benutzer zu registrieren.
Damit sind weitere Nachverfolgungen von erlaubten Benutzern einfach und jederzeit auch Benutzerhinzufügung möglich.
Vorlieb
Ajoy Bhatia
Rob Hitchens
Vorlieb
Rob Hitchens
Vorlieb
Rob Hitchens
Cyberience
require(approved[msg.sender,true);
benötigen Sie möglicherweise Methoden zum Genehmigen, Auflisten und Aussetzen dieser Liste. und machen Sie es vielleicht zu einer Struktur, um Dinge wie Namen oder andere Informationen hinzuzufügen, um das Mitglied zu identifizieren,