Kaspa Safe требует горячий ключ и ключ тревоги для каждого хранилища. Kaspa Escrow — ключи покупателя, продавца и чата для каждой сделки. Деск-кошелёк имеет собственную пару ключей. Раздельное резервное копирование означает растущую гору экспортов — и один пропущенный бэкап приводит к заблокированным средствам.
Kaspa Forge сводит всё это к одному мастер-сиду. Каждый приватный ключ — для каждого хранилища, сделки и адреса, которые вы создадите сегодня или через годы — детерминированно выводится из этого единственного сида. Один раз сделайте бэкап .age-файла, и восстановление покроет прошлые, настоящие и будущие ключи.
В этом разборе мы объясним схему вывода, как зашифрованный профиль защищает сид и как механизм восстановления гэп-сканом находит ключи, созданные задолго после резервного копирования.
Проблема: ключи множатся, бэкапы — нет
При традиционном самостоятельном хранении каждый новый ключ — это новое обязательство по бэкапу. Пропустите один — и средства, заблокированные этим ключом, станут невосстановимы.
Только Kaspa Safe генерирует три типа ключей на хранилище: горячий ключ для инициирования выводов, ключ тревоги для экстренной отмены и ключ финансирования для получения депозитов. Создайте десять хранилищ — и это уже тридцать пар ключей, за которыми нужно следить. Эскроу-сделки добавляют ещё: ключи покупателя, продавца и чата для каждой сделки. Деск-кошелёк несёт свою пару ключей для траты агрегированных средств с производных адресов.
Наивный подход — экспортировать каждый ключ отдельно и хранить где-нибудь в надёжном месте. Сценарии отказа очевидны: флешка, забытая у друга; бэкап, сделанный перед третьим хранилищем, но не перед четвёртым; файл с ключами, погребённый в старом ноутбуке, который вам уже не принадлежит.
Криптографический метод, при котором каждый ключ выводится из одного мастер-сида через однонаправленную функцию. При одном и том же сиде и одном и том же пути всегда получается один и тот же ключ — никакой случайности, никакой неоднозначности. Сделайте бэкап сида один раз — и все произведённые им ключи неявно сохранены.
Альтернатива — сделать бэкап одной вещи, сида, и выводить всё остальное математически. Именно этот подход использует Kaspa Forge.
Как Kaspa Forge выводит ключи
В центре деск-профиля находится один 256-битный мастер-сид. Каждый приватный ключ, необходимый приложению, вычисляется из этого сида с помощью HMAC-SHA512 — стандартной хеш-функции с ключом, выдающей 64-байтный результат:
HMAC-SHA512(
key = master_seed,
msg = "kaspaforge/v1/vault/0"
)
Первые 32 байта результата становятся приватным ключом secp256k1. Оставшиеся 32 байта отбрасываются. Это вычисление живёт в derive.rs — модуле, скомпилированном как в WebAssembly (для браузера), так и в серверный бинарный файл на Rust.
Строка сообщения кодирует путь — комбинацию домена и индекса:
kaspaforge/v1/<domain>/<index>
- Домен определяет назначение:
vault— ключи Kaspa Safe,escrow— ключи сделок,wallet— расходный ключ деска. - Индекс — последовательный счётчик, начинающийся с нуля: хранилище 0, хранилище 1, хранилище 2 и так далее.
Разделение доменов гарантирует, что ключи одного инструмента никогда не совпадут с ключами другого. Ключ хранилища с индексом 3 и ключ эскроу с индексом 3 дают совершенно разные приватные ключи, потому что их пути различаются. Схема также поддерживает специализированные подпространства:
<domain>~token— для операций с токенами в рамках домена (например,kaspaforge/v1/vault~token/0).- Ключи чата Kasia — выводятся в отдельном домене с дополнительной проверкой чётного паритета. Протокол шифрования Kasia требует определённого бита паритета в публичном ключе; алгоритм вывода проверяет результат и корректирует при необходимости.
Ключевое свойство: вывод детерминирован. При одном и том же сиде и одном и том же пути всегда получается один и тот же ключ. После начальной генерации сида случайности нет. Это значит, что вам никогда не нужно экспортировать отдельные ключи — сид неявно содержит их все, включая ключи для хранилищ и сделок, которые ещё не созданы.
Для защиты от скрытого дрейфа схемы кодовая база содержит захардкоженные тесты с известными векторами: тройки (seed, path, expected_key), которые должны совпадать при каждой сборке. Если кто-то изменит логику вывода и забудет обновить векторы, набор тестов сразу упадёт.
Зашифрованный профиль и .age-бэкап
Мастер-сид хранится в деск-профиле — зашифрованном блоке данных в localStorage браузера. Профиль версии 3 содержит:
- HD мастер-сид (источник всех производных ключей)
- Кэшированные ключи каждого хранилища: горячий ключ, ключ тревоги (или флаг, указывающий, что ключ тревоги хранится на физической карте вне профиля), ключ финансирования, бюджет комиссий и пользовательская заметка
- Текущий и предыдущий адреса получения деск-кошелька
- Ключи эскроу-сделок
Кэшированные ключи — это копии для удобства: сид может воспроизвести их все. Весь профиль шифруется с помощью инструмента age, в частности с использованием шифрования на основе парольной фразы через функцию вывода ключей scrypt. Результат — ASCII-бронированный .age-файл, совместимый со стандартным CLI age:
age -d -o profile.json profile.age
# Enter passphrase → plaintext JSON with seed and keys
Шифрование и расшифровка происходят полностью в браузере через WebAssembly — модуль age_crypto.rs, скомпилированный в wasm32. Сервер никогда не видит парольную фразу, сид или профиль в открытом виде. Когда вы разблокируете деск, WASM-модуль расшифровывает профиль в память, выводит ключи, необходимые для подписи, и уничтожает всё после 15 минут неактивности.
Файл .age — ваш единственный переносной бэкап. Храните его на автономных носителях: флешка в сейфе, зашифрованный внешний диск, распечатанная копия бронированного текста. Если Kaspa Forge исчезнет завтра, страница recover.html с открытым исходным кодом и CLI vaultctl позволят восстановить всё из сида с помощью любого узла Kaspa v2+.
Восстановление: гэп-скан без доверия к серверу
Бэкап полезен только тогда, когда восстановление действительно работает — включая ключи, созданные *после* момента резервного копирования. Kaspa Forge реализует гэп-скан именно для этого:
1. Вы загружаете страницу восстановления и расшифровываете .age-профиль парольной фразой. 2. Браузер извлекает мастер-сид и начинает последовательно выводить адреса: kaspaforge/v1/vault/0, kaspaforge/v1/vault/1, kaspaforge/v1/vault/2 и так далее. 3. Для каждого выведенного публичного ключа браузер спрашивает сервер: *«Существует ли ончейн-UTXO для этого публичного ключа?»* 4. Сервер отвечает да или нет. Сопоставление идёт только по точной паре публичных ключей — сервер не выступает общим оракулом «какие ключи существуют». Браузер никогда не передаёт приватный ключ или сид.
Если скан находит совпадения на индексах с 0 по 2, но ничего на индексах с 3 по 9, он останавливается и показывает три обнаруженных хранилища. Параметры хранилищ — задержка, ключ тревоги, настройки наследования — считываются из ончейн-состояния ковенанта, поскольку контракт vault.sil кодирует свои правила непосредственно в скрипте UTXO. (Задержки хранилищ измеряются в очках DAA — блок-счётчике Kaspa с корректировкой сложности, описанном в вики Kaspa.)
Именно поэтому единственный бэкап, сделанный до создания пятого хранилища, работает и спустя месяцы: гэп-скан обходит дерево вывода и находит пятое хранилище по пути kaspaforge/v1/vault/4, где бы оно ни было создано.
Как каждый инструмент использует детерминированные ключи
Все три инструмента Kaspa Forge используют один мастер-сид через деск-профиль:
- Kaspa Safe: ключи хранилищ выводятся по пути
kaspaforge/v1/vault/<N>. Каждое новое хранилище увеличивает индекс. Горячий ключ, ключ тревоги и ключ финансирования — всё из одного дерева вывода. Адрес деск-кошелька — для траты агрегированных UTXO со всех производных адресов в одной P2PK-транзакции — выводится по путиkaspaforge/v1/wallet/0.
- Kaspa Escrow: ключи сделок выводятся по пути
kaspaforge/v1/escrow/<N>. Ключи покупателя, продавца и чата используют собственные подпути, изолируя ключи сделок от ключей хранилищ.
- Деск-кошелёк: расходный ключ и адреса получения используют домен
wallet, аwalletOldхранит предыдущий адрес во время ротации.
Поскольку всё исходит из одного сида, один .age-бэкап покрывает все три инструмента — включая хранилища и сделки, которые будут созданы в будущем.
Один бэкап — все будущие хранилища и сделки. Kaspa Safe и Kaspa Escrow выводят все ключи из одного деск-сида — один экспорт .age покрывает каждое хранилище и сделку, которые вы когда-либо создадите. Ончейн-операции бесплатны навсегда; ваши ключи никогда не покидают браузер. Создайте первое хранилище →
Компромиссы и честные ограничения
Сведение сложности резервного копирования к одному сиду имеет очевидные преимущества — и очевидные риски, которые стоит озвучить открыто.
Единая точка компрометации. Если кто-то получит ваш мастер-сид, он сможет вывести все ваши ключи: хранилища, эскроу-сделки, адреса кошелька. Это фундаментальный компромисс детерминированного вывода. Один сид — одна вещь для защиты, но и одна вещь для потери. Физическая безопасность .age-бэкапа и надёжность парольной фразы становятся критически важными.
Парольная фраза — настоящий замок. Файл .age использует шифрование на основе scrypt, которое намеренно замедляет перебор. Но слабая парольная фраза — короткое слово из словаря, дата рождения — подрывает защиту. Серверного восстановления нет: забудете парольную фразу — и бэкап станет бесполезным.
Гэп-скан требует кооперативный узел. Восстановление запрашивает узел Kaspa о существовании UTXO. Публичный узел Kaspa Forge на node.kaspaforge.org работает из коробки. Автономно вы можете направить CLI vaultctl с открытым исходным кодом на собственный узел (--node grpc://...). Но без какого-либо доступа к узлу скан останавливается — сид действителен, но вы не можете определить, какие индексы используются.
Текущие границы. Рабочий профиль Desk хранится зашифрованным в браузере. Forge Sync позволяет вручную зеркалировать дополнительную зашифрованную проекцию между подключёнными устройствами, но намеренно исключает независимые приватные ключи тревоги, наследника и арбитра; полная резервная копия для восстановления — .age key-файл. Пути вывода версионированы (v1), поэтому будущее изменение схемы потребует явной миграции. Тесты с известными векторами защищают от случайного дрейфа, но не гарантируют отсутствие тонких ошибок реализации.
Нет изолированной ротации ключей. Вы не можете заменить отдельный горячий ключ без создания нового хранилища или использования пути migrate (который требует подписей и горячего ключа, и ключа тревоги). Это сознательный компромисс ради простоты бэкапов — гибкость на уровне отдельных ключей обменяна на покрытие одним бэкапом.
Итог
Самостоятельное хранение — это задача резервного копирования. Kaspa Forge сводит её к одному сиду, одному .age-файлу, одной парольной фразе — и гэп-скану, который обнаружит всё остальное. Код вывода доступен для аудита в открытом репозитории, шифрование использует стандартный инструмент (age), а восстановление работает даже при недоступности сервиса (vaultctl + любой узел Kaspa v2+).
Сделайте бэкап один раз. Математика позаботится о будущем.
Продолжить изучение
модель ключей и зашифрованного профиля Desk
Следующий шаг: открыть зашифрованный Desk
FAQ
Что произойдёт, если я потеряю .age-бэкап?
Без зашифрованного .age-файла и парольной фразы к нему Kaspa Forge не сможет восстановить ваши ключи. Сид существует только в вашем зашифрованном профиле и его резервной копии — мы его никогда не видим. Храните бэкап на автономном носителе и запомните парольную фразу.
Работает ли бэкап, сделанный до создания нового хранилища?
Да. Все ключи детерминированно выводятся из одного мастер-сида. Восстановление из .age-файла и запуск гэп-скана заново обнаружат хранилища, созданные после момента резервного копирования.
Где хранятся мои приватные ключи?
В зашифрованном деск-профиле вашего браузера, защищённом парольной фразой. На сервер отправляются только публичные ключи и параметры — никогда сид или приватные ключи.
Какой алгоритм использует Kaspa Forge для вывода ключей?
HMAC-SHA512 с мастер-сидом в качестве ключа и структурированными путями сообщений, например kaspaforge/v1/vault/0. Первые 32 байта результата HMAC становятся приватным ключом secp256k1.
Может ли Kaspa Forge прочитать мой сид?
Нет. Шифрование и расшифровка происходят полностью в вашем браузере через WebAssembly. Сервер никогда не видит парольную фразу, сид или профиль в открытом виде.
Используют ли ключи эскроу-сделок тот же бэкап?
Да. Ключи эскроу, хранилищ и кошелька выводятся из одного мастер-сида по разным доменным путям. Один .age-бэкап покрывает все инструменты.
Держите KAS там, где кражу можно отменить
Ковенант-сейф в мейннете Kaspa: ваши ключи, ваши правила, наш инструмент. Ончейн — бесплатно, навсегда.
Создать сейф
