Kaspa Forge
Разбор

Каждый депозит в Kaspa Safe становится собственной On-Chain блокировкой

7 августа 2026 Автор — ИИ-команда OfficeForge · проверено командой 9 мин чтения
Депозиты в Kaspa Safe: Каждый UTXO становится собственным ковенант-локом

Когда вы вносите KAS в хранилище Kaspa Safe, средства не скапливаются в едином ончейн-балансе за одним замком. Каждый взнос создает свой собственный независимый ковенантный UTXO — самостоятельный экземпляр контракта в блокчейне Kaspa blockDAG с собственным таймером задержки, собственной проверкой тревожного ключа и собственным двухуровневым автоматом состояний. Пополните хранилище три раза — и у вас будет три отдельных лока, тикающих по своим часам.

Эта независимость каждого взноса является прямым следствием того, как UTXO-модель Kaspa взаимодействует с ковенантами Toccata. Это имеет реальные последствия для управления выводами, для работы офчейн-наблюдателя, отслеживающего ваше хранилище, и для того, как тревожный ключ защищает каждый взнос индивидуально. В этой статье мы разберем механику: почему каждый взнос автономен, как работают выводы из нескольких взносов, и что происходит с непредвиденными платежами, которые приходят на адрес вашего хранилища.

UTXO-модель: краткое напоминание

Kaspa, как и Bitcoin, использует модель непотраченных выходов транзакций (UTXO). Как описано в документации вики Kaspa по комиссиям за транзакции и DAA, каждая расходуемая единица KAS существует как дискретный выход, записанный в blockDAG. Когда вы отправляете KAS, ваш кошелек использует один или несколько UTXO на входах и создает новые UTXO на выходах. Ваш баланс — это сумма всех UTXO, которыми вы управляете; нигде в блокчейне нет единого поля «баланс аккаунта».

Определение

UTXO (Unspent Transaction Output — непотраченный выход транзакции): дискретная, расходуемая единица, записанная в реестре. Представьте ее как отдельную монету — вы не можете потратить половину UTXO; вы расходуете целиком и получаете сдачу в виде нового UTXO.

Эта монетоподобная гранулярность и делает ковенанты мощными. Ковенант привязывает правила расходования к конкретному UTXO. При создании UTXO правила фиксируются. При расходовании они обеспечиваются. Контракт живет и умирает вместе с этим одним выходом.

Как рождается адрес хранилища Kaspa Safe

Когда вы создаете хранилище через Desk, Kaspa Forge компилирует выбранные вами параметры — горячий ключ, тревожный ключ, задержку вывода, адрес наследника, задержку наследования, флаг авто-наследования, бюджет комиссии — в ковенантный скрипт Silverscript (vault.sil). Этот скрипт кодирует все семь путей расходования: initiate, cancel, complete, checkin, inheritAuto, inheritSigned и migrate.

Скомпилированный байткод хешируется для создания адреса P2SH (pay-to-script-hash). Этот адрес — публичный идентификатор вашего хранилища, который вы делитесь или показываете для взносов. Поскольку параметры встроены в хеш скрипта, каждое хранилище имеет уникальный адрес. Два хранилища с разными настройками задержки или разными тревожными ключами создадут разные адреса, даже на основе одного горячего ключа.

Ключевой момент: ковенант привязывается к UTXO, а не к адресу. Когда KAS поступает на адрес вашего хранилища, выход блокируется ковенантным скриптом. Рождается новый экземпляр контракта. Отправьте KAS на этот адрес три раза отдельно — и вы получите три отдельных ковенантных UTXO — сиблингов, а не единое целое.

Каждый взнос: собственный автомат состояний

Каждый ковенантный UTXO на адресе вашего хранилища поддерживает независимое состояние. Хранилище определяет два состояния — сохраняемых как поле mode внутри UTXO:

  • VAULT (mode 0): средства заблокированы. Только initiate, checkin, inheritAuto, inheritSigned и migrate могут потратить этот UTXO.
  • UNVAULTING (mode 1): вывод инициирован. Назначение (dest) фиксировано. Обратный отсчет задержки запущен. Только cancel, complete и migrate могут его потратить.

Когда вы вносите 1 000 KAS три раза, вы создаете три UTXO, каждый из которых начинает в состоянии VAULT. Если вы инициируете вывод по первому, только этот UTXO переходит в UNVAULTING. Остальные два остаются в VAULT, нетронутыми.

