原子交换(Atomic Swap),就是去中心化(无第三方参与)下,两个人实现原子性的跨链公平交易。
那什么原子性呢?就是要么交换成功,要么失败,不会存在中间状态。
那什么是公平交易呢?就是换币时,我骗不了你,你也骗不了我,对双方都是公平的。
原子交换的提出很早,在 2013 年 bitcointalk 上就有人提出。它的实现条件使用了 HTLC 和博弈论思想。HTLC 在比特币上早已有,而在支持智能合约的区块链上就更容易实现了。
9月份时,查理大帝在推特上公布 LTC 和 BTC 的原子交换实验成果。altcoin.io 也准备推出原子交换钱包。在其他跨链交易技术不成熟的当下,原子交换可能是最成熟的。
HTLC
HTLC 的全称是 Hashed Timelock Contracts,原子交换基本是依赖它构建的。可以把 HTLC 理解成一种条件输出,只要满足这个条件你就能花这笔钱。它有两种类型
- Hashlock:给你一个哈希值,当你给出它的原像时,你就可以花这笔钱
- Timelock:在某个时间点之前,你不能花这笔钱。只有这个时间点之后才能花。
下文里的揭露哈希原像和 locktime 处都用到了 HTLC。
除了原子交换,闪电网络也用到了 HTLC。
协议
为了解释原子交换的流程,又要祭出我们的 Alice 和 Bob。
阅读前注意
- “交易”都是指区块链上的 transaction,而“交换”指原子交换这个协议
- tx11 表示满足 tx1 解锁条件 1 的交易,tx12 表示满足 tx1 解锁条件 2 的交易;tx21 和 tx22 同理。
- 最好借助草纸理解,否则一堆 tx1/tx2 的符号,会乱掉的?
场景:Alice 用 1BTC 与 Bob 交换 3ETH。过程如下
Alice
- 生成随机数 a 并计算 hash(a)
- 生成 1BTC 的比特币交易 tx1,但不先广播。tx1 的输出是分支输出:当解锁脚本满足下面某个分支时,可以花费 tx1 里的 1BTC
- Alice 和 Bob 的签名
- hash(a) 的原像和 Bob 的签名
- 生成交易 tx11,该交易把 1BTC 从 tx1 转到 Alice 自己的地址里,有 48h locktime,即要前一笔交易上链后过 48h,本交易才能上链。这笔交易是为了保证在整个交换过程失败时,Alice 可以取回她的钱。
- 请求 Bob 对 tx11 的签名。此后,Alice 再附上自己的签名,tx11 就同时有 Alice 和 Bob 的签名。但 Alice 不能上链该交易,她需要等到 48h 的 locktime。
- 广播 tx1,该交易上链。
Bob:做和 Alice 相似的操作
- 确认 tx1 上链后,生成 3ETH 的以太坊交易 tx2,但先不广播。tx2 的输出也是分支输出:当解锁脚本满足下面某个分支时,可以花费 tx2 里的 3ETH
- Alice 和 Bob 的签名
- hash(a) 的原像和 Alice 的签名(Bob 可从已上链的 tx1 知道 hash(a))
- 生成交易 tx21,该交易可以在 24h locktime(一定要比 tx11 的 48h locktime 短)之后,把 3ETH 从 tx2 转回 Bob 的以太坊地址里。
- 请求 Alice 对 tx21 的签名
- 广播 tx2,该交易上链。
成功的情况
- Alice 确认 tx2 上链后,在 24h 内构造并广播交易 tx22:将 3ETH 从 tx2 里转到 Alice 的以太坊地址里(满足 tx2 的解锁条件2:揭露 a 和 Alice 的签名)。tx22 上链以太坊网络。
- Bob 从广播的 tx22 里得到 a 后,构造交易并广播 tx12:将 1BTC 从 tx1 里转到 Bob 的比特币地址里(满足 tx1 的解锁条件2:揭露 a 和 Bob 的签名)。tx12 上链比特币网络。
- 交易完成
失败的情况
- 若 24h 内,Alice 没有构造并广播交易 tx22。
- 则 24h 后,Bob 签名并广播 tx21(超过 locktime,且同时有 Alice 和 Bob 的签名),把 3ETH 转回给自己。tx21 上链以太坊网络。
- 48h 后,Alice 同理广播 tx11,把 1BTC 转回给自己。tx11 上链比特币网络。
- 交易失败,但双方都不会损失钱。
原子交换里交易的上链顺序应该为:tx1->tx2->Max(tx12, tx22)。前一个交易应该等到后一个交易完全上链,才能保证整个过程的绝对安全,双方都不会损失钱。
缺陷
原子交换看似安全,实际还是存在不少缺陷的。
缺陷一:可以看出,不管交换成功或失败,总会有 4 个交易被上链。如果按照比特币现有的拥堵状态和高手续费,原子交换是基本行不通的,代价过高且会有损失钱的风险。
缺陷二:在考虑外部市场后,会存在对手风险,原子交换是不适用的。如在上面的协议描述里,Alice 和 Bob 已经将 tx1 和 tx2 上链。则这之后,原子交换的成功与否取决于 Alice 是否要抛出 hash(a) 的原像,她有 24h 的考虑时间去决定。那在这 24 小时内,Alice 大可在对比交易所和原子交换的比率差别,如果交易所的汇率对自己有利,那就去交易所交易,抛弃原子交换。在这种情况下,Alice 除了会锁定 48h 的币,没有其他风险,风险全部转嫁给了 Bob。
那么有人说,缩短 24h 和 48h 的参数设定就好了啊。但无论怎么缩短,这个风险都不能消除。且缩短锁定时间还可能带来安全风险。
缺陷三:除此之外,还有一种攻击。在 tx1 和 tx2 上链后,Bob 完全封锁 Alice 的网络(由于存在点对点通信,会增加这种风险)。Alice 发出的 tx22 无法广播到网络里,但 Bob 可以截取到。Bob 因此可以得到 Hash(a) 的原像,从而上链 tx12(满足 tx1 的解锁条件2)拿到 1BTC。之后,Bob 再封锁 Alice 的网络 24 小时,他就又可以上链 tx21(满足 tx2 的解锁条件1)拿到 3ETH。
那有人说,只要 Alice 迟迟发现自己发出的 tx22 不上链,那就去找个网吧重新发交易啊。Bob 总不能连人去哪都可以追踪吧。这确实是最简单的抵御方法。但也说明,原子交换需要人类来监控,在完全程序自动化的条件下完成仍存在风险。
本文由币乎社区(bihu.com)内容支持计划赞助