Freecash 多签测试



  • 真实的使用场景

    单机模式多签测试 是使用regtest 模式单机测试,真实使用场景不会这么用,私钥会暴露。
    真实场景是使用 signrawtransactionwithwallet 命令。

    下面通过testnet 测试多签

    step 1 准备好3个节点,各自生成一个地址,用3个公钥生成多签地址

    依次用到的命令是:

    1. getnewaddress : 生成地址
    2. getaddressinfo : 获取公钥
      以上2个命令在3个节点都要执行
    3. createmultisig : 生成 2 of 3多签地址
      只需在任一节点执行一次
      第一个参数 传 2
      第二个参数是 刚刚从3个节点获取到的公钥
    freecash-cli createmultisig 2 '["02f8746b23e90fc7dfdfce8bf4213e0091632d380183beb66176586570178d1e65","028d9b59c15f1fa7e9324330a412ab4a36acd4caea06fd9eba4274b0bcd492815b","03520e6e05f71f72ad760a50a071971299fa5ff7b8b4ba0c5ce52b6c53e2866f9a"]'
    多签地址返回值(假设的返回,各位自己去测试肯定不是下面的值):
    {
      "address": "2N5GYr5aWGHv1enu2DeqvP3nX7ky6NieDL8",
      "redeemScript": "522102f8746b23e90fc7dfdfce8bf4213e0091632d380183beb66176586570178d1e6521028d9b59c15f1fa7e9324330a412ab4a36acd4caea06fd9eba4274b0bcd492815b2103520e6e05f71f72ad760a50a071971299fa5ff7b8b4ba0c5ce52b6c53e2866f9a53ae"
    }
    

    以上的值,后面测试步骤将用到

    step 2 导入多签地址

    在节点一、节点二、节点三上面均执行:

    # 导入多签地址
    freecash-cli -testnet addmultisigaddress 2 '["02f8746b23e90fc7dfdfce8bf4213e0091632d380183beb66176586570178d1e65","028d9b59c15f1fa7e9324330a412ab4a36acd4caea06fd9eba4274b0bcd492815b","03520e6e05f71f72ad760a50a071971299fa5ff7b8b4ba0c5ce52b6c53e2866f9a"]'
    

    第一个参数为 2,因为我们是 2 of 3 的多签
    第二个参数是 step 1中获取的3个公钥

    step 3 给多签地址打一笔 10fch

    在任一有余额的节点执行:

    freecash-cli -testnet sendtoaddress 2N5GYr5aWGHv1enu2DeqvP3nX7ky6NieDL8 10.00
    

    地址是 step 1 生成的多签地址。
    等待约1分钟后,交易生效。 sendtoaddress返回的txid是我们下一步要使用的输入,假定其为值 txid_of_2N5G,是我们后面创建新的交易的输入。

    step 4 生成要签名的交易

    我们从 多签地址的余额给其他地址发送一笔交易,首先创建一个交易。
    使用 createrawtransaction 命令
    txid 填入 step 3 得到的 txid_of_2N5G
    vout 是 txid_of_2N5G中,发给2N5GYr5aWGHv1enu2DeqvP3nX7ky6NieDL8 10f的输出index,通常是0.
    输出地址,随便找一个地址即可,由于输入的是10f,输出值定为9.99f

    freecash-cli -testnet createrawtransaction '[{"txid":"txid_of_2N5G","vout":0}]'  '{"n1VAs96DPUmTXv1qmu6q3VhdCDSJFzQxKp":9.99}'
    

    执行后得到待签名的rawtx,假定值为 rawtx_no_sign,接下来我们将对这个rawtx_no_sign进行两次签名

    step 5 在节点一对rawtx_no_sign进行签名

    使用 signrawtransactionwithwallet 命令
    第一个参数传入 step 4 的 rawtx_no_sign
    第二个参数是输入交易的信息,也就是 txid_of_2N5G 的信息,可以通过
    getrawtransaction txid_of_2N5G 1 获取具体信息。
    txid 填入 txid_of_2N5G
    vout 是 txid_of_2N5G中,发给2N5GYr5aWGHv1enu2DeqvP3nX7ky6NieDL8 10f的输出index,通常是0.
    scriptPubKey 从 getrawtransaction 返回里找,本例是 a91483e1aaedc04897682f69156cec746297106cad6487
    redeemScript 是 step 1 多签地址的信息
    amount 是 utxo 的金额,是 10

    freecash-cli -testnet signrawtransactionwithwallet rawtx_no_sign '[{"txid":"txid_of_2N5G","vout":0,"scriptPubKey":"a91483e1aaedc04897682f69156cec746297106cad6487","redeemScript":"522102f8746b23e90fc7dfdfce8bf4213e0091632d380183beb66176586570178d1e6521028d9b59c15f1fa7e9324330a412ab4a36acd4caea06fd9eba4274b0bcd492815b2103520e6e05f71f72ad760a50a071971299fa5ff7b8b4ba0c5ce52b6c53e2866f9a53ae","amount":10}]'
    

    执行后得到如下输出:

    {
      "hex": "rawtx_after_one_sign",
      "complete": false,
      "errors": [
        {
          ......
          "error": "Unable to sign input, invalid stack size (possibly missing key)"
        }
      ]
    }
    

    由于是第一个签名的,输出会报错,但是没关系,我们只需要 "hex"的内容,这个是经过第一个节点签名的tx,假定hex的值为rawtx_after_one_sign,可以看到比之前的rawtx_no_sign要长一些,这个值将作为下一个节点的输入。

    step 6 在节点二对rawtx_after_one_sign进行签名

    节点一签名过后的 rawtx_after_one_sign,拿来给节点二,再次执行签名。
    使用 signrawtransactionwithwallet 命令
    第一个参数传入 step 5 的 rawtx_after_one_sign
    第二个参数跟 step 5 一模一样
    执行后得到如下输出:

    {
      "hex": "rawtx_after_two_sign",
      "complete": true
    }
    

    可以看到,已经签名成功了。假定 签名后的 rawtx 值为 rawtx_after_two_sign

    step 7 把签名成功后的rawtx广播

    freecash-cli -testnet sendrawtransaction rawtx_after_two_sign
    

    testnet 上的 tx a687f21eb3b8978a2965987ea66bf05c1b023fa969fd33e4a7699e7ceb169013
    是我发送成功的交易(从多签地址往其他地址支付)


Log in to reply