以下以三个p2pkh的输入为例,解释序列化之后的交易
三个输入:
{Txid: "c64ba31f7ca4e534ce9a966847d47666b147cc0a96507c4e88301b19a2e12431", Vout: 0, Value: 99000},
{Txid: "c64ba31f7ca4e534ce9a966847d47666b147cc0a96507c4e88301b19a2e12432", Vout: 1, Value: 98000},
{Txid: "c64ba31f7ca4e534ce9a966847d47666b147cc0a96507c4e88301b19a2e12433", Vout: 1, Value: 99000}
两个输出,一个是P2WSH,一个是OP RETURN
序列化之后的数据如下
02000000033124e1a2191b30884e7c50960acc47b16676d44768969ace34e5a47c1fa34bc6000000006a473044022020f824c9e8969c380327dbb066ad6fd3a10f907beab314d33d3b496594293e3602201c205e10b5dd825d48c20ec34d842afcd016ebcb9fc4bab6b15ab16649f710f20121024eea8184b07701ef45e1470ac0da4562e32daef2844e39db79b3770f7ee48f88feffffff3324e1a2191b30884e7c50960acc47b16676d44768969ace34e5a47c1fa34bc6010000006b4830450221009615faf68db6744883577e8ffed54d2342108b9ba3152b64f6fb99778d9c89fc02200760575e26a1359aeb66f0ea40ae37137ba54340a5999fdff646145d09af171c0121024eea8184b07701ef45e1470ac0da4562e32daef2844e39db79b3770f7ee48f88feffffff3224e1a2191b30884e7c50960acc47b16676d44768969ace34e5a47c1fa34bc6010000006a47304402206dc7c969fce1076be90a356c1da9e667e1ae77fac8e4355cd660cae069289f6302201928eb53224598cc06414a97a6f28a7c0e6c51f1be4dd3a522266ba515d81e8b0121024eea8184b07701ef45e1470ac0da4562e32daef2844e39db79b3770f7ee48f88feffffff02a08601000000000022002005393ad390043fba636ecb524bc97190146ab5ddc2a59bd8edd936ce671d01ec0000000000000000536a4c505341542b010458b07fa57a7452daec3ee8c1d1b0c85239acd6d7170a53b7e0ffd97357e444b85f4d683c1d8e22879a0004534d7466b17576a9140b74907d3bb4b1b761cfd6cc497f8ae903e9c2ff88ac00000000
- 02000000 4个字节version,当前version为2
- 因为交易中没有witness,故而没有Marker 和Flag
- 03 1个字节,表示输入的个数,当前有3个
- 3124e1a2191b30884e7c50960acc47b16676d44768969ace34e5a47c1fa34bc6 32字节的交易hash,是txid的逆序
- 00000000 4 个字节,表示前一笔输出的index,当前index为0
- 6a 1个字节,表示脚本的长度,当前sigScript脚本长度为106
- 47 1个字节,表示签名的长度,当前签名长度71,签名采用DER编码
- 30 1个字节,十进制表示数为48,在DER编码中表示SEQUENCE类型
- 44 1个字节,在DER编码中表示类型的长度,当前表示数据长度为71
- 02 1个字节,在DER编码中表示INTEGER类型,这表明后面的数据是一个整数
- 20 1 个字节,表示长度,当前表示INERER的长度是32个字节
- 20f824c9e8969c380327dbb066ad6fd3a10f907beab314d33d3b496594293e36 32字节,ecdsa签名的r
- 0220,表示INTEGER类型,长度32,后面为ecdsa签名的s
- 01 1个字节,表示当前签名的hash类型,当前为SigHashAll
- 21 1个字节,表示公钥的长度,33个字节表示压缩公钥
024eea8184b07701ef45e1470ac0da4562e32daef2844e39db79b3770f7ee48f88 33字节压缩公钥
feffffff 4个字节,输入的Sequence
– 其后跟两个相同类型的输入,略过 - 02 1个字节,表示输出的个数
- a086010000000000 8个字节,表述输出amount=100000,小端序表示
- 22 1个字节,表示脚本长度,22表示长度34
- 00 1 个字节,表示OP_0,用在隔离见证的输出上,表示后面的是witness Program
- 20 1 个字节,表示OP_DATA32,表示长度为32的witness program,当前表示的是Script的SHA256
- 05393ad390043fba636ecb524bc97190146ab5ddc2a59bd8edd936ce671d01ec 32字节脚本SHA256
- 0000000000000000 8个字节,输出金额为0
- 53 1个字节,表示脚本长度,83个字节的脚本
- 6a 1 个字节,表示OP_RETURN
- 4c 1 个字节,表示OP_PUSHDATA1,用以将数据推入栈中
- 50 1 个字节,表示要推的数据长度,当前表示需要推送80个字节数据
- 5341542b010458b07fa57a7452daec3ee8c1d1b0c85239acd6d7170a53b7e0ffd97357e444b85f4d683c1d8e22879a0004534d7466b17576a9140b74907d3bb4b1b761cfd6cc497f8ae903e9c2ff88ac 80个字节的推送数据
- 最末尾的00000000 4个字节表示LockTime,当前未设置
bitcoin 交易估费时输入输出占用字节数举例
交易输入 148 字节
- (32 字节)交易ID
- (4 字节)输出索引,用于反推本次交易来源与之间的哪个交易输出
- (1 字节)解锁脚本大小,1 ~ 9 字节,使用时选择 1。
- (107 字节)scriptSig的长度为139个字节,或十六进制为8b
- (1 字节)DER 格式签名长度
- (72 字节)DER 格式签名
- (1 字节)公钥长度
- (33 字节)公钥
总共:148 字节
交易输出34字节
- (8 字节) 交易金额
- (1字节) 锁定交易大小,1~9字节,紧凑型无符号整数
- 锁定脚本
- p2pkh (25字节)
- (4字节)操作码,4个操作码
- (1 字节)公钥长度
- (20字节)公钥hash160
- p2wsh (例如上面举例交易,43字节)
- (1字节) OP_0
- (1字节) witness Program 长度
- (32字节) script sha256
- p2pkh (25字节)
基础的10个字节
- (4字节)版本号
- (4字节)锁定时间
- (1字节)输入数量,1~9字节,紧凑型无符号整数
- (1字节)输出数量,1~9字节,紧凑型无符号整数