平时我们买东西,一手交钱,一手交货,钱货两清。拿了东西不给钱,店家是要揪住领子问你要债的。
可在网上就不同了,如果是顾客先把钱打到商家账号上,商家不发货怎么办?或者,商家先发货,顾客收到不认账怎么办?
这时候支付宝跳出来说,我给你们做担保,顾客先把钱打到我这里,商家发货,顾客收到之后确认付款,钱再打到商家手里,双方都觉得很公平,暗暗点头。
所以支付宝解决的最大问题是什么?是信任。
然而,在区块链世界里,规则又发生了变化。
在超市买东西,钱和物都是在线下交付;在淘宝买东西,钱在线上付,货在线下收;而在区块链世界里,用比特币换以太坊,比特币的转账和以太坊的接收全都是线上交付。
这时,信任从何而来?
有人说,再造一个区块链世界的支付宝,我们相信第三方就好了。
其实现有的区块链交易所扮演的不就是这样一个第三方么?
但是,数字资产的买卖过程中,交易所是要收手续费的。更重要的是,万一交易所的信用出现了危机怎么办呢?相信别人总是没有相信自己来得实在。
哈希锁就很好地解决了这个问题,它不依赖于任何一个中介或个人的信用背书,完全靠代码和规则就能实现数字资产间的交易。
它的设计非常得简单,一旦了解,你会学会从另一个思路思考和解决问题。
那么它具体是如何实现的呢?
首先我们假设A和B两个人,A有X资产,B有Y资产。X和Y链上都能运行哈希锁的智能合约。
现在,A要用1个X跟B换10个Y。但谁都不愿意把自己的币转给对方,为什么呢?因为有风险嘛。
哈希锁站出来,给了AB两人各自一个密码盒,让AB分别把1个X和10个Y放进自己的密码盒里,然后给两个密码盒都加上一把锁。注意,这两个密码盒被上的锁是一模一样的,也就是说,可以用相同的钥匙打开。所以,为了防止拿着钥匙的人取走对方盒子里的币后,又取走自己盒子里的币,做出规定,谁都只能打开对方的密码盒,无法打开自己的密码盒。
密码盒锁好了,可是钥匙去哪里找呢?答案是,在AB两人中任何一个人的脑子里。什么意思呢?
哈希锁在给两个密码盒加锁之前,就是向A和B中任意一个人要了一个随机数。我们假设它是向A要的,A给了它一个666。哈希锁把这个666塞进一个黑箱子里,在里面经过一系列加工,出来这样一串字符:
c7e616822 f366fb1b5e 0756af498 cc11d2c 0862edcb 32ca65882 f622ff 39de1b。
这串字符跟666比起来,早已面目全非了。它就好像往绞肉机里放进去一块肉,得到一堆肉末一样,你是很难透过这堆肉末想象出原先那块肉的形状的。
这个过程就叫做给随机数666做哈希,这串字符就是666的哈希值。
现在就用这串字符封住AB两人的密码盒,规定如果你手里的随机数的哈希值和这串字符一致,密码盒就可以被打开,你就可以取走里面的币。
哈希的神奇之处就在于,如果塞相同的数字进去,得出的字符串总是一致的,多个空格、多个点都不行。所以如果你有随机数666,密码盒轻松破解;但如果你没有,想利用小聪明试出来,那就是痴人说梦了。
还记得A和B谁有这个随机数吗?对,是A,那他就可以用这个666去开B的密码箱了。而他的开箱过程是公开的,所以当B看到A用666成功解锁了自己的密码箱后,走到A的密码箱前,也用666成功解锁。至此,两人各取所需,交易完成。
想一想,这个流程有没有什么漏洞呢?
我们来看一个实际的例子,你就能发现问题所在了。
如果哈希锁真如上方的流程运行,那么如果一家大型公司如果想搞垮另一家小公司就变得轻而易举。怎么做呢?假设大公司手握价值10亿的A币,小公司只有价值1亿的B币。大公司只要跟小公司换价值1个亿的币,等两家公司都把币锁进密码箱后,就是不用随机数去开密码箱,直到B公司资金链断裂。B公司无能为力,只能看着一个亿放在那里,干着急直跺脚。
说到这你可能已经意识到了交易的漏洞了。那就是没有给交易规定时间,一旦存在恶意交易者,资金就会无限期被锁死。
发明哈希锁的人不会想不到这一点,他们把哈希锁加上一个时间的维度。规定在这个时间内如果没有用随机数打开密码箱,则原币奉还密码箱的主人。所以哈希锁的全名叫做哈希时间锁。
具体这个时间限制怎么加也是有学问的。
如果两人的时间限制一样,A若存心使诈,只需要在心里默数秒数,直到最后时刻再用随机数打开B的密码箱,此时B刚刚看到A的随机数,来不及跑到A的密码箱处,A的密码箱就到期自动解锁了。那么A得到了B的币,且同时拿回了自己的币,空手套白狼,对B太不公平了。
你肯定已经想到了解决方案,那就是给A的密码箱多锁一会,这样等A拿走了B密码箱里的币后,B有足够多的时间去拿A密码箱里的币。那多出来的这部分时间又应该是多少呢?
我们来假设一个场景解释这个问题。首先要知道,解锁密码箱也是需要一定时间的,假设AB锁定密码箱的瞬间,A就去开B的密码箱,用了10分钟。当然,正常情况下不可能这么慢的,计算机的操作往往都是在光电火石之间,这节课拿10分钟来举例,目的是帮助你理解。同样的,对于B来说,解锁的时间也应该是10分钟,因为两人的锁是一模一样的嘛,解锁的过程也是一模一样的,解锁的时间也就是一模一样的了。
所以,如果我们设定B的密码箱的锁定时间是10分钟,那A的密码箱锁定时间就应该是20分钟,也就是B的密码箱锁定时间的2倍。
至此为止,交易双方还有没有风险呢?如果有,是谁的风险呢?
当然有,而且是两个人都有风险。你可以先猜一猜谁的风险更大呢?谁的风险是可避免的,谁的风险是不可避免的?
我给这两种风险起了个名字,一个叫过失风险,一个叫系统风险。
什么意思呢?我举个例子你就明白了。科学家做实验的时候总会提到误差,误差分过失误差和系统误差两种。
过失误差就比如做实验的人到时间忘记关设备了,或者手一滑火开大了,这些人为因素造成的误差,一般小心一点就可以避免了。
不过对于系统误差,就是实验设计得不合理、流程优化得不到位所导致的了。这个是根本上的问题,很难改变,除非对实验重新设计。
那如果你理解了过失误差和系统误差在实验室的意思,就能类比着理解过失风险和系统风险对于哈希时间锁的意义了。
先看过失风险存在在哪里,以及谁会有过失风险的可能性。
通过刚才对于时间的限定,我们可以按照A的开锁时间分成三种情况:
1、A在0-10分钟内开锁
2、A在10-20分钟内开锁
3、A在20分钟之后开锁
先来说第一种和第三种情况。
第一种情况,A在0-10分钟内开锁,B看到A开锁的密码后再用0-10分钟开锁,所以B的开锁时间不会超过20分钟。两人交易顺利完成。
第三种情况,A在20分钟后解锁。此时两人密码箱都已到期,谁也拿不走对方的币,交易作废。
以上两种情况很简单,剩下的第二种情况就是问题之所在了。A在10-20分钟内开锁。此时B的密码箱已经超时失效,虽然密码箱还在,但里面已经空空如也,币被如数返还给B了。可是,A用随机数开锁的过程B可以看得真真切切的。我们假设A输入的这个随机数是正确的,那么B完全可以趁A的密码箱没到时间之前用这个随机数打开A的密码箱,大大方方地取走里面的币。
一旦这种情况发生,A没有拿到自己应得的币,却失去了用来交换的币,是赔了夫人又折兵。
但这又能怪谁呢?A没有在规定时间,也就是10分钟内取走应得的币,所以如果出现这种情况A只能认倒霉。当然,真实世界里,这种情况是不会发生的。因为所有的操作都是计算机来完成的,系统会检测出是否已经超过10分钟,一旦超过,哪怕憋着随机数不填,静静等到20分钟后,作废这笔交易,计算机也不会让这种过失风险存在。
有了计算机的帮忙,A可以躲避掉过失风险。那另一个即便“小心一点”也逃不掉的系统风险,又会花落谁家呢?
这次就要轮到B倒霉了。
你可以先想想,什么情况下,B有可能蒙受损失呢?
再看一下这个锁全名——哈希时间锁。哈希锁加上了时间维度,解决了永久锁定的问题,但也正是这个时间差,让一些投机倒把的人有机可乘。
我们都知道,数字资产界没有一成不变的汇率。一个X这一秒可以换10个Y,下一秒有可能换20个或者5个Y,涨跌很难预判。
这里就留给A一个漏洞钻。在A可交易的这10分钟里,A静观其变。我们假设A打开密码箱只需要1分钟的时间,那A就一直等到第9分钟的时候,看此时币价波动如何。
如果9分钟时1个X能换20个Y,也就是说,X升值了,那A就不去开B的密码箱,让这笔交易作废。
那你会说,即便这样,A也没有赚到什么钱啊。
非也。刚才只是假设了升值的情况,如果X贬值了,也就是说9分钟时1个X只能换5个Y了呢?这时候A就会立马去开B的密码箱,拿走10个Y,赚得钵满盆满。
真实情况下,XY的价值不会有这么大的变化,但即便是很微小的变化,A设定好程序,反复交易,一定是会获利的。
所以就会出现一个问题,谁都不愿意扮演B的角色,都希望自己是先手。这样就会扭曲市场,长期来看确实是个隐患。
然而至今仍没有一个人或者一项技术来解决这个问题,所以哈希时间锁还有很长的路要走。区块链有更长的路要走。
如果你不了解其中的这些微小的差别,就很容易稀里糊涂地成为交易中弱势的一方而不自知,钱哗啦啦地流入别人的口袋。
如果你不懂哈希锁的工作原理、解决的具体问题,就有可能被人抛出的几个高深概念唬住;或者你不了解哈希锁的缺陷在哪,听人说哈希锁有系统风险,就有可能因此错过一个绝佳的投资机会。不论哪一种,都源于对哈希锁的了解不够深。当你彻底了解之后再做决断,你才会离成功更进一步。