Эта независимость имеет практическое значение:

  • Независимые задержки. Задержка вывода измеряется в DAA-оценке — монотонно возрастающем счетчике, привязанном к окну корректировки сложности Kaspa. Таймер задержки каждого UTXO начинается с DAA-оценки блока, подтверждающего его транзакцию инициации. Инициируйте два взноса в разных блоках — и их обратные отсчеты завершатся в разное время.
  • Независимое покрытие тревожного ключа. Если злоумышленник скомпрометирует ваш горячий ключ и инициирует вывод по одному UTXO, вы можете отменить этот конкретный вывод тревожным ключом. Злоумышленнику потребуется отдельная транзакция на инициацию для каждого UTXO, который он хочет опустошить — а вы можете отменить каждую из них индивидуально в течение окна задержки.
  • Нет перекрестного загрязнения. Вывод по UTXO A не может перенаправить средства из UTXO B. Значение и назначение выхода проверяются относительно состояния конкретного UTXO. Эта изоляция обеспечивается инвариантом одного входа.

Инвариант одного входа: почему взносы не могут объединяться

Соблазнительным укорочением было бы потратить несколько UTXO хранилища в одной транзакции — объединив их в один вывод. Ковенант Kaspa Safe это предотвращает.

Каждый из семи путей расходования начинается с явной проверки: транзакция должна содержать ровно один вход. Это инвариант одного входа, выверенный для устранения конкретного вектора атаки. Если два UTXO с одинаковым ковенантным скриптом были бы потреблены в одной транзакции, ограничения на значение выхода оценивались бы относительно их объединенного баланса. Злоумышленник мог бы воспользоваться разницей — направив «излишек» от UTXO с меньшим балансом на комиссии или на вторичный выход, фактически высасывая средства.

Путем обеспечения одного входа на транзакцию ковенант гарантирует, что каждый UTXO оценивается изолированно. Выход должен удовлетворять правилам для конкретного баланса UTXO за вычетом разрешенного бюджета комиссии (feeBudget, настраивается в диапазоне 0.01–0.1 KAS, с жестким ончейн-ограничением 0.1 KAS через константу MAX_FEE_BUDGET).

Следствие механическое: вывод из десяти взносов требует десяти отдельных транзакций. Никаких пакетных укорочений, и это продуманный дизайн.

Мульти-депозитный вывод: инициация по каждому UTXO

Интерфейс управления хранилищем Kaspa Forge обрабатывает выводы из нескольких взносов через две операции, встроенные в ядро WASM:

  • withdrawOne(utxo, dest) — формирует транзакцию на инициацию для одного указанного UTXO. Транзакция переводит этот UTXO из VAULT в UNVAULTING, кодируя адрес назначения в поле dest. Используйте для вывода конкретной суммы, не затрагивая другие взносы.
  • withdrawAll(dest) — перебирает все ковенантные UTXO на адресе хранилища и создает N отдельных транзакций на инициацию, все направленные на одно назначение. Каждая является независимой ончейн-транзакцией с собственной комиссией.

После инициации в дело вступает офчейн-наблюдатель. Он опрашивает все UTXO на адресе хранилища, обнаруживает переходы состояния в UNVAULTING и, как только задержка в DAA-оценках истекает, транслирует транзакцию без ключа complete() для каждого UTXO. Поскольку complete() не требует подписи — ковенант проверяет только что age >= delay и что выход направлен в зафиксированное dest — транслировать ее может кто угодно. Наблюдатель делает это автоматически, но вы могли бы сделать это вручную через любой узел Kaspa, если сервис был недоступен.

В интерфейсе Desk вывод в процессе из нескольких взносов отображается как строка с разделенным балансом: одна часть показывается как «в хранилище» (взносы все еще в состоянии VAULT), другая как «покидает» (взносы, чей обратный отсчет запущен). Каждая строка отслеживается независимо, потому что каждый UTXO *и есть* независимость.

Механизм объединения (sweep): уборка непредвиденных взносов

Адрес вашего хранилища виден в блокчейне. Любой может отправить на него KAS — намеренно, случайно или через автоматический платеж. Эти внешние платежи поступают как UTXO, заблокированные ковенантом, потому что адрес И есть хеш ковенантного скрипта. Любой выход, отправленный на него, подчиняется правилам хранилища, независимо от намерений отправителя.

Kaspa Safe предоставляет для этого сценария функцию build_vault_sweep_tx. Она использует путь checkin — обычно механизм «пульса» для сброса таймера наследования — для консолидации непредвиденных взносов. Горячий ключ подписывает, UTXO расходуется через точку входа checkin, и новый ковенантный UTXO создается на адресе хранилища с обнуленным возрастом. Это вводит случайный взнос в нормальный жизненный цикл хранилища: отслеживается Desk, контролируется наблюдателем и подчиняется стандартному процессу вывода.

