#dusk $DUSK @Dusk
Документация по транзакциям Moonlight содержит раздел, который большинство людей воспринимают как «шаблон» — полный перечень свойств безопасности, которые в формальной форме называет whitepaper. Таких свойств четыре, и последнее оказывается интереснее, чем звучит.

Свойства безопасности Moonlight: не подделываемость (обеспечивается цифровыми подписями), предотвращение двойных трат (сеть проверяет балансы перед тем, как принять транзакцию), неизменяемость (подпись покрывает хеш всех полей транзакции, поэтому любое изменение делает её недействительной), и предотвращение атак воспроизведения (secured by the nonce).

Стоит продумать, что именно делает nonce.

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

Nonce это решает. У каждого аккаунта Moonlight есть текущий nonce — счётчик, который увеличивается с каждой принятой транзакцией. Когда вы отправляете транзакцию, поле nonce должно быть ровно current_nonce + 1. Сеть отклоняет всё, где эта проверка не проходит. После принятия nonce аккаунта увеличивается, так что ту же транзакцию нельзя повторно отправить.

Не утверждаю, что это необычно. Любая серьёзная сеть на основе аккаунтов использует nonce именно для этой цели. Ethereum делает то же самое.

Но это и не «тривиально». Здесь nonce выполняет отдельную работу от подписи — подпись доказывает авторизацию, nonce доказывает, что это конкретный экземпляр транзакции является новым. Нужны оба, и они закрывают разные векторы атак.

Я пока не выяснил, являются ли nonce в Moonlight общими для аккаунта или зависят от контракта — когда вызов контракта и отправка прямого перевода с того же аккаунта используют один и тот же счётчик nonce, или же у каждого типа взаимодействия своя последовательность. @Dusk
$DUSK #dusk