比特币开发者指南(4)--合约

合约

合约是使用去中心化的比特币系统来执行财务协议的交易。通常可以制定比特币合约,以尽量减少对外部代理的依赖,例如法院系统,这显著降低了与金融交易中未知实体交易的风险。

以下小节将描述已经使用的各种比特币合约。因为合约是与真人打交道,而不仅仅是交易,它们在特定故事格式框架之中。

除了下述的合约类型,还提出了许多其他合约类型。其中几个收集在Bitcoin Wiki的合约页面。

托管和仲裁

Charlie客户想从Bob商人购买一种产品,但他们都不信任对方,所以他们使用合同帮助确保Charlie获得商品,Bob获得付款。

一个简单的合同可以说Charlie会把satoshis花费到某个输出,只有Charlie和Bob都签名了这个输入才能花费它。这意味着鲍勃不会得到报酬,除非查理得到他的商品,但查理无法获得商品和保留他的付款。

如果有争议,这个简单的合约没有什么帮助,所以Bob和Charlie征求了Alice仲裁员的帮助来创建一个托管合约。Charlie花费这些satoshis到一个输出,这个输出只有三人中的两人都签名输入的话才能被花费。现在如果一切正常Charlie可以支付给Bob,如果有问题的话Bob可以退款,或者如果有争议的话爱丽丝可以仲裁并决定谁应该得到satoshis。

要创建一个多重签名(multisig)输出,他们每个给他人一个公钥。然后,Bob创建以下P2SH multisig redeem脚本:



(将公钥压入堆栈的Opcodes未显示。)
OP_2和OP_3将实际数字2和3压入堆栈上。OP_2指定需要2个签名,OP_3指定需要提供3个未哈希过的公钥。这是一个2-of-3 multisig pubkey脚本,更一般地称为m-of-n pubkey脚本(m是需要的最小匹配的签名,n是提供公钥的数量)。
Bob向Charlie发送redeem脚本,Charlie检查确定他的公钥和Alice的公钥。然后,他将redeem 脚本求哈希,来创建P2SH redeem脚本,并向其支付satoshis。Bob看到付款被添加到块链并运送商品。
不幸的是,商品在运输途中受到轻微破坏。Charlie想要一个完整的退款,但Bob认为10%退款是足够的。他们转向Alice来解决这个问题。Alice要求Charlie的照片证据,以及Bob创建查理检查过的redeem脚本的副本。
在查看证据后,Alice认为40%的退款是足够的,所以她创建并签署两个输出的交易,一个花费satoshis到Bob的公开密钥,剩下的40%花到Charlie的公钥。
在签名脚本中,Alice把她的签名和Bob创建的未哈希序列化的兑换redeem的副本放入其中。她向Bob和Charlie提供了不完整交易的副本。他们中的任何一个可以通过添加他的签名来完成它,以创建以下签名脚本:


(将签名和redeem脚本压入堆栈的Opcodes未显示。OP_0是原始实现中一个错误的解决方法,必须保留兼容性。请注意,签名脚本必须以与redeem脚本中出现的相应的公钥相同的顺序提供签名 。有关详细信息,请参见OP_CHECKMULTISIG中的说明。)
当交易被广播到网络时,每个节点根据Charlie先前支付的P2SH输出检查签名脚本,确保redeem脚本和之前提供的redeem脚本哈希值相匹配。然后评估将两个签名用作输入数据的兑换脚本。假设兑换脚本验证成功,两个交易输出显示在Bob和Charlie的钱包中作为可支付余额。

然而,如果Alice创建并签名了一个交易,他们都不会同意,例如将所有的satoshis支付给她自己,Bob和Charlie可以找到一个新的仲裁员,并签署一个支付satoshis的交易到另一个2-of-3 mutlisig redeem脚本哈希, 这个包括一个新的仲裁员的公钥。这意味着鲍勃和查理从来不需要担心他们的仲裁员偷他们的钱。

资源: BitRated在GNU AGPL授权网站上使用HTML/JavaScript提供了一个multisig仲裁服务接口。


微支付渠道

Alice还为Bob兼职审核论坛帖子。每当有人发帖到Bob的论坛,Alice都要浏览它,确保它不会令人反感或垃圾帖子。但Bob经常忘记付钱给她,所以Alice要求在她批准或拒绝的每个帖子后立即支付。鲍勃说他不能这么做,因为数百笔小额付款会在交易费用中花费成千上万的satoshis,所以Alice建议使用微支付渠道。
Bob向Alice询问她的公钥,然后创建两个交易。第一笔交易支付100 millibitcoins到一个P2SH输出,它的2-of-2 multisig redeem 脚本需要Alice和Bob都签名。这就是债券交易。广播此交易将让Alice持有millibitcoins质押币,所以Bob现在将交易私有,并创建第二个交易。
第二个交易花费所有第一个交易的millibitcoins(减去交易费)在由locktime强制执行的24小时延时后返回给Bob。这是退款交易。Bob不能自己签名退款交易,所以他把它交给Alice签字,如下图所示。

比特币开发者指南(4)--合约_第1张图片

