GitHub
深入技术
交易

交易

比特币交易是指选择 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 就是保险箱的锁, ScriptSigWitness 就是开锁的钥匙。一旦保险箱的锁被打开过(被消费过), 那么这个保险箱则会被销毁。

内置的锁有几种类型:

  • 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 , 则认为交易有效, 否则无效。

脚本执行模拟

模拟脚本在栈中的执行过程
原始交易数据
交易输入
解锁脚本
锁定脚本
Stack

上面示例模拟的是一个保险箱的解锁过程。

交易结构

比特币交易由固定的字段按顺序组成。

交易字段

字段名大小格式描述
Version4 字节小端序交易版本号
Marker1 字节用于表示隔离见证交易。必须为 00
Flag1 字节用于表示隔离见证交易。必须为 01 或更大的数
Input Count动态Compact Size交易输入的 UTXO 数量
Inputs
字段名大小格式描述
TXID32 字节要花费的 UTXO 来自于哪个交易ID
VOUT4 字节小端序要花费的 UTXO 来自于交易输出的哪个索引号
ScriptSig Size动态Compact SizeScriptSig 字节大小
ScriptSig动态解锁 UTXO 的脚本代码
Sequence4 字节小端序设置交易是否可以替换或何时可以挖掘
Output Count动态Compact Size交易输出的 UTXO 数量
Outputs
字段名大小格式描述
Amount8 字节小端序输出的 UTXO 包含的聪的数量
ScriptPubKey Size动态Compact SizeScriptPubKey 字节大小
ScriptPubKey动态输出的锁定脚本
Witness
字段名大小格式描述
Stack Items动态Compact Size入栈的元素数量
字段名大小格式描述
Size动态Compact SizeItem 字节大小
Item动态压入栈中的数据
Locktime4 字节小端序设置一个时间或高度,该交易可以在此之后进行挖掘
  • Version - 交易版本号, 用于区分不同的交易格式

    • 0x00000001 - 旧版交易
    • 0x00000002 - 支持相对时间锁
  • Marker - 表示交易是隔离见证交易, 必须为 0x00

  • Flag - 表示交易是隔离见证交易, 必须为 0x01 或更大的数

  • Input Count - 输入数量

  • Inputs - 输入列表。 见 交易输入

  • Output Count - 输出数量

  • Outputs - 输出列表。 见 交易输出

  • Witness - 见证数据, 仅隔离见证交易。详情见 Witness

  • Lock Time - 锁定时间。见 Locktime

交易数据拆分

将原始交易数据拆分为单独的字段
原始交易数据
Copyright © 2024 HeapUp