Kaspa Forge
Для Сейфа есть vaultctl; для Гаранта и Залога — публичный recovery-kit dealctl. Оба собираются из исходника и работают через Kaspa-ноду без API Kaspa Forge.
Пришёл алерт «начат вывод», а это не ты? Времени у тебя — всё окно отмены с момента старта (его длину ты выбирал при создании; таймер виден в «Мой сейф»). Подойдёт любой компьютер или чужой телефон: при раздельном хранении используй тревожную карточку, при общем — импортируй полную зашифрованную копию .age, экспортированную с устройства создания. Одного Forge Sync недостаточно: тревожные ключи он не переносит.
Твои сейфы, сделки и объявления живут в одном зашифрованном мастер key-file — твоём профиле Деска. С любого устройства открой свой Деск, выбери «Импорт / восстановить» и загрузи мастер key-file (.age) с его паролем — профиль вернётся разом. Рабочие ключи для созданного после раннего экспорта выводятся из мастер-seed, а публичные записи Деск находит на сервере. Тревожные ключи — исключение ниже: выбрав общее хранение для сейфа, сделай свежий полный экспорт с этого устройства.
Место хранения тревожного ключа зависит от выбора при создании каждого сейфа. В более безопасном раздельном режиме ключ живёт только на тревожной карточке, а Деск помечает сейф «alarm: карточка»; отмена кражи и migrate попросят ключ с неё. Если ты выбрал более удобное общее хранение, тревожный ключ находится внутри полной зашифрованной копии мастер key-file с устройства создания. Forge Sync сознательно исключает все тревожные ключи: на втором устройстве сейф появится, но отменить вывод будет невозможно, пока не импортируешь эту полную копию .age.
Нужно достать сырые ключи из файла — даже если этот сайт исчезнет? Скачай офлайн-дешифратор файла ключей (один HTML-файл, ~3 МБ): открой его с диска при выключенном интернете, загрузи .age-файл и его пароль — он покажет все приватные ключи, сохранённые внутри, без единого сетевого запроса. Тревожных ключей сейфов с раздельным хранением там нет: они существуют только на своих карточках. Файл — стандартный age, CLI тоже работает: age -d keyfile.age. Зеркало в открытом репозитории: github.com/Kaspaforge/kaspaforge.
Тебе оставили сейф Kaspa Safe. Владелец задал срок: пока он периодически отмечался («я жив»), сейф был только его. Если отметки прекратились — после срока сейф открывается тебе. Раньше срока не увидишь и не заберёшь ничего, так задуман контракт.
Сколько осталось до открытия — видно в панели (строка «Таймер») или командой vaultctl status. Наши разрешения не нужны: правила исполняет блокчейн. Сайт недоступен — то же самое делает vaultctl inherit (блок ниже).
Kaspa Safe не зависит от нас: сейф — ончейн-контракт, и он проверяет только твои ключи и время. Открытая утилита vaultctl делает всё то же, что сайт, из терминала против любой ноды Kaspa v2+ (запущенной с --utxoindex). Код опубликован: github.com/Kaspaforge/kaspaforge — сохрани себе копию (кнопка Code → Download ZIP), тогда не будешь зависеть даже от GitHub.
# один раз: собрать (нужны Rust с rustup.rs, protobuf-compiler, clang) git clone https://github.com/Kaspaforge/kaspaforge cd kaspaforge/vaultctl && cargo build --release # расшифруй офлайн через web/keyfile-decrypt.html или стандартный age: # расшифруй его один раз и вытащи нужный сейф — vaultctl понимает и JSON: age -d kaspa-office-profile.age > profile.json # спросит пароль Деска jq '.vaults[0]' profile.json > vault.json # выбери нужный сейф # состояние сейфа: баланс, возраст, таймер наследования vaultctl status --recovery vault.json # начать вывод на свой адрес (нужен горячий ключ из профиля) vaultctl initiate --recovery vault.json --to kaspa:q... # отменить идущий вывод (тревожный ключ; --dest = адрес, КУДА идёт вывод — # свой ты знаешь, вора покажет TG-алерт или панель) vaultctl cancel --recovery vault.json --dest kaspa:q... # доставить созревший вывод на назначение (ключ не нужен) vaultctl complete --recovery vault.json --dest kaspa:q... # чекин «я жив» · доставка наследства после срока vaultctl checkin --recovery vault.json vaultctl inherit --recovery vault.json # режим «авто»: без ключа vaultctl inherit --recovery vault.json --heir-sk КЛЮЧ # «ручной»: ключ наследника # migrate — ОБА ключа (горячий + тревожный) = мгновенная полная власть: перевезти # весь сейф куда угодно без задержки (ротация засветившегося ключа, апгрейд версии # контракта, уход). --dest спасает UTXO на полпути вывода (с unvault-адреса). vaultctl migrate --recovery vault.json --to kaspa:q... [--dest kaspa:q...]
Хранение тревожного ключа: если ты сохранил его в зашифрованном профиле, он будет в vault.json только тогда, когда profile.json получен из полной копии .age, содержащей ключ, — никогда не из Forge Sync. Для сейфа с раздельным хранением перед cancel или migrate допиши ключ с тревожной карточки полем "alarm_sk".
Полезные флаги: --node grpc://твоя-нода:16110 — любая нода Kaspa v2+ с --utxoindex (по умолчанию публичная нода OfficeForge grpc://node.kaspaforge.org:16110 — или подними свою); --dry-run — собрать и подписать транзакцию, показать txid, но НЕ отправлять (попробуй сначала так). Проверить сам контракт: vaultctl selftest — 25 проверок всех путей и атак в VM ноды.
Публичный recovery-kit/ содержит общее Rust-ядро транзакций, dealctl, escrow.sil, версионированные схемы, детерминированные векторы, гайды EN/RU, офлайн-дешифратор .age и манифест контрольных сумм. Hosted-сервера, чата/медиа, модерации, Telegram и operator/admin API внутри нет.
# проверь и собери опубликованный исходник git clone https://github.com/Kaspaforge/kaspaforge cd kaspaforge/recovery-kit sha256sum -c RECOVERY-SHA256SUMS cargo build --release --locked -p dealctl # ОФЛАЙН: расшифруй бэкап Деска, извлеки и проверь одну сделку age --decrypt -o profile.json your-backup.age ./target/release/dealctl extract --profile profile.json --deal ID --output deal.recovery.json ./target/release/dealctl verify --recovery deal.recovery.json # ОФЛАЙН: создай ПУБЛИЧНЫЙ watch-файл — приватных ключей в нём нет ./target/release/dealctl watch --recovery deal.recovery.json --output watch.json # ОНЛАЙН: запроси любую Kaspa-ноду v2+ с --utxoindex dealctl prepare --watch watch.json --node grpc://ТВОЯ_НОДА:16110 --output lines.json # ОФЛАЙН: подпиши разрешённый путь; пакет линий привязан к этой сделке dealctl escrow release --recovery deal.recovery.json --line lines.json --output release.tx.json # ОНЛАЙН: отправь готовую подпись; приватный ключ здесь не нужен dealctl submit --tx release.tx.json --node grpc://ТВОЯ_НОДА:16110
Приватная recovery-запись остаётся офлайн. На сетевую машину переходят только watch.json, lines.json и подписанная транзакция; приватных ключей в них нет. dealctl также поддерживает возврат, спор, взаимный расчёт, keyless auto-release/timeout и соответствующие команды Залога. Перед движением средств прочитай полный гайд.
Если кто-то просит прислать приватный ключ, seed-фразу, пароль от Деска, мастер key-file или тревожную карточку — это мошенник.
К карточке — особое отношение: вместе с key-file она даёт мгновенный полный контроль над сейфом (путь migrate). Никто настоящий никогда не попросит её «проверить» или «подтвердить».
Мастер key-file не даёт OfficeForge доступ к твоим монетам — он зашифрован твоим паролем и существует только для тебя, чтобы подписывать действия своими ключами. Мы не храним приватные ключи и твой пароль и не можем восстановить их за тебя. И никогда их не попросим — ни в чате, ни в письме, ни «для проверки». Поддержка (kaspa@officeforge.co) может объяснить шаги, но физически не имеет доступа ни к ключам, ни к монетам.