比特币交易是指选择 UTXO 作为交易的输入, 并创建新的 UTXO 作为输出的过程。每一笔交易至少有一个输入和一个输出。
一旦 UTXO 作为交易的输入被消费, 即会被销毁。
UTXO
UTXO 全称叫未花费的交易输出(Unspent Transaction Output), 是比特币交易的基本单位。
假设某地址下有 2 个 UTXO, 一个 UTXO 有 1 BTC, 另一个 UTXO 有 1.2 BTC, 当要转账 1.5 BTC 时, 需要将这 2 个 UTXO 作为输入, 并创建 2 个 UTXO 作为输出(假设无手续费损耗):
- 输出到收款人的
UTXO, 价值 1.5 BTC - 找零的
UTXO, 价值 0.7 BTC
每个 UTXO 都有下列字段:
Amount- 包含聪的数量ScriptPubKey Size-ScriptPubKey的字节长度ScriptPubKey- 锁定的代码
最重要的是 ScriptPubKey 字段, 表示通过何种脚本去锁定 UTXO。
当要花费 UTXO 时, 需要提供一个解锁脚本。在隔离见证升级前, 解锁脚本是 ScriptSig 字段。隔离见证之后, 解锁脚本被移动到了 Witness 字段。
锁
如果把 UTXO 比作一次性的保险箱, 那么 ScriptPubKey 就是保险箱的锁, ScriptSig 或 Witness 就是开锁的钥匙。一旦保险箱的锁被打开过(被消费过), 那么这个保险箱则会被销毁。
内置的锁有几种类型:
- P2PK - Pay to Public Key - 支付到公钥
- P2PKH - Pay to Public Key Hash - 支付到公钥哈希
- P2MS - Pay to MultiSig - 支付到多重签名
- P2SH - Pay to Script Hash - 支付到脚本哈希
- P2WPKH - Pay to Witness Public Key Hash - 支付到隔离见证公钥哈希
- P2WSH - Pay to Witness Script Hash - 支付到隔离见证脚本哈希
- P2TR - Pay to Taproot - 支付到 Taproot
- OP_RETURN - 用于存储数据的锁, 不能被消费
UTXO 实际上并没有归属权, 任何人都可以将其作为交易输入, 但要使交易有效必须要能够解开锁。
执行脚本
将解锁脚本和锁定脚本按顺序拼接在一起后执行, 如果最后执行栈中只剩 OP_1 , 则认为交易有效, 否则无效。
脚本执行模拟
上面示例模拟的是一个保险箱的解锁过程。
交易结构
比特币交易由固定的字段按顺序组成。
交易字段
| 字段名 | 大小 | 格式 | 描述 | ||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Version | 4 字节 | 小端序 | 交易版本号 | ||||||||||||||||||||||||
| Marker | 1 字节 | 用于表示隔离见证交易。必须为 00 | |||||||||||||||||||||||||
| Flag | 1 字节 | 用于表示隔离见证交易。必须为 01 或更大的数 | |||||||||||||||||||||||||
| Input Count | 动态 | Compact Size | 交易输入的 UTXO 数量 | ||||||||||||||||||||||||
| Inputs |
| ||||||||||||||||||||||||||
| Output Count | 动态 | Compact Size | 交易输出的 UTXO 数量 | ||||||||||||||||||||||||
| Outputs |
| ||||||||||||||||||||||||||
| Witness |
| ||||||||||||||||||||||||||
| Locktime | 4 字节 | 小端序 | 设置一个时间或高度,该交易可以在此之后进行挖掘 | ||||||||||||||||||||||||
-
Version- 交易版本号, 用于区分不同的交易格式0x00000001- 旧版交易0x00000002- 支持相对时间锁
-
Marker- 表示交易是隔离见证交易, 必须为0x00 -
Flag- 表示交易是隔离见证交易, 必须为0x01或更大的数 -
Input Count- 输入数量 -
Inputs- 输入列表。 见 交易输入 -
Output Count- 输出数量 -
Outputs- 输出列表。 见 交易输出 -
Witness- 见证数据, 仅隔离见证交易。详情见 Witness -
Lock Time- 锁定时间。见 Locktime