So senden Sie Ether an ein Konto, anstatt einen Smart Contract mit ethers.js zu erstellen

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 toKonto 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"?

Drucken Sie den Wert von to? Meine Vermutung ist, dass es nulloder ist 0.
Der Wert von to ist: 0x00269e08097635F95aba776030e0907b56a7e181. Weder null noch 0. Vielleicht braucht es ein bestimmtes Format oder so etwas?
Ok, ich habe gesehen, dass das to-Feld nach dem Signieren der Transaktion undefiniert wird. Ist das normal oder was ist das erwartete Verhalten?
Du meinst, das transactionObjekt wird modifiziert? Können Sie Code und Ausgabe zeigen, wo Sie console.log(transaction.to)über und unter dem signAufruf arbeiten?
Ich habe festgestellt, dass das Problem die Unterzeichnung der Transaktion ist. Ich bearbeite die Frage
Aus dem Code sieht es so aus 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ür signwäre, wenn Sie die Transaktion außerhalb der Brieftasche senden würden (z. B. über die sendTransactionMethode eines Anbieters wie im Beispiel ).

Antworten (1)

Der signedTransactionist serialisierter Hex-String der Transaktion.

Der Wallet.prototype.sendTransactionAufruf 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.sendTransactionAufruf 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.sendTransactioneinige der Werte automatisch für Sie ausgefüllt werden und dem zurückgegebenen Transaktionsobjekt einige Hilfsfunktionen hinzugefügt werden (z. B. wait())