Что происходит с collateral при разных исходах
- Phase-1 rejection не запускает Plutus и не списывает collateral: нужно исправить тело и пересобрать его из свежего UTXO state.
- Phase-2 failure применяет collateral path: regular effects не исполняются, но их пересечение с collateralInputs всё равно может быть потрачено как collateral.
- CIP-40 позволяет явно задать totalCollateral и один collateralReturn output; расчёт проверяют по live protocol parameters той же сети и эпохи.
| Исход | Обычная часть transaction | Collateral path |
|---|---|---|
| Phase-1 reject | Не включена; Plutus не запущен | Collateral inputs не расходуются |
| Phase-2 success | Inputs/outputs/fee применяются | Collateral inputs остаются UTXO |
| Phase-2 failure, tx included invalid | Обычные эффекты inputs/outputs, mint/certs не применяются | Расходуются collateral inputs; совпавший normal outpoint потребляется здесь; возможен collateralReturn |
- Исход
- Phase-1 reject
- Обычная часть transaction
- Не включена; Plutus не запущен
- Collateral path
- Collateral inputs не расходуются
- Исход
- Phase-2 success
- Обычная часть transaction
- Inputs/outputs/fee применяются
- Collateral path
- Collateral inputs остаются UTXO
- Исход
- Phase-2 failure, tx included invalid
- Обычная часть transaction
- Обычные эффекты inputs/outputs, mint/certs не применяются
- Collateral path
- Расходуются collateral inputs; совпавший normal outpoint потребляется здесь; возможен collateralReturn
Смотрите подписанный transaction body, а не обещание dApp
Collateral inputs — отдельный набор ссылок на UTXO в body, но CIP-40 допускает тот же outpoint и среди normal inputs. Поэтому до подписи сравните пересечение двух наборов: при phase-2 failure обычный эффект такого input пропускается, однако сам outpoint расходуется через collateral path. totalCollateral — точная ADA-сумма, которую body объявляет собираемой, а collateralReturn — один output для оставшегося value. Перед подтверждением полезно понимать, что именно подписывает кошелёк, и записать каждый collateral outpoint, его полный value и return address.
CIP-40 задаёт баланс: суммарный value collateral inputs равен collateralReturn плюс consumed collateral. Если return содержит native assets или сложный value, output также должен удовлетворять minimum ADA и правилам текущей эпохи. Не переносите min-ADA из другого output: руководство про minimum ADA показывает, почему его считают для окончательно сериализованного return.
Live parameters важнее старого процента из инструкции
Required collateral выводится из fee и текущего collateralPercentage; maxCollateralInputs ограничивает число collateral UTXO. Оба значения получают для той же сети и актуального tip через node/provider protocol-parameters query. Публичная документация может приводить текущее на дату страницы число, но governance меняет параметры: для доказательства сохраните JSON snapshot и версию node/builder.
| Поле | Проверка | Stop |
|---|---|---|
| collateralInputs | Exact outpoints существуют; пересечение с normal inputs вычислено | Stale/spent input, неизвестный value или незамеченный общий outpoint |
| fee + collateralPercentage | Builder/node вычисляет minimum по live params | Процент взят из скриншота |
| totalCollateral | Явная consumed ADA покрывает protocol requirement | Поле отсутствует при обещанном частичном возврате |
| collateralReturn | Address, полный value и min-ADA валидны | UI показывает только ADA и скрывает assets |
| maxCollateralInputs | Число inputs не превышает live limit | Builder молча выбрал другой collateral set |
- Поле
- collateralInputs
- Проверка
- Exact outpoints существуют; пересечение с normal inputs вычислено
- Stop
- Stale/spent input, неизвестный value или незамеченный общий outpoint
- Поле
- fee + collateralPercentage
- Проверка
- Builder/node вычисляет minimum по live params
- Stop
- Процент взят из скриншота
- Поле
- totalCollateral
- Проверка
- Явная consumed ADA покрывает protocol requirement
- Stop
- Поле отсутствует при обещанном частичном возврате
- Поле
- collateralReturn
- Проверка
- Address, полный value и min-ADA валидны
- Stop
- UI показывает только ADA и скрывает assets
- Поле
- maxCollateralInputs
- Проверка
- Число inputs не превышает live limit
- Stop
- Builder молча выбрал другой collateral set
После отправки отделите reject от включённого invalid
Runbook проверки
- 1Заморозьте body
Сохраните CBOR/body hash, network ID, fee, normal inputs, collateralInputs, их пересечение, totalCollateral, collateralReturn и validity interval.
- 2Снимите parameters
Запишите slot/tip, collateralPercentage, maxCollateralInputs, min-UTXO параметры и node/provider version.
- 3Воспроизведите phase-1
Проверьте inputs, signatures, size, fee и body rules. Reject здесь означает rebuild, а не collateral loss.
- 4Оцените Plutus
Выполните script evaluation против exact spent/reference inputs и datum/redeemer; не меняйте body между оценкой и подписью.
- 5Найдите ledger outcome
После submission сохраните block/slot и признак valid/invalid, а не только tx hash из wallet.
- 6Сверьте UTXO effects
При invalid найдите расход каждого collateral outpoint и exact collateralReturn output. Ordinary-only inputs должны остаться, но outpoint из пересечения будет потрачен как collateral.
Проверку транзакции завершайте по ledger effects: при phase-2 failure посчитайте разницу между суммой collateral inputs и фактическим return value, сравните ADA-часть с totalCollateral и убедитесь, что обычные outputs не появились. Ordinary-only outpoints должны остаться, а каждый outpoint из пересечения normal/collateral — быть учтён как потраченный collateral. Затем учитывайте подтверждения и финальность выбранного блока; один pending/404 ответ провайдера не устанавливает окончательный исход.
Recovery и stop-сигналы
- не повторять submission, пока неизвестно, был ли первый body включён как invalid;
- при phase-1 reject обновить UTXO set и полностью пересобрать body, а не менять подписанные bytes;
- при phase-2 failure сохранить script evaluation, datum/redeemer и exact state для разработчика dApp;
- не считать collateralReturn возвратом всех assets, пока не декодирован полный output value;
- не считать normal input нетронутым, пока не проверено его пересечение с collateralInputs;
- не подписывать body с неизвестным return address или чрезмерным collateral set;
- не передавать seed/private keys службе поддержки: для диагностики достаточно публичных body/UTXO/ledger данных.
Источники
Мы используем прямые ссылки и фиксируем дату проверки. Полный текст чужих материалов не перепечатывается.
- CIP-40 — Collateral Output Cardano Foundation · Проверено 24 августа 2026 г. в 09:25 GMT+5
- Cardano Developer Portal — transaction fees and collateral Cardano Foundation · Проверено 24 августа 2026 г. в 09:25 GMT+5
- Cardano Developer Portal — transaction building Cardano Foundation · Проверено 24 августа 2026 г. в 09:25 GMT+5
- Intersect cardano-node — release 11.0.1 IntersectMBO · Проверено 24 августа 2026 г. в 09:25 GMT+5
