Privater Schlüssel zum Senden von Transaktionen in Ethereum erforderlich oder nicht

In Web3-APIs konnte ich keine Option zum Angeben eines privaten Schlüssels zum Senden einer Transaktion in doc sehen . Wie wird das denn gemacht? Meines Wissens nach benötigen wir den privaten Schlüssel eines bestimmten Kontos, um die Transaktion zu senden.

Haben Sie personal.unlockAccount() ausprobiert? web3py.readthedocs.io/en/latest/… Sie können das Konto entsperren, das Sie im Feld from angegeben haben, dann verwendet der Client den entsprechenden privaten Schlüssel zum Signieren.

Antworten (2)

web3 sendet Transaktionen mit entsperrten Brieftaschen, was erfordert, dass Sie Ihr Konto mit der Schlüsseldatei und dem Passwort entsperren, bevor Sie eine Transaktion senden. web3 kann dann auf den privaten Schlüssel aus der entsperrten Brieftasche zugreifen und die Transaktion signieren.

Wenn Sie das Entsperren der Brieftasche vermeiden möchten, müssen Sie die Transaktion selbst signieren und eine Rohtransaktion mit eth.sendRawTransaction senden.

Leider unterstützt web3 das Signieren von Transaktionen nicht. Sie können jedoch eine Transaktion mit ethereumjs-tx signieren . Um eine Hex-Zeichenfolge zu erhalten serializedTx, die die signierte Transaktion enthält, verwenden Sie

const tx = new EthereumTx(txParams); 
tx.sign(privateKey);
let serializedTx = "0x" + tx.serialize().toString('hex');

serializedTxkann mit eth.sendRawTransaction verwendet werden.

Zum Signieren der Transaktionen wird der Private Key privateKeybenötigt. Wenn Sie den privaten Schlüssel nicht haben, können Sie myetherwallet.com verwenden , um ihn aus einer Schlüsseldatei und der Passphrase zu erhalten, oder Sie können den privaten Schlüssel programmgesteuert aus einer Schlüsseldatei und dem Passwort mit abrufen

let privateKey = keythereum.recover(password, keyObject);

von keyethereum . keyObjectist der Inhalt der Schlüsseldatei, die eine JSON-Zeichenfolge ist.

Danke @gisdev_p für die Antwort. Ich habe jetzt das Konzept. Eine Frage lautet: Wie kann ich die Smart-Contract-Transaktionen unterzeichnen? Wenn ich mich mit dem anderen ethereumjs-tx-Weg als dem web3-Passphrasenweg bewege.
Eigentlich macht es keinen Unterschied, ob Sie eine Transaktion auf ein normales Konto oder einen Vertrag tätigen. Die Abwicklung der Transaktion und der Signierung ist gleich. Dass Sie bei einer Transaktion zu einem Vertrag typischerweise einen Datenteil haben werden, bei einer Transaktion zu einem normalen Konto aber höchstwahrscheinlich nicht, hat keinen Einfluss auf die Unterzeichnung. Sie fügen der Transaktion einfach den Datenteil hinzu und signieren ihn.

Das Signieren der Transaktion wird von dem Provider durchgeführt, der auf dem web3-Objekt festgelegt ist.

Wenn der Benutzer beispielsweise über einen Browser mit einer DApp interagiert, ist es wahrscheinlich, dass der Anbieter MetaMask ist und dies den Benutzer behandelt, der die Transaktionen autorisiert.

Ich versuche es tatsächlich vom Server. Aus meiner Python-Django-Anwendung. Wie kann ich das dann mit web3.py machen?
Ich bin neugierig, basierend auf dem, was Sie gerade gesagt haben, wenn ich einen integrierten Anbieter verwende, z. B. web3.providers.HttpProvider, führt er eine Transaktionssignierung durch?
@c.sokun, wenn Sie einen lokalen Ethereum-Knoten haben, der läuft und die RPC-API offengelegt ist, dann wird dieser Knoten die TX-Signierung handhaben