在比特币体系里,在不同个体或群体之间,达成一项交换货币或资产的交易很直接。这就是之前谈到的合币的原理。合币也可以用来交易智能资产。前面谈到的在域名币中出售域名也是基于同样的原理。
但是前面所有的例子中,即便涉及不同的资产,交易也都是限制在单一的区块链里。一般来说,一个另类币的交易和另外的其他另类币的交易历史没有任何关系也无法相互参考,这是一个基本的无法跨越的限制。那么,是否有其他办法可以互换不同的货币?比如,如果喵妹想卖掉a个另类币给员外,换得员外的b个比特币,他们可以把这项交易做成是单一且无法分割的形式吗?初看起来好像不太可能,因为无法强迫不同体系的区块链同时发生相关的交易。如果其中一个人,假设是喵妹,先执行交易,有什么办法可以阻止员外不遵守承诺呢?
有个聪明的办法可以做到,这用到了密码学的承诺和锁定时间存储,这是两个我们已经讨论过的技术。下图描绘了这个协议。暂时先假设两个区块链里的区块是按固定步骤轮流产生的,每个时间单位产生一个区块。T代表协议流程的开始时间。
- 喵妹创建如下 a 个另类币的可以退换存款:
- 喵妹创建一个随机的字符串x,计算哈希值 h=H(x)
- 喵妹创建如下所示存储A区块,但是并不公开
- 喵妹创建再融资 A 区块,让员外签名
- 一旦员外在再融资 A 区块签名,喵妹公开存储A区块(但是还没有公开再融资A区块)
- 员外创建如下可以退还的存款 b 比特币:
- 员外创建如下所示存储B区块,但是并不公开
- 员外创建再融资 B区块,让喵妹签名
- 一旦喵妹在再融资B区块签名,员外公开存储B区块(但是还没有公开再融资B区块)
- 情景1:喵妹按照计划完成兑换
- 在 T1 喵妹索回比特币,把x给员外(和其他所有人)
- 在 T2 索回另类币
情景2:喵妹改变主意,不要比特币,也不让员外知道 x 值 - 在 T1 员外索回他的比特币
- 在T2 喵妹索回她的另类币
存储A[另类币区块]
输入:喵妹的价值为a的货币
输出脚本:可以通过签名A以及签名B一起兑现或者通过签名B和xs.t.H(x)=<h> 一起兑现
再融资A[另类币区块]
输入:存储A
输出:地址A
定时:T2
输入脚本:签名A,签名B
存储[比特币区块链]
输入:员外的价值为b的货币
输出脚本:可以通过签名A以及签名B一起兑现或者通过签名A和xs.t.H(x) = <h> 一起兑现
再融资B[比特币区块]
输入:存储B
输出:地址B
定时:T1
输入脚本:签名A,签名B
第一步,喵妹存储a价值的另类币[这里的存意味着把货币发给输出脚本(ScriptPubkey),并在里面注明只有两种情况可以使用这笔货币]。这个存款只有通过以下两种方法可以取得此a价值另类币:第一,如果喵妹和员外两个人都同意,他们可以取回。事实上,喵妹只有在员外签署回款交易后,她才公开这个存款。这样就保证如果两个时间单位过去后,存款还没有被领取,她可以赎回她的存款。
另外一个办法是在任何时候,提供员外的签名和x的值,通过x的值去开启哈希函数的承诺h。注意,把<h>写在存储A的区块里来表明喵妹特意把h写入输出脚本。因为只有喵妹知道x,所以在最后阶段,任何单独一方无法索取存款。这个方法就是,当且仅当喵妹拿到比特币,员外才知道x的地址,他才能索取另类币。
第二步大体是第一步的反向过程。员外存b单位比特币,这些比特币只能在两种情况下才能被取走。很重要的区别是,员外并不需要创建一个新的谜题。相反,他用相同的哈希值h ( 把这个h值从存储A区块简单复制到存储B区块)。哈希值h就是链接两个区块链的钥匙。
这时,喵妹有主动权,她可以临时变卦。如果在T1 时,喵妹还没有表示要给员外x值,员外可以简单地取回他的存款退出交易。喵妹的另一选择是在T1 之前取走员外的比特币,但是她必须创建并广播输入脚本,里面含有x值。员外看到这个广播就可以用x值去领取喵妹的另类币,兑换的交易完成。
注意,如果喵妹稍微晚点领取员外的比特币(在T1 之后但是在T2 之前),员外可能同时拿走两笔存款。类似地,如果喵妹及时拿走员外的比特币,但是员外等太久还没取走喵妹的,那么喵妹也可以把两个都拿走。但这不是问题,只要保证双方无法在协议上欺骗对方就可以,自己的疏忽或者故意怠慢不是系统考虑的范围。
最后,区块在比特币和另类币中,并不是按照固定时间产生的。这种情况会造成一些混乱,特别是两个区块链没有协调一致时。假设两个区块链各自平均10分钟产生一个区块。以1小时为时间单位,也就是说,需要T1 至少为现在另类币区块+12,T2 至少为现在比特币区块+6,也许能带来更大安全边际。
遗憾的是,存在很小的可能性,12个另类币区块已经找到,但后面6个比特币还没有找到。这时,喵妹可以索取两个存款。可以通过增加时间单位来降低可能性,但是会牺牲速度。
这是一个清晰明了的协议,但是截至2015年,还没有人用到。相反,所有加密货币都是在传统的中心化的交易系统里交易。造成这种现象有很多原因:第一是该协议的复杂、不便和缓慢;第二,这个协议可以防止偷盗货币,但是不能防范服务性攻击。有人或许以诱人的兑换价格作为广告,但是在协议原型的第一步或第二步就反悔退出,这浪费了每个人的时间。为了减缓这种情况,也为了集合并匹配大家的需求,可能需要一个中心化的交易平台(机制),即使如此,也不能完全相信它不会偷你的货币。这种情况进一步降低了该协议原型的使用范围。