Перейти к содержанию

Пространства nonce в криптосистемах

Практическое руководство по nonce учетных записей Ethereum, прикладным nonce для защиты от повторного воспроизведения, параллельным каналам ключа и последовательности ERC-4337 и поисковым nonce заголовков блоков Proof-of-Work.

Обновлено

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

Краткий ответ

Nonce — это значение, смысл которого задается конкретным пространством имен протокола. Оно не обязательно является случайным числом или универсальным значением, «используемым один раз». В Ethereum nonce состояния внешне управляемой учетной записи упорядочивает и подтверждает транзакции этого отправителя. Контракт может хранить отдельные прикладные nonce для разрешений и подписанных поручений. Смарт-аккаунты ERC-4337 могут применять структурированный nonce UserOperation с параллельными каналами ключей и последовательностей. В Bitcoin Proof-of-Work nonce заголовка блока — ограниченное поле перебора кандидатов хеша.

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

Как это работает

  1. Перед чтением числа определите пространство имен: транзакция EOA, состояние контрактной учетной записи, хранилище приложения, UserOperation ERC-4337 или заголовок конкретной PoW-сети. Зафиксируйте chain ID, форк и версию протокола, учетную запись или владельца, проверяющий контракт и домен, EntryPoint либо формат заголовка.
  2. Читайте авторитетное состояние с явным тегом блока. Отличайте канонический nonce EOA от pending-счетчика провайдера, значения nonces(owner) в хранилище приложения, ключа и последовательности ERC-4337 и локального счетчика перебора заголовков майнера. Совпадение независимых RPC-ответов не заменяет проверку канонических квитанции и состояния.
  3. Формируйте полную цепочку подписания. Записывайте отправителя или владельца, сеть и домен, nonce, полезную нагрузку, срок действия, проверяющий контракт, хеш транзакции или сообщения и все замены. Для транзакций Ethereum правила домена сети, такие как EIP-155, дополняют nonce учетной записи; один nonce не дает полной защиты от межсетевого повторного воспроизведения.
  4. Выделяйте номер в правильном канале. Координируйте параллельных подписантов EOA, чтобы каждая каноническая последовательность назначалась один раз; сохраняйте пробелы и историю замен с тем же nonce. Для приложения или смарт-аккаунта следуйте атомарной проверке с увеличением и правилам каналов данного контракта, не предполагая единый глобальный счетчик.
  5. Отправляйте по надлежащим правилам допуска. Политики pending-транзакций и замен у execution-клиентов локальны; бандлеры ERC-4337 проверяют объекты UserOperation по правилам EntryPoint и аккаунта; подпись EIP-712 или permit может быть передана внутри чужой транзакции. Ни один локальный путь допуска не доказывает каноническое включение.
  6. Отслеживайте полный результат. Различайте отклоненную, ожидающую, поставленную в очередь, замененную, успешно включенную, включенную с status = 0, удаленную реорганизацией и финализированную транзакции. Включенная транзакция Ethereum увеличивает nonce отправителя даже при откате исполнения EVM; изменение прикладного nonce в хранилище внутри откатившегося вызова отменяется.
  7. Перед повтором сверяйте состояние. Проверьте каноническую квитанцию, хеш блока, nonce отправителя, хранилище приложения, событие или квитанцию ERC-4337 и финальность. Для PoW проверяйте весь заголовок и целевое значение, а не только nonce; исчерпав конечное поле nonce, майнеры меняют другие влияющие на заголовок данные и получают новое пространство поиска.

Разобранные примеры

  • Включенный откат исполнения расходует nonce EOA. Канонический nonce отправителя равен 12. Транзакция с nonce 12 включена с status = 0, использует 50,000 газа по 30 gwei и стоит 50,000 * 30 gwei = 0.0015 ETH. Изменения контракта отменяются, но канонический nonce отправителя становится 13. Если реорганизация удалит блок, nonce может вернуться к 12; кошелек должен заново проверить всю историю транзакции.
  • Прикладной nonce и nonce ретранслятора различаются. Nonce EOA владельца равен 18; токен ERC-2612 сообщает nonces(owner) = 7; nonce EOA ретранслятора равен 42. Успешный permit расходует прикладной nonce 7, меняя его на 8, а включение повышает nonce ретранслятора до 43 и оставляет nonce EOA владельца равным 18. Если весь вызов откатывается, nonce ретранслятора все равно становится 43, но хранилище токена возвращается к 7.
  • Каналы ERC-4337. В учебном выражении упаковки nonce = (key << 64) | sequence ключ 5 и последовательность 9 дают 5 * 2^64 + 9 = 92,233,720,368,547,758,089, а последовательность 10 дает 92,233,720,368,547,758,090. Независимые ключ 6 и последовательность 0 дают 110,680,464,442,257,309,696. Параллельная работа все равно зависит от логики проверки смарт-аккаунта и не связана с nonce EOA-транзакции бандлера.
  • Поисковый nonce PoW. Nonce заголовка Bitcoin имеет размер 32 bits, поэтому содержит 2^32 = 4,294,967,296 числовых кандидатов. При гипотетической скорости 100 TH/s перебор этого пространства занимает 4,294,967,296 / 100,000,000,000,000 = 0.00004294967296 seconds = 42.94967296 microseconds. Майнеры меняют extraNonce в coinbase-транзакции, время или набор транзакций, чтобы изменить корень Merkle и получить новые заголовки; это поле не является состоянием защиты учетной записи от повторного воспроизведения.

Риски

  • Смешение пространств nonce EOA, контракта, приложения, ERC-4337 и PoW.
  • Чтение nonce не той сети, ветви, контракта или EntryPoint.
  • Устаревший, противоречивый или вредоносный ответ RPC.
  • Назначение одного nonce транзакции EOA параллельными подписантами.
  • Блокировка более поздних локальных кандидатов из-за пропуска nonce.
  • Принятие pending-nonce провайдера за каноническое состояние.
  • Игнорирование расхода nonce EOA и газа при включенном откате.
  • Не восстановленная после реорганизации история nonce и кандидатов.
  • Несоответствие замены с тем же nonce политике комиссий целевого узла.
  • Предположение, что замена глобально удалила старую подписанную транзакцию.
  • Связывание равных числовых nonce разных отправителей или доменов.
  • Отсутствие chain ID или другого обязательного разделителя домена подписи.
  • Неатомарная проверка и инкремент прикладного nonce.
  • Неверные владелец, срок, разделитель домена или токен ERC-2612.
  • Повтор подписи приложения в другой сети, контракте или версии.
  • Толкование nonce состояния контрактной учетной записи как общего счетчика вызовов.
  • Неверная упаковка ключа nonce или разрядности последовательности ERC-4337.
  • Смешение nonce EOA бандлера с nonce UserOperation смарт-аккаунта.
  • Изменение поведения прикладного nonce из-за обновления прокси или конфликта хранилища.
  • Принятие конечного поискового nonce PoW за авторизацию, состояние защиты от повтора или самостоятельное доказательство.

Распространенные заблуждения

  • Все поля nonce имеют один смысл и глобально используются единожды.
  • Более высокий nonce делает транзакцию безопаснее, быстрее или финальнее.
  • Откатившаяся транзакция Ethereum не расходует nonce отправителя.
  • Один nonce предотвращает любой повтор между сетями, контрактами и типизированными сообщениями.
  • У каждого смарт-аккаунта ERC-4337 есть один линейный счетчик, идентичный nonce транзакции EOA.

Связанные темы

Источники

Навигация

Поиск по вики...