В настоящее время я работаю над DApp, который включает отправку транзакций. Я использую BlockCypher для отправки транзакций, так как API довольно прост. Одна проблема, которую я обнаружил, заключается в том, что когда я запускаю свой API локально и вызываю метод отправки транзакции, я получаю хэш транзакции, и я могу проверить его на Etherscan, и транзакция действительно выполняется.
Следующим шагом, конечно же, является развертывание API, а затем его тестирование, когда я делаю это и попадаю в конечную точку API с точно такими же параметрами. Я получаю следующую ошибку: Error validating transaction: Account nonce 68 too far behind transaction 0xad50ba948fc3fe266fb19c4aa3f3a81928ff114b3fadf597a620ec86eada7cf0:
. Похоже, что рассматриваемая транзакция вообще не существует (из-за поиска на Etherscan), и поэтому кажется, что мой Nonce для этой учетной записи не синхронизирован с тем, чем он должен быть. Это вообще возможно? И как побороть эту проблему?
Как оказалось, я обнаружил, что учетная запись должна иметь одноразовый номер более 200, а функция, web3.eth.getTransactionCount(ADDR)
кажется, возвращает только 68. Вот как я строю транзакцию:
var count = web3.eth.getTransactionCount(FROM_ADDR);
var data = myContractInstance.transfer.getData(to, value, { from: FROM_ADDR });
var gasPrice = "2000000000";
var gasLimit = 90000;
var rawTransaction = {
"from": FROM_ADDR,
"nonce": web3.toHex(count),
"gasPrice": web3.toHex(gasPrice),
"gasLimit": web3.toHex(gasLimit),
"to": to,
"data": data,
"chainId": 0x01
};
Как ни странно, когда я изменил адрес, транзакции снова правильно отправляются как на моей локальной машине, так и на сервере. Я оставил электронное письмо для BlockCypher, чтобы узнать, могут ли они помочь с этим.
Заранее спасибо,
Когда вы создаете транзакцию с полным объектом транзакции, вы можете делать разные вещи, включая размещение другого файла nonce
. Просто посмотрите на любую ожидающую транзакцию, чтобы увидеть, как она выглядит, и постройте свою транзакцию на основе чего-то вроде этого:
[{
blockHash: null,
blockNumber: null,
from: "0x010...",
gas: 90000,
gasPrice: 100000000000,
hash: "0xe483aec6b05342eeedf3017314a2838180d66ee78a5ef21642c9f81b7b222dce",
input: "0x",
nonce: 269,
r: "0x9927c6c3856b35ca4ef1155840a4dbd83b79daa5a581b58a23563880bd9838b1",
s: "0x20bb0b13e8c87cff5677cfbb9c720b75104708e36cd08df5e844d5f1d359ebc5",
to: "0x020...",
transactionIndex: 0,
v: "0xa95",
value: 1000000000000000000
}]
Поэтому вы можете попробовать что-то вроде:
web3.eth.sendTransaction( { from : me , to : _to, value: web3.toWei(1), /*gas: 90000, gasPrice: 100000000000,*/ nonce: 269 } )
В качестве альтернативы вы можете попробовать подписать и отправить много транзакций, пока не получите то, что вам нужно.
ПлаваниеG