Nonce в блокчейне: что это такое, как работает и зачем нужен
В блокчейне транзакции и блоки образуют единую цепочку, в которой каждый отдельный элемент неразрывно связан с предыдущим. Чтобы это стало возможным, необходимо соблюдать строгий порядок при добавлении транзакций в сеть.
Именно с этой целью был создан параметр nonce в блокчейне, который используется для упорядочивания транзакций и блоков.
Что такое nonce в криптовалюте?
Nonce — это числовое значение, которое используется для определения порядка транзакций при их отправке в сеть либо для идентификации номера блока. В зависимости от реализации nonce может быть случайным, псевдослучайным или последовательно увеличиваться.
Термин "nonce" является сокращением от английской фразы "number used once", то есть представляет собой "число, использованное единожды".
Nonce в блокчейне является одним из ключевых элементов обеспечения безопасности децентрализованных сетей. Параметр nonce гарантирует, что каждая транзакция является уникальной и ее нельзя повторить.
Без использования nonce любая операция в блокчейне, будь то добавление блока или отправка транзакции, могла бы стать целью атаки и воспроизводиться повторно. Благодаря nonce в криптовалюте любые дубликаты оригинальных транзакций будут отклонены.
Виды
Различают несколько видов параметра nonce в криптовалюте в зависимости от того, как именно он используется.
Nonce транзакции
В пользовательских транзакциях параметр nonce выступает в роли счетчика, который присваивается каждому новому кошельку. За счет этой особенности уникальный порядковый номер транзакции также часто называют nonce аккаунта.
Кошельку с нулевой историей транзакций присваивается nonce с нулевым значением. С каждой совершенной транзакцией значение nonce будет увеличиваться на единицу. При этом двух подтвержденных транзакций с одинаковым значением nonce в одном кошельке быть не может.
Модель на основе nonce транзакции используют сети, работающие на механизме консенсуса Proof-of-Stake (PoS), такие как Ethereum, а также EVM-совместимые блокчейны, включая решения второго уровня (Layer-2), например:
Mining nonce в майнинге
Nonce также является ключевым компонентом блокчейнов, работающих на основе механизма консенсуса Proof-of-Work (PoW).
Как и транзакции, каждый блок имеет собственный неповторимый nonce в блокчейне. Майнеры изменяют значение nonce в заголовке блока, чтобы получать разные хеши* и подобрать тот, который соответствует установленному уровню сложности сети*.
* Хеш — уникальная последовательность символов фиксированной длины, которая создается из определенного набора данных с помощью специального алгоритма — хеш-функции. В блокчейне хеш используется для проверки целостности данных и связи блоков между собой. Если изменить даже небольшую часть исходных данных, полученный хеш также изменится.
* Сложность сети — показатель, определяющий, насколько трудно майнерам найти подходящий хеш для создания нового блока в блокчейне на основе механизма консенсуса Proof-of-Work. Чем выше сложность сети, тем больше вычислительных операций в среднем необходимо выполнить для нахождения подходящего значения. Сложность периодически корректируется сетью для поддержания предусмотренной протоколом скорости создания блоков.
Именно nonce наряду с другими ключевыми параметрами, такими как дерево транзакций* и таймстампы*, отвечает за то, чтобы у каждого блока был уникальный хеш.
* Дерево транзакций (дерево Меркла) — структура данных, которая позволяет объединить информацию обо всех транзакциях блока в одно итоговое значение — корень Меркла (Merkle root). Для этого хеши транзакций последовательно объединяются и хешируются. Такой механизм позволяет быстро проверить, входит ли определенная транзакция в блок, без необходимости обрабатывать все его транзакции.
* Таймстамп (временная метка) — значение, содержащее информацию о времени создания блока или совершения определенного события в блокчейне. Таймстампы помогают сети соблюдать временную последовательность блоков и используются в работе механизма консенсуса.
Поиск значения nonce в криптовалюте является одной из задач майнеров, при успешном решении которой они получают право на добавление нового блока и, соответственно, получение вознаграждения за него.
Помимо этого, mining nonce в блокчейне защищает от манипуляций и поддельных транзакций. Чтобы изменить историю транзакций, атакующему пришлось бы пересчитать хеши всех предыдущих блоков.
Это делает взлом блокчейна ресурсоемким и дорогостоящим и, кроме того, требует наличия преобладающей доли хешрейта* сети.
* Хешрейт — показатель вычислительной мощности оборудования, участвующего в майнинге криптовалют на основе Proof-of-Work. Он показывает, сколько попыток вычисления хеша оборудование или вся сеть способны выполнить за одну секунду. Чем выше общий хешрейт сети, тем больше вычислительных ресурсов требуется для получения значительной доли ее майнинговой мощности.
Но у nonce есть и обратная сторона. В блокчейнах на основе PoW подбор подходящего значения nonce требует больших вычислительных мощностей. При этом, чем больше майнеров присоединяется к сети, тем сильнее увеличивается сложность поиска nonce в блокчейне.
Signature nonce (уникальный порядковый номер при подписи)
При подписи транзакций параметр nonce в блокчейне используется в качестве одноразового кода — по аналогии с авторизацией в учетных записях.
После подтверждения транзакции nonce становится недействительным и больше не может использоваться повторно. Для следующей подписи создается новый nonce, что защищает транзакции от повторного использования злоумышленниками.
Request nonce (уникальный порядковый номер запросов)
В некоторых сетях, таких как Chainlink, параметр nonce используется в более сложных сценариях, включая межсетевое взаимодействие.
Сеть Chainlink работает на основе протокола межсетевой совместимости CCIP, в котором nonce используется для обеспечения уникальности запросов и является одним из элементов механизма их обработки.
Это защищает инфраструктуру от действий злоумышленников, нацеленных на нарушение работы децентрализованных приложений.
Для чего используется nonce в блокчейне?
Nonce транзакции защищает ее от перехвата и повторного использования.
Однако с пользовательской точки зрения nonce в криптовалюте позволяет не только защитить блокчейн от различных видов угроз, но и отменить или заменить транзакцию, отправленную с ошибкой.
Например, для отмены транзакции в блокчейне Ethereum необходимо отправить повторную с тем же значением nonce, которое можно указать в настройках кошелька, но с нулевой суммой.
Для замены транзакции необходимо при отправке указать новую сумму с тем же значением nonce.
Однако важно учесть два нюанса:
- Заменить или отменить транзакцию с тем же nonce можно только в том случае, если она еще не была подтверждена;
- У повторной транзакции должна быть установлена большая сумма комиссии, чем у первой — только так она сможет быть записана в блокчейн раньше предыдущей.
Помимо возможности отмены или замены транзакций, nonce определяет порядок их выполнения. Каждая новая транзакция с одного адреса получает следующее по порядку значение nonce.
Например, если с Ethereum-кошелька уже было отправлено пять транзакций с nonce от 0 до 4, следующая транзакция должна получить nonce 5.
Если вместо nonce 5 указать, например, nonce 10, такая транзакция не будет обработана сразу. Она останется в ожидании, пока не будут обработаны транзакции с пропущенными значениями nonce от 5 до 9.
Ошибки, связанные с nonce
Поскольку nonce определяет последовательность обработки транзакций, некорректное его значение может привести к тому, что операция будет отклонена сетью. Обычно такие ситуации сопровождаются соответствующим сообщением об ошибке в криптокошельке. Наиболее распространены следующие ошибки, связанные с параметром nonce:
- "Nonce too low" — значение nonce слишком мало, уже было использовано, и его нужно увеличить;
- "Nonce too high" — значение nonce слишком большое, и его нужно будет уменьшить, иначе придется дожидаться очереди.
Для уточнения значения nonce в блокчейне можно воспользоваться обозревателями блоков: Etherscan, Blockchain, BSCScan, Arbiscan или Polygonscan в зависимости от конкретной сети.
