交易输入是一个数组, 数组中的每个元素都具有下列结构:
字段名 | 大小 | 格式 | 描述 |
---|---|---|---|
TXID | 32 字节 | 要花费的 UTXO 来自于哪个交易ID | |
VOUT | 4 字节 | 小端序 | 要花费的 UTXO 来自于交易输出的哪个索引号 |
ScriptSig Size | 动态 | Compact Size | ScriptSig 字节大小 |
ScriptSig | 动态 | 解锁 UTXO 的脚本代码 | |
Sequence | 4 字节 | 小端序 | 设置交易是否可以替换或何时可以挖掘 |
如下是有两个交易输入的交易:
在隔离见证升级后, ScriptSig
字段被移动到了 Witness
字段中。
隔离见证交易的 ScriptSig
为空, 但仍保留 ScriptSigSize
字段, 值为 0x00
。
交易输入字段详解
TXID
交易ID, 是一笔交易的唯一标识, 大小为 32 字节, 以小端序显示。 通过对交易数据进行 HASH256
运算得到。
- 隔离见证前的交易, 对全部原始交易数据进行
HASH256
运算。 - 隔离见证交易, 对除
Marker
、Flag
和Witness
字段之外的所有原始交易数据进行HASH256
运算。
交易ID计算器
交易输入中的 TXID
表示要花费的 UTXO
来自于哪笔交易输出。
在原始交易数据中的交易ID, 以大端序显示。但在区块浏览器中显示的交易ID, 则以小端序显示。
wTXID
wTXID
是所有交易数据进行 HASH256
运算得到的结果, 包括 Marker
、Flag
和 Witness
字段。
Witness Root Hash
- 将区块内所有交易的wTXID
构造成默克尔树, 得到默克尔根。Witness Reserved Value
-Coinbase
交易输入中Witness
字段值, 是矿工设置的保留值。用于在必要时可以向区块中添加额外的信息,而不需要重新构建整个区块。
将 Witness Root Hash
与 Witness Reserved Value
组合进行 HASH256
运算, 得到 wTXID
承诺。wTXID
承诺会被放在 Coinbase
交易输出的 OP_RETURN
中。
例如区块 862971 中 Coinbase
交易的包含 wTXID
承诺的输出:
前 4 个字节 aa21a9ed
用于标识此输出包含 wTXID
承诺, 后 32 个字节为 wTXID
承诺。
VOUT
VOUT
表示花费的 UTXO
来自于交易的第几个输出。
示例中交易输入只有一个, 其 VOUT
为 0x8c010000
, 由于原始交易数据的 VOUT
是小端序, 转换为大端序为 0x0000018c
, 即 10进制的 396。表示该交易花费的 UTXO
来自于交易 69ce...2109
的第 396 个输出。
ScriptSig Size
ScriptSig Size
表示解锁脚本 ScriptSig
的大小, 以字节为单位。
ScriptSig
ScriptSig
表示对应交易输入的解锁脚本。
由于每个交易输出中有一个锁定脚本 ScriptPubKey
, 当将其作为交易输入时, 需要提供对应的解锁脚本 ScriptSig
。在非隔离见证交易中, 解锁脚本位于交易输入的 ScriptSig
字段中。
标准非隔离见证锁定脚本都有各自对应的固定格式 ScriptSig
:
在隔离见证交易中该字段为空。
Sequence
每个交易输入内 Sequence
字段控制其最终确认时间。有以下取值
0xFFFFFFFF
- 表示输入是最终的, 不能被替换。当所有交易输入都设置为这个值时, 将禁用交易的Locktime
字段。0xFFFFFFFE
- 启用交易的Locktime
字段。0xFFFFFFFD
- 启用RBF
(Replace-By-Fee), 整个交易可以被更高手续费的交易替换。只要有一个交易输入的Sequence
小于0xFFFFFFFE
即可。通常情况下设置为0xFFFFFFFD
来启用RBF
。- 相对锁定时间, BIP68 规定
Sequence
字段低16位的用法, 用于实现相对于交易被打包进区块的时间经过多久后被该输入真正被花费。- 比特位 22 为 1, 则表示基于时间的锁定, 以 512 秒为单位, 0-15 比特位为表示的锁定时间为 。
- 比特位 22 为 0, 则表示区块的锁定, 0-15 比特位为区块数。
交易已经被打包进区块, 并不等于交易输入的 UTXO
真正被花费了, 何时被花费取决于交易输入的 Sequence
字段。
相对时间锁定
启用基于时间锁定, 且锁定时间为 0 时
00000000 01000000 00000000 00000000 // 0x00400000
启用基于时间锁定, 且锁定时间为512秒
00000000 01000000 00000000 00000001 // 0x00400001
启用区块锁定, 且锁定区块数为1时
00000000 00000000 00000000 00000001 // 0x00000001
启用区块锁定, 且锁定区块数为6时
00000000 00000000 00000000 00000110 // 0x00000006
注: 以上是大端序展示的比特位, 转换成 Sequence
字段时, 需要转换为小端序。
要启用相对时间锁定,交易版本号须大于等于2。