比特币UTXO以及交易数据解析

UTXO 代表 Unspent Transaction Output。

比特币没有账户概念,就好比我们消费现金,每次购物,都需要把现金整个消费掉,若金额较大,则会找零。每个现金对应一个地址(可相同也可不同)。

比特币构建交易中,可以一个或多个 input (好比几张现金同时花),一个或多个output (给多个地址或自己)。

在比特币构建交易中,引入了锁定脚本以及解锁脚本,在需要消费一笔UTXO时,需要根据这笔UTXO的锁定脚本,构建新交易的解锁脚本,证明当前地址拥有该笔UTXO的使用权,之后构建输出脚本,及把UTXO输出给目标地址,若发送成功,在目标地址消费该笔UTXO时,同样需要根据该UTXO的锁定脚本,构建输入的解锁脚本,证明该地址的使用权,之后构建输出。

脚本: P2PKH、P2PK、P2SH(多签名)等,较多使用 P2PKH

交易数据分析:

 

01000000 // 版本号
01    // input 数量
43e3b95ef2796bb1986388fce443042e7eda7d2df5e758202a1983f69f07c5c6 // previous tx hash
00000000 // index 在上笔交易输出中的索引
6b // 解锁脚本长度
48 // 签名长度
30 //表示DER序列的开始
45 //序列的长度
02 
21 // R 长度
00d12513a98190c7ddd7bb7bd04ee4b3565a50cb3a9ae8515d13358f8009b83d6a // R
02 
20 // S 长度
458d51a7b06dafe0ebba4e653657a83d3e6d9aadea984836f1e15ff4176e0340  // S
01  // hash 类型
21 // 公钥长度
03 //公钥压缩格式
c938cff0d57d42480eacc057ccbf2ec009a32db5f74ec0a46a152f608754d29d // 公钥
ffffffff // 序列,在生效时间不为0时,需要小于 0xffffffff,并生效
01    // output 数量
98a5030000000000  // amount
19  // output 长度
76  // OP_DUP 复制栈顶
a9  // OP_HASH160 
14  // 公钥长度
12538aa79472b24bd8858d87d885259f2e63a284 // (pubKey hash)
88  // OP_EQUALVERIFY
ac // OP_CHECKSIG
00000000 // 生效时间 (0 立即生效)

验证脚本: 先入栈 解锁脚本,之后锁定脚本,在返回True时,则证明拥有该笔UTXO的使用权。

之后根据新地址,构建锁定脚本,理论上时新交易输入UTXO的锁定脚本,决定新交易输入的解锁脚本(UTXO对应上一笔交易,输出的锁定脚本决定在新交易中的输入脚本,因为需要证明使用权才可以花费)。

字节长度表示: 

如果0 < data.length < 76(0x4C),则结果为:1个字节data.length + data数据
如果76(0x4C) <= data.length < 2^8,则结果为:0x4C + 1个字节data.length + data数据
如果2^8 <= data.length < 2^16,则结果为:0x4D + 2个字节data.length + data数据
如果2^16 <= data.length < 2^32,则结果为:0x4E + 4个字节data.length + data数据

 

没有更多推荐了,返回首页