Kaspa Forge OfficeForge
Безопасность

Центр безопасности

Всё, от чего зависит, можно ли доверить Kaspa Forge деньги, — в одном месте: реальные хеши, ключи и цифры тестов и то, как каждую из них проверить самому. Kaspa Forge — некостодиальный сервис: средства лежат в открытых ончейн-ковенантах, и эта страница — попытка сделать это проверяемым, а не обещанием на словах. Последняя сверка: 11 июля 2026. Контакт по безопасности: kaspa@officeforge.co · security.txt.

Открытая бета · внешний аудит впереди. Оба ковенанта открыты и прошли наши ончейн- и adversarial-тесты, но независимого внешнего аудита у них пока нет. Относитесь к Kaspa Forge как к бета-софту: держите балансы сейфов и суммы сделок умеренными (рекомендуемый потолок сейфа 5 000 KAS; сделки — 50–10 000 KAS).

1. Модель доверия

Kaspa Forge не берёт ваши монеты в кастоди. Деньги лежат в ончейн-ковенанте Kaspa — скрипте, который исполняет консенсус Kaspa, а не наш сервер. Подписывающие ключи существуют только в вашем браузере или приложении, внутри зашифрованного ключевого файла, и нам не передаются. Что это даёт, в виде жёстких инвариантов:

  • Сервер не может украсть. Ни приватных ключей сейфа/эскроу, ни 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-сифон и не давая сжечь переход в сетевую комиссию.
  • Сервис — удобство, а не зависимость. Если наш сайт исчезнет, ваши средства — нет: контракты живут ончейн и управляются с вашего recovery-листа против любой ноды Kaspa — см. §10.

Полная архитектура и аннотированный список инвариантов — в документации; исходники контрактов ниже — источник истины.

2. Контракты и их хеши

Всем управляют два ковенанта на Silverscript. Оба целиком опубликованы в нашем открытом репозитории. SHA-256 ниже — от файла-исходника ковенанта в опубликованном виде: он позволяет убедиться, что код, который вы аудируете, — это код, который мы поставляем.

vault.sil — ковенант сейфа Kaspa Safe
версияv3 — наследование (auto / signed), путь migrate
пути траты7 — initiate · cancel · complete · checkin · inheritAuto · inheritSigned · migrate
sha-256a47cb298f60d688427585f9f7b443fddd3bef44c6ec87ebf35648897f7d0220b
escrow.sil — ковенант Kaspa Гарант (Escrow)
версияv1 — 10 фиксированных путей выплаты
пути траты10 — release · refund · mutual · dispute · autoRelease · arbitrate{ToBuyer,ToSeller,Split} · timeout{ToBuyer,ToSeller}
sha-25665d4b6bb3c516647b72a873dab1272445c498f8b17bfba19ec15519726dcb4a0
Почему нет одного «хеша задеплоенного контракта»? Скрипт-префикс ковенанта в цепочке — это исходник плюс ваши параметры (ваши pubkeys, задержка, наследник, бюджет комиссии, условия сделки), поэтому у каждого сейфа и каждой сделки свой script-hash — так и задумано. Стабильная, проверяемая вещь — исходник выше; конкретный script сейфа/сделки детерминированно выводится из него открытым тулингом, а ваш Деск показывает точный адрес, который вы пополнили. Как воспроизвести — в §3.

3. Проверьте контракт сами

Всё для проверки ковенантов открыто в github.com/pcdoctormsk-ctrl/kaspa-safe: оба .sil-исходника, CLI vaultctl / escrowctl, веб-фронт и Android-приложение с его сборочным workflow.

Сверьте хеш исходника с тем, что заявлено на этой странице:

# после клонирования репозитория
sha256sum contracts/vault.sil contracts/escrow.sil
# ожидается:
# a47cb298f60d688427585f9f7b443fddd3bef44c6ec87ebf35648897f7d0220b  contracts/vault.sil
# 65d4b6bb3c516647b72a873dab1272445c498f8b17bfba19ec15519726dcb4a0  contracts/escrow.sil

Прогоните ковенанты в настоящей VM Kaspa. CLI компилируют ковенант закреплённым компилятором Silverscript (rev d25bd34) и исполняют каждый путь траты — включая атаки (досрочное завершение, неверный ключ, неверный адрес, преждевременное наследование, migrate одним ключом, multi-input-сифон) — внутри реальной VM ноды Kaspa, с консенсусным лимитом compute-budget:

# нужны Rust (rustup.rs), protobuf-compiler, clang
cd vaultctl  && cargo run --release -- selftest   # сейф: 25 проверок
cd escrowctl && cargo run --release -- selftest   # эскроу: 52 проверки

Воспроизведите адрес своего сейфа. Для уже созданного сейфа vaultctl status --recovery <ваш recovery-лист> пересобирает ковенант из ваших параметров и печатает тот же адрес, который пополнил ваш Деск, — доказательство, что задеплоенный script и есть этот исходник, инстанциированный вашими ключами, без сервера в контуре.

4. Публичные ключи и адреса

Это единственные долгоживущие значения сервиса, зашиваемые в эскроу-сделки. Оба публичны по природе — x-only публичный ключ и адрес Kaspa. Никакого приватного ключа сервиса, которому нужно доверять, нет: ключ арбитра лишь позволяет арбитру выбрать среди покупатель/продавец/раздел, а fee-адрес только получает видимую комиссию сервиса.

