抵押品被部分消耗、多余 ADA 沿指定地址退回,这套机制如今是 Cardano 账本的既成事实:CIP-40「Collateral Output」的验收清单明确写着它已随 Vasil 协议升级在 Cardano 上完整实现。这份 2022 年 2 月提交、状态 Active 的账本类提案由 DCSpark 的 Sebastien Guillemot 与 IOHK 的两位工程师起草。要理解它解决了什么,得先看它之前的抵押品有多不友好。
从 Alonzo 的七条规矩说起
Plutus 合约采用两阶段验证:第一阶段做确定性的资源与脚本检查,第二阶段才真正执行脚本。自 Alonzo 升级起,调用 Plutus 合约的交易必须挂抵押品,以防执行失败时费用无法覆盖。提案原文列出的规则是:抵押品输入只能是纯 ADA、不能来自脚本地址、必须是 UTxO、总额要达到交易费的一定比例(比例由协议参数 collateralPercent 定,输入个数上限是 maxColInputs);同一个 UTxO 可以同时用作普通输入和抵押品;关键的一条是——一旦第二阶段验证失败,这些抵押品输入被全额消耗,没有任何找零。

两个痛点:凑不出纯 ADA、硬件钱包不敢签
规则里「抵押品输入不能含任何代币」最伤用户体验:日常手里的 UTxO 大多夹着代币,钱包只好替用户专门囤一个纯 ADA 的「抵押 UTxO」,既占额度又难解释。更棘手的是硬件钱包这一头,提案在 Rationale 里点得很透:硬件钱包看不到抵押品输入的内容,没法自行核一核抵押挂得对不对——就像交易正文里要显式写出手续费一样,交易体也需要一个新字段,明确声明第二阶段验证失败时究竟会消耗多少抵押品。再叠加旧规则里「失败即全额没收」这一条:设备无法预知脚本会不会跑挂,用户挂着大笔抵押品点确认,等于让一台最谨慎的设备去赌一个它看不见的结果。硬件钱包拒签的交易长什么样:CIP-21 给 Cardano 交易划出的兼容性红线同样体现了这种「设备能算清才敢签」的思路。
解决办法:加一个退还出口
CIP-40 的答案朴素:给交易增加一种特殊输出——抵押品输出。脚本执行失败时,被没收的不再是全部抵押品输入,而是「抵押品输入减去抵押品输出」后的差额。提案比较过两种实现:把抵押品输出做成交易里的独立新字段,或者在输出类型上加一个「普通/抵押品」枚举标记。它选择了前者,理由是不指定抵押品输出(旧交易、旧钱包)的场景仍是多数,独立字段对未升级的钱包向后兼容性最好。
两条新的平衡公式
指定了抵押品输出后,规则同步收紧:其一,抵押品输出要满足与普通输出相同的最小 ADA 要求,不能是空壳;其二,交易要满足 sum(collateral_input) = sum(collateral_output) + collateral_consumed,其中 collateral_consumed 沿用旧公式(交易费乘以 collateralPercent 再除以一百)。同时提案明确,抵押品被真正消耗时,交易里的证书等其他元素不参与这笔找零核算——抵押归抵押,其他归其他。
这套规则对钱包与 dApp 提了什么要求
把机制理顺之后,提案对生态各方的要求其实很克制:dApp 构建交易时要显式声明失败情形下会消耗多少抵押品,并把退还出口挂上;钱包则第一次有能力向用户解释「最坏损失是多少、退回哪里」,而不是笼统地圈住一整块 ADA。对用户来说,这代表看到抵押品请求时可以多做一步:确认交易里有抵押品输出、退还地址是自己的,超出费用上限的大额抵押才有理由被拒。
对读者意味着什么
如果你用钱包连 dApp 时看到「抵押品」字样和一笔明显大于手续费的 ADA 被圈住,现在可以多做一步:确认交易里有没有抵押品输出、退还地址是不是自己的。金额与地址核对不清的签名请求,宁可拒签。抵押品规则涉及协议参数,具体数字以链上现行参数为准;本文只讲机制,不构成投资建议。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。