还需要用到的辅助参数 Raw 私钥,Raw 公钥,地址
以下两步操作需要找到对应语言的实现
- 把一个 Tx 交易 Hash 值转成 Json 数组
- 把 Json 数组转成 Tx 交易 Hash 值
C++ 参考:bitcoin/rawtransaction.cpp at master · bitcoin/bitcoin · GitHub
- 拿到一个 Tx 交易
- 拆解交易 Json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47{
"txid": "cca138efd14d7a1bfe40bdad3c8d5cb51aef715412c89f139922a3678d68e354",
"hash": "cca138efd14d7a1bfe40bdad3c8d5cb51aef715412c89f139922a3678d68e354",
"version": 2,
"size": 226,
"vsize": 226,
"locktime": 0,
"vin": [
{
"txid": "58eb7b09020f7bf9e6037fbe91d72dab38dc19c6bf774a15d31ea0448b953321",
"vout": 1,
"scriptSig": {
"asm": "",
"hex": ""
},
"sequence": 4294967295
}
],
"vout": [
{
"value": 0.01000000,
"n": 0,
"scriptPubKey": {
"asm": "OP_DUP OP_HASH160 53b0535dc9927534be5db29947474e5bb3586619 OP_EQUALVERIFY OP_CHECKSIG",
"hex": "76a91453b0535dc9927534be5db29947474e5bb358661988ac",
"reqSigs": 1,
"type": "pubkeyhash",
"addresses": [
"mo9TcJAwnQ1v7brym9D48wEH3cRJXNTgpz"
]
}
},
{
"value": 0.08990000,
"n": 1,
"scriptPubKey": {
"asm": "OP_DUP OP_HASH160 2e1e7684f795bab22b79a061845ea3a9932cbfa9 OP_EQUALVERIFY OP_CHECKSIG",
"hex": "76a9142e1e7684f795bab22b79a061845ea3a9932cbfa988ac",
"reqSigs": 1,
"type": "pubkeyhash",
"addresses": [
"mjiosUvVDYzCpd1dnY2ZYDoSbganyg6YCR"
]
}
}
]
} - 未签名的交易解析格式如上 vin 数组中 scriptSig 的两个参数为空
- 得到待签署的地址脚本 76a914 拼接 (地址 反 Base58Check 去掉第一位网络标识) 拼接 88ac
- 把 Tx 交易中的所有 vin 数组中的 scriptSig 清空,首先拿出第一个 vin 把待签的脚本放到 scriptSig 中(Java 实现中 scriptSig 并没有 asm,hex 这两个字段,我采取的整体替换),然后得到修改后的 Tx 交易的 hash 值,然后后面拼 1,然后进行两次 SHA256
- 然后使用 Raw 私钥通过 ECDSASigner 签名
- 签名后的值在后面在拼接 1
- 拼接后的签名 和 Raw 公钥 拼接新的 scriptSig 这就完成了一个 vin 的签名
- 重复 5-8 完成所有 vin 的签名(在重复签名时签过名的 vin 也要置空,这就要暂存其他 vin 的签名结果,等待所有 vin 签过名之后再逐一放置回去)
- 然后会变成如下,转成 Tx Hash 值 就完成了处理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47{
"txid": "cca138efd14d7a1bfe40bdad3c8d5cb51aef715412c89f139922a3678d68e354",
"hash": "cca138efd14d7a1bfe40bdad3c8d5cb51aef715412c89f139922a3678d68e354",
"version": 2,
"size": 226,
"vsize": 226,
"locktime": 0,
"vin": [
{
"txid": "58eb7b09020f7bf9e6037fbe91d72dab38dc19c6bf774a15d31ea0448b953321",
"vout": 1,
"scriptSig": {
"asm": "3045022100ad909e04a649140ef3700999c94e5600f70b2402816b5cee36c21fffac078e7c0220276aeaebda9d649ab122e2a067d70113588865034fe38bc64a621f8b404d1913[ALL] 026eeb78f13772ebf0f07e1d4dbf45adcb563c7c118299a22b70fb1cf71e75406a",
"hex": "483045022100ad909e04a649140ef3700999c94e5600f70b2402816b5cee36c21fffac078e7c0220276aeaebda9d649ab122e2a067d70113588865034fe38bc64a621f8b404d19130121026eeb78f13772ebf0f07e1d4dbf45adcb563c7c118299a22b70fb1cf71e75406a"
},
"sequence": 4294967295
}
],
"vout": [
{
"value": 0.01000000,
"n": 0,
"scriptPubKey": {
"asm": "OP_DUP OP_HASH160 53b0535dc9927534be5db29947474e5bb3586619 OP_EQUALVERIFY OP_CHECKSIG",
"hex": "76a91453b0535dc9927534be5db29947474e5bb358661988ac",
"reqSigs": 1,
"type": "pubkeyhash",
"addresses": [
"mo9TcJAwnQ1v7brym9D48wEH3cRJXNTgpz"
]
}
},
{
"value": 0.08990000,
"n": 1,
"scriptPubKey": {
"asm": "OP_DUP OP_HASH160 2e1e7684f795bab22b79a061845ea3a9932cbfa9 OP_EQUALVERIFY OP_CHECKSIG",
"hex": "76a9142e1e7684f795bab22b79a061845ea3a9932cbfa988ac",
"reqSigs": 1,
"type": "pubkeyhash",
"addresses": [
"mjiosUvVDYzCpd1dnY2ZYDoSbganyg6YCR"
]
}
}
]
}