多重签名

下为最早的多重签名实现方法:
该方法通过CHECKMULTISIG来实现,其中输入脚本提供N个签名,输出脚本给出N个公钥和阈值M,表示N个人至少有M个签名即可实现转账(N>=M)。输入脚本只需要提供N个公钥中M个合法签名即可。【给出的M个签名顺序要和N个公钥中相对顺序一致】

输出脚本最前面有一个红色的X,是因为比特币中CHECKMULTISIG的实现存在一个bug,执行时会从堆栈上多弹出一个元素。这个bug现在已经无法修改(去中心化系统中软件升级代价极大,需要硬分叉修改)。所以,实际中采用的方案是往栈中多压入一个无用元素。


执行实例:
如图为一个N=3,M=2的多重签名脚本执行过程。其中前三行为输入脚本内容,后续为输出脚本内容。

 


早期的实际应用中,多重签名就是这样写的。但是,在应用中体现出了一些问题。例如,在网上购物时候,某个电商使用多重签名,要求5个合伙人中任意3个人才能将钱取出。这就要求用户在生成,转账交易时候,要给出五个合伙人的转账公钥以及N个M的值。而对于用户来说,需要购物网站公布出来才能知道这些信息。不同电商对于数量要求不一致,会为用户转账交易带来不便之处(因为这些复杂性全暴露给了用户)。
为了解决这一问题,就需要用到P2SH

如图为使用P2SH实现多重签名

本质上是将复杂度从输出脚本转移到输入脚本,可见此时输出脚本只有三行,原本复杂度被转入到赎回脚本redeemScript中。输出脚本只需要给出赎回脚本的哈希值即可。该赎回脚本在输入脚本提供,即收款人提供。
这样做,类似之前提到的电商,收款人只需要公布赎回脚本哈希值即可,用户只要在输出脚本中包含该哈希值,用户无需知道收款人的相关规则(对用户更加友好)。


具体运行过程:

第一阶段验证(输入输出脚本):


第二阶段验证(赎回脚本):


实例:

————————————————
版权声明:本文为CSDN博主「Sinocifengs」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Mu_Xiaoye/article/details/104364191

posted @ 2022-01-15 20:26  xjspyx  阅读(92)  评论(0编辑  收藏  举报