举例说明比特币交易序列化

以下以三个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

基础的10个字节

  • (4字节)版本号
  • (4字节)锁定时间
  • (1字节)输入数量,1~9字节,紧凑型无符号整数
  • (1字节)输出数量,1~9字节,紧凑型无符号整数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值