pubkey арбитра (x-only)43eec216c3c93e4c0565eb53aae1e4674d567111661baf5eaa2df405316eaa2e
fee-адрес эскроуkaspa:qq3manh4l3yj69hc062wz5a86h6qjffx7nuh9ldkdjqr5kaxm4zy6sh2lksln

Когда вы создаёте или входите в сделку, ровно эти значения записываются в ковенант, который вы пополняете, — их можно сверить в своём ключевом файле и с ончейн-сделкой.

5. Тесты и статус аудита

Автоматические тест-наборы (прогон 11 июля 2026). Rust-ядро и сервер несут юнит- и property-тесты по логике ковенантов, вотчеру, кошельку/деривации и конечному автомату сделки:

крейт сервера119 passed · 0 failed · 1 ignored
wasm-крейт ядра29 passed · 0 failed
итого148 passed · 0 failed

Selftest контрактов в VM консенсуса. Поверх юнит-тестов ковенанты прогоняются путь-за-путём внутри реальной VM ноды Kaspa (как запустить самому — §3): сейф — 25 проверок, эскроу — 52 проверки — каждая с adversarial-кейсами, всё зелёное.

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

6. Воспроизводимые сборки и приложение

WASM-ядро сейфа/эскроу собирается из исходников скриптом wasm/build.sh (wasm-pack, release). Android-приложение собирает публичный workflow android-apk в GitHub Actions в том же репозитории, поэтому устанавливаемый бинарь прослеживается до открытого исходника и CI, а не залит руками.

Текущая Android-сборка. APK и его SHA-256 публикуются рядом со скачиванием; проверьте перед установкой:

версия0.1.1
apk sha-256086421854bedd54b1c123092f06ab309be2aea04efbbfff3590ff7a089bc413b
файл контрольной суммы/dl/KaspaSafe.apk.sha256
# проверка скачанного APK
sha256sum KaspaSafe.apk
# должно быть равно 086421854bedd54b1c123092f06ab309be2aea04efbbfff3590ff7a089bc413b

Подписанные релизные APK также публикуются в GitHub Releases. Веб-приложение работает целиком в браузере; его Content-Security-Policy запрещает любые сетевые соединения, кроме как к этому origin, поэтому ключ нельзя выкрасть даже через инъекцию скрипта.

7. Известные ограничения

Честность — часть истории про безопасность. Вот реальные края текущего дизайна:

  • Внешнего аудита ещё нет. Контракты не аудированы третьей стороной — см. §5.
  • Открытая бета, суммы ограничены. Рекомендуемый потолок сейфа 5 000 KAS; эскроу-сделки принудительно 50–10 000 KAS.
  • Эскроу требует активного покупателя. Спор нужно открыть внутри окна спора. Если окно прошло без спора, средства авто-релизятся продавцу — покупатель обязан успеть.
  • Потеряли ключевой файл — потеряли доступ. Аккаунтов и сброса пароля нет. Ваш зашифрованный ключевой файл — единственный вход, делайте резервную копию. Словарно-слабый пароль ослабляет шифрование файла.
  • Сервисный токен — это capability. Токен в ключевом файле авторизует управляющие API-вызовы для вашего сейфа/сделки; получивший его может звать эти эндпоинты (двигать средства вне фиксированных путей ковенанта он всё равно не может). Автоматически он не ротируется. Подробности — в политике приватности.
  • Алерты зависят от сервиса. Telegram/e-mail-алерты и удобные автопубликации вотчера прекращаются, если наш сервис недоступен. Ончейн-безопасность от них не зависит — но вы можете узнать позже. Хотите независимости — запустите свой вотчер из recovery-кита.
  • Контрагента оцениваете вы. В Гаранте и Маркетплейсе мы не сторона сделки и не проверяем товар, личность или платёжеспособность; арбитр судит только в треугольнике покупатель/продавец/комиссия.

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.

Платной программы bug bounty у нас нет, и выплат мы не обещаем. Это добросовестный канал ответственного раскрытия — просто просим сообщать приватно, и мы отреагируем.

10. Если что-то пошло не так

Поскольку контракты живут ончейн, вы можете действовать, даже если наш сайт недоступен:

  • Восстановление сейфа (офлайн): гайд по восстановлению сейфа и vaultctl управляют сейфом с вашего recovery-листа против любой ноды Kaspa — чекин, отмена кражи, завершение вывода, вступление в наследство или migrate наружу.
  • Восстановление сделки (офлайн): гайд по восстановлению эскроу покрывает застрявшую сделку — включая keyless-путь timeout, который выдаёт средства, если арбитр так и не вынес вердикт.
  • Подозрение на кражу горячего ключа сейфа: отмените текущий вывод тревожным ключом (он показан в Telegram-алерте и в панели сейфа), затем сделайте migrate в свежий сейф.
  • Нашли баг безопасности: не публикуйте его открыто — пишите на kaspa@officeforge.co (см. §9).

Связанное: Условия · Приватность сейфа · Приватность Гаранта и Маркета · Документация. Вопросы: kaspa@officeforge.co.