Есть ли способ найти одноразовый номер текущей транзакции учетной записи?

Мне нужно знать одноразовый номер моей транзакции, потому что я делаю причудливые вещи с контрактными адресами (которые представляют собой хэш keccak моего адреса + одноразовый номер моей транзакции). Есть ли способ найти это через консоль JavaScript?

Ответы (5)

Ваш комментарий верен: используйте web3.eth.getTransactionCount(accountAddress)

Обратите внимание, что клиент (Geth) должен быть синхронизирован с блокчейном.


Если у вас нет узла и вы хотите доверять службе, вы можете попробовать Infura сeth_getTransactionCount .

Что, если вам удастся установить одноразовый номер больше, чем количество транзакций в предыдущей транзакции? Как тогда получить одноразовый номер?
@0xcaff Я не понимаю вашего вопроса, не могли бы вы пояснить? Если клиент синхронизирован, он всегда будет предоставлять правильный одноразовый номер...
Я рекомендую использовать web3.eth.getTransactionCount(accountAddress, 'pending'), чтобы избежать коллизий одноразовых номеров при параллельном выполнении нескольких транзакций. (Если вы этого не сделаете, вы можете получить это запутанное сообщение об ошибке: «Возвращенная ошибка: известная транзакция»)
Хороший вопрос, joeytwiddle и, возможно, то, что спрашивал @0xcaff.
web3.py теперь функция web3_eth.get_transaction_count(account, block_identifier=web3.eth.default_block)

в гете вы можете:

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?
Я бы сказал больше с eth.getTransactionFromBlock(хэш блока #) нет?
Но если я не знаю и блок своей последней транзакции, то мне приходится просматривать все блоки, что не идеально.
В желтой бумаге написано, что одноразовый номер транзакции равен количеству транзакций, отправленных адресом.
вы должны изменить правильный ответ на тот, который сделал @eth;)

Обычно я получаю количество транзакций, используя

web3.eth.getTransactionCount(
    wallet_address
);

Этого недостаточно при отправке нескольких транзакций, в то время как старые еще не добыты, поэтому некоторые люди используют getPendingTransactionметод

Когда, как и я, работаю с Infura RPC, этот последний метод вообще НЕ доступен, еще не реализован; абсурд, но это так.

Я обнаружил поиск в Google, который мы можем использовать getTransactionCountследующим образом

web3.eth.getTransactionCount(
   wallet_address,
   "pending"
);

На самом деле это не задокументировано, но работает с локальной gethустановкой и с Infura.

Используя эту систему, я могу отправить кучу подписанных транзакций по одной за короткое время, чтобы все они были в ожидании, а затем были добыты за несколько минут.

Предупреждение: эта функция с опцией «Ожидание» может заблокировать вашу учетную запись так же, как застряла моя. Я не мог развернуть и чеканить. Рекомендуется использовать функцию без этой опции. Пояснение: github.com/ethers-io/ethers.js/issues/…

Эфиры очень похожи на 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 перед запуском кодов выше.