Skip to content

BTC #3:Transaction(上)— UTXO 与交易结构

比特币没有"余额"概念。你的"钱"其实是散落在区块链上的一堆"未花费的交易输出"(UTXO)。


UTXO 模型

什么是 UTXO

UTXO(Unspent Transaction Output)即"未花费的交易输出"。比特币的记账方式不是记录"你有多少钱",而是记录"哪些钱还没被花掉"。

Alice 的 UTXO

UTXO 1
0.5 BTC
来自交易 A

UTXO 2
0.3 BTC
来自交易 B

UTXO 3
0.2 BTC
来自交易 C

Alice 的'余额'
= 0.5 + 0.3 + 0.2
= 1.0 BTC

UTXO vs 账户模型

以太坊 账户模型

-0.6 ETH

+0.6 ETH

Alice: 1.0 ETH

Alice: 0.39 ETH

Bob: 0 ETH

Bob: 0.6 ETH

比特币 UTXO 模型

UTXO: 0.5 BTC

交易

UTXO: 0.3 BTC

新 UTXO: 0.6 BTC
(给 Bob)

新 UTXO: 0.19 BTC
(找零给 Alice)

0.01 BTC
(矿工费)

特性UTXO 模型(BTC)账户模型(ETH)
余额表示所有 UTXO 之和单一余额数字
隐私性较好(每次可用新地址)较差(地址固定)
并发性天然支持(不同 UTXO 独立)需要 nonce 排序
转账找零需要找零输出自动扣减余额
手续费输入总额 - 输出总额 = 矿工费显式指定 gasPrice

交易结构

📝 Bitcoin Transaction

version
版本号

inputs 输入列表

outputs 输出列表

locktime
锁定时间

Input 0

前一交易哈希
txid

输出索引
vout

解锁脚本
scriptSig

Output 0

金额
value (satoshi)

锁定脚本
scriptPubKey

输入(Input)

  • txid:引用的前一笔交易的哈希
  • vout:前一笔交易中具体哪个输出(索引)
  • scriptSig:解锁脚本,提供花费证明(签名 + 公钥)

输出(Output)

  • value:金额(以聪 satoshi 为单位,1 BTC = 10^8 satoshi)
  • scriptPubKey:锁定脚本,定义花费条件

手续费

手续费 = 所有输入的总金额 - 所有输出的总金额

手续费不是交易的一个显式字段,而是隐含在输入输出的差值中。

比特币脚本

比特币脚本是一种基于栈的简单编程语言,用于定义和验证花费条件。

P2PKH 脚本执行过程

锁定脚本 (scriptPubKey)

解锁脚本 (scriptSig)

PUSH 签名

PUSH 公钥

OP_DUP

OP_HASH160

PUSH 公钥哈希

OP_EQUALVERIFY

OP_CHECKSIG

✅ 验证通过

执行流程:

  1. 将签名和公钥压入栈
  2. OP_DUP:复制栈顶的公钥
  3. OP_HASH160:对公钥做哈希
  4. OP_EQUALVERIFY:比较哈希是否与锁定脚本中的公钥哈希一致
  5. OP_CHECKSIG:用公钥验证签名

学习资源