Ich suche nach einer Möglichkeit, eine Transaktion manuell zu signieren, indem ich die erforderlichen Eingaben habe, ohne Bibliotheken zu verwenden. Ich habe nirgendwo genau gefunden, wie der Signiervorgang genau funktioniert, weshalb ich hier frage. Ich möchte keine Bibliothek verwenden, weil ich versuchen möchte, eine Rohtransaktion innerhalb von Solidity ohne Gaseinschränkungen zu signieren.
BEARBEITEN: Zur Verdeutlichung möchte ich die Transaktion nicht an das Netzwerk senden. Ich ziele einfach darauf ab, die signierte Nachricht an den Anrufer zurückzusenden.
Das Generieren einer ECDSA-Signatur erfordert eine Skalarmultiplikation mit elliptischen Kurven, was ziemlich teuer ist und sicherlich nicht in die Gasgrenze einer öffentlichen Blockchain passen würde. Ich kenne keine Implementierungen von secp256k1 in Solidity, und ich sehe ehrlich gesagt keinen Grund, warum Sie Signaturen in der Kette generieren möchten. Wenn Sie den privaten Schlüssel zu einem Vertrag geben, wird dieser öffentlich. In diesem Fall können Sie die Signatur genauso gut außerhalb der Kette generieren.
Es gibt einen sehr nützlichen Medium -Artikel, der Schritt für Schritt erklärt, wie eine Transaktion erstellt und signiert wird.
Eine Transaktion muss jedoch normalerweise in den Mempool eines Knotens gelangen (und an andere Knoten gesendet werden) - ich bin mir nicht sicher, ob dies innerhalb eines Smart Contract / Solidity möglich ist.
Ich denke, wie @Richard Horrocks betonte, dass, wenn alle Knoten im Netzwerk den privaten Schlüssel hätten, sie eine Transaktion verarbeiten würden (diesen intelligenten Vertrag nennen), die den gespeicherten privaten Schlüssel verwenden würde, um eine neue Transaktion zu signieren, die aktualisiert werden könnte der Zustand der Ethereum-Blockchain.
Es könnte jedoch möglich sein, dass die im Smart Contract erstellte Transaktion denselben Smart Contract (oder einen ähnlichen in einem gerichteten, zyklischen Graphen von Verträgen) aufruft, und wenn es keine Gasbeschränkungen gibt, wäre dies das gesamte Netzwerk in einer Endlosschleife gefangen.
Dies scheint den Sinn des geheimen / privaten Schlüssels zu widerlegen.
Anknüpfend an Tjadens Antwort ...
Zur Veranschaulichung der Gasmenge, die diese Art von Operation erfordern würde, gibt es hier eine Solidity-Implementierung von secp256k . Es wurde seit einem Jahr nicht mehr berührt, daher kann Ihre Laufleistung variieren.
Aus der README:
Dies ist eine Implementierung der elliptischen Kurve secp256k in 100% in Solidität geschrieben.
Und:
Die Berechnung eines öffentlichen Schlüssels aus einem privaten Schlüssel kostet etwa 800.000 Gas.
Bei einem flüchtigen Blick auf den Vertrag scheint es nicht direkt umzusetzen, was Sie wollen, aber es könnte ein guter Ausgangspunkt sein.
Bearbeiten:
Und für eine noch ältere Implementierung siehe hier .
Richard Horrocks
Alex Papageorgiou
libertylocked