Что такое одноразовый номер в Ethereum? Как это предотвращает двойные расходы?

Недавно я увлекся блокчейном и начал изучать Ethereum. Я столкнулся с концепцией nonce в Ethereum.

После исследования я обнаружил, что nonce используется для двух целей.

а. Для поддержания транзакции, связанной со счетом, в порядке. т.е. если есть транзакция с одноразовым номером 3, связанная с какой-либо учетной записью в txpool, и какая-то транзакция получит одноразовый номер 4, то эта транзакция не будет добыта до тех пор, пока транзакция с одноразовым номером 3 не будет добыта.

Я это поняла.

Но у меня есть вопрос, который я не могу найти?

i) значение одноразового номера связано с адресом, верно? Таким образом, два адреса могут иметь один и тот же одноразовый номер одновременно, т. е. учетная запись с адресом A может иметь последний одноразовый номер 2, аналогично учетная запись с адресом B также может иметь последний одноразовый номер 2.

ii) Будут ли все узлы в сети иметь одинаковое последнее значение nonce для всех учетных записей, доступных в сети?

То есть, если есть три аккаунта и 2 майнера, то значение nonce для трех аккаунтов равно 1,2,3 соответственно, тогда оба майнера будут иметь одинаковый nonce.

Предположение: оба майнера синхронизированы

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

Все, что вам нужно, находится здесь: myetherwallet.groovehq.com/knowledge_base/topics/what-is-nonce
В итоге мне пришлось посмотреть на дизайн UTXO Биткойна и дизайн балансов Ethereum, чтобы действительно понять одноразовый номер. Это имело смысл, когда я читал только об Эфириуме, но я продолжал задаваться вопросом, почему Биткойн не нуждался в этом.
eth учетная запись nonce не имеет ничего общего с двойной тратой. qr.ae/Tctelk

Ответы (2)

Что такое одноразовый номер в Ethereum?

Если вы обратитесь к Глоссарию на Github Wiki , в Ethereum используются два типа nonce.

  1. Одноразовый номер учетной записи — это просто количество транзакций учетной записи.

Аккаунт одноразовый: счетчик транзакций в каждом аккаунте. Это предотвращает атаки повторного воспроизведения, когда транзакция, например, отправляется. 20 монет от A до B могут воспроизводиться B снова и снова, чтобы постоянно истощать баланс A.

  1. Proof of work nonce — случайное значение в блоке, которое использовалось для подтверждения выполнения работы (в зависимости от сложности на тот момент).

Proof of work nonce: бессмысленное значение в блоке, которое можно изменить, чтобы попытаться выполнить условие доказательства работы.

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

i) Значение одноразового номера связано с адресом, верно? Таким образом, два адреса могут иметь один и тот же одноразовый номер одновременно, т. е. учетная запись с адресом A может иметь последний одноразовый номер 2, аналогично учетная запись с адресом B также может иметь последний одноразовый номер 2.

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

ii) Будут ли все узлы в сети иметь одинаковое последнее значение одноразового номера для всех учетных записей, доступных в сети?

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

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

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

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

Рассмотрим ситуацию, когда A отправляет транзакцию X ETH пользователю B в качестве платежа, а на счете A есть только эти X ETH. После того, как транзакция была отправлена ​​для майнинга, А может отправить другую транзакцию на X ETH с более высокой ценой газа на одну из своих учетных записей, позволив первой отправленной транзакции быть добытой позже, получив более высокий приоритет в очереди ожидающих транзакций. Но поскольку Ethereum принимает во внимание одноразовый номер, это недопустимо, поскольку одноразовый номер более поздней транзакции выше, чем у предыдущей.

Вы также можете обратиться к этому вопросу .

проголосовал за упоминание одноразового номера PoW.
Предполагая, что первая транзакция была подтверждена x раз, верно? Иначе что мешает мне транслировать двойную трату с более высокой ценой на газ и с тем же одноразовым номером?
Относительно: «Ононс учетной записи - это просто количество транзакций учетной записи». Это не совсем так - одноразовый номер увеличивается каждый раз, когда выполняется код операции CREATE, поскольку одна транзакция может генерировать много инструкций CREATE, это число может быть значительно выше, чем количество транзакций.
«Ононс учетной записи: счетчик транзакций в каждой учетной записи. Это предотвращает атаки повторного воспроизведения, когда транзакция, отправляющая, например, 20 монет из A в B, может воспроизводиться B снова и снова, чтобы постоянно истощать баланс A». это то, что говорит глоссарий github. У вас есть источник, на который можно сослаться?
Если бы одноразовые номера не существовали, воспроизведение было бы возможно без опережения. Никаких манипуляций с газом не потребуется. Причина в том, что в целях законной отправки одной и той же суммы дважды с одной учетной записи на другую честный верификатор должен будет принять несколько транзакций с одним и тем же кортежем from/to/amount. Таким образом, противник просто сможет повторно отправить ту же транзакцию. Nonce просит отправителя подписать новое сообщение, когда та же сумма переводится на тот же счет, и, таким образом, верификатор теперь может безопасно отбрасывать транзакции, которые просто повторно передаются.

Во-первых, это «нонс», а не «объявление».

i) Да, у каждого адреса есть одноразовый номер. Адреса могут иметь один и тот же одноразовый номер, и часто так и есть.

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

б) Nonce — это просто счетчик, который отслеживает количество транзакций, отправленных адресом.

Предположим, адрес A имеет 1 ETH.

Во-первых, он пытается отправить 1 ETH на адрес B. Давайте назовем эту транзакцию A0, потому что она была подписана A, и у нее есть nonce 0. Теперь A пытается удвоить трату этого 1 ETH, отправив другую транзакцию 1 ETH на C: назовем это транзакцией A1. A1 будет немедленно отклонен всеми узлами, потому что каждый узел видит, что A1 должен идти после A0, а после A0 в A недостаточно ETH для отправки A1.

Таким образом, вы не можете дважды тратить с разными одноразовыми номерами.

А может попробовать другую стратегию: дважды потратить один и тот же одноразовый номер. Сначала A отправляет транзакцию A0 в B, а затем другую транзакцию A0 в C. Оба имеют одинаковый одноразовый номер и один и тот же источник, но разные адресаты. Только одна из транзакций A0 будет принята в блокчейн, потому что все узлы могут видеть, что одноразовый номер 0 был использован дважды A, а это недопустимо.

Таким образом, вы также не можете дважды потратить один и тот же одноразовый номер.

Как это работает с несколькими незавершенными транзакциями, которые действительны? Предположим, у меня есть 2 ETH. Когда я отправил 1ETH на A с одноразовым номером 0 и 1 ETH на B с одноразовым номером 1, и по какой-то причине транзакция B1 была принята первой, отменяется ли A0, потому что теперь в цепочке есть принятый tx с более высоким одноразовым номером? Или все же пройдет?
Кроме того, как я должен генерировать одноразовые номера в автономном сценарии. Скажем, у меня есть два устройства, которые ведут внутренний, но отдельный учет количества транзакций. При подписании транзакции, которая должна быть отправлена ​​​​через некоторое время, как я могу гарантировать отсутствие коллизии одноразовых номеров?
@LOST Транзакции всегда подтверждаются в порядке возрастания. Nonce 5 всегда будет подтверждаться после nonce 4. Если транзакция с nonce 4 не существует, то nonce 5 никогда не будет подтвержден.
@LOST Если между устройствами нет связи, и каждое из них должно иметь возможность подписывать транзакцию в любое время для последующей трансляции, нет способа предотвратить коллизию одноразовых номеров.
@jesses-busman, вот пример использования :(