Без функции объединения непредвиденные взносы оставались бы ковенантными UTXO с неизвестным возрастом и без записи в Desk. Они остаются безопасными — правила хранилища все равно действуют — но владелец может не осознавать, что средства там есть, и таймер наследования будет тихо тикать.

Компромиссы: линейная стоимость, независимые области отказа

Модель UTXO-за-взнос имеет очевидную стоимость. Каждый вывод — это отдельная транзакция со своей сетевой комиссией. Вывод из десяти взносов означает десять транзакций на инициацию и десять транзакций complete — всего двадцать. Параметр бюджета комиссии (настраивается для каждого хранилища, ончейн ограничен 0.1 KAS) лимитирует максимальную комиссию за транзакцию, но количество растет линейно с числом взносов.

Для большинства пользователей, держащих несколько взносов, это незначительно на высокопроизводительном blockDAG Kaspa. Но это стоит учитывать до того, как вы пополните хранилище пятьюдесятью микровзносами, которые потом захотите консолидировать за один сеанс.

Выгода структурная. Независимые UTXO означают независимые области отказа. Ошибка, атака или некорректная транзакция, затрагивающая один взнос, не может каскадом перекинуться на другие. Тревожный ключ может отменять выводы по одному, не затрагивая остальные. И частичные выводы — доступ к части средств при сохранении остальных заблокированными — естественным образом вытекают из модели «UTXO-за-взнос». Вам не нужно разблокировать всё, чтобы получить доступ к части.

Хотите увидеть, как мульти-депозитные хранилища работают на практике? Создайте хранилище Kaspa Safe и попробуйте пополнить его больше одного раза — ончейн-операции бесплатны, и каждый взнос независимо проверяем на любом блок-эксплорере. Правила хранилища обеспечиваются исключительно блокчейном Kaspa blockDAG, а не нашими серверами.

Создать сейф

Что это значит для самостоятельного хранения

Модель мульти-UTXO — не деталь реализации, а прямое выражение встречи архитектуры UTXO Kaspa с ковенантами Toccata. На цепях с моделью аккаунтов смарт-контракт хранит единый баланс, и код контракта оперирует этим балансом. На Kaspa каждый взнос — это собственный экземпляр контракта с собственным жизненным циклом, и ковенантный скрипт — единственная власть.

Вот почему Kaspa Safe может обещать, что прекращение работы сервиса не угрожает деньгам. Каждый взнос в хранилище — это самостоятельный ковенантный UTXO в blockDAG. Семь путей расходования, таймеры задержки, проверки тревожного ключа и логика наследования — всё в ончейн-скрипте. Наблюдатель и Desk — удобства. Контракт — это гарантия.

FAQ

Что происходит, если я несколько раз вношу KAS в свой хранилище Kaspa Safe?

Каждый взнос создает независимый ковенантный UTXO — собственный экземпляр контракта с отдельным таймером задержки, проверкой тревожного ключа и состоянием. Взносы не объединяются в единый баланс.

Могу ли я вывести один взнос, не затрагивая остальные?

Да. Цикл «инициировать → завершить» выполняется для каждого UTXO отдельно. Только выбранный вами взнос переходит в состояние UNVAULTING; остальные остаются заблокированными в режиме VAULT.

Почему хранилище не может объединить все мои взносы в одну транзакцию?

Инвариант одного входа требует, чтобы каждый путь расходования использовал ровно один UTXO. Это предотвращает целый класс атак на высасывание средств из нескольких UTXO и принудительно реализует вывод каждого взноса по отдельности.

Что если кто-то случайно отправит простые KAS на адрес моего хранилища?

Средства поступят как UTXO, заблокированный ковенантом (адрес И есть хеш скрипта). Функция объединения (sweep) хранилища может консолидировать непредвиденные взносы через путь checkin с использованием вашего горячего ключа.

Вывод средств из нескольких взносов стоит дороже по комиссиям?

Каждый вывод — это отдельная ончейн-транзакция со своей комиссией (ограниченной параметром feeBudget, 0.01–0.1 KAS). Десять взносов означают десять транзакций на инициацию плюс десять на завершение — всего двадцать.

Как работает тревожный ключ для нескольких взносов?

Если злоумышленник инициирует вывод по одному UTXO, тревожный ключ отменяет именно этот вывод. Каждый UTXO требует собственной транзакции на отмену — но и каждая атака требует своей транзакции на инициацию.

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

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

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

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

Создать сейф