Xinmin's Blog
AdminRSS
全部AIDeFiSolidity以太坊公链实战区块链行业观察
Admin
RSS

说说我对UTXO的理解

区块链·2025年2月25日·1 次阅读·约 12 分钟
© 2026·

什么是UTXO

UTXO(Unspent Transaction Output),翻译过来就叫未花费的交易输出。

UTXO是比特币的账户模型,与以太坊的账户余额模型形成鲜明对比。

在比特币系统中,用户的比特币不是集中存储在一个账户中,而是分散在多个UTXO中,每个UTXO都代表一定数量的比特币。我私下把UTXO理解成装在存钱罐里的硬币,要花10块钱的时候,就去找10个散装硬币。

UTXO的主要作用

一、防止双花攻击

双花攻击是电子货币系统面临的核心问题,即同一笔资金被重复使用。比特币通过UTXO模型巧妙解决了这一问题:

  • 每笔交易包含输入和输出两部分
  • 输入部分指向先前交易的UTXO(通过交易ID和输出索引定位)
  • 网络节点通过检查UTXO是否已被花费来防止双花
  • 当验证新交易时,节点会检查其引用的UTXO是否已被其他交易消费。一旦UTXO被使用,它将被标记为"已花费",不能再次被引用,从而从根本上防止了双花问题。

二、保存比特币的支配权

UTXO模型通过密码学机制确保只有合法所有者才能花费比特币:

1. 交易创建过程:

  • 钱包软件会扫描并汇总用户控制的所有UTXO
  • 根据支付金额选择适当的UTXO组合
  • 创建新交易,引用这些UTXO作为输入

2. 支配权验证流程:

  • 用户用私钥生成签名,将签名和公钥放入输入脚本

  • 输出脚本包含接收方的公钥哈希

    交易输出会包含一个脚本,这个脚本说 “这个输出谁能拿出一个签名和接收方的公钥地址匹配上,就支付给谁”。
    
  • 交易验证通过脚本执行实现

3. 脚本执行过程(基于比特币的栈式虚拟机):

输入脚本:
OP_PUSHDATA(Sig)  // 推送有权花费这笔UTXO的用户的私钥签名
OP_PUSHDATA(PubKey) // 推送有权花费这笔UTXO的用户的公钥

输出脚本:
OP_DUP  // 复制有权花费这笔UTXO的用户的公钥(复制栈顶元素)
OP_HASH160 // 对以上公钥进行哈希(弹出栈顶元素,对公钥进行哈希运算,再压入栈顶)
OP_PUSHDATA(PubKeyHash) // 压入输出脚本中的收款方的公钥哈希
OP_EQUALVERIFY // 弹出栈顶的两个元素,比较是否相等,目的是防止有人冒名顶替收款方
OP_CHECKSIG // 弹出栈顶的两个元素,用公钥检查签名是否正确,到此验完有权花费这笔UTXO的用户身份

如果整个脚本执行过程没有错误,且最终栈顶为真值,则验证通过,交易有效。

UTXO模型的实际运作

当用户发送比特币时:

输入选择: 钱包选择一个或多个UTXO作为交易输入

找零处理: 如果选定的UTXO总额超过需支付金额,会创建一个"找零"输出,返回给发送者

**新UTXO生成:**交易完成后,原UTXO被标记为已花费,同时生成新的UTXO(包括接收方的和找零的)

举例说明:

假设Alice有3个UTXO(价值分别为2、3和5 BTC),她想向Bob发送4 BTC:

  1. Alice的钱包选择2和3的UTXO作为输入(总计5 BTC)

  2. 创建两个输出:一个给Bob(4 BTC),一个找零给Alice自己(1 BTC,减去交易费)注意:矿工费并不作为输出,而是使用输入总额-输出总额的差额作为矿工费。

  3. 用私钥签名交易

  4. 交易广播后,原来的两个UTXO被消费,网络中产生两个新UTXO

附比特币的交易结构:

https://www.blockchain.com/explorer/transactions/btc/921af728159e3019c18bbe0de9c70aa563ad27f3f562294d993a208d4fcfdd24

