概述
比特币的多重签名机制可以实现多方共同管理资产,也可以用于第三方交易担保。 多重签名最多支持三方共同管理一个地址的资产。按照比特币 wiki 上的表述方式,称之为:M of N 模式。
1 <= N <= 3
1 <= M <= N
N: 持有私钥的管理者数量
M: 解锁地址需要的私钥数量
一般有 1 of 1, 1 of 2, 1 of 3, 2 of 3, 3 of 3 几种模式。
通常情况下,多应用于 N = 3 的情形。
- 1 of 3: 三个管理者中,任何一方都可以单独的处理该地址的资产。
- 2 of 3: 三个管理者中,必须有两方共同签署才能处理该地址的资产。
- 3 of 3: 三个管理者必须都签署才能处理该地址的资产。
本文就以 2 of 3 的情形来介绍一下使用多重签名的方法。
制作多重签名地址
首先,制作多重签名地址用到比特币钱包的 API. 熟悉命令行的读者可以直接在 “命令提示符” 窗口里运行 bitcoind
调用相应的命令。可能大部分读者对 “命令提示符” 并不熟悉,所以本文用 “比特币核心” 钱包的调试窗口来演示。 要制作多重签名地址,首先需要参与管理的三方提供各自的公钥。
管理者 1:
管理者 2:
管理者 3:
那么,这些公钥是如何获取的呢?首先,打开 “比特币核心” 钱包。点击 “帮助”->” 调试窗口”, 在弹出的 “Debug window” 窗口点击 “控制台”。进入图 1 控制台的界面:
在该界面下面的输入框里,输入:
钱包会为我们生成一个新的地址。
获取新地址
这便是上面管理者 1 的地址。但制作多重签名,只有地址还不够,还需要对应的公钥。公钥可以通过地址来查询出来。使用命令
得到如图三 (图 3 获取公钥) 的公钥界面:
其中,“pubkey” 后面的数据便是该地址的公钥。
取得三个管理者的公钥之后,就可以用 createmultisig 命令来生成多重签名地址。首先,看一下该命令的基本格式:
我们要创建的是 2 of 3 的模式,所以命令里 n=2。输入命令如下:
得到如图 4 (生成多重签名地址) 的地址界面:
上图中的 3M8voDot82tBrQE7QWGy9WUWxp7gDU7owx,就是我们生成的多重签名地址。然后将这个地址增加到钱包里,只有这样,当收到比特币时,钱包才会有显示。用命令
如果忘记了输入这条命令,钱包便无法显示这个地址上的金额。而且,在这条命令运行前汇款到地址上的币也不会显示出来。遇到这样的情况,需要重新从头开始同步区块链。 我们可以向该地址中汇两笔钱,用于测试。如图 5 (收款成功)
从多重签名地址付款
接下来,我们要演示从多重签名地址付款。我们设置的是 2 of 3 的模式,就是说,三个管理者中,持有任意两人的私钥便可付款。我们假设现在持有的是管理者 1 和管理者 3 的私钥。 管理者 1
管理者 3
获取私钥的方法也很简单,只要使用如下命令即可:
第一步:获取地址上的交易信息 使用 listunspent, 结果如图 (图 6 地址上的交易信息):
我们一共向这个地址进行了两次汇款,因为要手动构建交易单,所以,就只能针对具体的每一笔交易进行设置。如果那笔交易上的钱比要花费的多,就要自己设置找零操作。我们用第一笔交易做示例。从 0.01 个比特币里,付款 0.005 到一个新地址 1KfqXpdhdtSqhACSeMvNoFSeXFGV5j8PkT, 找零地址为:18eHb5P7N4ZAKURetN6pjF1jTGdD3HThrj 首先,我们需要记录第一笔交易的如下几个参数: 第二步:构建交易单:
输出如下 (图 7 构建交易单):
第三步:用第一个私钥对交易单签名
命令的第一个参数,就是 createrawtransaction 的输出。第二个关于 txid 的参数,与上面的相同。最后一个参数,是私钥,我们用的是管理者 1 的私钥。
输出如图:
可以注意到 complete 字段是 false,因为我们只用了一个私钥签名。然后,将输出的 hex 字段取出,用第二个私钥再次签名。 第四步:用第二个私钥签名:输入命令:
输出如图 (图 8 第二次签名):
可以看到,第二次签名后,complete 字段是 true,说明签名成功。我们可以使用该地址的币了。 第五步:发送交易单 将上一步的输出 hex 部分,用 sendrawtransaction 命令发送到网络上:
输入命令:
查询交易 ID cd2494071876f91e1f9505f5c5421088c7df2e6f939c17f742d3638bc7df789a 即可看到这笔钱的花费情况。
使用脚本
如果您读到了这里,首先感谢您的耐心。上面的命令确实让人抓狂。再加上 windows 下各种符号的兼容问题,笔者测试时几乎吐血了。幸运的是在开源社区,已经有了很多方便的脚本工具。这里,笔者修改了一个开源代码,可以方便大家进行多重签名地址的创建和消费。代码地址在:https://github.com/johnsondiao/blackboard101 https://github.com/johnsondiao/python-bitcoinrpc 脚本是用 python 写的。首先需要安装 python2.7.6。安装方法这里不再赘述。python-bitcoinrpc 是一个 bitcoin 的库文件,需要对其中的 setup.py 文件运行
命令将库安装到 python 里。 然后,在比特币钱包的路径 (wallet.dat 所在的目录) 里添加 bitcoin.conf 文件。 文件内容如下:
wbn\_multisigs\_pt1\_create-address.py
脚本用来生成多重签名地址。wbn\_multisigs\_pt2\_spend-funds.py
脚本用来发送多重签名地址的币。
具体的使用方法,就不再说明了,可以用 python 的 IDLE 来运行调试。构建多重签名地址的运行截图如下:
花费多重签名地址的程序运行如下: