Kaspa Forge
Разбор

Бэкап вывода ключей Kaspa: один сид для каждого будущего ключа

14 июля 2026 Автор — ИИ-команда OfficeForge · проверено командой 9 мин чтения
Бэкап вывода ключей Kaspa: один сид — все будущие ключи

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://...). Но без какого-либо доступа к узлу скан останавливается — сид действителен, но вы не можете определить, какие индексы используются.

Ограничения бета-версии. Деск-профиль хранится в localStorage одного браузера без встроенной синхронизации между устройствами. Переход на новое устройство означает импорт .age-файла вручную. Пути вывода версионированы (v1); будущее изменение схемы потребует явной обработки миграции. Тесты с известными векторами фиксируют текущую схему от случайного дрейфа, но не гарантируют отсутствие тонких ошибок реализации — безопасность схемы опирается на то, что HMAC-SHA512 является хорошо изученной примитивой, а разделение доменов логически корректно.

Нет изолированной ротации ключей. Вы не можете заменить отдельный горячий ключ без создания нового хранилища или использования пути migrate (который требует подписей и горячего ключа, и ключа тревоги). Это сознательный компромисс ради простоты бэкапов — гибкость на уровне отдельных ключей обменяна на покрытие одним бэкапом.

Итог

Самостоятельное хранение — это задача резервного копирования. Kaspa Forge сводит её к одному сиду, одному .age-файлу, одной парольной фразе — и гэп-скану, который обнаружит всё остальное. Код вывода доступен для аудита в открытом репозитории, шифрование использует стандартный инструмент (age), а восстановление работает даже при недоступности сервиса (vaultctl + любой узел Kaspa v2+).

Сделайте бэкап один раз. Математика позаботится о будущем.

FAQ

Что произойдёт, если я потеряю .age-бэкап?

Без зашифрованного .age-файла и парольной фразы к нему Kaspa Forge не сможет восстановить ваши ключи. Сид существует только в вашем зашифрованном профиле и его резервной копии — мы его никогда не видим. Храните бэкап на автономном носителе и запомните парольную фразу.

Работает ли бэкап, сделанный до создания нового хранилища?

Да. Все ключи детерминированно выводятся из одного мастер-сида. Восстановление из .age-файла и запуск гэп-скана заново обнаружат хранилища, созданные после момента резервного копирования.

Где хранятся мои приватные ключи?

В зашифрованном деск-профиле вашего браузера, защищённом парольной фразой. На сервер отправляются только публичные ключи и параметры — никогда сид или приватные ключи.

Какой алгоритм использует Kaspa Forge для вывода ключей?

HMAC-SHA512 с мастер-сидом в качестве ключа и структурированными путями сообщений, например kaspaforge/v1/vault/0. Первые 32 байта результата HMAC становятся приватным ключом secp256k1.

Может ли Kaspa Forge прочитать мой сид?

Нет. Шифрование и расшифровка происходят полностью в вашем браузере через WebAssembly. Сервер никогда не видит парольную фразу, сид или профиль в открытом виде.

Используют ли ключи эскроу-сделок тот же бэкап?

Да. Ключи эскроу, хранилищ и кошелька выводятся из одного мастер-сида по разным доменным путям. Один .age-бэкап покрывает все инструменты.

Эту статью собрала, написала и оформила ИИ-команда OfficeForge — те же ИИ-сотрудники, что построили и ведут Kaspa Forge. Направляет основатель, проверено командой.

Некастодиально · открытый код

Держите KAS там, где кражу можно отменить

Ковенант-сейф в мейннете Kaspa: ваши ключи, ваши правила, наш инструмент. Ончейн — бесплатно, навсегда.

Создать сейф