区块链(05):同一笔支付在 UTXO 与账户账本里的两种状态迁移
买家拥有面额为 100 的一份合成资产,要向卖家支付 70,手续费 1,剩余 29 归买家。UTXO 模型要解释“旧输出被消费,新输出怎样生成”;账户模型要解释“余额和 nonce 如何变化”。两种表示都要保证没有凭空产生价值,但拒绝重复支出的检查点不同。先修 区块链(01):两份签名都正确,账本仍会冲突 的双签冲突,以及 区块链(03):签名证明授权了哪条消息 的授权边界。
先固定不变量,再看两种状态
合成单位都是整数,不讨论小数位。模型假定输入已被正确授权,但没有验证签名、脚本、gas 或协议费用规则。对 UTXO,初始状态只有 ("synthetic-coin", 0) -> (buyer, 100);交易引用该输出,生成 (seller, 70) 与 (buyer, 29),旧输出从未花费集合删除,手续费为 100 - 70 - 29 = 1。找零是一个新的可花费输出,不是将原输出的余额改成 29。
flowchart LR
U[未消费输出 buyer:100] -->|消费同一 outpoint| T[交易]
T --> S[新输出 seller:70]
T --> C[新输出 buyer:29]
T --> F[差额: 手续费1]
A[账户 buyer:100 nonce0] -->|按 nonce0 转移| B[buyer:29 nonce1]
A --> D[seller:70 与手续费1]
对账户,起点是 buyer=(100, nonce 0)、seller=(0, nonce 0)。按 nonce 0 执行时,买家余额变成 29,nonce 变成 1,卖家余额变成 70;将单列的手续费 1 加回,可得 29+70+1=100。模型把手续费从账户扣走但未建立矿工账户,等式右端必须显式包含该差额;不能声称余额之和依旧是 100。
| 失败输入 | UTXO 的拒绝点 | 账户的拒绝点 |
|---|---|---|
| 重复提交原支付 | 旧 outpoint 已从未花费集合删除 | 买家当前 nonce 为 1,旧 nonce 0 拒绝 |
| 想付 101 | 输入 100 小于输出 101 | 余额 29 不足以再支付 101 |
| “不付找零” | 若输出 70,差额 30 都按本模型计作手续费 | 显式指定手续费,否则不会自动生成 UTXO 找零 |
spend 和 transfer 都先验证再返回新状态;失败时原映射没有被修改。UTXO 测试还覆盖重复输入列表、未知输入、零输出及超额输出;账户测试覆盖 nonce、余额和金额边界。有限模型里输入/账户按逻辑字符串命名;钱包并不会因此自动知道属于自己或已确认的资产。旧文UTXO 与 account balance 模型继续保留原地址,新模型补的是可执行的守恒与冲突反例,不复制其历史命令。
若两笔交易同时引用旧 outpoint,或两个账户交易都携带 nonce 0,它们单独面对初始状态可以看起来合理,但串行执行后只能有一个按当前状态成功。哪些交易先被排列、节点能否接收未确认冲突交易、何时不可逆,都超出了这两个函数。下一阶段需在 Bitcoin Core regtest 中创建真正原始交易,保存交易标识、区块高度和状态变化;在这一步之前不能称“已完成 Bitcoin 双花验收”。
账户 nonce 保护的是同一个发起方在指定执行域内的交易序号,不是订单号;买家下一笔合法付款必须采用 1。UTXO 的 outpoint 保护的是一份可花费输出,不是买家全部资产;若买家还有另一个输出,可并行花费另一个 outpoint。把两个概念混成“全局交易 ID 防重”会错误拒绝独立交易,也会漏掉相同输入换交易标识的冲突。
余额断言还不是完整资产账本。交易可能因脚本失败被拒、因 gas 消耗导致执行失败却付了费用,或者暂处未确认状态;这些都没有被 spend/transfer 表达。后续应记录构造、提交、入块、执行、业务兑现五个分别可撤销或不可撤销的阶段,不能把本章的成功返回值当作链上回执。
两道练习
- 手算守恒:将卖家的输出从 70 改为 71,保留找零 29,手续费变成多少?若找零改为 30 呢?答案:第一种差额 0,仍不凭空增发;第二种输出 71+30=101,超过输入 100,UTXO 模型抛
value creation。账户模型也必须保证amount + fee <= balance。 - 故障重放:第一次支付后再用旧 outpoint 发第二笔给攻击者,或者在账户中重放 nonce 0,两个模型原状态会否被中途破坏?答案:旧 outpoint 缺失、旧 nonce 不匹配;函数抛异常且返回新状态的操作没有执行,前一笔结果仍为买家 29、卖家 70、手续费 1。测试逐项覆盖。
可迁移原则:授权、金额守恒与一次性消费状态是三个不同的断言。后端幂等表、库存扣减与事件消费也需要同样明确“什么标识只能使用一次”。
参考资料与核验边界
- Bitcoin Core Developer Guide:Transactions(待核验)。Core release、源码 SHA、regtest 交易与签名均 NOT_RUN / NOT_FROZEN。
- Ethereum 执行规范(待冻结 fork 与源码 SHA)。账户模型没有实现 EVM、EIP-1559 费用或任何 PoS 终局性,旧论文不能填此缺口。
系列导航:区块链(04):Merkle 包含证明需要可信根 · 05 UTXO 与账户;系列入口 区块链(00):从中心化订单基线开始。06–13 尚未创建文章,真实网络实验完成后再接入链接。


