Cardano 的 eUTXO 是什么?UTXO 模型怎么被扩展出状态 图 1
Cardano 的 eUTXO 是什么?UTXO 模型怎么被扩展出状态 · 图 1

两种记账传统:账户余额与未花费输出

多数智能合约公链用账户模型记账:每个地址对应一个余额,转账就是在两个数字之间挪动。比特币世界选择的是另一条路——账本的基本单元不是余额,而是一笔笔未花费输出(UTXO)。花钱是声明我要消费哪几个具体输出,销毁它们并生成新的输出;余额只是所有未花费输出的合计,从不独立存在。Cardano 继承了这条路线并在其上做出扩展,社区把这套方案称为 eUTXO,即扩展的未花费输出。官方文档把它的核心卖点概括为确定性与可预测性。

扩展扩展在哪里:输出携带数据

机制示意(图片由 Agnes 生成,非产品界面或数据图)

普通 UTXO 只记录多少钱、什么条件下可花。Cardano 让输出多携带一层内容:与输出绑定的脚本,以及一段挂在输出上的链上数据(datum);花费这笔输出时还需要提供一段解锁参数(redeemer)。输出从一张定额支票变成了一个带状态的小对象——它保存自己的数据,数据怎么变由脚本规则说了算。智能合约由此不必集中住在一个合约账户里,而是分散在它所管理的那些输出上;所谓调用合约,实质是消费旧输出、产出携带新数据的新输出,状态跟着交易一起搬家。

并行更容易:输入不重叠就能同时验

账户模型有个结构性麻烦:两笔交易如果都要改同一个余额,必须分出先后。UTXO 模型从声明层面回避了这一点——每笔交易显式列出自己消费哪些输出,只要两笔交易的输入集合不重叠,验证就互不干扰,可以并行处理,并行度由交易自身的声明决定,而不是靠运行时试探冲突。对开发者来说,这也意味着写合约要习惯状态打包在输出里随交易迁移的思维方式,而不是对着一个全局存储读写。

组合与竞争的边界

硬币的另一面是组合负担。用户可能持有一大堆小额输出,参与某个需要特定金额结构的协议前,有时得先做一轮聚零为整的整理交易;协议则必须处理输入被别人抢先消费的情形——同一笔输出谁先上链谁得,落败方需要重新选输入重试,不能假设上次看到的输入还在。这些不是缺陷而是模型属性:确定性的另一面,就是所有依赖都必须提前写死在交易里。

与账户模型合约的一次正面对照

同一个换币需求放到两种模型里,画面完全不同。账户模型的合约把流动性存在自己的存储槽里,所有用户共享同一份状态,交易先后由合约内部逻辑排队;eUTXO 的去中心化交易所则把每一池流动性拆成一组具体输出,做市者的资金以带脚本的输出形式公开挂着,吃单交易直接消费某个报价输出、产出找零输出,撮合结果在交易被构造出来那一刻就已锁定,不存在执行后再看情况的变化。对用户来说最直观的区别是滑点来源:账户模型里报价受同一合约内并发交易影响,eUTXO 里价格波动的主要来源是输入竞争——你看中的那个报价输出是否还来得及被你消费。

怎么读这份资料

判断一条链是不是 UTXO 变体,最快的证据是看它的交易结构是否显式列出输入与输出集合,而不是查某个余额字段。Cardano 的脚本语言、地址格式与协议参数在各版本间有演进,涉及动手操作前,以官方文档 docs.cardano.org 的当期描述为准,不要照搬旧教程。

本文仅作机制科普,不构成任何投资建议。