Модель комиссий Kaspa проще, чем у большинства PoW-цепочек: вместо начисления за вес транзакции или виртуальные байты, комиссия кошелька по умолчанию представляет собой фиксированную сумму на каждый потреблённый UTXO. Эта простота имеет последствия — некоторые желанные (предсказуемые затраты при объединении UTXO), некоторые менее очевидные (зачем ковенантным контрактам на блокчейне нужен параметр feeBudget и что происходит с транзакцией после её отправки).
В этой статье мы подробно разберём весь жизненный цикл: как рассчитываются комиссии, что мемпул делает с ожидающими транзакциями, как майнеры решают, что включать в блок, и как ковенантные скрипты защищают от атак с целью нанести ущерб через комиссии.
Формула комиссии: на UTXO, а не на байт
В Bitcoin комиссии зависят от *веса* сериализованной транзакции — больше входов, больше выходов и более сложные скрипты увеличивают вес, и вы платите за каждый виртуальный байт. В результате транзакция, расходующая 50 мелких UTXO, обходится значительно дороже, чем та, что тратит один крупный UTXO, даже если передаваемая стоимость идентична.
Kaspa использует другой подход. Задокументированная комиссия кошелька по умолчанию составляет 0,0001 KAS (100 000 sompi) на каждый UTXO, задействованный в транзакции. Если ваша транзакция потребляет 3 UTXO на входах, комиссия по умолчанию составит 0,0003 KAS. Количество выходов напрямую не увеличивает комиссию — только входы.
Sompi — наименьшая единица KAS. 1 KAS = 100 000 000 sompi. Комиссии и балансы в ковенантных скриптах указаны в sompi (например, 100 000 sompi = 0,0001 KAS).
Эта модель на UTXO имеет практическое преимущество для инструментов самостоятельного хранения: объединение 20 мелких UTXO в один адрес при сборе средств (sweep) обходится пропорционально, но вам не нужно рассчитывать сложную формулу веса. Стоимость линейно и предсказуемо.
Важная оговорка: цифра в 100 000 sompi — это настройка кошелька по умолчанию, а не гарантированный консенсусом минимум. Программное обеспечение кошелька решает, какую комиссию прикрепить. Транзакция с нулевой комиссией технически валидна на уровне консенсуса — майнер *мог бы* включить её в блок, и каждый другой узел принял бы этот блок.
Кошельки, узлы и антиспам-пол
Если любой может установить произвольно низкую комиссию, что препятствует спаму?
Ответ — это минимальная комиссия за ретрансляцию на уровне узла. Каждый узел Kaspa фильтрует транзакции ниже настраиваемого порога из своего мемпула и не ретранслирует их пирам. Это антиспам-политика, а не консенсус: порог можно изменить через флаг командной строки без риска раскола цепочки. Как отмечает вики Kaspa, скоординированное обновление сети может снизить или повысить его по мере необходимости — «будет достаточно, если большинство пользователей обновятся для работы».
Это различие важно:
- Ниже минимума ретрансляции: вашу транзакцию фильтруют узлы, она не распространяется и никогда не доходит до майнера.
- Выше минимума ретрансляции, но ниже того, что предпочитают майнеры: транзакция попадает в мемпулы, но при заполнении блока майнеры выберут транзакции с более высокой комиссией. Ваша транзакция может ожидать в мемпуле до появления свободного места.
- Включена в блок с любой комиссией: как только майнер помещает транзакцию в валидный блок, каждый узел принимает её независимо от размера комиссии.
Обсуждались академические идеи о введении минимальных комиссий, определяемых майнерами (где майнеры сигнализируют минимальную комиссию, которую они готовы принять), но такой системы ещё нет в основной сети Kaspa.
Мемпул: два срока жизни для ожидающих транзакций
Не все транзакции попадают в мемпул одинаково, и правила истечения срока различаются в зависимости от источника:
| Источник | Истекает через | Ретранслируется? |
|---|---|---|
| Ретрансляция от пиров (p2p) | 60 блоков без включения | Нет |
| Локальный кошелёк (RPC) | Никогда | Да — периодически до перезагрузки узла |
Чтобы вручную удалить транзакцию, отправленную локально, из мемпула, необходимо перезагрузить узел.
При текущей скорости создания блоков в Kaspa — 10 блоков в секунду — 60 блоков проходят примерно за 6 секунд. Это означает, что транзакции, ретранслированные от пиров, имеют очень короткое окно для включения в блок до удаления из удалённых мемпулов. Транзакции, отправленные через ваш собственный узел, сохраняются неограниченно — поэтому операторы сервисов используют собственную инфраструктуру узлов и отправляют транзакции напрямую через gRPC, а не полагаются на ретрансляцию от пиров. Мы уже рассказывали, почему мы запускаем свой собственный узел Kaspa, в предыдущей статье; описанное здесь поведение мемпула — одна из конкретных причин.
Как майнеры выбирают транзакции
Когда майнер строит блок, процесс прост: если в мемпуле больше транзакций, чем помещается в блок, майнер выбирает транзакции с самой высокой комиссией первыми. Минимальная комиссия ретрансляции определяет только то, попадёт ли транзакция в мемпул — она не гарантирует своевременное включение.
Поскольку Kaspa обрабатывает 10 блоков в секунду, эффективное пространство блока велико. При текущем объёме транзакций давление на комиссию низкое: большинство транзакций подтверждается в течение нескольких секунд независимо от размера комиссии. Сегодня комиссия в первую очередь выполняет роль антиспам-меры, а не конкурентного торга.
Сообщество Kaspa обсуждало модели рынка комиссий для сценариев, когда спрос превышает пропускную способность. Они остаются теоретическими — текущая система представляет собой единый стандарт на UTXO с минимумом ретрансляции на уровне узла.
Защита комиссий в ковенантах: зачем нужен feeBudget
Здесь ковенантный уровень Kaspa (представленный в основной сети с форком Toccata) пересекается с механикой комиссий неочевидным образом.
Некоторые пути расходования ковенанта бесключевые — они не требуют подписи и могут быть транслированы *кем угодно*. Примеры из двух основных контрактов Kaspa Forge:
completeв хранилище: после истечения задержки на вывод средств любой может транслировать транзакцию, которая релизирует средства на адрес назначения.autoReleaseв эскроу: после закрытия окна спора без самого спора любой может перевести средства продавцу.inheritAutoв хранилище: после истечения задержки наследования без подтверждения активности средства переходят наследнику.timeoutToBuyer/timeoutToSellerв эскроу: если дедлайн арбитра истекает, таймаут срабатывает без какой-либо подписи.
Эти бесключевые пути — функция, обеспечивающая разрешение контракта, даже если одна из сторон исчезает. Но они создают вектор атаки с целью нанести ущерб: поскольку *кто угодно* может транслировать транзакцию, атакующий (или ошибочный наблюдатель) может установить завышенную сетевую комиссию, в результате чего майнер извлечёт большую часть стоимости UTXO в виде комиссии, а легитимный получатель почти ничего не получит.
Решение — параметр feeBudget, заложенный в ковенантный скрипт:
int constant MAX_FEE_BUDGET = 10_000_000 // 0.1 KAS
require(feeBudget > 0 && feeBudget <= MAX_FEE_BUDGET)
// ... в каждом бесключевом пути:
require(tx.fee <= feeBudget)
Это ограничивает максимальную сетевую комиссию, которую может потратить любой бесключевой путь. В ковенанте хранилища (vault.sil) из 7 путей 6 обеспечивают эту проверку. Единственное исключение — migrate, который требует обеих ключей (основного и тревожного) — поскольку нужны обе подписи владельца, он напрямую контролирует комиссию, и лимит не нужен.
В ковенанте эскроу (escrow.sil) все 10 путей расходования обеспечивают бюджет комиссии. Лимит в 0,1 KAS (10 000 000 sompi) достаточно велик для любой обычной сетевой комиссии, но достаточно мал, чтобы предотвратить значительное извлечение стоимости через манипуляцию с комиссией.
Это связано с инвариантом одного входа: каждый путь ковенанта требует tx.inputs.length == 1, что означает, что каждая транзакция тратит ровно один UTXO хранилища или эскроу. Следовательно, feeBudget применяется к этому единственному UTXO — невозможно агрегировать несколько ковенантных UTXO и перенаправить излишек в виде комиссии.
Как Kaspa Forge обрабатывает комиссии в продакшене
Архитектура Kaspa Forge рассматривает сетевые комиссии как первостепенную задачу на каждом уровне:
Оценка комиссии. Бэкенд предоставляет эндпоинт GET fee-estimate, который проксирует текущие данные о сетевых комиссиях от узла. Клиент в браузере использует это для установки соответствующих комиссий при создании транзакций в мастере создания хранилища или сделок эскроу.
Привязка feeBudget. Когда пользователь создаёт хранилище или сделку эскроу, оффчейн-привязки (код между браузерным интерфейсом и WASM-ядром) ограничивают feeBudget безопасным диапазоном — в настоящее время от 1 000 000 до 10 000 000 sompi (от 0,01 до 0,1 KAS). Это предотвращает установку как пользователем, так и интерфейсом опасно высокого бюджета.
Бесключевые пути, транслируемые наблюдателем. Сервис наблюдателя Kaspa Safe отслеживает UTXO хранилищ и может транслировать бесключевые пути, такие как complete, inheritAuto и autoRelease, от имени владельца. Поскольку ковенант обеспечивает feeBudget, даже скомпрометированный или ошибочный наблюдатель не сможет опустошить хранилище через чрезмерные комиссии. Наблюдатель — это уровень удобства; контракт является границей доверия.
Сервисные комиссии vs. сетевые комиссии. В Kaspa Escrow комиссия за разрешение спора (0,5%, минимум 1,2 KAS) и комиссия за спор (2%, минимум 5 KAS) отделены от сетевых комиссий. Они реализованы как специальные записи выхода в ковенантной транзакции — скрипт требует определённого выхода, оплачивающего комиссионный адрес сервиса. feeBudget регулирует только сетевую комиссию (то, что получает майнер), а не сервисную.
Механизм feeBudget — одна из причин, почему хранилища и эскроу-контракты Kaspa Forge работают автономно. Каждый бесключевой путь расходования ограничен — наблюдатель может инициировать автоматический релиз или таймаут, но ковенант ограничивает сумму, которую майнер может получить. Если вы хотите увидеть, как ковенантное хранилище выглядит на практике, создайте его — операции в блокчейне бесплатны, а код контракта открыт. --- Модель комиссий на UTXO и система feeBudget работают, но они сопряжены с компромиссами, о которых стоит упомянуть: Простота модели комиссий vs. детализация. Фиксированная ставка на UTXO игнорирует размер данных транзакции. Сложная многовыходная транзакция стоит столько же, сколько простая транзакция «один UTXO — один выход» с тем же количеством входов. При текущих объёмах это неважно, но в будущем, когда пространство блоков станет дефицитным, модель на основе веса может быть более эффективной. Дизайн рынка комиссий Kaspa всё ещё развивается. Лимит 0,1 KAS статичен. MAX_FEE_BUDGET = 10 000 000 sompi был выбран как разумная верхняя граница для текущих уровней комиссий. Если KAS значительно вырастет в цене, 0,1 KAS может стать слишком большой площадкой для атак. Если сетевые комиссии вырастут во время перегрузки сети, лимит может оказаться слишком тесным для надёжной трансляции бесключевых путей. Его изменение требует новой версии ковенанта и миграции — именно для этого и предназначен путь migrate. Отсутствие встроенной оценки комиссий на уровне протокола. В отличие от некоторых сетей, предоставляющих RPC-метод для динамических процентилей комиссий, оценка комиссий в Kaspa зависит от реализации кошелька или сторонних сервисов. Kaspa Forge проксирует данные о комиссиях от своего собственного узла, но нет стандартного протокольного оценщика, который предоставляли бы все узлы. Лимиты комиссий в ковенантах не покрывают нековенантные транзакции. Система feeBudget защищает только конкретные ончейн-UTXO хранилищ и эскроу. Обычные транзакции кошелька — отправка KAS с одного адреса на другой — не имеют такой защиты. Программное обеспечение кошелька — единственная защита от случайного прикрепления огромной комиссии. Это стандартно для PoW-цепочек, но означает, что дисциплина самостоятельного хранения по-прежнему важна для средств, не находящихся в ковенантах. Понимание этих механик — ценообразования на UTXO, сроков жизни мемпула и защиты комиссий в ковенантах — помогает объяснить, почему некастодиальные инструменты в Kaspa построены именно так: каждый бесключевой путь ограничен, каждое действие наблюдателя ограничено, а браузер пользователя хранит ключи, которые переопределяют всё остальное.
FAQ
Как рассчитываются комиссии за транзакции в Kaspa?
По умолчанию кошельки Kaspa добавляют комиссию в размере 0,0001 KAS (100 000 sompi) на каждый UTXO, используемый в транзакции. Это решение на уровне кошелька, а не правило консенсуса — майнеры могут включать транзакции с нулевой комиссией, если пожелают.
Что произойдёт, если отправить транзакцию с очень низкой комиссией?
Узлы, скорее всего, отклонят её из своего мемпула (антиспам-минимум), но если майнер включит её в блок, другие узлы признают её валидной. Нет риска раскола цепочки из-за изменения минимальной комиссии — это политика узла, а не параметр консенсуса.
Как долго транзакция Kaspa остаётся в мемпуле?
Транзакции, переданные от пиров (p2p), истекают через 60 блоков, если не были включены — примерно 6 секунд при 10 блоках в секунду. Транзакции, отправленные через RPC вашего собственного узла, никогда не истекают и периодически ретранслируются до перезагрузки узла.
Что такое feeBudget в ковенантном хранилище Kaspa?
Это параметр в ончейн-скрипте, ограничивающий максимальную сетевую комиссию, которую бесключевой путь расходования может прикрепить к транзакции. Он предотвращает атаку с целью нанести ущерб, когда кто-то транслирует автоматический релиз или таймаут и устанавливает завышенную комиссию, сжигая средства хранилища.
Могут ли майнеры устанавливать собственную минимальную комиссию?
В настоящее время минимальная комиссия за ретрансляцию является настройкой узла по умолчанию. Обсуждались идеи о введении минимальных комиссий, определяемых майнерами, но такой механизм ещё не запущен в основной сети.
Являются ли сервисные комиссии и сетевые комиссии одним и тем же?
Нет. Сетевые комиссии (комиссия на UTXO) идут майнеру, который добыл блок. Сервисные комиссии — такие как комиссии за разрешение споров в Kaspa Escrow — это отдельные выходы в ковенантной транзакции, обеспеченные ончейн-скриптом и отправляемые на комиссионный адрес сервиса.
Держите KAS там, где кражу можно отменить
Ковенант-сейф в мейннете Kaspa: ваши ключи, ваши правила, наш инструмент. Ончейн — бесплатно, навсегда.
Создать сейф
