比特币多签名地址生成以及数据解析

地址生成:

1、多签名类型、m/n 用N个公钥生成地址,M个公钥解锁,M(Threshold) 小于等于 N,屏幕录入N个公钥地址,N最大为 16

2、依据公钥 byte[] 排序,并依据公钥以及个数,创建 ReddeemScript 结构:M + pubKey1 + pubKey2 + pubKey3 ... + N + opCode(174 : OP_CHECKMULTISIG)

3、ReddeemScript 按顺序拼接转 byte[] 并进行 sha256\hash160 获取 hash

4、创建 P2SHOutputScript , opCode(169) + hash + opCode(135)

5、通过 opCode 判断为 P2SH,取出 hash、P2SHHeader(version),组建地址 version + hash + checkNum 编码生成地址

签名交易过程:

交易数据
01000000 // 版本号
01 // 输入UTXO个数
c97d377f3f8066a9987f4b7f5650a7e7d0b164a5fca236cf858e7fbb1e95dfab // UTXO txId (hash)
0000000000 // index
ffffffff
01 // size
1027000000000000 // amount
19 // len
76 // OP_DUP
a9  // OP_HASH160
14 // len
f31695dc9f6de6367a303ff3168c712138847522 
88 // OP_EQUALVERIFY
ac // OP_CHECKSIG
00000000 // time

第一个签名:
01000000 // 版本号
01 // 输入UTXO个数
c97d377f3f8066a9987f4b7f5650a7e7d0b164a5fca236cf858e7fbb1e95dfab // UTXO txId (hash)
0000000000 // index
b4 // 脚本长度
00 // OP_0 (脚本bug)
47 // len 
30 // 序列开始
44 // 序列长度
02
20 // R 长度
583fbb4f69d23cf84e62fd682e668daeaa1c9c3e0d0614fc8aed1b86d7e2ac36 // R
02
20 // S长度
0927ff778cbcbff13bbc8bb473311ca14f04eed2a08175cfeb42d3ae1ef2d9f2 // S
01 // 签名类型
4c // OP_PUSHDATA1
69 // len
52 // OP_2
21 // len
02b2920753c34df2992a26c0589acd3718846302b3506dc00ed3a6459df71afb87 // pubKey1
21 // len
0291474332c297147d2e7d4e21799b06e0bfffc887813f37a9d90309575849c226 // pubKey2
21 // len
03fc4a74379fe1d253457759dd015cc923929ea4eed7f484bb47ba15da02398961 // pubKey3
53 // OP_3 
ae // OP_CHECKMULTISIG
ffffffff
01 // size
1027000000000000 // amount
19 // len
76 // OP_DUP
a9  // OP_HASH160
14 // len
f31695dc9f6de6367a303ff3168c712138847522 
88 // OP_EQUALVERIFY
ac // OP_CHECKSIG
00000000 // time


第二个签名:
01000000 // 版本号
01 // 输入UTXO个数
c97d377f3f8066a9987f4b7f5650a7e7d0b164a5fca236cf858e7fbb1e95dfab // UTXO txId (hash)
0000000000 // index
fc // 脚本长度
00 // OP_0
47 // 签名1长度
304402
20 // len
583fbb4f69d23cf84e62fd682e668daeaa1c9c3e0d0614fc8aed1b86d7e2ac36 // R
02
20 // len
0927ff778cbcbff13bbc8bb473311ca14f04eed2a08175cfeb42d3ae1ef2d9f2 // S
01 // 签名类型
47 // 签名2长度
30 // 序列开始
44 // 序列长度
02
20 // len
5268dcba8faaac3411d5aed90ed53c2e906426390ca145591b52699d7da73091 // R
02
20 // len
00f3e48d3c7240c1e6b7ea38b695c43387f6636caa5f7c7c3b2f0bc2b7c7d5b0 // S
01 // 签名类型
4c // OP_PUSHDATA1
69 // len
52 // OP_2
21 // len
02b2920753c34df2992a26c0589acd3718846302b3506dc00ed3a6459df71afb87 // pubKey1
21 // len
0291474332c297147d2e7d4e21799b06e0bfffc887813f37a9d90309575849c226 // pubKey2
21 // len
03fc4a74379fe1d253457759dd015cc923929ea4eed7f484bb47ba15da02398961 // pubKey3
53 // OP_3 
ae // OP_CHECKMULTISIG
ffffffff
01 // size
1027000000000000 // amount
19 // len
76 // OP_DUP
a9  // OP_HASH160
14 // len
f31695dc9f6de6367a303ff3168c712138847522 
88 // OP_EQUALVERIFY
ac // OP_CHECKSIG
00000000 // time

你可能感兴趣的:(区块链钱包)