多重签名本质上很简单,就是在单个数字签名校验的基础上做一些组合。但这些简单的组合,却创造出了很多种有趣的应用。
基本原理
比特币的交易一般用的单个签名校验,可以这样理解:C把钱放进一个储物柜,然后用B的公钥给储物柜加锁,只有B能使用自己的私钥开锁,把钱取出来。而多重签名的交易,则可以理解为:C把钱放进储物柜后,不仅用B的公钥给储物柜加锁,还用自己的公钥加锁,甚至还使用第三方A(如中介或仲裁者)的公钥再加一道锁。而且这个储物柜非常智能,可以设置开了几道锁后,储物柜的门才打开。这样设定不同的开锁要求就可以得到不同的应用模型。
应用场景
共同账户
例如夫妻双方建立的联合账户,有两种形式。一种是类似零钱账户,夫妻中任何一人都可以从中取钱,方便平时的小额消费。另一种类似储蓄账户,需要夫妻双方都同意,才能从中取钱,这样可以保证大额账户不会被单方面支出,保护共同财产的安全。前者相当于只需要开一道锁的储物柜,后者相当于两道锁都要开的储物柜。类似的还有公司合伙人的联合账户,可以设置需要多少人同意才能动用账户中的资金。
托管和仲裁
在淘宝上购物时,我们支付的货款会先由淘宝托管,等确认收货后,再由淘宝把货款转给商家。比特币也可以实现类似功能,而且托管方受到更多的约束,更难以作恶。在这种场景下,消费者和商家建立一个托管账户,消费者转账到这个托管账户时,用自己和商家以及仲裁方的公钥给账户加锁。接下来有三种情况:
- 消费者收到的商品没有问题,跟商家达成一致,两者用自己的签名来解锁账户,并把钱转给商家。
- 商品有问题,消费者要求退款,商家也同意,操作跟第一种情况类似,只不过最后把托管账户里的钱退给消费者,或者是以一定比例退款,其它的钱转给商家。
- 商品有问题,但商家不同意退款,由仲裁者裁决。不管仲裁者最后是跟谁达成一致,最终都会得到两个签名来解锁账户,然后把钱转给卖家,或者是部分或全额退款给消费者。
微支付
比特币的《开发者指南》中有个微支付的例子。A为B兼职审核论坛发帖,A希望每审核一篇帖子就收到一份报酬,但因为比特币的交易费用,小额支付成功太高不划算。所以他们设计这样一套方案:
- A和B设立一个共同账户,这个账户要两个人都签字同意才能取钱出来。B签署一份协议,转钱到这个共同账户,作为准备金,但这时并不公布这份协议。
- B签署另一份协议,延迟24小时把共同账户的钱转回给自己。B和A都在这份协议上签字,但这份协议暂时不公开,只作为B在A没有正常工作时能收回准备金的凭据。然后A会公布第一份协议。
- 接下来A开始工作,他每完成一个任务,会要求B签署一份新版本的不带时间锁定的退款协议,按照A已完成的工作量进行转账和退款。A可以随时在协议上签字然后公布,获得已完成部分工作的报酬。但A不会立即这么做,因为主链交易成本太高。
- 重复上一步的过程,直到A完成一天的工作后,或是到第二份协议时间锁定到期前,A在退款协议的最后版本上签字并公布,从而获取自己的劳动报酬,并把剩余的部分退回到B的账户。
从上面的流程看,在整个中间过程中,要准备很多份协议(交易),但并不公布出来,只在线下协商。最终被公布的是最开始的和最后的这两份协议,也就是实际上只有两个交易被广播到比特币网络中,这样就大幅降低了总的交易成本。
上面这个流程也是RSMC(Revocable Sequence Maturity Contract - 序列到期可撤销合约)的一种形式。把RSMC通道联成网络,就有了HTLC(Hashed Timelock Contract - 哈希时间锁定合约)。这就是闪电网络(Lightning Network),比特币的一种“低手续费的极速转账”技术。
总结
从上面的场景来看,多重签名的应用一般是设立虚拟的联合或托管账户,先将交易款项或准备金转到这个账户里,后续再通过协商或仲裁达成一致,将虚拟账户的钱以一定的比例分别转给起初的交易各方。这其实就是基于脚本的合约,需要的时候还可以结合第三方的仲裁和担保,以满足复杂应用场景的需求。