Что где живёт
Ключи создаются и остаются здесь — в зашифрованном профиле под паролем или на отдельной тревожной карточке. Каждая транзакция подписывается локально; пароль и приватные ключи никуда не отправляются.
Видит только публичные параметры, подписанные транзакции и шифротекст: зашифрованные чаты, зашифрованные блобы синка, медиа объявлений. Ничто из хранимого здесь не может двигать средства.
Здесь лежат монеты и скрипты ковенантов. Задержки, пути выплат и таймауты обеспечивает консенсус Kaspa — а не этот сайт.
Что обеспечивает ковенант — и максимум, что можем мы
| продукт | ковенант обеспечивает | оператор может максимум |
|---|---|---|
| Сейф | вывод уходит только через ваше окно задержки на адрес, зафиксированный при старте; отдельный тревожный ключ его отменяет; один вход + кап комиссии на каждом пути | следить за сетью, отправить уже подписанное бесключевое завершение, слать оповещения |
| Эскроу | 10 фиксированных путей выплат — только покупателю, продавцу или видимому адресу комиссии; третьей стороне заплатить нельзя | как арбитр — выбрать покупатель / продавец / раздел внутри открытого спора |
| Залог | тот же эскроу-ковенант с залогодателем по умолчанию: нет претензии к дедлайну → автоматический возврат | те же пределы арбитра, и только пока открыта претензия |
| Маркет | кнопка «Купить» открывает тот же эскроу-ковенант — оплата не проходит через нас | убрать объявление из каталога; монеты профинансированной сделки неприкосновенны |
| Доски | каждый текстовый пост — подписанная транзакция Kaspa; чаевые платятся напрямую ключу поста | скрыть контент из нашего зеркала (tombstone) — ончейн-запись остаётся |
1. Модель доверия
Kaspa Forge не берёт ваши монеты в кастоди. Деньги лежат в ончейн-ковенанте Kaspa — скрипте, который исполняет консенсус Kaspa, а не наш сервер. Подписывающие ключи существуют только в вашем браузере или приложении: внутри зашифрованного профиля Деска либо, если для сейфа выбрано отдельное хранение тревожного ключа, на alarm-карточке. Нам они не передаются; граница клиентских ключей подробно описана от памяти браузера до подписи транзакции. Forge Sync загружает только E2E-зашифрованную безопасную проекцию и никогда не включает тревожные ключи сейфов — даже если ключ хранится в зашифрованном профиле. Что это даёт, в виде жёстких инвариантов:
- Сервер не может украсть. Ни приватных ключей сейфа/эскроу, ни seed на сервере нет. Keyless-пути ковенанта (у сейфа — complete и inheritAuto; у эскроу — autoRelease и timeout) жёстко биндят выход к фиксированному получателю, поэтому даже наш вотчер способен лишь толкнуть средства туда, куда уже говорит контракт.
- Арбитр не может украсть. У эскроу-ковенанта нет пути к третьему лицу — каждый из 10 путей платит только покупателю, продавцу или на фиксированный fee-адрес сервиса. Скомпрометированный или принуждённый арбитр не может выразить кражу валидной транзакцией; максимум — выбрать покупателя / продавца / раздел.
- Вор только с горячим ключом быстро ничего не получит. Вывод из сейфа уходит только через окно задержки (unvault) на фиксированный адрес, а отдельный тревожный ключ его отменяет. Хранение на отдельной карточке — более безопасный дефолт; хранение в зашифрованном профиле — осознанный обмен изоляции на удобство.
- Вотчер — сервис liveness, а не кастодиан. Он следит за цепочкой, публикует уже подписанные keyless-пути (авто-релиз, наследование, timeout) и шлёт алерты — ключа, способного перенаправить средства, у него нет.
- Ковенанты только P2PK и несоставляемы. Выходы биндятся к простым pay-to-pubkey-скриптам; ковенанты нельзя сцепить или обернуть в больший контракт, меняющий их правила.
- Single-input на каждом пути. Каждый вход обоих ковенантов утверждает tx.inputs.length == 1 и ончейн-cap бюджета комиссии (0,1 KAS), закрывая multi-UTXO-сифон и не давая сжечь переход в сетевую комиссию.
- Сервис — удобство, а не зависимость. Если наш сайт исчезнет, ваши средства — нет: контракты живут ончейн. Для сейфа есть офлайн-дешифратор и vaultctl; для Гаранта и Залога — публичный recovery-kit/dealctl. Оба контура работают через независимую ноду Kaspa — см. §10.
Полная архитектура и аннотированный список инвариантов — в документации; исходники контрактов ниже — источник истины.
2. Контракты и их хеши
Всем управляют два ковенанта на Silverscript. Оба целиком опубликованы в нашем открытом репозитории. SHA-256 ниже — от файла-исходника ковенанта в опубликованном виде: он позволяет убедиться, что код, который вы аудируете, — это код, который мы поставляем.
3. Проверьте контракт сами
Всё для независимой проверки и восстановления стороны открыто в github.com/Kaspaforge/kaspaforge: оба .sil-исходника, vaultctl для Сейфа и hosted-free recovery-kit с общим Rust-ядром и dealctl для Гаранта и Залога. Операторский escrowctl не выдаётся за публичный recovery-инструмент.
Сверьте хеш исходника с тем, что заявлено на этой странице:
# после клонирования репозитория sha256sum contracts/vault.sil contracts/escrow.sil # ожидается: # a47cb298f60d688427585f9f7b443fddd3bef44c6ec87ebf35648897f7d0220b contracts/vault.sil # 65d4b6bb3c516647b72a873dab1272445c498f8b17bfba19ec15519726dcb4a0 contracts/escrow.sil
Запустите публичные проверочные наборы. Тулинг закрепляет Silverscript на rev 26e3b9f. Selftest Сейфа и ядро Deal Recovery исполняют валидные и атакующие пути в VM Kaspa; recovery-векторы дополнительно доказывают, что браузер/WASM, core и CLI выводят одинаковые адреса и байты транзакций:
# нужны Rust (rustup.rs), protobuf-compiler, clang cd vaultctl && cargo run --release -- selftest # Сейф: 25 проверок cd ../recovery-kit cargo test --locked -p kaspa-forge-contracts # 33: unit + VM + parity cargo test --locked -p dealctl # 33; simnet E2E включается отдельно
Воспроизведите адрес своего сейфа. Офлайн расшифруйте полный .age-профиль, извлеките запись сейфа как vault.json, затем выполните vaultctl status --recovery vault.json. Команда пересоберёт ковенант и напечатает тот же адрес, который пополнил ваш Деск, — доказательство, что задеплоенный script и есть этот исходник, инстанциированный вашими параметрами, без сервера в контуре.
Проверьте и восстановите свою сделку, не отдавая ключ онлайн-машине. Офлайн-команда dealctl watch создаёт публичный watch-файл; онлайн prepare --watch получает UTXO ковенанта; офлайн-подпись привязывает пакет к recovery-записи; онлайн submit отправляет уже подписанную транзакцию. Точный четырёхшаговый поток и сверка checksum — в Recovery hub.
4. Публичные ключи и адреса
Это единственные долгоживущие значения сервиса, зашиваемые в эскроу-сделки. Оба публичны по природе — x-only публичный ключ и адрес Kaspa. Никакого приватного ключа сервиса, которому нужно доверять, нет: ключ арбитра лишь позволяет арбитру выбрать среди покупатель/продавец/раздел, а fee-адрес только получает видимую комиссию сервиса.
Когда вы создаёте или входите в сделку, ровно эти значения записываются в ковенант, который вы пополняете, — их можно сверить в своём ключевом файле и с ончейн-сделкой.
5. Тесты
Автоматические тест-наборы (измерено 23 июля 2026). Это свежие locked/all-target прогоны. Hosted/runtime-наборы и независимо публикуемые recovery-наборы показаны отдельно, чтобы публичное доказательство не пряталось в одной общей цифре:
Консенсусные и recovery-доказательства. У Сейфа 25 публичных VM self-checks. В 33 теста публичного Deal Recovery core входят 9 тестов VM Kaspa и 2 детерминированных parity-вектора. В релизном ревью также прошёл opt-in hosted-independent simnet E2E по цепочке extract → verify → watch → prepare → offline sign → submit с точными дельтами ончейн-балансов.
6. Воспроизводимые сборки и приложение
WASM-ядро сейфа/эскроу собирается из исходников скриптом wasm/build.sh (wasm-pack, release). У Deal Recovery Kit один locked Cargo workspace, fail-closed allowlist, leak-scan всего дерева и RECOVERY-SHA256SUMS; он собирается из корня репозитория командой cargo build --release --locked -p dealctl. Hosted-сервер, чат/медиа, модерация, Telegram и operator/admin-поверхности в пакет не входят.
Веб-приложение работает в браузере. Content-Security-Policy ограничивает источники скриптов и сетевые назначения и уменьшает последствия инъекции, но не заменяет проверку клиентского кода и независимо проверенный recovery-kit.
7. Известные ограничения
Честность — часть истории про безопасность. Вот реальные края текущего дизайна:
- Ковенанты не проходили аудит. Контракты открыты, но внешнего аудита ещё не было. Эскроу-сделки принудительно от 50 KAS.
- Доставка hosted-веба остаётся поверхностью доверия. Используя живой сайт, вы доверяете этому origin доставку опубликованных клиентских байтов. CSP — эшелон защиты, а не доказательство против скомпрометированного first-party релиза. Храните проверенный recovery-kit и сверяйте его checksum перед аварийной операцией.
- Эскроу требует активного покупателя. Спор нужно открыть внутри окна спора. Если окно прошло без спора, средства авто-релизятся продавцу — покупатель обязан успеть.
- Потеряли материалы восстановления — потеряли доступ. Аккаунтов и сброса пароля нет. Храните отдельно полный зашифрованный экспорт .age и пароль к нему; для сейфа с отдельным хранением тревожного ключа сохраните также alarm-карточку. Forge Sync не заменяет резервную копию: он не может инициализировать пустое устройство и никогда не переносит alarm_sk.
- Сервисный токен — это capability. Токен в ключевом файле авторизует управляющие API-вызовы для вашего сейфа/сделки; получивший его может звать эти эндпоинты (двигать средства вне фиксированных путей ковенанта он всё равно не может). Автоматически он не ротируется. Подробности — в политике приватности.
- Для алертов нужны и доступ, и канал доставки. Первые 30 дней — бесплатный пробный период, затем мониторинг стоит 100 KAS в год. Сам пробный период или оплата ничего не доставляют: подключите Telegram либо e-mail владельца именно для этого сейфа. Без канала алерт не придёт. Алерты также прекращаются, если сервис недоступен; ончейн-безопасность от них не зависит.
- Контрагента оцениваете вы. В Гаранте и Маркетплейсе мы не сторона сделки и не проверяем товар, личность или платёжеспособность; арбитр судит только в треугольнике покупатель/продавец/комиссия.
8. История изменений контрактов
Каждое изменение исходников ковенантов, новое сверху (из git-истории репозитория):
| дата | файл | изменение |
|---|---|---|
| 2026-07-10 | сейф | добавлен путь migrate (обе подписи = мгновенная полная власть: апгрейд / ротация ключа / выход) |
| 2026-07-10 | оба | ончейн-griefing-cap: feeBudget ≤ MAX во всех путях (аудит 11.07) |
| 2026-07-10 | оба | бюджет комиссии стал конструктор-параметром + два require() из аудита |
| 2026-07-10 | оба | инвариант single-input во всех путях (multi-UTXO анти-сифон) |
| 2026-07-07 | сейф | заголовок актуализирован до v3 (наследование auto/signed) |
| 2026-07-05 | эскроу | escrow.sil v1 — 10 путей (release/refund/mutual/dispute/autoRelease/arbitrate×3/timeout×2) |
| 2026-07-04 | сейф | v3 наследование (auto/signed, выбор при создании) |
| 2026-07-04 | сейф | первый ончейн-сейф (genesis-ковенант принят консенсусом) |
Авторитетный полный лог — git-история contracts/vault.sil и contracts/escrow.sil в открытом репозитории.
9. Ответственное раскрытие
Нашли уязвимость? Пожалуйста, сообщите приватно и дайте нам шанс её починить, прежде чем она станет публичной.
- Напишите на kaspa@officeforge.co с деталями, достаточными для воспроизведения (proof-of-concept, затронутый компонент, влияние).
- Не публикуйте её открыто и не эксплуатируйте против средств реальных пользователей, пока мы работаем над фиксом.
- Стараемся подтверждать получение быстро и держать вас в курсе фикса и сроков. Репортёров, которые этого хотят, укажем в благодарностях.
Машиночитаемый контакт по RFC 9116: /.well-known/security.txt.
10. Если что-то пошло не так
Поскольку контракты живут ончейн, вы можете действовать, даже если наш сайт недоступен:
- Восстановление сейфа (офлайн): локально расшифруйте полный .age-профиль, извлеките vault.json и следуйте гайду по восстановлению сейфа. vaultctl может сделать чекин, отменить кражу, завершить вывод, вступить в наследство или выполнить migrate против любой ноды Kaspa.
- Восстановление Гаранта или Залога: сверьте checksum опубликованного recovery-kit, офлайн извлеките и проверьте сделку, создайте публичный watch-файл без ключа, подготовьте транзакцию онлайн, подпишите офлайн и отправьте онлайн. Следуйте четырёхшаговому гайду dealctl; приватный ключ не должен касаться сетевой машины.
- Подозрение на кражу горячего ключа сейфа: тревожным ключом с alarm-карточки или из полного локального профиля отмените текущий вывод, затем сделайте migrate в свежий сейф. На синхронизированном втором устройстве этого ключа нет, пока вы не импортировали туда полный экспорт с устройства создания.
- Нашли баг безопасности: не публикуйте его открыто — пишите на kaspa@officeforge.co (см. §9).
Связанное: Условия · Приватность сейфа · Приватность Гаранта и Маркета · Документация. Вопросы: kaspa@officeforge.co.