Я хотел бы отправить немного эфира на счет в ropsten testnet. Я использую следующий код и библиотеку 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()
)
пользователь19510
to
? Я предполагаю, что этоnull
или0
.Пол Альварес Весино
Пол Альварес Весино
пользователь19510
transaction
объект изменяется? Можете ли вы показать код и вывод, где вы делаетеconsole.log(transaction.to)
выше и нижеsign
вызова?Пол Альварес Весино
пользователь19510
wallet.sendTransaction
сообщение действительно уже подписано, но ничто в коде не указывает на то, что оно должно завершиться ошибкой при отправке уже подписанной транзакции. Возможно, вы нашли ошибку, о которой, вероятно, следует сообщить в выпусках проекта на GitHub. Я думаю, что причина дляsign
отдельного была бы, если бы вы собирались отправить транзакцию за пределы кошелька (например, черезsendTransaction
метод провайдера, как в примере ).