Что произойдет, если для транзакции не будет предоставлен одноразовый номер?

Параметр nonce кажется необязательным для транзакций. Его цель — защитить от повторных атак. В таком случае, почему это необязательно и что произойдет, если его не предоставить? Это оставляет конкретную транзакцию подверженной повторным атакам?

Общее напоминание сообщества для ethereum.meta.stackexchange.com/questions/1/… (я наткнулся на этот вопрос, вижу 3 ответа и 0 голосов.)

Ответы (3)

Если не указано, то одноразовый номер будет считан из состояния учетной записи в блокчейне (это часть состояния блокчейна).

Однако иногда бывает полезно указать его явно. Это может быть полезно, например, если вам нужно повторно отправить транзакцию с более высокой ценой на газ, если первая не добывается. Если вы отправите его снова с тем же одноразовым номером, он (может) перезаписать первый.

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

Но если кто-то захватит необработанное сообщение о транзакции, отправленное в сеть, он сможет повторно отправить то же сообщение? Например, если я использую etherescan.io/pushTx с необработанным сообщением, оно пройдет без одноразового номера. Что мешает Etherscan (или MITM) получить необработанную транзакцию и отправить ее снова?
Транзакционный одноразовый номер из отправляющей учетной записи включается (всегда, но см. примечание Эдмунда Эдгара о планах на будущее) в подписанные данные при создании транзакции. Изменить или заменить его невозможно. Т.е. необработанная транзакция включает одноразовый номер. (Кроме того, отправка одного и того же сообщения дважды (с одним и тем же одноразовым номером) не является ошибкой — в сети это происходит постоянно.)
Хм, я еще раз проверю. Я почти уверен, что сгенерировал необработанную транзакцию без одноразового номера, и она была принята :) (и никто не мог ее включить, поскольку у меня не было подключенного узла, это была просто локальная сериализация RLP)
Это раздел 4.3 Желтой книги для справки. Nonce находится в подписанных данных транзакции. Если его нет, транзакция будет недействительной.
может быть, потому что это была моя первая транзакция, она кодирует нуль, а это то же самое, что и 0.. Спасибо.

Одноразовый номер не является необязательным. Чтобы быть действительной, транзакция должна предоставить одноразовый номер.

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

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

Но если кто-то захватит необработанное сообщение о транзакции, отправленное в сеть, он сможет повторно отправить то же сообщение? Например, если я использую etherescan.io/pushTx с необработанным сообщением, оно пройдет без одноразового номера. Что мешает Etherscan (или MITM) получить необработанную транзакцию и отправить ее снова?
Нет, необработанное сообщение — это подписанная транзакция, включающая одноразовый номер.
Транзакция ethereumj, похоже, поддерживает getEncoded() (необработанный RLP) с нулевым одноразовым номером: github.com/ethereum/ethereumj/blob/develop/ethereumj-core/src/… Я думаю, что использовал это и отправил результат в pushTx, и он прошел (в ропстене), но я перепроверю, может что-то пропустил
может быть, потому что это была моя первая транзакция, она кодирует нуль, а это то же самое, что 0..
Да, это то, что я собирался предположить, что это может быть. Кстати, код, который вы связываете, выглядит так, как будто он также позволяет вам кодировать транзакцию без подписи, поэтому вполне возможно, что он позволяет вам кодировать транзакцию без одноразового номера, чтобы затем вернуться, декодировать и перекодировать его позже, на этот раз с одноразовым номером и подписью.

что произойдет, если это не предусмотрено?

Параметр nonce увеличивается каждый раз ((как столбец Identity в SQL), когда происходит транзакция, и его установка не обязательна.

При желании вы также можете установить одноразовый номер для транзакции, и ниже есть бонусный ответ от Reddit .

Чтобы заранее ответить на ваш следующий вопрос.

Что произойдет, если я отправлю транзакцию с одноразовым номером, который уже был транзакцией?

Он будет отклонен сетью. Что произойдет, если я отправлю одноразовый номер выше, чем правильный следующий одноразовый номер для использования?

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