Ich möchte etwas Ether an ein Konto im Ropsten Testnet senden. Ich verwende den folgenden Code und die Bibliothek https://docs.ethers.io/ethers.js/html/ . Anstatt jedoch den Ether an das to
Konto zu senden, wird ein Vertrag erstellt. Was mache ich falsch?
const wallet = new Wallet(config.privateKey);
wallet.provider = ethers.providers.getDefaultProvider('ropsten');
const transaction = {
nonce: 0,
gasLimit: config.gasLimit,
gasPrice: gasPrice,
to: to,
value: ethers.utils.parseEther(amount),
// data: "0x",
// This ensures the transaction cannot be replayed on different networks
chainId: 3 // ropsten
};
const signedTransaction = wallet.sign(transaction);
return new Promise((resolve, reject) => {
wallet.sendTransaction(signedTransaction)
.then(function(hash) {
logTransaction(hash, config.sourceAddress, to, amount, gasPrice);
resolve(hash);
}).catch(function(err) {
reject(err);
});
});
Dies ist eine Beispieltransaktion, die durch Ausführen des obigen Codes erstellt wurde:
https://ropsten.etherscan.io/tx/0x79504f592a390cdf36dab6f1ee196bf94cab7b032b0b88caf8e6bccdb2a76dbb
BEARBEITEN: Das Problem kommt von der Unterzeichnung der Transaktion. Wenn ich die Transaktion nicht unterschreibe, sendTransaction(transaction)
funktioniert sie wie erwartet und das Geld wird an überwiesen to
. Wenn ich die Transaktion unterzeichne und mache sendTransaction(signedTransaction)
, entstehen die genannten Verträge. Was ist der Zweck der Unterzeichnung und warum führt dies dazu, dass die Transaktion "fehlschlägt"?
Der signedTransaction
ist serialisierter Hex-String der Transaktion.
Der Wallet.prototype.sendTransaction
Aufruf erwartet ein Transaktionsobjekt, keine serialisierte Transaktion. Wenn es also intern versucht zu lesen tx.to
, wird es null, da tx eine Zeichenfolge ist.
Der Provider.prototype.sendTransaction
Aufruf erfordert eine signierte Transaktion.
Wenn Sie also die Transaktion in Ihrem Beispiel manuell signieren möchten, können Sie stattdessen Folgendes verwenden:
wallet.provider.sendTransaction(signedTransactio);
Was im Grunde dasselbe ist, als ob Sie Folgendes verwendet hätten:
wallet.sendTransaction(transaction);
Der Hauptunterschied besteht darin, dass Wallet.prototype.sendTransaction
einige der Werte automatisch für Sie ausgefüllt werden und dem zurückgegebenen Transaktionsobjekt einige Hilfsfunktionen hinzugefügt werden (z. B. wait()
)
Benutzer19510
to
? Meine Vermutung ist, dass esnull
oder ist0
.Pol Alvarez Vecino
Pol Alvarez Vecino
Benutzer19510
transaction
Objekt wird modifiziert? Können Sie Code und Ausgabe zeigen, wo Sieconsole.log(transaction.to)
über und unter demsign
Aufruf arbeiten?Pol Alvarez Vecino
Benutzer19510
wallet.sendTransaction
, als würde die Nachricht tatsächlich bereits signiert, aber nichts im Code weist darauf hin, dass es fehlschlagen sollte, wenn eine bereits signierte Transaktion gesendet wird. Möglicherweise haben Sie einen Fehler gefunden, der wahrscheinlich in den GitHub-Problemen des Projekts gemeldet werden sollte. Ich denke, der Grund dafürsign
wäre, wenn Sie die Transaktion außerhalb der Brieftasche senden würden (z. B. über diesendTransaction
Methode eines Anbieters wie im Beispiel ).