查看原文
其他

比特币史话·72 | 智能合约(7): 多重签名

刘教链 刘教链 2023-01-30

(图片来源于网络)
前情回顾:
比特币史话·67 | 智能合约(2): 合约并不智能
比特币史话·68 | 智能合约(3): 同性恋之死
比特币史话·69 | 智能合约(4): 图灵完全吗?
比特币史话·70 | 智能合约(5): 停机问题
比特币史话·71 | 智能合约(6): 逆波兰式

正文:

有了比特币脚本的设计,我们就可以很容易实现中本聪在2008年比特币白皮书中所说的“常规的担保支付(escrow)机制很容易实现来保护买家(支付比特币的一方)”[1]。中本聪本人也亲自在2010年8月7日名为“担保支付(Escrow)”的论坛帖子里[2]对此进行了阐述:

“这是在软件中实现担保支付交易的概述。这还没有实现,我可能没时间很快实现它,只是让大家知道什么是可行的。”

简易担保支付:买家支付到担保方(escrow)。卖家收到一笔交易,但钱在担保方手里,他不能花费这笔钱,除非买家同意解锁它。买家可以在随后的任意时间解锁这笔支付,但也可以永远不解锁。这不会让买家拿回这笔钱,但除了永不解锁之外,也不会给他一个烧掉这笔钱的选项。卖家可以有一个选项退还这笔钱给买家。”

听起来这个基本逻辑和支付宝的担保支付非常相似。只是,与支付宝需要把待支付的钱交给支付宝这个“受信任的第三方”不同,比特币实现担保支付不需要把资金托管给任何受信任第三方,只需要用比特币脚本就可以完成。方法也很简单,就是使用“多重签名脚本”,类似下面这样:

锁定脚本2 买家的公钥 卖家的公钥 2 检查多重签名(OP_CHECKMULTISIG)
解锁脚本买家的签名 卖家的签名

(注:解锁脚本实际上还需要在开头加一个零操作符 OP_0,这是由于检查多重签名指令的一个小bug导致的,但是由于区块链的特点,既有实现不易改变,故而保留至今。)

锁定脚本中的第二个“2”表示一共有两个公钥,而第一个“2”表示至少需要提供2个与公钥匹配的签名才能动用这个硬币(UTXO)。

这样,一旦买家把这笔比特币用上述的锁定脚本支付出来,就需要双方共同签名才能决定是把这笔钱再转账给卖家(正常交易)还是退还给买家(交易失败)。无论是买家还是卖家,谁也不能单方面支配这笔钱。

中本聪继续写道,“尽管这样的系统不能避免双方的损失,但是至少可以拿掉作弊的获利。”“如果卖家不发货,他就不会拿到钱。买家可能仍然拿不回来钱,但是至少卖家没有金钱方面的动机不退钱给买家。”“买家不能从支付失败中获利。他不能拿回担保中的钱。他也不能以资金不足为理由而不支付。卖家能够看到担保中的资金,承诺给了他的公钥,而且不能被擅自发送给其他人。”

中本聪在8月11日又补充道,“这让它听起来似乎有些让人摸不着头脑,好像是各方即使希望合作,也无法两清。”“当你提前付款时,你也不能把它拿回来。消费者似乎对此感到心安理得。现在的这个方案不会比它差。”“任何一方都可以选择把钱放行给另外一方。”

提前付款:客户损失,小偷得钱。
简易担保:客户损失,但是小偷也拿不到钱。”

他甚至反问了一句,“难道大家是说提前付款更好些,因为至少小偷得到钱了,至少某些人得到比特币了?”

“想象有人偷了你的东西。你无法将其拿回来,但是如果它具有可以远程触发的毁灭开关,如果你可以这么做,你会这么做吗?让小偷知道你所有的一切都有毁灭开关,如果他们偷了你的东西,这对他们也是无用的,尽管您仍然会丢失它吗?如果他们把币还回来,你可以重新激活它。”“想象一下,如果金在被盗时会变成铅。如果小偷还了回来,它会再次变成黄金。”

同时,中本聪还从博弈论的角度回应了一些质疑的声音。他写道,“现在,一个经济学家会讲说,一个欺诈的卖家可以开始谈判,比如像「放款,我将一半币退还给你」,但是到那一刻,信任就太少了,以至于那样的谈判不太可能发生。如果欺诈者已经食言而肥在先,那么究竟凭什么相信他会信守承诺把一半币退还给你呢?我认为对于不大不小的金额,几乎每个人都会仅仅出于原则而予以拒绝。”

“在我看来,问题可能出在表达方式上。首先,出于探讨博弈论的目的,不应该对于「烧钱」的说法如此口无遮拦。这笔钱从未真正烧掉。你永远可以在任何时间选择将其放行。”

从中本聪的行文中我们可以知道,他显然是对于博弈论(game theory)有所了解的。

在2010年9月26日的论坛帖子中,中本聪又对此方案总结道,“这绝对比没有担保的直接付款要更安全,但是没有人工仲裁的担保支付那么好,假如你足够信任人类的话。”“在这种担保中,一个作弊者无法获利,但你仍然有可能损失。它至少消除了欺骗你的获利动机。卖家可以获得钱已经预备就位的保证,而买家则通过未完成交易则不付款来保留对卖家的影响力。”[3]

事实上,我们可以对中本聪给出的方案稍作改进,允许交易双方在出现争议时引入第三人仲裁,避免僵局,那么可以很方便地扩展脚本:

锁定脚本2 买家的公钥 卖家的公钥 仲裁者的公钥 3 检查多重签名(OP_CHECKMULTISIG)
解锁脚本签名1 签名2 (买家、卖家、仲裁者任意两方的签名均可)

这样一来,当买卖双方正常交易时,仲裁者无需做任何事情。只有当双方出现争议时,请仲裁者进行仲裁,然后决定支持买家退款,还是支持卖家收款。

由于锁定脚本是公开在区块链上的,不利于保护各方的公钥,同时,当参与方很多时,锁定脚本的长度也会比较大,因此在2012年左右,BIP0013(比特币改进提案13号)提案引入了一种新的比特币交易类型叫做P2SH(支付到脚本哈希),或者叫做“支付到多重签名地址”。

把上面的锁定脚本作为所谓的“赎回脚本”(redeem script),然后定义新的锁定脚本如下:
HASH160 <赎回脚本的20字节哈希值> 相等判断(OP_EQUAL)

新的解锁脚本则为:
签名1 签名2 <赎回脚本>

新的锁定脚本中的赎回脚本的20字节HASH160哈希值,就是所谓的“多重签名地址”,又称“多签地址”或“P2SH地址”,是该提案新引入的一种新的比特币地址。这个地址使用与比特币地址相同的Base58Check编码后以“3”开头,比如:3DPNFXGoe8QGiEXEApQ3QtHb8wM15VCQU3。(阅读警告:不要向该地址中转入比特币。无法找回!)

这样一来,我们又可以像想象普通比特币地址那样,把上述多重签名地址想象成一个由3把锁锁住的保险箱,只有其中2把锁同时开启才能取走其中保管的比特币。

【未完待续】(公众号:刘教链)

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存