比特币签名流程

还需要用到的辅助参数 Raw 私钥,Raw 公钥,地址

以下两步操作需要找到对应语言的实现

  1. 把一个 Tx 交易 Hash 值转成 Json 数组
  2. 把 Json 数组转成 Tx 交易 Hash 值
    C++ 参考:bitcoin/rawtransaction.cpp at master · bitcoin/bitcoin · GitHub
  1. 拿到一个 Tx 交易
  2. 拆解交易 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"
    ]
    }
    }
    ]
    }
  3. 未签名的交易解析格式如上 vin 数组中 scriptSig 的两个参数为空
  4. 得到待签署的地址脚本 76a914 拼接 (地址 反 Base58Check 去掉第一位网络标识) 拼接 88ac
  5. 把 Tx 交易中的所有 vin 数组中的 scriptSig 清空,首先拿出第一个 vin 把待签的脚本放到 scriptSig 中(Java 实现中 scriptSig 并没有 asm,hex 这两个字段,我采取的整体替换),然后得到修改后的 Tx 交易的 hash 值,然后后面拼 1,然后进行两次 SHA256
  6. 然后使用 Raw 私钥通过 ECDSASigner 签名
  7. 签名后的值在后面在拼接 1
  8. 拼接后的签名 和 Raw 公钥 拼接新的 scriptSig 这就完成了一个 vin 的签名
  9. 重复 5-8 完成所有 vin 的签名(在重复签名时签过名的 vin 也要置空,这就要暂存其他 vin 的签名结果,等待所有 vin 签过名之后再逐一放置回去)
  10. 然后会变成如下,转成 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"
    ]
    }
    }
    ]
    }