Transactions

如何將乙太幣發送到賬戶而不是使用 ethers.js 創建智能合約

  • March 18, 2018

我想向 ropsten 測試網中的帳戶發送一些乙太幣。我正在使用以下程式碼和庫https://docs.ethers.io/ethers.js/html/。然而,它沒有將乙太幣發送到to賬戶,而是創建了一個合約。我究竟做錯了什麼?

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);
       });
});

這是通過執行上面的程式碼創建的範例事務:

https://ropsten.etherscan.io/tx/0x79504f592a390cdf36dab6f1ee196bf94cab7b032b0b88caf8e6bccdb2a76dbb

編輯:問題來自簽署交易。如果我不簽署交易,sendTransaction(transaction)將按預期工作並將資金轉移到to. 如果我簽署交易並執行sendTransaction(signedTransaction)它會創建上述契約。簽署它的目的是什麼,為什麼它會讓交易“失敗”?

signedTransaction是交易的序列化十六進製字元串。

Wallet.prototype.sendTransaction呼叫需要一個事務對象,而不是序列化事務。因此,當它在內部嘗試讀取時tx.to,由於 tx 是一個字元串,它會變為 null。

Provider.prototype.sendTransaction呼叫需要簽名交易。

因此,如果您想在範例中手動簽署交易,您可以改用:

wallet.provider.sendTransaction(signedTransactio);

這與您使用過的基本相同:

wallet.sendTransaction(transaction);

主要區別在於Wallet.prototype.sendTransaction會自動為你填寫一些值,並且會在返回的交易對像中添加一些實用函式(如wait()

引用自:https://ethereum.stackexchange.com/questions/41055