原文链接:http://www.wanbizu.com/baike/201408191710.html

  概述

  比特币的多重签名机制可以实现多方共同管理资产,也可以用于第三方交易担保。

  多重签名最多支持三方共同管理一个地址的资产。按照比特币wiki上的表述方式,称之为:

  一般有 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控制台的界面:

  在该界面下面的输入框里,输入:

钱包会为我们生成一个新的地址。如图2

获取新地址

这便是上面管理者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/blackboard101https://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来运行调试。构建多重签名地址的运行截图如下:

  花费多重签名地址的程序运行如下:

比特币多重签名机制使用篇相关推荐

  1. 技术构思:通过2-of-2多重签名,构建实现类闪电支付

    前言 本文从开始写到正式发布断断续续地写了好多天,一方面是较忙,更多是技术本身需要整理完善.其实我之前也在想要不要先申请专利,但考虑到申请的周期和技术本身大多来自公开技术,更多是进行技术的组合应用,有 ...

  2. 多重签名地址和P2SH

    目前,P2SH实现的功能大多是多重签名地址脚本,就像其名称所暗示的,底层脚本要求超过一个的签名来证明所有权并花费资金.比特币多重签名功能的设计要求在N个密钥中,至少需要提供M个签名(被称为" ...

  3. Wisdom Chain文档知识库之多重签名

    多重签名,就是多个用户对同一个事务进行数字签名,可以简单地理解为一个数字资产的多个签名.比如说安妮和鲍勃是一对情侣,他们共同管理100个比特币,这样他们其中有一个想要动用这100个比特,那么必须需要两 ...

  4. boost源码剖析之:多重回调机制signal(上)

    boost源码剖析之:多重回调机制signal(上) 刘未鹏 C++的罗浮宫(http://blog.csdn.net/pongba) boost库固然是技术的宝库,却更是思想的宝库.大多数程序员都知 ...

  5. 区块链中的数学 - EdDSA签名机制

    Ed25519 使用了扭曲爱德华曲线,签名过程和之前介绍过的 Schnorr,secp256k1, sm2 都不一样,最大的区别在于没有使用随机数,这样产生的签名结果是确定性的,即每次对同一消息签名结 ...

  6. 闪电网络(一):多重签名交易

    比特币的转账慢一直是一个令人诟病的问题.正常情况下,一笔转账需要6个区块的确认,也就是大概60分钟.但这还只是在正常情况下,如果遇上交易拥堵,要等待的时间也许超过几天. 本身的慢加拥堵,大大降低了比特 ...

  7. Android签名机制及PMS中校验流程(雷惊风)

    @Android签名机制及PMS中校验流程(雷惊风) 网上看到一篇比较好的关于Android签名的文章,但是文章链接不安全,不知道哪天会不会找不到了,而且需要关注才能查看完整版,所以在这里记录一下,原 ...

  8. 《Nodejs开发加密货币》之十九:签名和多重签名

    前言 加密货币是一种数字资产,随着区块链等相关技术的创新和突破,很多有形或无形资产实现了去中心化.比如我们这里分享的 亿书 就是要把数字出版物版权进行保护,实现去中心化,解决业界多年来版权保护不力的难 ...

  9. Android签名机制之---签名验证过程详解

    一.前言 今天是元旦,也是Single Dog的嚎叫之日,只能写博客来祛除寂寞了,今天我们继续来看一下Android中的签名机制的姊妹篇:Android中是如何验证一个Apk的签名.在前一篇文章中我们 ...

最新文章

  1. R语言ggplot2可视化自定义图例实战:添加自定义的图例、添加填充色的图例
  2. SAP MM 预留单据里的Base date和Requirement date
  3. hive导数据到mysql 自增主键出错_老大问我:“建表为啥还设置个自增 id ?用流水号当主键不正好么?”...
  4. Hessian RPC示例和基于Http请求的Hessian序列化对象传输
  5. LeetCode Partition List(链表分段)
  6. java学习--基础知识第六天--笔记
  7. 软件项目经理应该具备的心态
  8. Python案例:求转置矩阵
  9. android ems的作用,对话框主题活动中忽略android:minEms
  10. 《信息安全系统设计基础》第六周学习总结
  11. mysql数据库java驱动下载(jdbc)
  12. matlab中IGBT是什么,igbt的matlab仿真
  13. IPV6 DNS服务器地址列表
  14. 学习笔记(1):FFmpeg打造Android万能音频播放器-实现变速变调功能(二)
  15. 深度学习中的多任务学习介绍
  16. android studio怎么后退,Android Studio:上一个活动的后退按钮
  17. linux perl 升级,科学网—一次Perl版本升级引发的吐槽大会 - 黄健的博文
  18. 计算机考研用python_本科化工考研跨考计算机,学过高数和Python,难度有多大?...
  19. navicat连接pgsql报错:authentication method 10 not supported
  20. Android 11.0 充电指示灯红绿显示简单客制化

热门文章

  1. 9.JAVA-抽象类定义
  2. opencv 图片剪切
  3. 实时机器学习是什么,面临哪些挑战?
  4. 利用npm安装/删除/发布/更新/撤销发布包
  5. MagicalRecord使用中的注意事项
  6. CodeWarrior 初探(1) USBDM 芯片检测
  7. Hibernate关联查询
  8. Matlab Robotic Toolbox V9.10工具箱(七):Stanford arm 动力学建模与仿真
  9. C程序多线程同时画圆画方
  10. hyperledge工具-cryptogen