Alice检查退款交易的locktime是未来24小时,签名,并将其副本返回给Bob。然后,她询问Bob进行债券交易,并检查退款交易是否支付债券交易的输出。她现在可以将债券交易广播到网络,以确保鲍勃必须等待时间锁定到期,然后再进一步消费他的millibitcoins。Bob迄今为止还没有花费任何东西,除了可能还有一个小的交易费,他将能够在24小时内广播一个完整的退款的退款交易。

现在,当Alice做值1 millibitcoin的工作时,她要求Bob创建并签署新版本的退款交易。交易的第二版将1 millibitcoin花费到Alice,另一个99返回给Bob;它没有锁定时间,所以Alice只要她想要就可以签署并花费它。(但她不会立即这样做)

Alice和Bob重复这些工作和付款步骤,直到Alice完成一天的工作,或者直到时间锁定即将到期。Alice签署了退款交易的最终版本,并将其广播,支付给自己,并将余下的余额退还给Bob。第二天,当Alice开始工作时,他们创建一个新的微支付渠道。
如果Alice在时间锁定到期之前未能广播退款事务的新版本,则Bob可以广播第一个版本并收到一个完整的退款。这是微支付渠道最适合小额付款的一个原因 - 如果Alice的互联网服务在时间锁定到期时间断了几个小时,她可能会被骗走付款。
交易可扩展性,在上面交易部分讨论过,是限制微支付渠道的价值的另一个原因。如果有人使用交易可扩展性来破坏两个交易之间的链接,即使没有完成任何工作,Alice也可以保留Bob的100 millibitcoins质押币。
对于较大的付款,比特币交易费用占交易总额的百分比非常低,因此使用立即广播的单独交易来保护付款更有意义。


资源: bitcoinj Java库提供了一组完整的微支付功能,一个示例实现,以及一个教程,全部基于Apache许可证。


CoinJoin混币技术

Alice很担心她的隐私。她知道每个交易都被添加到公共块链中,所以当Bob和Charlie付钱时,他们可以轻松跟踪satoshis来了解她支付过的Bitcoin 地址,支付多少钱,还有她还剩多少satoshis。

Alice不是一个犯罪分子,她只是希望对获知她花费及她剩余的satoshis合理地拒绝,所以她在她的电脑上启动了Tor匿名服务,并以"AnnoGirl"登陆到IRC聊天室。

同样“Nemo”和“Neminem”也在聊天室,他们共同地同意将satoshis彼此转移,除了他们之外,没有人可以肯定谁控制这些satoshis。但是他们面临两难的境地:谁先将他们的satoshis转移到另外两个假名的人之一?CoinJoin风格的合约如下图所示,使得这个决定变得容易:他们创造了一个单一的交易,同时进行所有的支出,确保没有人能够窃取他人的satoyis。
比特币开发者指南(4)--合约_第2张图片
每个参与者都可以查看他们可以花费的100 millibitcoins的UTXOs的集合信息。然后,他们每个都会生成一个全新的公钥,并向协调人提供UTXO细节和pubkey哈希。在这种情况下,协调者是AnonGirl;她将每个UTXO的交易创建到三个相等大小的输出。一个输出转到每个参与者pubkey哈希。
AnonGirl然后使用SIGHASH_ALL签名输入,以确保没有人可以更改输入或输出详细信息。她向Nemo提供部分签名的交易,他们以相同的方式签署他的输入,并将其传递给同样的方式签署的Neminem。Neminem然后将交易广播到P2P网络,将所有millibitcoins混合在一个交易中。
如图所示,除了AnonGirl,Nemo和Neminem之外,任何人都无法肯定谁收到哪个输出,所以他们可以不可追踪地花费他们的输出。
现在当Bob或Charlie尝试通过块链跟踪Alice的交易时,他们还将看到Nemo和Neminem所做的交易。如果Alice做了更多的混币交易,Bob和Charlie可能不得不猜测几十个或几百个人中哪些实际上是由爱丽丝制造的交易。
Alice's satoshis的完整历史仍然在块链中,所以一个确定的调查员可以和AnonGirl CoinJoined的人交谈,找出她的最终来源satoshis,可能会将AnonGirl显露为Alice。但是,对于随便查看区块链历史信息的人来说,爱丽丝获得了合理的可否认性。
上文所述的CoinJoin技术使参与者花费少量satoshis来支付交易费。一种替代技术,购买者CoinJoin,实际上可以保存他们satoshis,同时提高他们的隐私。
AnonGirl在RC聊天室等待,直到她想要购买。她宣布她打算使用satoshis,等待有人想要从另一个商家进行购买。然后,它们以与之前相同的方式组合它们的输入,但将输出设置为单独的商户地址,所以没有人能够仅从块链历史单独指出其中一个人从商人那里买了什么。
由于他们不得不支付交易费来进行购买,因此AnonGirl和她的共同消费者不需要支付任何额外费用,但是由于它们通过组合多个交易减少开销,节省了字节数,他们可能能够支付较小的集合交易费,从而为他们致以节省少量的satoshis。

资源:在撰写本文时,去中心化的CoinJoin的Alpha版本的实现是CoinMux,仍然是Apache许可。

你可能感兴趣的:(比特币)