Freecash 多签测试

真实的使用场景

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

下面通过testnet 测试多签

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

依次用到的命令是:

  1. getnewaddress : 生成地址
  2. getaddressinfo : 获取公钥
    以上2个命令在3个节点都要执行
  3. createmultisig : 生成 2 of 3多签地址
    只需在任一节点执行一次
    第一个参数 传 2
    第二个参数是 刚刚从3个节点获取到的公钥
freecash-cli -testnet 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
是我发送成功的交易(从多签地址往其他地址支付)

你可能感兴趣的:(Freecash 多签测试)