Когда вы нажимаете «Отправить», кошелёк не просто отправляет запрос в сеть. Он подписывает точный набор данных операции: адрес получателя, сумму, комиссию, тип действия и другие параметры. Подпись работает так, что любое изменение в подписанных данных делает её невалидной. Именно поэтому перед нажатием последней кнопки стоит ещё раз всё перепроверить — даже если вы доверяете приложению.
Процесс состоит из четырёх этапов. Сначала приложение отправляет параметры операции (сумма, комиссия, получатель, публичный ключ) на узел сети. Узел возвращает неподписанные байты транзакции — это заготовка, которую ещё нельзя отправлять от имени владельца аккаунта. Затем эта заготовка передаётся в кошелёк, кошелёк показывает реквизиты, получает ваше подтверждение, создаёт подпись и возвращает подписанные байты. На финальном этапе подписанная транзакция отправляется узлу для broadcast в сеть.
Перед подписью важно проверить: полный адрес получателя (начинающийся на S-..., не только имя), сумму с правильным десятичным разделителем, комиссию (она списывается дополнительно к сумме), тип операции (перевод, заявка на бирже, вызов контракта — имеют разные последствия), сообщение и другие параметры. Официальные тесты криптографической библиотеки показывают: если хотя бы один бит в подписанных данных изменится, проверка подписи провалится. Значит, подпись относится именно к содержимому конкретной транзакции, не более того.
Сайт или dApp получает от вас только публичный ключ — этого достаточно, чтобы сформировать транзакцию и проверить подпись, но недостаточно, чтобы создать подпись вместо вас. Recovery phrase (seed-фраза) никогда не должна отправляться на сайт при обычном подтверждении в кошельке. Из неё выводится приватный ключ подписи, и это главный секрет аккаунта. Вводите recovery phrase только в доверенный кошелёк при осознанном восстановлении и никогда не передавайте её никому.
Библиотека SignumJS добавляет несколько уровней проверок: перед подписью сверяет поля неподписанной транзакции с исходными параметрами запроса, а после подписи генерирует подпись заново и проверяет её по публичному ключу; при ошибке отправка не происходит. Но эти автоматические проверки не заменяют вашу проверку на экране — если вы сами согласились с неверным получателем или суммой, корректная подпись не распознает это как ошибку.
Успешная подпись означает только, что данные соответствуют ключу. Дальше узел принимает транзакцию в очередь, а подтверждённой она становится только после включения в блок. Поэтому после отправки сохраните transaction ID и отдельно проверьте результат в блокчейне. Чек-лист: кошелёк из проверенного источника, тип операции совпадает с вашим действием, полный адрес и сумма сверены, параметры ожидаемы, сайт не получает recovery phrase, transaction ID сохранён, включение в блок проверено.