Wie kann ich eine Transaktion abschließen, ohne vorher mein Konto zu entsperren?

Ich muss eine (zustandsändernde) Funktion für meinen Vertrag aufrufen.

So führe ich diese Transaktion derzeit aus:

let transaction = contract.methods.myFunc();
await web3.eth.personal.unlockAccount(ACCOUNT_ADDRESS, ACCOUNT_PASSWORD);
let gas = await transaction.estimateGas({from: ACCOUNT_ADDRESS, gasPrice: GAS_PRICE});
await transaction.send({from: ACCOUNT_ADDRESS, gasPrice: GAS_PRICE, gas: gas});

Nach meinem Verständnis hinterlässt das Entsperren des Kontos auf meinem Ethereum-Client jedoch viele Sicherheitslücken, mit denen man sich befassen muss.

Gibt es eine Möglichkeit für mich, meine Zugangsdaten (Kontoadresse und Passwort) beim Ausführen der Transaktion weiterzugeben, anstatt das Konto vorher freizuschalten?

Dokumentation für unlockAccountist hier .

Dokumentation für sendist hier .

Vielen Dank!

Antworten (1)

Sie können die Transaktion einfach auf Ihrer Seite signieren und eine Rohtransaktion senden, Sie werden dies auf Python oder Java oder einer anderen Umgebung tun, aber nicht direkt auf Ihrem Ethereum-Client. Das Risiko wird also minimiert.

Beispiel:

var Tx = require('ethereumjs-tx');
dataTx = myContract.methods.myFunc(params).encodeABI(); //The encoded ABI of the method

var rawTx = {
  to: 'yourcantract address', 
  data:dataTx 
}

var tx = new Tx(rawTx);
tx.sign('yourprivateKey');

var serializedTx = tx.serialize();
web3.eth.sendSignedTransaction('0x' + serializedTx.toString('hex'))
.on('receipt', console.log);

Hoffe das hilft.

Danke schön. Also schaue ich mir Funktionen signund signTransaction hier an . Aber keiner von ihnen nimmt den privaten Schlüssel / die Passphrase / das Passwort als Eingabe. Wie genau kann es also möglicherweise ersetzen unlockAccount?
Oh, ich glaube, ich habe es verstanden. Ich muss function verwenden web3.eth.personal.signTransaction(nicht function web3.eth.signTransaction).
Die von Ihnen vorgeschlagene Funktion verwendet beispielsweise ein Transaktionsobjekt als Eingabe. Aber das Transaktionsobjekt in meinem Code - contract.methods.myFunc()- ist völlig anders (und ja, beide werden in den Dokumenten als Transaktionsobjekt bezeichnet ).
Ja, du hast recht, schau dir mein Update an. Lassen Sie mich wissen, wie es geht.
Ich bekomme Returned error: Insufficient funds. The account you tried to send transaction from does not have enough funds(ein Fehler, den ich nicht bekommen habe, als ich verwendet habe unlockAccount).
Wie der Fehler sagt, verfügt Ihr Konto nicht über genügend Guthaben.
Wie ich in meinem Kommentar sagte, tritt dieser Fehler nicht auf, wenn ich das Konto entsperre, daher kann der Grund unmöglich sein, dass es "nicht genug Guthaben hat".
Hast du das gelöst?, lass es mich wissen
Ich habe einen etwas anderen Code verwendet (rein web3, ohne ethereumjs-tx). Konnte es nicht zum Laufen bringen, also habe ich hier eine ausführlichere Frage gestellt .