起因是我建议李笑来开展比特币信贷业务
https://bitcointalk.org/index.php?topic=236985.0 ,他给我看这个
https://en.bitcoin.it/wiki/Contracts ,因为我无法直接有效的阅读英文原文,为了能清楚地理解,我不得不翻译过来再细读。既然翻译了就贴上来,有兴趣的一起看看。
Contracts条目有时会打不开,所以没全翻完,等翻完再补上;Smart property全翻完了。
合同 一种分布式合同,使用比特币通过区块链来构成与人的协议的一种方法。合同不能使任何以前不可行的事情变成可行,而是实现你以最小化的信任解决普通问题的方式。通过允许人判断是否退出循环,从而实现完全自动化,最小化信任一般可使事情变得更加方便。
通过建立与Bitcoin互相作用的低信任协议,可以创建全新的产品:
Smart property(智能财产),通过区块链可实现原子交易和贷款的资产。
Transferable virtual property(可转让虚拟资产),可以交易但不可复制的数字名目。
Agents(代理),维护自己钱包的独立程序,用来购买服务器时间。Agents通过出售服务器获得钱。如果供不应求,Agents可以孳生子域,子域的存亡取决于是否能够得到足够的业务。
Distributed markets(分散的市场),一种实现点对点证券交易的方式,可使比特币演化成对国际金融体系全方位的竞争者。
Ripple,一种基于社交网络实现分布式货币兑换的方式。
本页还列出了一些相似的例子。
很多关于比特币合同的主意,最先由Nick Szabó在他的开创性论文中描述,格式化和安全关系在公共网络上。这些页面由Mike Hearn撰写,如果有新型合同的想法请联系他。您可观看2012伦敦比特币会议关于合同主题谈话的视频。
一、理论 Bitcoin的每一笔交易都有一个或多个输入和输出。每个输入/输出带有一个小的单纯函数,称作Script。Script能够包含交易本身以外信息的签名。
每一笔交易能够拥有有一个与其本身关联的锁定时间。这允许交易在一个商定的未来时间点生效或变更,这个时间点即可以是一个区块索引也可以是一个时间戳(或同时是两者,但区块索引值须定义为小于5亿)。如果交易的锁定时间已经达到,我们称其为终点。
每笔交易的输入有一个序列号。在一个正常的交易中,它只是在一定范围内变动的值,序列号都是UINT_MAX,锁定时间是零。如果锁定时间仍未到达,但是所有序列号都是UINT_MAX,这笔交易也被判定终结。序列号可以用来发布一笔交易的新版本,没有无效的其他输入签名(不理解)。例如,一笔交易中的每个输入来自不同方,每个输入可以从序列号零开始,而且那些数字能独立地递增。
签名检查是灵活的,因为被签名的交易的形式能够通过使用SIGHASH标志从而被控制。SIGHASH标志添加在签名的尾部。通过这种方式,可以对每个签名方构建合同,不经过他即允许(该方以外的)其他部分改变。SIGHASH标志有两部分,三个状态之一和ANYONECANPAY调节器:
1、SIGHASH_ALL:这是默认的。它表示有关该交易的一切已被签名,除了输入Script。对输入Script的签名将明显使其不可能构建一笔交易,所以他们总是留空。不过请注意,那些其他输入的特性,像连接输出和序列号,是被签名的;只有Scrip除外。直观地说,它的意思是“我同意投入我的钱,如果每个人都投入他们的钱,而且输出是这个。”
2、SIGHASH_NONE:输出不被签名,而且可以是任何值。这表示:“我同意投入我的钱,只要每个人都投入他们的钱,但是我不在乎输出是什么。”此模式允许别人更新交易,通过改变他们的输入序列号。
3、SIGHASH_SINGLE:类似SIGHASH_NONE,输入被签名,但是序列号留空,这样别人可以创建交易的新版本。然而,唯一的输出是签名的,它是和输入在同一点的。这表示:“我同意,只要我的输出是我想要的,不管其他人。”
ANYONECANPAY调节器能够与上述三个状态结合。当设置后,只有对应的输入能被签名,其他输入可以是任何值。
Script能够包含CHECKMULTISIG操作码。此操作码提供N-M校验:你提供多个密钥,并且必须指定有效签名数,签名数可以比公钥数少。输出能够请求花费两个签名,需要先设置成如下:
2 <pubkey1> <pubkey2> 2 CHECKMULTISIGVERIFY
有两种一般模式安全地创建合同:
1、交易以部分完整或无效形式在p2p网络以外传递。
2、使用了两项交易:一个是(合同)被创建和签名,但是没有立刻广播。另一个是相反的,交易(付款)在合同被同意锁定钱款前就被广播,之后合同才被广播。
这是为了确保人们总是清楚他们同意的内容。
这些特性放在一起,让我们产生兴趣在区块链顶上建立新的金融工具。
二、例1:提供押金 想象一下,您在网站上开立一个帐户(例如一个论坛或wiki),并希望建立自己与运营商之间的诚信,但没有任何预先存在的声誉可供利用。一种办法是向网站付钱购买信任。但如果某时你关闭了你的帐户,你一定希望这些钱能回来。你可能不信任该网站,给他们足够的存款随意使用。另一个风险是,该网站可能在某天就消失了。
目的是证明你做出某种付出,这样网站知道你不是一个垃圾邮件机器人,但你不希望他们能够花这些钱。如果运营商消失,你最终会希望没有任何麻烦就从他们那儿拿回钱。
我们能够通过一个合同解决这个问题:
1、用户和网站互相发送一个新生成的公钥。
2、用户创建交易Tx1(支付),但不广播,(交易中)投入10BTC作为输出,输出需要用户和网站双方签名。它们(指广播)使用网站在上一步创建的公钥。
3、用户发送Tx1的哈希值给网站。
4、网站创建一个交易Tx2(即合同)。Tx2花掉Tx1,并通过用户在第一步提供的地址返还给他。请注意,Tx1需要两个签名,因此本次交易不能完成。 nLockTime设置在未来的某个日期(如6个月后)。输入的序列号设置为零。
5、最后,不完整的(半签名)交易被发送回给用户。用户对照预期检查该合同,如一致钱最终会回到他手里,如不情况有变,仅半年后(钱还是会回来)。因为序列号是零,若双方同意,合同可以在未来修订。输入中的Script仍未完成,用户的签名只可能是零。要修复此问题,用户通过对合同签名和在合适的点放上新签名。
6、用户广播Tx1,然后广播Tx2。
在这个阶段,10BTC处于一个无论是用户还是网站都不能单独花掉它的状态。六个月后,合同将完成,即使该网站消失,用户也将拿回钱。
如果用户希望提前关闭他的账户(该如何)?网站创建一个新版的Tx2, nLockTime设为零,输入的序列号设为UINT_MAX,然后他(用户)重新签名。网站把Tx还给用户签名。然后用户广播此交易,提前终止合同并释放钱款。
如果6个月临近,用户希望维持他的账户(该如何)?同样的事情也适用于:合同能被新的nLockTime重新签名,序列号加1并重新广播2^32次。无论何种情况,双方都必须同意合同变更。
显然,如果用户变成滥用账户(例如垃圾邮件制造者),网站将不会允许合同提早结束。如果发生太多的滥用,能升高押金额度或延长合同期限。
三、例2:托管及纠纷调处四、例3:保险合同五、使用外部状态 (一)、最小化预报中的信任六、链间的交易七、在预付中快速(微)调整支付八、参考