Daten aus Smart Contracts / Events nur für bestimmte Adressen / Benutzer sichtbar machen

Ich habe einen Anwendungsfall, wo ich brauche:

1- Meine Daten sind für die Öffentlichkeit nicht sichtbar.

2- Um die Rechte meiner Kunden/Benutzer zum Anzeigen dieser Daten aus meinem Smart Contract widerrufen zu können.

Wie hat das schon mal jemand gemacht?

Ich habe darüber nachgedacht, meine Daten-Client-Seite zu verschlüsseln / zu entschlüsseln, damit die Daten in der Blockchain niemals klar sichtbar sind und das solide genug erscheint. (Der Client würde den privaten Schlüssel halten)

Aber dann sehe ich nicht, wie ich meine Benutzer daran hindern kann, die Ereignisse für diesen Vertrag mit so etwas wie zu sehen

contractInstance.EventName({x: y}, {fromBlock: 0, toBlock: 'latest'});

oder indem ich Getter direkt von ihrem lokalen Knoten aufrufe, wenn ich ihr Recht widerrufen möchte, es zu sehen.

Ich dachte daran, die Daten in der Blockchain ein zweites Mal neu zu verschlüsseln und sie von meinem Vertrag für die Adresse in einer Art Liste entschlüsseln zu lassen, aber das würde erfordern, dass mein Vertrag den privaten Schlüssel enthält, und das würde effektiv alles unbrauchbar machen.

Gibt es eine andere/bessere Lösung für dieses Problem?

Bearbeiten :

Ein bisschen mehr zu meinem Anwendungsfall, es ist eine Art Registrierung. Ich hoste Daten auf der Blockchain, ich gebe meinen Benutzern mit grundlegenden Rechten das Recht, Daten hinzuzufügen/zu bearbeiten (ich bin Eigentümer des Vertrags und es gibt eine Liste autorisierter Benutzer, die Funktionen zum Hinzufügen/Bearbeiten verwenden können). ,Der Benutzer kann nur seine eigenen Daten bearbeiten, kann aber den gesamten Satz sehen, wenn er abonniert ist.

Ich möchte, dass dieselbe Benutzerliste NUR die Daten lesen kann (abonnementbasiertes System), sodass sie die Daten nach Ablauf des Abonnements nicht mehr lesen können.

Es fällt mir schwer, mir das richtige Design vorzustellen, da das Verschlüsseln der Daten und das Senden an die Blockchain in Ordnung ist, während der private Schlüssel in meinem privat verteilten Client gespeichert ist, aber das würde immer noch bedeuten, dass der Client den Schlüssel zum Entschlüsseln der Daten für immer behält . Oder ich müsste den gesamten Datensatz jedes Mal neu verschlüsseln, wenn ein Client die Sub abmeldet, was nicht realistisch ist.

Antworten (2)

Sie können niemanden mit Zugriff auf die Blockchain daran hindern, den Status zu lesen und Code auf beliebige Weise auszuführen. Sie können Daten verschlüsseln, aber das hindert die Leute nicht daran, sie zu sehen, sondern sie nur zu interpretieren.

Angenommen, Sie sind damit einverstanden, dass Personen, die das Abonnement beendet haben, auf die Daten zugreifen können, die ihnen bereits zur Verfügung standen – was Sie im Grunde sowieso nicht verhindern können –, gibt es mehrere Möglichkeiten, wie Sie dies erreichen können.

Eine besteht darin, die standardmäßige Verschlüsselung mit öffentlichen Schlüsseln für mehrere Empfänger zu verwenden: Verschlüsseln Sie jede Nachricht mit einem zufällig generierten Schlüssel und verschlüsseln Sie diesen Schlüssel dann mit dem öffentlichen Schlüssel jedes Benutzers, der darauf zugreifen können soll. Wenn ein Benutzer sein Abonnement beendet, entfernen Sie ihn aus dem Satz aktiver Schlüssel. Wenn sich ein neuer Benutzer anmeldet, fügen Sie ihn dem Set hinzu und verschlüsseln Sie die Geheimnisse aller früheren Nachrichten, auf die er zugreifen können sollte.

