Мне нужно знать одноразовый номер моей транзакции, потому что я делаю причудливые вещи с контрактными адресами (которые представляют собой хэш keccak моего адреса + одноразовый номер моей транзакции). Есть ли способ найти это через консоль JavaScript?
Ваш комментарий верен: используйте web3.eth.getTransactionCount(accountAddress)
Обратите внимание, что клиент (Geth) должен быть синхронизирован с блокчейном.
Если у вас нет узла и вы хотите доверять службе, вы можете попробовать Infura сeth_getTransactionCount
.
в гете вы можете:
eth.getTransaction('0x0b95eaccd6273fa35bd9e6102c8a7216ee62274940ff52348c8967c13e1c12de')
{
blockHash: "0x24b5d26d4fca736ca095e4c85e0e8230c2e0b1056a5050824a4bccf7dd84e1f2",
blockNumber: 1251275,
from: "0x2a65aca4d5fc5b5c859090a6c34d164135398226",
gas: 90000,
gasPrice: 20000000000,
hash: "0x0b95eaccd6273fa35bd9e6102c8a7216ee62274940ff52348c8967c13e1c12de",
input: "0x",
nonce: 377073,
to: "0xeadefe2cfa52c759e274d6592a938be0217f5877",
transactionIndex: 15,
value: 1011030740000000000
}
eth.getTransactionCount
?Обычно я получаю количество транзакций, используя
web3.eth.getTransactionCount(
wallet_address
);
Этого недостаточно при отправке нескольких транзакций, в то время как старые еще не добыты, поэтому некоторые люди используют getPendingTransaction
метод
Когда, как и я, работаю с Infura RPC, этот последний метод вообще НЕ доступен, еще не реализован; абсурд, но это так.
Я обнаружил поиск в Google, который мы можем использовать getTransactionCount
следующим образом
web3.eth.getTransactionCount(
wallet_address,
"pending"
);
На самом деле это не задокументировано, но работает с локальной geth
установкой и с Infura.
Используя эту систему, я могу отправить кучу подписанных транзакций по одной за короткое время, чтобы все они были в ожидании, а затем были добыты за несколько минут.
Эфиры очень похожи на web3 в отношении getTransactionCount
.
await provider.getTransactionCount('ricmoo.eth');
// 26
Используя переключатель «ожидание», вы можете получить количество не добытых транзакций для этого адреса.
await provider.getTransactionCount('ricmoo.eth', 'pending');
// 2
Однако будьте осторожны: это довольно ненадежно.
BlockTag
pending
не очень надежен, и я не буду его рекомендовать. Реализация для Parity и Geth сильно различается: один проверяет общий пул транзакций, а другой проверяет транзакции, которые, как ожидается, перейдут в следующий блок (я забыл, какой есть какой), и многие серверные части просто игнорируют его и используютlatest
внутренне, еслиpending
он используется.По сути, если вы не используете свою собственную инфраструктуру, которая делает то, что вы хотите, я не буду зависеть от нее. :)
https://github.com/ethers-io/ethers.js/issues/435#issuecomment-583808056
Его код node js для получения одноразового номера любой учетной записи: -
const Web3 = require("web3");
const web3 = new Web3(<RPC-Provider-Link>)
var account = "0x60E7B364092B1f8D96C5C92Dxxxxxxxxxxxx"
web3.eth.getTransactionCount(account, (err, nonce) => {
console.log(nonce,err)
})
установить web3 с помощью npm i web3
. также измените учетную запись и RPC-Provider-Link перед запуском кодов выше.
0xcaff
эт
Джойтвиддл
web3.eth.getTransactionCount(accountAddress, 'pending')
, чтобы избежать коллизий одноразовых номеров при параллельном выполнении нескольких транзакций. (Если вы этого не сделаете, вы можете получить это запутанное сообщение об ошибке: «Возвращенная ошибка: известная транзакция»)эт
jkr