Что происходит, когда транзакция nonce слишком высока?

Из Обоснование дизайна :

  

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


На этом сайте возникли некоторые вопросы о слишком низких транзакциях. Что происходит, когда транзакция nonce слишком высока?

19 голосов | спросил The Officious BokkyPooBah 9 AMpSat, 09 Apr 2016 10:43:52 +030043Saturday 2016, 10:43:52

3 ответа


57

Резюме

  • Операции со слишком низким значением nonce немедленно отклоняются.
  • Транзакции со слишком высоким значением nonce попадают в очередь пула транзакций.
  • Если транзакции с nonce, которые заполняют промежуток между последним действительным nonce и слишком высоким nonce, отправляются, а последовательность nonce завершается, все транзакции в последовательности обрабатываются и обрабатываются.
  • Когда экземпляры geth закрываются и перезапускаются, транзакции в очереди пула транзакций исчезают.
  • Очередь пула транзакций будет содержать максимум 64 транзакции с одним и тем же адресом From: с неустановленными последовательностями.
  • Экземпляр geth может быть разбит, заполнив очередь пула транзакций 64 транзакциями с тем же адресом From: с неустановленными последовательностями, например:
    • Создание множества учетных записей с минимальным количеством простых эфиров (0,05 ETH в моих тестах)
    • Отправка 64 транзакций из каждой учетной записи с большой полезной нагрузкой данных
    • Для ограничения на 4 Гб памяти, которое я разместил на моем экземпляре geth, 400 x 64 транзакций с полезной нагрузкой около 4500 байт бы вырезали экземпляр geth (из моего ограниченного тестирования в любом случае).
    • Эти транзакции со слишком высоким значением nonce НЕ распространяются на другие узлы и разбивают другие узлы сети Ethereum.
  • Мировой компьютер Ethereum не может быть сбит транзакциями со слишком высоким значением nonce. Хорошая работа, разработчики!


Подробности ниже.



Что происходит, когда транзакция Nonce слишком низкая?

Я создал две новые учетные записи в своей частной сети --dev, используя

geth -datadir ./data --dev account new
Your new account is locked with a password. Please give a password. Do not forget this password.
Passphrase: 
Repeat Passphrase: 
Address: {c18f2996c11ba48c7e14233710e5a8580c4fb9ee}

geth -datadir ./data --dev account new
Your new account is locked with a password. Please give a password. Do not forget this password.
Passphrase: 
Repeat Passphrase: 
Address: {e1fb110faa8850b4c6be5bdb3b7940d1ede87dfb}

Я запустил экземпляр geth-geth в отдельном окне, поэтому первая учетная запись (coinbase) получает депозит с большим количеством средств при добыче новых блоков.

geth --datadir ./data --dev --mine --minerthreads 1 console

В моем основном окне я запустил экземпляр geth, прикрепленный к экземпляру интеллектуального анализа.

geth --datadir ./data --dev attach

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

> eth.sendTransaction({from: eth.accounts[0], to: eth.accounts[1], value: web3.toWei(1, "ether")})
Unlock account c18f2996c11ba48c7e14233710e5a8580c4fb9ee
Passphrase: 
"0xd17510a4c9880155b0237cac58423e05b61ad3f2d5ee90f72d3db2b7d4ea2d47"

Ниже приведены сведения о транзакции для первой транзакции. Для этой транзакции автоматически назначено значение nonce из 0.

 > eth.getTransaction("0xd17510a4c9880155b0237cac58423e05b61ad3f2d5ee90f72d3db2b7d4ea2d47")
 {
   blockHash: "0x519ddf8c3d1a094933d2975bb7c9cdf3680c9d66b880ba22b26627f70d90bb54",
   blockNumber: 88,
   from: "0xc18f2996c11ba48c7e14233710e5a8580c4fb9ee",
   gas: 90000,
   gasPrice: 20000000000,
   hash: "0xd17510a4c9880155b0237cac58423e05b61ad3f2d5ee90f72d3db2b7d4ea2d47",
   input: "0x",
   nonce: 0,
   to: "0xe1fb110faa8850b4c6be5bdb3b7940d1ede87dfb",
   transactionIndex: 0,
   value: 1000000000000000000
 }

Я отправляю вторую транзакцию из своей первой учетной записи в свою вторую учетную запись, указав nonce из 0 и получаю ожидаемый результат «Nonce too low».

> eth.sendTransaction({from: eth.accounts[0], to: eth.accounts[1], value: web3.toWei(1, "ether"), nonce:0})
Nonce too low
    at InvalidResponse (<anonymous>:-81662:-106)
    at send (<anonymous>:-156322:-106)
    at sendTransaction (<anonymous>:-133322:-106)
    at <anonymous>:1:1



Что происходит, когда транзакция Nonce слишком высока?

Теперь я отправляю третью транзакцию из своей первой учетной записи в свою вторую учетную запись, указав значение nonce из 10000 и получая хэш хэнд-транзакции, который был отправлен транзакции в пул транзакций.

> eth.sendTransaction({from: eth.accounts[0], to: eth.accounts[1], value: web3.toWei(1, "ether"), nonce:10000})
"0x5b09270d6bcd33297527a1f6b08fa1528deec01e82a100c7e62ee93fbdcd1f7d"

В окне поиска отображается сообщение о том, что транзакция получена. Однако транзакция никогда не запускается.

I0409 15:25:07.699859   10726 worker.go:569] commit new work on block 95 with 0 txs & 0 uncles. Took 289.587µs
I0409 15:25:08.493883   10726 xeth.go:1028] Tx(0x5b09270d6bcd33297527a1f6b08fa1528deec01e82a100c7e62ee93fbdcd1f7d) to: 0xe1fb110faa8850b4c6be5bdb3b7940d1ede87dfb
> I0409 15:26:13.472919   10726 worker.go:348] 
ответил The Officious BokkyPooBah 9 AMpSat, 09 Apr 2016 10:43:52 +030043Saturday 2016, 10:43:52
0
  

Что происходит, если транзакция nonce слишком высока?

«слишком высокая» транзакция nonce может быть добавлена ​​в tx_pool и пройти проверку на первом этапе, но при выполнении перехода состояния она не будет выполнена. Он строго следует Обоснование дизайна: «принимает только транзакцию, если ее nonce равно 1 после последнего использования nonce».

go-ethereum /core /state_transition.go

func (self *StateTransition) preCheck() (err error) {
    msg := self.msg
    sender := self.from()

    // Make sure this transaction's nonce is correct
    if msg.CheckNonce() {
        if n := self.state.GetNonce(sender.Address()); n != msg.Nonce() {
            return NonceError(msg.Nonce(), n)
        }
    }

    // Pre-pay gas
    if err = self.buyGas(); err != nil {
        if IsGasLimitErr(err) {
            return err
        }
        return InvalidTxError(err)
    }

    return nil
}
ответил Shawn Guo 16 FebruaryEurope/MoscowbThu, 16 Feb 2017 18:27:34 +0300000000pmThu, 16 Feb 2017 18:27:34 +030017 2017, 18:27:34
-2

В обмене Blockchain.info, используя трансляции shesheshift между двумя криптовыми, например, ethereum, в биткойн, это сообщение появляется, если ваш первый статус транзакции еще не выполнен.

Это защита от двойных транзакций. Подождите, пока первая транзакция не будет завершена, прежде чем пытаться переместить больше.

ответил minnaar 6 FebruaryEurope/MoscowbTue, 06 Feb 2018 09:39:51 +0300000000amTue, 06 Feb 2018 09:39:51 +030018 2018, 09:39:51

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132