Eine leichte Variation kann eine einfachere Schlüsselverwaltung ermöglichen: Verwenden Sie einen Schlüssel für jede „Epoche“. Eine Epoche endet jedes Mal, wenn ein Benutzer sein Abonnement beendet. Wenn Sie eine Nachricht einfügen, verschlüsseln Sie sie mit dem aktuellen Epochenschlüssel (stellen Sie sicher, dass Sie auch einen IV verwenden, um Wörterbuch- und Known-Plaintext-Angriffe zu verhindern). Bereitstellung eines Schlüsselspeichers, mit dem Benutzer auf die Epochenschlüssel für jede Epoche zugreifen können, die sie abonniert haben; entweder außerhalb der Kette oder durch Verschlüsselung dieser Schlüssel mit dem öffentlichen Schlüssel jedes Benutzers, der sie verwenden darf.

@jayD Basierend auf Ihrer Bearbeitung könnten Sie von jedem Kunden einen öffentlichen Schlüssel erhalten und die Daten bei der Veröffentlichung mit dem Schlüssel jedes aktiven Benutzers verschlüsseln. Wenn ein Benutzer sein Abonnement beendet, können Sie seinen Schlüssel aus dem aktiven Satz entfernen; Sie können nur bis zur Beendigung ihres Abonnements auf Daten zugreifen.
Aber würde das nicht bedeuten, dass der gesamte Datensatz n^activeuserkey mal gespeichert wird? Weil ich mir nicht vorstellen kann, wie der Benutzer den gesamten Datensatz sehen kann, wenn er mit verschiedenen privaten Schlüsseln verschlüsselt ist? fehlt mir etwas
@jayD Sie können jede Nachricht mit einem zufällig generierten Schlüssel verschlüsseln und dann den Schlüssel mit jedem der öffentlichen Schlüssel der Benutzer verschlüsseln. So funktioniert die reguläre Public-Key-Verschlüsselung sowieso. Und der Overhead beträgt n * activeUsers, nicht n^activeUsers.
Ich habe meine Antwort diesbezüglich ausführlicher aktualisiert.
Super das ist perfekt! könnten Sie mir nur die Richtung zeigen, wie man "diese Schlüssel mit dem öffentlichen Schlüssel jedes Benutzers verschlüsselt, der sie verwenden darf". Ich verstehe, wie das auf Client-Seite gemacht werden könnte, aber ich suche eher nach einer On-Chain-Lösung, wenn möglich. Gibt es eine solide Möglichkeit, Daten aus einem Funktionsparameter mithilfe einer Adressliste zu verschlüsseln, sodass ich für jede hinzugefügte Daten den automatisch generierten Schlüssel für jeden Benutzer/jede Adresse verschlüsseln kann?
@jayD Sie können es nicht on-chain machen - denn dann wären die Aufrufargumente, die die unverschlüsselten Daten enthalten, in der Blockchain.
Sie können Leute daran hindern, bestimmte Teile des Codes auszuführen, indem Sie ihn in eine Prüfung auf msg.sender einschließen, richtig?
@NickJohnson, aber sobald ein aktiver Benutzer mit seinem öffentlichen Schlüssel entschlüsselt, ist er sich des generierten Schlüssels bewusst und könnte ihn öffentlich preisgeben - dann hat jeder Benutzer ohne Abonnement Zugriff auf den Schlüssel. Ich frage mich, ob es eine gute Möglichkeit gibt, das Abonnement verschlüsselter Inhalte zu verwalten.

Werfen Sie einen Blick auf Quorum. Es läuft 'über' ein Ethereum-Netzwerk und macht meistens das, wovon Sie sprechen.