交易输入列表长度字段
交易输入列表以一个整数开始,该整数表示交易中输入的数量。最小值为一个。虽然没有明确的最大值,但是对于交易大小的最大限制实际上将交易限制在几千个输入之内。该数字被编码为一个紧凑型无符号整数。
紧凑型无符号整数
比特币中的无符号整数通常具有较低的值,但有时可能具有较高的值,这些值通常使用CompactSize数据类型进行编码。CompactSize是可变长度整数的一种版本,因此有时被称为var_int或varint(例如,参见BIP 37和144的文档)。
在不同的程序中,包括不同的比特币程序中,使用了几种不同的可变长度整数。例如,比特币核心使用称为VarInts的数据类型来序列化其UTXO数据库,这与CompactSize不同。此外,在比特币区块头中,nBits字段使用称为Compact的自定义数据类型进行编码,这与compactSize无关。在讨论比特币交易序列化和比特币P2P协议的其他部分中使用的可变长度整数时,我们将始终使用全名compactSize。
对于0到252之间的数字,紧凑大小无符号整数与C语言数据类型uint8_t相同,这可能是任何程序员熟悉的本地编码方式。对于其他数字,可以将一个字节作为前缀添加到数字前,以指示其长度,但除此之外,这些数字看起来就像常规的C语言编码的无符号整数:
≥ 0 && ≤ 252 (0xfc)
1
uint8_t
≥ 253 && ≤ 0xffff
3
0xfd后面跟着一个uint16_t类型的数字。
≥ 0x10000 && ≤ 0xffffffff
5
0xfd后面跟着一个uint32_t类型的数字。
≥ 0x100000000 && ≤ 0xffffffffffffffff
9
0xfd后面跟着一个uint64_t类型的数字。
每个交易输入必须包含三个字段:outpoint字段、带长度前缀的输入脚本字段和序列字段。我们将在接下来的章节中逐一查看这些字段。一些输入还包括见证堆栈,但这些在交易的末尾进行序列化,因此我们稍后会对其进行检查。
Last updated