一、coinbase交易结构
每个区块的第一个交易叫做coinbase交易,它的结构如下:
字节长度 | 字段 | 说明 |
---|---|---|
4 | 交易版本号 | 明确这笔交易参照的规则 |
1-9 | 输入计数器 | 包含的交易输入数量 |
不定 | 交易输入 | 一个或多个交易输入 |
1-9 | 输出计数器 | 包含的交易输出数量 |
不定 | 交易输出 | 一个或多个交易输出 |
4 | 锁定时间 | 一个区块号或UNIX时间戳 |
coinbase的交易输入结构为:
字节长度 | 字段 | 说明 |
---|---|---|
32 | 交易哈希值 | 固定为全0 |
4 | 输出索引 | 固定为全1 |
1-9 | Coinbase脚本长度 | coinbase的脚本字节长度 |
不定 | coinbase脚本 | coinbase脚本,可以任意填充 |
4 | 序列号 | 固定值0xFFFFFFFF |
coinbase交易的输入格式经过数次改变,在高度227836之前遵从的区块版本号为1。因为本文分析的区块实例高度为170,则coinbase交易遵从版本1的规定。之后的区块版本中规定coinbase数据中需要添加区块高度值,版本2、3、4更详细的说明可以查看比特币官网的开发文档,在此不再赘述。
coinbase的交易输出结构为:
字节长度 | 字段 | 说明 |
---|---|---|
8 | 总量 | 用聪表示的比特币值 |
1-9 | 锁定脚本大小 | 用字节表示的后面的锁定脚本长度 |
不定 | 锁定脚本 | 一个定义了支付输出所需条件的脚本 |
二、普通交易信息结构
剩余的信息就是一个普通交易信息,普通交易结构为:
字节长度 | 字段 | 说明 |
---|---|---|
4 | 交易版本号 | 明确这笔交易参照的规则 |
1-9 | 输入计数器 | 包含的交易输入数量 |
不定 | 交易输入 | 一个或多个交易输入 |
1-9 | 输出计数器 | 包含的交易输出数量 |
不定 | 交易输出 | 一个或多个交易输出 |
4 | 锁定时间 | 一个区块号或UNIX时间戳 |
普通交易输入结构为:
字节长度 | 字段 | 说明 |
---|---|---|
32 | 交易哈希值 | 指向被花费的UTXO所在的交易的哈希 |
4 | 输出索引 | 被花费的UTXO的索引号,第一个是0 |
1-9 | 解锁脚本大小 | 用字节表示的后面的解锁脚本长度 |
不定 | 解锁脚本 | 满足UTXO解锁脚本条件的脚本 |
4 | 序列号 | 固定值0xFFFFFFFF |
普通交易输出结构为:
字节长度 | 字段 | 说明 |
---|---|---|
8 | 总量 | 用聪表示的比特币值 |
1-9 | 锁定脚本大小 | 用字节表示的后面的锁定脚本长度 |
不定 | 锁定脚本 | 一个定义了支付输出所需条件的脚本 |
当发起一笔交易时,如果输入的UTXO远大于输出的给对方的数量时,需要找零。 这时,比特币钱包就会自动创建一个新的地址,用来接收除去转账金额和手续费之后的找零。比特币在进行交易时,会把发起交易地址的余额清零,转账后的剩余金额会转到找零地址中去。当然找零的接收地址也可以设置为发起交易的原地址。 通常情况下,比特币客户端在一开始会产生 100 个用户专属地址的私钥,创建找零地址时会优先使用这 100 个地址中的某一个,当这些地址全部被使用之后,将会继续创建新的找零地址。一般一次交易用一次找零地址,故100个地址只能使用100次交易,超过时,会继续创建地址提供使用,但需要注意备份。