合约
合约就是指用去中心化的比特币系统来执行金融协议。比特币的合约可以让交易最大程度地摆脱对外部机构的依赖,例如审判系统等,这样在金融交易方面就大大减少了受未知实体影响的风险。
以下的一些部分会详细说明现有的几种比特币合约。因为合约并不仅局限于交易,更是直接和现实的人相关的协议,所以他们也有既定的框架,这些框架将会在后面的内容中有详细的解读说明。
除了以下介绍的几种合约方式外,还有人提出其他的方式。有一些都被维基百科比特币的合约页面所收录。
托管与仲裁
顾客Charlie想在商人Bob这里购买商品,但是他们都不信任第三方,所以,他们使用合约来确保Charlie能得到他的货物,Bob能得到货款。
一个简单的合约,规定如下,Charlie将会在花费比特币购买这一商品,可是只有在Charlie和Bob共同签名后这一交易才最终成立。这就意味着Bob在Charlie收到货物前不能收到货款,同时,Charlie不付款就不能得到货物。
如果遇到争执,这一简单的合约并不能解决问题,因此商人Bob和消费者Charlie引入托管和仲裁机制,创立一个由第三方Alice托管的合约。对于Charlie这一笔只有在多人签名的情况下才能生效。如今只要一切顺利,Charlie就可以支付给Bob相应的货款,如果出现问题,Bob可以退还款项,或者Alice可以在有争执的时候仲裁和决定谁应该得到这笔交易的钱。
创建一笔多重签名的输出,他们就赋予了别人公匙。然后Bob就创建以下的P2SH多重签名的脚本:
OP_2 [A's pubkey] [B's pubkey] [C's pubkey] OP_3 OP_CHECKMULTISIG
(Op代码把公匙堆积成数列并不直接显示)
OP_2和OP_3把 数字2和3 都累积起来。OP_2 指定签名2必须要得到签名; OP_3指定必须提供公匙3。这就是2-3的多重签名脚本,也通常称为m-n脚本(当m是作为最少签名数,n是代表公匙提供的数量)
Bob把这一脚本给Charlie,以此确保他的公匙和Alice的公匙都包含在里面,然后他把脚本散列,把这些编入P2SHoutput里,接着就支付比特币。Bob在看到货款添加到协议上就准备运输货物。
不幸的是,在运输过程中商品受到了轻微的损伤。Charlie想要得到全额退款,但是Bob觉得10%的退款已经足够了。他们随即转向Alice请求解决办法。Alice要求Charlie提供Bob创建的没有被散列的脚本,并由Charlie检查。
在看了证据之后,Alice认为40%的退款已经足够了,然后她创建有两个输出信号的交易并对此签名,一名交易者支付60%的比特币去Bob的公匙,然后另一名则支付剩余的40%去Charlie的公匙。
在输入信号的脚本方面,Alice加入了她的签名和Bob创建的未散列的序列脚本。她提供了Bob和Charlie之间不完全的交易副本,交易的其中一方(买卖双方)可以在以下的输入脚本中创建自己的签名:
OP_0 [A's signature] [B's or C's signature] [serialized redeemScript]
(Op 代码在输入签名和编写脚本堆积数列并不直接呈现。OP_0是一个变通方案,如果在原始的执行方案有一个小错误,那么这个变通方案将会在执行的时候兼容)
当交易被全网广播时,每一个节点都可以通过输入信号的脚本检查Charlie先前支付的P2SH输出信号的脚本,以此保证此脚本与哈希数列上的脚本相符。然后,由于有两个签名已经验证了这个输入的数据,这一脚本就通过检验了。假设脚本生效,那么这两笔交易的输出信号就会同时在Bob和Charlie的钱包中显示出可消费的账户余额。
然而,如果Alice创建和签名的这笔交易并没有得到交易双方的认同,比如说把这笔款项都归属自己,那么Bob和Charlie就可以找到新的仲裁者,并将这笔款项发送到有2-3个多重签名的哈希数列脚本中,这个包括第二名仲裁者的公匙。这就意味着Bob和Charlie不用担心他们的仲裁者会偷走他们的钱了。
资源:BitRated 提供多重签名的仲裁服务接口,在开源认可协议的网站上有提供HTML和Java的脚本。
小额支付渠道
Alice同时也在Bob处兼职,负责处理Bob的论坛公告。每当有人想要在繁忙时段给Bob发信息,Alice会先过滤这些信息,把垃圾邮件都清理出来。Alas是Bob手下的另外一名员工,Bob经常忘记付给她工资,所以Alice要求Bob在她每一次为其工作后能马上得到自己的工资,Bob不答应她这个请求,并解释如此多的小额支付会产生很多的交易手续费,因此Alice提议他们的交易可以使用小额支付通道。
Bob问Alice要到她的公匙,并创建两笔交易。第一笔交易是支付在P2SH的输出信号中支付100m比特币,这是属于双方的点对点多重签名脚本,需要同时得到双方的签名才可生效。这就为这笔交易提供了担保。广播了这笔交易之后能让Alice得到抵押的钱,Bob可以暂时隐藏这笔交易并创立第二次的交易。
第二笔交易就是把第一笔交易的钱(其中减去了交易的费用)退回到Bob的账户中,当然这是在24小时的延迟后由锁定时间可以强制执行的。这就是所称的偿还交易。Bob不可以单独地对这笔偿还交易签名,因此他必须让Alice对此签名,然后会在下面的图表中详细呈现出来。
Alice可以监测此偿还交易是未来的24小时可生效,对此签名,并把副本发送给Bob,然后她就可以要求这个担保交易,同时并可以检查偿还交易担保交易输出信号。她现在可以在网络上广播这笔担保交易,以此确定Bob被冻结的资金能够支付给她工资。事实上Bob除了要支付极小的交易费用,并没有真正地把这笔钱支付出去,他可以在24小时内做出要全款偿还的要求。
当Alice贡献了价值1m比特币的工作时,她随即要求Bob创建新的偿还交易,新的交易将会支付给Alice1m比特币,并把其余的99m退回给Bob,这就没有锁定时间的限制,因此Alice可以随心所欲地花费这笔钱。(但是她并没有这样做)
Alice和Bob之间不断重复这个步骤直到Alice完成了这天的工作或者直到约定的锁定时间得以解除。Alice对此最终的偿还交易签名并且对此进行广播,并把多余的款项退还给Bob,第二天,当Alice开始工作的时候,他们也建立了新的支付通道。
如果Alice没有在规定的锁定时间内对最新的(第二次)交易进行广播,Bob可以将旧交易广播并得到全额的退款。这就是小额支付通道之所以适合小额支付的优势了——如果Alice的规定的锁定时间断网了,她就很可能得不到工资的支付。
交易的可塑性,这一问题在交易过程限制了小额支付渠道的发展。
对于大额支付,比特币的交易费用相对于总体的交易额还是仅仅占到了极小的比例,因此这个能提供即时播报分离交易的支付系统更年保护交易安全。
资源: The bitcoinj Java library provides a complete set of micropayment functions, an example implementation, and a tutorial all under an Apache license.
CoinJoin加密技术
Alice也很关心她自身的隐私安全。她知道每一笔交易都会在区块链上显示,每当Bob和Charlie支付钱给她的时候,他们都可以通过查询到这笔款项所支付到的地址得知她在其他方面的消费,甚至知道她在什么地方消费,账户余额是多少等等。
但是Alice并不是一名罪犯,她想要知道的仅仅是消费支出的地方和账户余额,因此她在电脑上创立了匿名服务,以匿名身份登陆网上聊天。
同时在聊天室里还有Nemo和Neminem两人,他们一致同意使用比特币进行交易,这样除了他们外没人可以控制这些比特币。但是与此同时他们面临着一个困境:谁应该领头把比特转给其他两名匿名者?以下的图展示的结合类的协议可以轻易解决这个问题:他们创建了了一个单独地交易,这个交易可以自动处理所以的支付,以此保证他们其中的任何一员都不能偷走其中的比特币。
每一位捐助者看到他们钱包里尚未花费的输出(UTXOs),有100m比特币是可以使用的。然后他们可以生成一个新的公匙,并提供给服务商UTXOs 详细含义和哈希数列上的公匙。在这种情况下,服务商就是那名匿名的女生,她创建的交易是把每一笔支付的UTXOs分为3份同等的输出信号,一个输出信号对应捐助者的哈希数列的公匙。
然后,这名匿名的女孩用SIGHASH_ALL 来对其输出信号进行签名,确保没人可以修改输出输入信号的详情。然后,她单笔签名支付给Nemo,然后Nemo再签名转给Neminem,以此循环。Neminem就对这一笔交易进行点对点的广播,在单次的交易中对所有的比特币进行整合。
正如图表所见,除了匿名的女孩,Nemo,Neminem外没有人可以决定谁接受了哪个输出,因此他们之间通过合理推诿对交易进行输出。
如今,当Bob或者Charlie打算在区块链上查询Alice的交易时,他们同时可以看到Nemo和Neminem的交易,如果Alice在这个连接网络中贡献的交易很少,Bob和Charlie就要在成千上百个交易中猜测哪个才是Alice的真正交易。
事实上Alice交易的所有记录都会在区块链上显示,因此有决心的调查员依然可以通过向联网的匿名女孩等等询问查出最终的比特币资金流向并找到Alice。但是对于其他随意浏览点击区块链历史的人,Alice还是保留了相对的隐私权。
以上提及的CoinJoin加密技术将会要求用户提供极少的比特币作为支付费用。作为加密技术CoinJoin的消费者,可以节省他们的比特币的同时可以增强对隐私的保护。
匿名女孩在聊天室里呆着,直到她想要买东西,她发布了她想要花费比特币的需求,并且等待另外一个同样想买东西的人,另外的人可能是去不同商家那里购买东西的,然后她们在分离输出信号打上不同商家地址的时候把输入信号合并,这样就没有人可以通过区块链交易历史看到究竟是谁在哪里消费了。
因为她们在交易过程中需要支付小额的交易费,除此之外Anon和另一位消费者不用添加额外费用——但是由于她们联合创建了多笔交易,节省了字节空间,可能还会降低交易费用。
资料:其中一个去中心化CoinJoin技术做得很好的是CoinMux,在Apache上可以找到。另外一个中心化的CoinJoin技术可以在SharedCoin 网站上找到,(这是Blockchain.info的一部分),这项技术可以在4-clause BSD 上实现。