Signieren Sie eine rohe TX ohne eine Bibliothek?

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.

"... eine Rohtransaktion innerhalb von Solidity ohne Gasbeschränkungen unterzeichnen." - Wenn ich das richtig verstehe, würde das, was Sie vorschlagen, den privaten Schlüssel dem Rest des Netzwerks zugänglich machen. Wird das ein Problem in Ihrem Setup sein? (Ich gehe davon aus, dass es sich um ein privates Netzwerk handelt.)
Wie Sie richtig angenommen haben, handelt es sich um ein privates Netzwerk, sodass dies kein Problem darstellen würde.
Wenn Ihr Vertrag eine Nachricht sendet, ist sie bereits unterzeichnet.

Antworten (3)

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.

Obwohl diese Frage hauptsächlich zu Bildungszwecken dient, könnte sie in einer privaten Blockchain mit gefilterten Proxy-RPC-Zugriffspunkten einen eigenen nützlichen Zweck haben. Danke für deinen Beitrag.
Darüber hinaus müssen Sie einen Weg finden, zufällige Nonces on-Chain zu generieren, was ein weiteres schwieriges Problem darstellt
Was meinst du mit zufälligen Nonces? Sind Account-Nonces nicht deterministisch?
Das Generieren einer ECDSA-Signatur erfordert das Generieren einer unvoreingenommenen pseudozufälligen Nonce, die immer geheim gehalten und niemals wiederverwendet werden muss. de.wikipedia.org/wiki/… . Sie können sie jedoch deterministisch generieren, indem Sie die Nachricht mit dem privaten Schlüssel hashen, da Sie bereit sind, den Schlüssel dem gesamten Netzwerk zugänglich zu machen

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 .

Vielen Dank für die Bereitstellung eines guten Ausgangspunkts. Dies in Verbindung mit dem mittleren Post über Transaktionen könnte alles sein, was ich brauche, obwohl ich diese Frage noch einige Zeit offen lassen werde.
Ich stehe korrigiert, ich denke, jemand hat es getan. Könnte für die ECDSA-Verifizierung auf verschiedenen Kurven nützlich sein