Transactions
如何將乙太幣發送到賬戶而不是使用 ethers.js 創建智能合約
我想向 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()
)