{
    "txid": "921af728159e3019c18bbe0de9c70aa563ad27f3f562294d993a208d4fcfdd24", // 交易哈希:全网唯一
    "size": 226, // 交易数据的大小:以字节为单位
    "version": 1, // 交易的版本号
    "locktime": 0, // 交易的锁定时间:0表示无锁定,立即生效
    "fee": 29040, // 矿工费:以聪(satoshis)为单位
    "inputs": [
      {
        "coinbase": false, // 来源类型:这笔BTC是否为挖矿所得,true-是,false-否
        "txid": "c0cb92ca8e41070233bf965d808b0fc4bac144dab05690b17823fac3e184c57b", // 交易哈希:这笔输入来自哪笔交易哈希
        "output": 0, // 输出序号:这笔输入来自哪笔交易哈希的第几笔输出
        "sigscript": "483045022100928496fb0d2a25e4e7c99b9c60d4d0d12fcf8974a0faffcb30119b0d385872a30220253d3d0c507e5e44e123bc28b795ab4a38bf3b205455403e77aa72d58d9e17110121022ef8d3a6dd8a7039e513acc8ecf9b094ed7e85439824a1d11920f85927cd0018", // 签名脚本:解锁这个输入所需的脚本
        "sequence": 4294967295, // 序列号:用于支持替换费率(RBF)功能,通常设置为最大值表示不使用RBF。 sequence < 0xFFFFFFFF-1 = 4,294,967,295 时,表示这笔交易如果未确认时,支持替换,以便加快打包速度
        "pkscript": "76a914e1a8cdae6411b17ee1d4cecfe47bafce37e14d1488ac", // 公钥脚本:锁定该输入的脚本
        "value": 76469684, // 输入金额:该输入的比特币金额,以聪为单位
        "address": "1MaBFqBEfcQyXPv3fm5WAW9aQuJuKHaA3A", // 输入地址:花这笔BTC的人的钱包地址
        "witness": [] // 见证数据:用于SegWit交易的额外数据
      }
    ],
    "outputs": [
      {
        "address": "19z8LJkNXLrTv2QK5jgTncJCGUEEfpQvSr", // 输出地址:接收方的钱包地址
        "pkscript": "76a914628ed6567c0b9056067309f07bbea2992ecad74388ac", // 公钥脚本:锁定该输出的脚本
        "value": 22684000, // 输出金额:该输出的比特币金额,以聪为单位
        "spent": true, // 是否已花费:表示该输出是否已被使用
        "spender": {
          "txid": "437f8e2d8b33dc46f73e8d57be5fc739c5a70d2dc02e1326a6a530adf4c3c57b", // 使用该输出的交易哈希:花费这个输出的交易ID
          "input": 0 // 使用该输出的输入索引:花费这个输出的输入索引
        }
      },
      {
        "address": "1LvGTpdyeVLcLCDK2m9f7Pbh7zwhs7NYhX", // 输出地址:接收方的钱包地址
        "pkscript": "76a914da7d57dfd02c6f5a9c649e891b5ac199ad012cd288ac", // 公钥脚本:锁定该输出的脚本
        "value": 53756644, // 输出金额:该输出的比特币金额,以聪为单位
        "spent": true, // 是否已花费:表示该输出是否已被使用
        "spender": {
          "txid": "a9fcce7933c672b058a4c9534ca1e975db002f85d19ef7124356e7285c48c428", // 使用该输出的交易哈希:花费这个输出的交易ID
          "input": 0 // 使用该输出的输入索引:花费这个输出的输入索引
        }
      }
    ],
    "block": {
      "height": 530657, // 区块高度
      "position": 25 // 交易位置:该交易在区块中的位置
    },
    "deleted": false, // 是否已删除:表示交易是否已被删除或取消
    "time": 1530846727, // 交易时间:UNIX时间戳,表示交易被包含进区块的时间
    "rbf": false, // 替换费率(RBF):表示该交易是否支持替换费率功能
    "weight": 904 // 交易权重:用于计算交易的相对成本,考虑了SegWit优化
  }

以上矿工费 = 76469684 - 22684000 - 53756644 = 29040,与fee字段值一致。

UTXO的优势

安全性: 通过密码学确保只有拥有私钥的用户才能花费UTXO

隐私性: 可以每次交易使用新地址,增强隐私保护

并行处理: 不同UTXO的交易可以并行验证,提高网络吞吐量

状态简化: 只需维护未花费交易集合,而非全部交易历史

UTXO的局限性

复杂的脚本支持有限: 相比以太坊,比特币脚本功能较为有限

碎片化: 长期使用会产生大量小额UTXO,增加交易费用

应用开发难度高: 相比账户模型,基于UTXO构建应用更复杂

继续阅读

基于全文检索与主题相似度

区块链2025年3月8日

比特币能否被量子计算攻破?

结论 先说结论:理论上能攻破,但实际上不可能发生。 为什么? 因为设计者中本聪在设计之初就考虑到了量子计算的威胁,巧妙地为其准备了3个锦囊(安全防线):隐身术、闪电战、终极进化。只需在不同时期按顺序掏出这些锦囊,比特币就能逢凶化吉。 这3个锦囊到底是什么东东,为何如此强大?简单解释一下: - 隐身术

区块链2025年2月25日

我在HD Wallet上交的一笔学费

一个不愿提及的教训 2021年的一天,我丢失了价值约¥2W的数字货币。这源于一个愚蠢的操作,至今记忆犹新。回顾起来,这是在HD Wallet理解上交的一笔“学费”。 事情是这样的:我用一个测试钱包接收了一笔USDT,这个钱包的助记词曾在我的博客文章(如何使用MetaMask)中公开过。我知道这个助记

区块链2025年6月13日

区块链面试必备:6种常见共识算法全解析

说在前面 作为一个在区块链搬砖多年的开发者,我发现共识机制是面试中最常被问到的技术问题之一。 今天,我想梳理一下6种主流共识机制,为我也为你在面对相关问题时能够准确、专业地回答。 共识机制解决的核心问题 在分布式网络中,节点之间如何在没有中心权威的情况下对某个值或状态达成一致?这就是共识机制要解决的