Anwendungsfall für öffentliche/private Schlüssel

Ich möchte eine große Anzahl privater/öffentlicher Schlüsselpaare für einzelne Benutzer generieren und die öffentlichen Schlüssel in einem Smart Contract speichern. Private Schlüssel werden nicht elektronisch an Benutzer verteilt. Wenn ein Benutzer erfolgreich einen privaten Schlüssel (über eine Dapp) eingibt und dieser Schlüssel den öffentlichen Schlüssel entsperrt, wird er mit etwas ETH aus dem Smart Contract belohnt.

Die Schritte wurden wie folgt aufgeteilt:

  1. Generieren Sie über 1000 private und öffentliche Schlüsselpaare.
  2. Öffentliche Schlüssel werden in einem Smart Contract gespeichert
  3. Private Keys werden nicht digital an Benutzer verteilt (sagen wir auf Papier gedruckt).
  4. Ein Benutzer, der von einer bestimmten Adresse kommt, interagiert mit Hilfe von MIST mit unserer DApp und gibt den erhaltenen privaten Schlüssel ein.
  5. DApp sendet den TX an den Smart Contract. Da die Interaktion mit DApp über MIST erfolgt, ist msg.sender die Benutzeradresse.

Soweit ich sehen kann, gibt es zwei mögliche Lösungen, um die Kombination aus privatem und öffentlichem Schlüssel zu überprüfen und eine Belohnung an msg.sender zu senden:

A. Ein öffentlicher Schlüssel wird aus dem privaten Schlüssel in der Kette generiert (sagen wir mit https://github.com/jbaylina/ecsol ). Wenn sie übereinstimmen. Entfernen Sie den öffentlichen Schlüssel aus dem Vertrag und zahlen Sie msg.sender aus.

ODER

B. Generieren Sie vor dem Senden des TX an den Smart Contract einen öffentlichen Schlüssel aus dem privaten Schlüssel außerhalb der Kette (innerhalb unseres DAPP). Vergleichen Sie den öffentlichen Schlüssel im Smart Contract. Wenn sie übereinstimmen.. Auszahlung.

Mein Problem ist die Wahl zwischen a. und B. Jeder hat einen Nachteil:

A. Die Entschlüsselung in der Kette ist kostspielig. Aber zumindest kennen wir msg.sender (wohin die Gelder freigegeben werden sollen), was in b schwer zu bestimmen ist. OK, also zeige ich die Kombination aus privatem und öffentlichem Schlüssel, aber da jede Kombination aus privatem und öffentlichem Schlüssel einzigartig ist, sollte das Offenlegen eines privaten Schlüssels die Integrität der verbleibenden nicht beeinträchtigen. Kombinationen aus öffentlichem und privatem Schlüssel sind einzigartig und werden nur einmal verwendet.

B. Sobald ich verifiziert habe, dass der öffentliche/private Schlüssel außerhalb der Kette übereinstimmt, wie kann ich dann dem Vertrag mitteilen, dass die Entschlüsselung erfolgreich war und dass er Gelder an msg.sender freigeben sollte? Meiner Meinung nach würde dies idealerweise über einen Rückruf erfolgen. Zum Beispiel: Off-Chain entschlüsseln, falls erfolgreich, Rückruf und Gelder an die anrufende Adresse freigeben. Solidity bietet diese Funktionalität jedoch nicht. Vielleicht könnte ich die Transaktion signieren und validieren, zum Beispiel mit ( https://medium.com/@angellopozo/ethereum-signing-and-validating-13a2d7cb0ee3 ). Also zeichne ich die Übereinstimmung auf, die von msg.sender kam, und bringe dann meine Dapp dazu, eine weitere Anfrage zu senden, die eine msg.sender.transfer auslöst?

Ich sollte anmerken, dass wir die Benutzeradresse vorher nicht kennen (und tatsächlich kann es jede ETH-Adresse sein).

Ich hoffe meine Frage klar. Vielleicht übersehe ich etwas? Gedanken?

Antworten (1)

  1. Speichern Sie im Vertrag die aus dem privaten Schlüssel generierte Adresse für jeden Benutzer.

  2. Senden Sie den Benutzern den generierten privaten Schlüssel.

  3. Dapp signiert eine statische Nachricht mit dem generierten privaten Schlüssel.

  4. Contracts verwendet ecrecover mit signierter Nachricht von dapp, validiert, dass die Adresse im Vertrag gespeichert ist.

In 4. können Sie die Benutzeradresse der von Ihnen generierten Adresse zuordnen.

Toll! Das hat funktioniert. Hoffe, das hilft jemand anderem.