Стандартная транзакция Kaspa блокирует средства за публичным ключом: тот, кто владеет соответствующим приватным ключом, может потратить монеты. Эта модель подходит для базового кошелька — но она не способна выразить правило вроде «этот вывод должен подождать 24 часа» или «если я не подам сигнал в течение шести месяцев, отправь средства моему наследнику». До Toccata единственным способом обеспечить такую логику было отдать ключи кастодиальному сервису.
Ковенанты меняют это. Ковенант — это условие расходования, привязанное к UTXO, которое ограничивает не только *кто* может подписать транзакцию, но и *как* структурированы её выходы и *когда* разрешено расходование. В Kaspa обновление Toccata принесло эту возможность в основную сеть, обеспечив on-chain скрипты, которые реализуют конечные автоматы с несколькими путями — без посредников, без мультиподписного кастодиана, без необходимости доверять третьей стороне.
В этой статье мы разберём механику работы ковенантов Kaspa, а также покажем, как Kaspa Safe и Kaspa Escrow строят на их основе готовые продукты.
Какую проблему решают ковенанты
Рассмотрим типичную дилемму самостоятельного хранения. Вы держите KAS в стандартном кошельке. Если ваш горячий ключ скомпрометирован, злоумышленник получает мгновенный доступ — никакой задержки, второго фактора или окна для отмены. Можно использовать аппаратный кошелёк, но средства всё равно потрачиваемы одной транзакцией, как только ключ поставил подпись.
А теперь представьте другую конструкцию: средства лежат в on-chain скрипте, который говорит: «чтобы потратить эти монеты, ты сначала должен объявить о своём намерении, затем подождать N блоков, затем завершить вывод — а в период ожидания отдельный тревожный ключ может отменить транзакцию». Это и есть ковенант. Правила обеспечивает каждый узел Kaspa, валидирующий blockDAG, а не сервер, которому приходится доверять.
Тот же механизм обобщается. P2P-сделка может заблокировать средства покупателя и продавца в контракте, где для высвобождения нужна подпись покупателя, для возврата — подпись продавца, а спорный путь ведёт к арбитру — но арбитр может отправить средства только покупателю или продавцу, но не себе. Контракт обеспечивает инвариант на уровне консенсуса.
Ковенант — UTXO, скрипт которого ограничивает *структуру транзакции расходования* (выходы, суммы, адреса назначения), а не только авторизацию (подпись). В Kaspa ковенанты пишутся на Silverscript и компилируются в байткод, который узлы выполняют при валидации.
Анатомия ковенанта Kaspa
Язык скриптов: Silverscript
Ковенанты Kaspa пишутся на Silverscript (^0.1.0) — языке, созданном специально для скриптовой виртуальной машины Kaspa. Файл Silverscript (.sil) определяет три вещи:
1. Параметры — публичные ключи, значения задержек, адреса и флаги, задаваемые один раз при создании ковенанта. Для хранилища это: горячий ключ, тревожный ключ, длительность задержки, публичный ключ наследника и настройки наследования. 2. Состояние — компактная структура, хранимая внутри самого UTXO. Когда транзакция расходования удовлетворяет путь ковенанта, новый UTXO переносит обновлённое состояние дальше. 3. Точки входа (пути расходования) — каждый путь указывает, какие подписи требуются, какой переход состояния происходит и куда должны попасть выходы.
Компилятор выдаёт байткод, который узел Kaspa валидирует. Как только средства отправлены на адрес ковенанта, скрипт и его параметры становятся неизменяемыми.
Конечные автоматы on-chain
Ковенант — это конечный автомат, живущий внутри UTXO. Каждая транзакция расходования должна пройти три проверки:
- Авторизация — предоставляет ли транзакция требуемые подписи или выполняет безключевое условие (например, UTXO переждал тайм-аут)?
- Переход состояния — допустимо ли текущее состояние для этого пути? Нельзя
completeвывод, если хранилище всё ещё в режиме VAULT; сначала нужноinitiate. - Ограничения на выходы — соответствуют ли выходы транзакции тому, что требует путь? Путь
completeможет отправить средства только на адрес назначения, зафиксированный в состоянии приinitiate.
Если все три проверки пройдены, UTXO потребляется. Если путь это предусматривается, создаётся новый UTXO ковенанта с обновлённым состоянием. Так конечный автомат продвигается с каждой транзакцией.
Тайминг на основе DAA
Высокая частота блоков Kaspa (10 блоков в секунду) и её DAA (алгоритм корректировки сложности) обеспечивают надёжные, устойчивые к манипуляциям часы для тайм-аутов ковенантов. Задержки измеряются в приращениях DAA-счёта, а не в отметках настенных часов. Окно DAA охватывает 2641 блок, сглаживая локальные отклонения — ни один майнер не способен существенно ускорить тайм-аут, манипулируя временными метками блоков. Задержка в N единиц DAA соответствует предсказуемому реальному промежутку времени.
Вычислительный бюджет
Каждый путь ковенанта потребляет вычислительный бюджет — ограничение на объём вычислительной работы, которую может потребовать валидация одного UTXO. Это предотвращает атаки типа «отказ в обслуживании», когда патологический скрипт заставляет узлы вступать в дорогие циклы. Переходы хранилищ Kaspa Safe потребляют 20 вычислительных единиц; путь миграции с двойной подписью migrate — 30. Транзакции Kaspa Escrow используют 40 единиц. Эти ограничения обеспечиваются сетью.
Kaspa Safe: ковенант хранилища на практике
Kaspa Safe — это некастодиальное хранилище для держателей KAS, построенное целиком на ковенанте Toccata под названием vault.sil. Контракт реализует конечный автомат с семью путями:
| Путь | Подпись(и) | Переход состояния | Назначение |
|---|---|---|---|
initiate | горячий ключ | VAULT → UNVAULTING | Начать вывод; адрес назначения фиксируется в состоянии |
cancel | тревожный ключ | UNVAULTING → VAULT | Отмена в окне задержки (защита от кражи) |
complete | *нет (без ключа)* | UNVAULTING → dest | Исполнение вывода после истечения задержки |
checkin | горячий ключ | VAULT → VAULT | Сброс таймера наследования («я жив») |
inheritAuto | *нет (без ключа)* | VAULT → heir | Автоматическое наследование по тайм-ауту «мёртвая рука» |
inheritSigned | ключ наследника | VAULT → heir | Наследник заявляет права вручную |
migrate | горячий + тревожный | любой → любой | Полноценный выход владельца: ротация ключей, обновление хранилища или немедленный вывод |
Полезная нагрузка состояния — два поля: mode (0 = VAULT, 1 = UNVAULTING) и dest (36-байтовый скрипт-публичный ключ с префиксом версии — адрес назначения вывода). Вызов initiate записывает адрес назначения в состояние — его нельзя изменить до тех пор, пока вывод не будет завершён или отменён.
Ключевое свойство конструкции: безключевые пути (complete, inheritAuto) может транслировать *кто угодно* — включая сервер Kaspa Forge — поскольку средства могут уйти только туда, куда уже предписывает ковенант. Сервер может инициировать транзакции, но никогда не касается ключей и не контролирует адреса назначения. Если Kaspa Forge исчезнет полностью, open-source утилита vaultctl CLI и распечатанная карточка восстановления позволят взаимодействовать с хранилищем напрямую через любой узел Kaspa (v2+). Подробности — в разделе как работает хранилище.
Попробуйте Kaspa Safe — создайте хранилище с задержкой вывода и тревожным ключом менее чем за пять минут. Операции on-chain бесплатны навсегда; необязательные уведомления в Telegram стоят 100 KAS/год с 30-дневным бесплатным периодом. Создать хранилище →
В продакшене скрипт ковенанта компилируется на этапе сборки и встраивается как в клиентский WASM-модуль браузера, так и в серверный бинарник через Rust-макрос include_str!. Вся подпись происходит на стороне клиента — в браузере или в обёртке Tauri для Android; приватные ключи никогда не покидают устройство пользователя. Сервер — это тонкий RPC-мост к узлу Kaspa, который запускает 10-секундный цикл наблюдения для алертов и автоматических безключевых транзакций.
Kaspa Escrow: ковенанты для P2P-сделок
Kaspa Escrow использует отдельный ковенант escrow.sil для хранения средств в одноранговых транзакциях. Контракт реализует конечный автомат с десятью путями и двумя состояниями: ACTIVE (сделка в процессе) и DISPUTED (ожидает арбитража).
Кооперативные пути позволяют сторонам разрешить ситуацию без внешней помощи:
release— покупатель подписывает, средства идут продавцу.refund— продавец подписывает, средства идут покупателю.mutual— обе стороны подписывают, выходы гибкие (но выход с комиссией обязателен, чтобы обойти структуру комиссий было нельзя).
Спорные и арбитражные пути активируются, когда сотрудничество невозможно:
dispute— покупатель инициирует эскалацию, переводя UTXO в состояние DISPUTED и запуская дедлайн для арбитра.arbitrateToBuyer,arbitrateToSeller,arbitrateSplit— назначенный ключ арбитра разрешает спор.
Пути тайм-аутов (без ключа) решают сценарий «арбитр исчезает»: после дедлайна на основе DAA средства направляются заранее определённой стороне, выбранной при создании сделки — без подписи, без зависимости от сервиса.
Ключевой инвариант контракта: ни один путь расходования — даже арбитражные — не может отправить средства куда-либо, кроме {buyer, seller, feeSpk}. Арбитр решает, *как* разделить средства, но не имеет никаких полномочий перенаправить их в другое место. Это обеспечивается на уровне консенсуса каждым валидирующим узлом. В этом структурное отличие от кастодиальных эскроу-ботов в Telegram, где оператор физически владеет средствами.
Компромиссы и честные ограничения
Ковенанты в Kaspa мощные, но несут реальные ограничения:
- Потолок вычислительного бюджета. Сложная многоподписная логика ограничена. Добавление большего числа путей или более тяжёлой валидации рискует упираться в вычислительный лимит сети. Текущие конструкции укладываются в бюджет с запасом, но выразительность конечна.
- Зрелость Silverscript. Язык версии
^0.1.0— специализированный и работоспособный, но молодой. Инструментарий, документация и покрытие сторонними аудитами ещё развиваются. Контракт Kaspa Safe находится на версии v3; пересмотр v4 запланирован перед внешним аудитом.
- Ограничения на размер состояния. Каждый UTXO ковенанта несёт небольшую полезную нагрузку состояния (флаги режима, байты адреса назначения, публичные ключи). Сложные метаданные хранятся off-chain. Это сохраняет лёгкость валидации, но ограничивает то, что контракт может «запоминать».
- Статус аудита. На момент написания ни
vault.sil, ниescrow.silне проходили внешний аудит безопасности. Контракты имеют более 25 нативных тестов эквивалентности виртуальной машины и набор из 52 кейсов самотестирования (escrow), но «протестировано разработчиками» — это не то же самое, что «проверено независимо». Версия v4 Kaspa Safe предназначена для внешней проверки.
- Ограничения бета-продукта. Kaspa Escrow ограничивает размер сделок диапазоном 50–10 000 KAS в период беты, а вердикт ИИ-медиатора не является обязательным — он исполняется только если одна из сторон его подписывает или вмешивается живой арбитр. Это осознанные ограничительные меры.
- Отсутствие вычислений общего назначения. Ковенанты — это не тьюринг-полные смарт-контракты. Нет персистентного хранения между UTXO, нет повторного входа, нет межконтрактных вызовов. Каждый UTXO — изолированный конечный автомат. Это ограничивает выразительность, но устраняет целые классы эксплойтов, от которых страдают системы на основе аккаунтов.
Честное резюме: ковенанты в Kaspa дают вам программируемые, обеспечиваемые консенсусом правила расходования без передачи ключей кому бы то ни было. Компромисс в том, что логика должна укладываться в фиксированный вычислительный бюджет и выражать себя через небольшой конечный автомат на каждый UTXO. Для хранилищ, эскроу и наследования — сценариев, где важно «куда могут уйти деньги» больше, чем «что контракт может вычислить» — этот компромисс работает.
FAQ
Что такое ковенант в криптовалюте?
Ковенант — это условие расходования, привязанное к UTXO, которое ограничивает не только того, кто может его потратить, но и куда могут уйти средства, и когда. В отличие от простой проверки подписи, ковенант задаёт правила относительно выходов будущей транзакции.
Ковенанты Kaspa уже работают в основной сети?
Да. Обновление Toccata добавило поддержку ковенантов в основную сеть Kaspa. И Kaspa Safe, и Kaspa Escrow работают на реальных ковенантах Toccата прямо сейчас.
Может ли разработчик ковенанта украсть мои средства?
Нет. Ковенант — это скрипт on-chain, скомпилированный до отправки средств. Разработчик не может изменить его после развёртывания. Каждый путь расходования точно указывает, какие ключи (или безключевые условия) авторизуют перемещение и куда должны попасть средства.
Что произойдёт, если Kaspa Forge отключится?
Хранилища и эскроу-сделки — это контракты on-chain. Для Kaspa Safe вы можете восстановить средства с помощью распечатанной карточки восстановления и open-source утилиты vaultctl CLI через любой узел Kaspa v2+ — подключение к нашим серверам не требуется.
Чем ковенанты отличаются от смарт-контрактов Ethereum?
Ковенанты привязаны к отдельным UTXO (как скрипты Bitcoin), а не развёртываются как глобальные конечные автоматы с персистентным состоянием. У них нет повторного входа, нет межконтрактных вызовов и фиксированный вычислительный бюджет. Это ограничивает выразительность, но радикально сокращает поверхность атаки.
Каков вычислительный бюджет для транзакций с ковенантами?
Переходы хранилищ Kaspa Safe потребляют 20 вычислительных единиц; путь миграции с двойной подписью — 30. Транзакции Kaspa Escrow используют 40 единиц. Эти лимиты обеспечиваются сетью Kaspa при валидации.
Держите KAS там, где кражу можно отменить
Ковенант-сейф в мейннете Kaspa: ваши ключи, ваши правила, наш инструмент. Ончейн — бесплатно, навсегда.
Создать сейф
