Отмена/перезапись ожидающей транзакции с помощью geth JSON RPC

Это частная сеть

Была отправлена ​​транзакция для создания контракта с помощью eth_sendTransactionвызова RPC.

Транзакция «удалена» с пометкой «будет удалена», потому что у нее закончился газ, но она остается в pendingсостоянии, и майнеры продолжают пытаться ее обработать.

1- Есть ли способ отменить незавершенную транзакцию?

Согласно sendTransaction документации , повторная отправка транзакции с тем же одноразовым номером позволяет «перезаписать собственную ожидающую транзакцию».

С eth_getTransactionByHashего помощью можно восстановить одноразовый номер транзакции.

Однако при отправке новой транзакции с тем же одноразовым номером (и большим количеством газа) новая транзакция завершается с ошибкой «TX (d37f7a1b) не удалось, будет удалена: транзакция с недопустимым одноразовым номером».

2- Как мы «перезаписываем» ожидающую транзакцию?

Огромное спасибо


edit1: результатeth.pendingTransactions

Вход тот же (тот же контракт), как и одноразовый номер.

Первые 2 терпят неудачу с TX (49dcf54d/7e591a92) failed, will be removed: Out of gas, третий сTX (d37f7a1b) failed, will be removed: Transaction w/ invalid nonce. tx=8 state=9)

[{
    blockHash: null,
    blockNumber: null,
    from: "0x766b8dc3ee1a98dd53444ce3cc5a185305570861",
    gas: 90000,
    gasPrice: 20000000000,
    hash: "0x49dcf54d52ddad2cfb57d9805b1a94bbc6b60ad44eaac9c117399530424d1300",
    input: "0x60606...5056",
    nonce: 8,
    to: null,
    transactionIndex: null,
    value: 0
}, {
    blockHash: null,
    blockNumber: null,
    from: "0x766b8dc3ee1a98dd53444ce3cc5a185305570861",
    gas: 150000,
    gasPrice: 20000000000,
    hash: "0x7e591a92683453ea0ec6a7024d54198140ec2c23936b3662c4f3e0d9978fc828",
    input: "0x60606...5056",
    nonce: 8,
    to: null,
    transactionIndex: null,
    value: 0
}, {
    blockHash: null,
    blockNumber: null,
    from: "0x766b8dc3ee1a98dd53444ce3cc5a185305570861",
    gas: 500000,
    gasPrice: 20000000000,
    hash: "0xd37f7a1bcedef089723f31bbf155b6c4c66f77fd0b5a5f6c3168a0b8ff3af299",
    input: "0x60606...5056",
    nonce: 8,
    to: null,
    transactionIndex: null,
    value: 0
}]

edit2: изменение после того, как нода, создавшая транзакции, начала майнинг

Ситуация изменилась только тогда, когда нода, создавшая транзакции, начала майнинг.

  • Первая транзакция удалена
  • Вторая транзакция, несмотря на то, что она была отклонена с OOG при выделении хранилища, завершена, и адрес контракта сгенерирован.
  • Третья транзакция удалена

Является ли это ожидаемым поведением, которое должен выполнять узел, создавший ожидающую транзакцию , чтобы транзакция, выполняющая OOG на другом майнере, была фактически удалена?

Первоначальный вопрос все еще остается: как удалить/отменить/перезаписать ожидающую транзакцию?

Вы уверены, что транзакция не была заминирована? Что значит «удалено», потому что майнеры будут рады обработать ту транзакцию, у которой закончился газ, и собрать всю комиссию. В консоли. попытка ethereum.stackexchange.com/questions/645/… — это один из способов убедиться, что транзакция еще не завершена.
@eth Привет. Транзакции еще не завершены, см. edit1 выше. Точное сообщение «будет удалено», но это не так. Как их удалить/отменить/перезаписать?
@eth см. edit2: у меня проблемы с пониманием того, почему узел, создавший транзакцию, должен майнить, чтобы прояснить ситуацию. Также остается исходный вопрос: как удалить/отменить/перезаписать ожидающие транзакции?
Попробуйте повторно отправить транзакцию с более высоким одноразовым номером и более высоким газом, если это будет добыто, тогда все должны сбросить ожидающую транзакцию с более низким одноразовым номером.

Ответы (2)

Чтобы перезаписать исходную транзакцию, вам нужно будет повторно передать ту же транзакцию с тем же одноразовым номером, но также с * > 10% более высокой ценой газа, чем раньше *

Если вы хотите отменить транзакцию, ретранслируйте транзакцию с нулевой стоимостью с тем же одноразовым номером, но на > 10 % более высокой ценой газа.

Только одна из транзакций с этим одноразовым номером может быть включена в блокчейн.

как вы «Если вы хотите отменить транзакцию, ретранслируйте транзакцию с нулевой стоимостью с тем же одноразовым номером, но> 10% более высокой ценой газа». У вас есть код?
Вы можете сделать это из любого кошелька, который позволяет вам вручную установить одноразовый номер. Например, MyCrypto.

У меня была аналогичная проблема: я случайно совершил 20 транзакций с GasPrice=0, что полностью заблокировало мой экземпляр Geth. Я выполнил шаги, описанные в этой статье , чтобы отменить транзакции. По сути, что вы хотите сделать, это:

  1. Получить экземпляр консоли Gethgeth attach
  2. Проверьте, какие транзакции ожидаются (это те, которые блокируют все это) eth.pendingTransactions. Это вернет все ожидающие транзакции. Один или несколько объектов, которые выглядят следующим образом: { blockHash: null, blockNumber: null, from: "your account", gas: 179412, gasPrice: 0, hash: "hex stuff", input: "hex stuff", nonce: 260, r: "hex stuff", s: "hex stuff", to: "hex stuff", transactionIndex: 0, v: "0x29", value: 0 }

Теперь может возникнуть одна из двух ситуаций, у вас только одна ожидающая транзакция или у вас их несколько.

Только одна транзакция

  1. Поиск транзакции nonce(в примере выше было 260)
  2. Разблокируйте свой аккаунт,

    personal.unlockAccount('<YOUR_ACCOUNT>') Unlock account <YOUR_ACCOUNT> Passphrase: true

  3. Отправьте транзакцию самому себе с тем же одноразовым номером и на 10% (как минимум) более высокой стоимостью газа,eth.sendTransaction({ from: '<YOUR_ACCOUNT>', to: '<YOUR_ACCOUNT>', value: 0, gasPrice: <NEW_HIGHER_GAS_PRICE>, gasLimit: 24000, nonce: '<NONCE_OF_YOUR_PENDING_TRANSACTION>' });

С несколькими транзакциями

Это довольно странное исправление, но оно работает :)

Сделайте те же 1 и 2 шага из предыдущего случая, затем:

  1. Скопируйте все объекты ожидающих транзакций и вставьте их в текстовый редактор с поддержкой нескольких курсоров, например возвышенный
  2. Выберите значения одноразового номера (выберите одно, а затем Ctrl + D) и удалите все остальное.
  3. Поддерживая мультикурсор, создайте eth.sendTransaction()(предварительно заполните адреса учетных записей и цену газа) вокруг значения nonce. Я сделал гифку, показывающую это здесь.
  4. Скопируйте этот код, вставьте его в консоль Geth и нажмите Enter.

Это должно сработать.