Atomic swap:不经由第三方完成的安全可靠的跨区块链交易
因为加密货币交易所不时传出被骇客攻击、被冻结、甚至卷款倒闭的事情,人们开始意识到把钱放在交易所的大金库其实是不太安全的,也有一些去中心化交易所的方案被提出来,试着在保障使用者资产安全的前提下交易。
然而,这些基于以太坊智慧合约实现的去中心化交易所,都有一个最大的局限,就是它们只能交易Ether本身和存在以太坊主链上的token,比起传统交易所能处理Bitcoin, Ethereum, Monero, Zcash…之间的各种币/币交易,去中心化交易所的功能显得阳春许多。
因为区块链创造的安全交易机制,作用范围终究只限于同一条链上,目前要做跨链交易就只能把钱交由第三方保管,完成互换后再发还给拥有者。所以我们想试着找到一个方法,能够达成
只要双方互相约定,就能安全的达成跨链的资产交易
这乍看之下好像很简单,就是一手交钱一手交货嘛。但实际上,我们在日常生活中之所以能实现所谓的付钱取货,其实仰赖了很多东西,比方说信任,比方说法律,比方说监视器和防盗门。而场景一旦换到网路世界,事情就变得没那么单纯。
比方说小时候玩的线上游戏吧,有些人会用点数卡序号去跟其他玩家换游戏币,但永远都存在一个无解的问题:先给点数还是先给币?我怎么知道如果先给了对方会不会直接跑掉?
加密货币交易也有同样的问题,当你的交易对手是某个网路上不具名的人,你们要如何相信彼此能完成一笔交易而不被对方骗?或者说,怎么保证只要对方只要拿了我的钱就一定会给我货?
交易的原子性
所谓的原子性(Atomic) 指的是一笔交易应该像原子一样,被视为最小的,不可再分割(虽然原子好像可以) 的单位。也就是说,我给你钱你给我货这两件事情呢,必须要同时发生,否则就同时不发生。
为了创造这样的特性,我们会用上一些区块链的神奇黑魔法,以Bitcoin来说是杂凑函数和时间锁;至于Ethereum的话就是智慧合约。
交易的过程大致上是这样子的,假设我和一位匿名网友达成共识,要用我持有的10 BTC交换他的100 ETH。首先我们需要知道彼此的收付款地址,为了后续说明方便,这里假设它们分别是:
BTC_in
BTC_out
ETH_in
ETH_out
再来,为了完成这笔交易,我需要为这笔交易创造一个秘密,具体来说会是一段只有我自己知道的字串,并算出这个秘密的杂凑值。
这里我选用的秘密是:早安我的朋友
接着,我发送一笔交易,将我的10 BTC从BTC_out转出到一个特殊的暂存位置( P2SH ),并且规定这笔钱有两种方式可以转走:一种是如果出示那个可以被Hash变成46f34 …8f4的秘密,就把钱交给BTC_in;另一种是如果钱放了两个小时还没被领走,那BTC_out就可以把钱领回去。
对方也要做类似的事情,把100 ETH 从ETH_out 转到暂存的智慧合约,规定只要ETH_in 向合约出示能变成46f34…8f4 的正确秘密就可以把钱领走,否则一小时后ETH_out 可以把钱拿回去。
等这些设定都完成了之后,我就可以对合约说「早安我的朋友」,然后把对方的100 ETH 领走,同时因为区块链资料是公开的,对方看得到我用来领钱的秘密,当然也就来把我的10 BTC 拿走,交易就算顺利完成啦。
这里有两个值得注意的小细节,第一个是领钱的规则,并不是任何知道秘密的人都可以领,要是指定的交易对手说出秘密才可以。这是因为区块链上的资讯人人可见,所以当我在广播交易的同时,所有人都会看到早安我的朋友,甚至有可能抢先在我的交易被确认之前,用同个秘密去把钱偷走,所以不能只认秘密,要同时限制收款人才行。
第二个是两人的提款时限是不一样的,因为即便双方都用同一组杂凑,一开始却只有我单方面知道秘密,所以当前面的设置完成之后,什么时候执行交易的主动权握在我手上。若是两边的时限一样,我就可以在到期前不久打出领ETH 的指令,并趁对方来得及反应之前把本来的BTC 抽走。所以通常对方会把时限订得比拥有秘密的人设定的时限再早一点,确保就算被压死线也还有足够的时间拿到应得的钱。
所以说,整个换手的过程,就是我选了一支密码学钥匙,并构造了一个可以被这支钥匙解开的锁。基于神奇的数学魔法,锁是没办法回推钥匙的形状的。所以我安心的把自己的钱锁起来,并给对方一个一模一样的锁,对方也安心的把他的钱用这个锁给锁起来,因为他知道,只要我亮出钥匙来取他的钱,他绝对可以用同一把钥匙拿走我的钱。
不同区块链上的两笔交易,用同一个杂凑锁,产生了关联
于是跨链交易的原子性就得到了保证,只有可能两边都给对方钱,否则就是两边都取回本来的钱,(理论上) 绝对不会有某一方拿了就跑的情况。而且更重要的是,这整个过程完全没有第三方介入,虽然也需要把钱暂时锁定,但这和放进交易所的大金库有着根本的不同。藉由区块链本身的锁定机制,钱的控制权还是在拥有者手上,不会没事就被盗。
拒绝付款攻击
原子互换保证了两个相依的交易会同时发生或同时不发生,却不保证交易会发生,所以它仍然存在着一些待解的问题。这和第三方托管的场外交易有点类似,因为交易从设置到完成并不是及时的,所以我们一定要为彼此保留一个缓冲的时间,让付款流程可以被完成,但这个时间差有被利用的可能。
因为设置好的交易不见得会被执行,对于有心人来说,这就成了绝佳的套利机会。我可以找人假意提出交易,待对手锁定资产之后,自己不急着按下同意付款的按钮,而是好整以暇的盯盘,一旦发现市场上的汇率出现波动,就立刻完成交易,并同时在另一边以市价对冲,套取中间的价差。而如果时间到还没有出现套利的机会,就拒绝付款,再找人发起交易,重复攻击。
以BTC:ETH = 1:10,锁定时间2小时/1小时为例,攻击者有1 小时的机会可以故意拖延。如果是双方都锁定,在这段时间内汇率变成1:9,本来的BTC 方可以零风险套走10% 利润。
我们假设有交易的意思表示就代表对当前的汇率满意,也就是被攻击的人心胸宽大不计较中间的汇差,这仍然会造成些许损失。首先是机会成本,尽管当事人给了一段缓冲期,但他本来不预期会被锁定到最后一刻,这段时间如果有更好的交易机会出现,这笔钱也没办法参与,潜在的获利即是损失。
再来是区块链的使用成本,虽然交易前的设置阶段还没有真的转帐,但是对于处理它的矿工而言,这仍然是一笔交易,也要收取一定数量的手续费,所以如果对方根本没有诚意跟你做交易,其实这手续费就是白花了。
面对这些潜在的道德危机,完全去中心化的原子互换技术上还无法克服,在人人自危的情况下,愿意和陌生人使用这种交易方式的人势必很少。固然有些变通方法,比方说缩短锁定期,但伴随而来的却是不方便和失窃风险。至于其他的解决方案,比方说建立外源的评价系统,或者用支付通道之类的第二层架构,则又会带来程度不一的中心化。这可能也算是某种易用性与安全性与去中心化的三难吧。