Управление одноразовыми номерами Ethereum. ошибка одноразового номера слишком мала

Я использую web3 и сеть провайдера. Делаю 2 сделки по контракту. во-первых, это метод утверждения, а другая транзакция - мультитрансфер. Я храню вторую подпись в базе данных. если первая транзакция прошла успешно, я отправляю вторую транзакцию/. вторая транзакция почти всегда выдает ошибку nonce too low`. как я могу решить эту проблему


person Максаткалиулы Адилет    schedule 07.06.2019    source источник


Ответы (2)


Для правильного управления nonce у вас есть 2 варианта:

  • Запросить количество транзакций подтвержденных для вашего адреса с помощью web3.eth.getTransactionCount(ethAddress), увеличить, отправить и дождаться получения до обработки следующего. Это очень медленно, если вам нужна высокая пропускная способность, и вы полагаетесь на доступность и синхронизацию определенного узла.

  • Вы поддерживаете свой собственный локальный счетчик persisted на уровне базы данных. Используйте блокировки доступа к БД для обработки возможных одновременных запросов и каждый раз возвращайте правильные значения. Вы не хотите хранить эти счетчики в памяти, так как они будут потеряны, если ваше приложение выйдет из строя или перезапустится. Это очень эффективно, так как вам не нужен узел, и вы можете отправлять столько транзакций, сколько сможете. Если что-то пойдет не так... (один раз слишком низкий) сбросьте значение web3.eth.getTransactionCount(ethAddress).

Важное примечание. Вы можете задаться вопросом, почему бы не использовать web3.eth.getTransactionCount(ethAddress, 'ожидание'). Это связано с тем, что параметр «ожидание» делает вызов ненадежным, поскольку узлам сложно иметь точное количество транзакций в очереди и пуле памяти.

Для лучшего понимания того, как узлы смотрят на одноразовый номер вашего сообщения. Проверьте этот ответ здесь: https:/ /ethereum.stackexchange.com/questions/2808/what-happens-when-a-transaction-nonce-is-too-high/2809#2809

И это тоже: Отправить необработанную транзакцию Ethereum infura nodejs npm

person ehanoc    schedule 11.06.2019

Насколько я понимаю, здесь может быть две проблемы (решения); 1) Возможно, вам придется вручную увеличить одноразовый номер для оценки газа операций мультипередачи. 2) Некоторые серверы в наши дни работают довольно медленно, поэтому либо вы получаете транзакцию (опрос) первой транзакции, прежде чем выполнять вторую, чтобы убедиться, что она была добыта. Таким образом, у вас, вероятно, будет правильный одноразовый номер для второй транзакции. Однако, если вам лень это делать, просто разумны задержки между двумя транзакциями.

person user618677    schedule 08.06.2019
comment
посмотрите, например: у меня есть 2 подписи с нонсами 6 и 7. Я отправляю первую подпись на ноду и жду, пока она будет добыта. если он был заминирован, я посылаю вторую подпись. все хорошо. НО между транзакциями, если кто-то выполняет транзакцию из этого кошелька, тогда эта транзакция также использует одноразовый номер 7. выходит, у меня есть 2 транзакции с одинаковыми значениями, поэтому я получил ошибку nonce too low - person Максаткалиулы Адилет; 09.06.2019