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