比特币闪电网络(Lighting Network)概念是在知名开发人员Joseph Poon 和Thaddeus Dryja发布的《比特币闪电网络:可扩展链下实时支付》(The Bitcoin Lightning Network: Scalable Off-Chain Instant Payments)白皮书中提出的,本质上是由了哈希时间锁定智能合约(Hashed Time Lock Contract)来安全地处理“0确认“交易的一种机制,通过巧妙设置”智能合约“,用户可以在闪电网络上进行未确认的交易。
闪电网络支付通道时通过哈希时间锁定智能合约来实现的——这其实就是限时转账,通过该智能合约,双方约定转账方先冻结一笔钱,并提供一个哈希锁将发起方的交易代币锁定,如果在规定时间内有人能够提供之前生成支付的加密证明,并且与之前约定的哈希值一致,交易即可完成。
然而,闪电网络哈希时间锁定智能合约真的如我们想象中的那么完美吗?在此,星球君(微信:o-daily)希望通过Peter R. RIzun 的分析告诉大家一个答案。首先,Peter R. RIzun 虚构设计了三个人:Alice、Bob、和Carol,通过他们之间的闪电网络交易来解释哈希时间锁定智能合约的问题。
闪电通道可以被看作是再两个人之间伸展的一串珠子(参考图1),Alice 如果想要支付给Bob 一笔费用,相当于把自己的一个珠子推送给Bob。如果Bob和Carol 之间也有一个闪电网络通道,那么Alice 可以通过Bob 给Carol 支付,相当于:Alice 推送一个珠子给Bob,然后Bob 再推送一个珠子给Carol。这里我们就会发现闪电网络流动性基本规则中存在的一个问题,即珠子可以从一侧移动到另一侧,但是却无法离开他们依附的那条“绳子”。
图1:Alice 可以发送一笔支付给Carol,但需要通过Bob 路由这笔交易。因为珠子不能离开他们依附的那根“绳子“,Bob 可以在与Alice 连接的那根”绳子“上增加一颗珠子,然后在与Carol 连接的那根”绳子“上减少一颗珠子。
这其实就是闪电网络上的资金流动方式,但是这种模式并没有告诉我们为什么通过闪电网络支付是安全可靠的。举个例子,如果Bob 一直保留Alice 推送给他的那一个珠子,然后一直不给Carol 发送一个珠子,情况又会如何呢?
事实上,这就是本文撰写的目的——寻找“究竟是什么让闪电支付变得‘去信任(trustless)’?“这个问题的答案。此外在文章的最后,我们还会揭示闪电网络一个肮脏的小秘密:闪电网络小额支付并非完全”去信任“——路由节点可能会丢失客户资金。
(星球君注:区块链去信任是指用户不需要相信任何第三方。用户使用去信任的系统或技术处理交易时非常安全和顺畅,交易双方都可以安全地交易,而不需要依赖信任的第三方。)
哈希时间锁定智能合约(HTLCs)
为了解释是什么阻止Bob 一直保留Alice 发送给自己的那一个珠子,而且不把一个珠子发送给Carol,我们需要在闪电网络通道上引入一个物理类比——“锁(locks)“。”锁“可以被放置在Alice、Bob 和Carol 共同依附的那条“绳子“上并限制珠子的移动,只有当特定条件被满足的时候,”锁“才会被打开。闪电网络支付中使用的哈希时间锁定智能合约包含两种类型的”锁“(参见图2):
第一种是在提供正确密码的时候才能被打开的“锁“——我们称之为”哈希锁(hash-lock)“。
第二种是在一段时间延迟之后自动打开的“锁“——我们称之为”时间锁(time-lock)“。
图2:当哈希值达到指定值的时候(在本例中为45f8),输入密码即可打开哈希锁;而时间锁则是在指定时间过后就会被打开(在本例中为48 小时)。
现在,让我们重新回到Alice 通过Boc 向Carol 支付一个珠子的例子上。为了让这笔支付交易“去信任“,Alice、Bob 和Carol 需要同时在线,而且还要按照各方都设定好的方式参与交易。
首先,Alice 必须要求Carol 想出一个密码,并告诉她这个密码的哈希值。让我们假设想出的这个密码是“boondoggle“,而与之对应的哈希值是”45f8“。接下来,Alice 要在她和Bob 之间设置一个哈希锁,并且该锁必须要在输入哈希值是”45f8“的密码时才能被打开。此时,Alice 和Bob 都无法打开这个哈希锁,因为他们都不知道密码。Alice 之后会向这个哈希锁推送一个珠子,最后她会在自己的珠子上设置一个时间锁,并将其设置为48 小时之后打开(如图3 所示)。
图3,在了解到Carol 秘密设置的密码哈希值之后,Alice 可以设置一个哈希锁,并以此保护他转移给Bob 的代币(该代币之后会路由给Carol)。Alice 就会用时间锁锁定代币,如果Bob 未能在48 小时内完成付款,她就会把这笔钱取回。
如果能够在48 小时内找到Carol 设定的密码,Bob 就能拿到Alice 发出的珠子。与此同时,Bobby 也知道(因为Alice 会告诉他)Carol 会公布这个密码来换取他的一个珠子。为了诱使Carol 采取行动,Bob 可以在他和Carol 之间放置一个相同的哈希锁,其中放置了他自己的一个珠子,然后Bob 可以再设置另一个时间锁(如图4 所示)。他知道如果要让Carol 打开哈希锁并拿走珠子,Carol 必须要输入密码——很明显,这个密码会和Alice 设定给Bob 打开的那个哈希锁密码一样。
图4:如果Carol 在48 小时结束之前公布了Alice 的密码,那么Bob 会看到Alice 提供给他的代币。Bob 会设置相同的哈希锁,然后推送一个代币给Carol,并用一个时间锁锁定该代币。Carol 要获取Bob 这个代币的唯一方式,就是公布Bob 需要从Alice 那里获取代币的哈希锁密码。
Carol 看到自己要获取的那个珠子,然后在锁中输入密码“boondoggle“(Bob 可以看到并记住),该锁的CUP 确认了密码为“boondoogle”的哈希值是45f8,然后就打开了这个锁。接下来,Carol 把这个珠子顺着“绳子”移到了自己这边(如图5 所示)。
图5,Carol 公布了自己的密码,然后打开密码锁取出代币。
获取了Carol 的密码之后,Bob 用同样的方式解锁了Alice 给自己的珠子(如图6 所示),整个支付交易完成。
图6,获取了Carol 的密码之后,Bob 现在可以获取Alice 给自己的珠子,整个支付交易也因此完成了。
你可能想知道,为什么Bob 会是第一个参与整个流程的人?因为如果Carol 没有参与合作的话,Bob 的珠子会被一直冻结,直到时间锁过期。而在实际交易中,Alice 向Bob 发送的资金可能会比她给Carol 的资金更多一点,因为Alice 希望用这种方式作为Bob 工作的费用,或是避免出现不必要的风险。支付交易完成之后,Bob 的账户余额会比这笔交易完成之前的更多一点,从而也激励他能去完成这笔交易(或是类似的交易)。
当然,你可能也想知道在整个闪电网络交易过程中为什么要使用时间锁。事实上,如果支付交易因为各种原因未能成功,时间锁能够让交易参与各方收回自己的资金。举个例子,想象一下如果Alice 把珠子转移给Bob 并添加了哈希锁和时间锁之后,Bob 突然不合作处理这笔交易,此时时间锁就能帮助Alice 取回自己发送给Bob 的那个珠子,因为她只要等待时间锁到期就可以了。在此期间,Bob 根本无法偷走这个珠子,因为他需要Carol 的ima,而且如果Bob 不给Carol 转移一个珠子的话,他就无法获得这个密码,因此对于Bob 来说必须转出一个珠子,才能获得一个珠子。
如果你对闪电网络支付流程感兴趣的话,可以深入探讨一下如果其中一方在不同步骤中变得不合作,Alice、Bob 和Carol 会不会因为对方行为面临资金损失的风险。
闪电网络的肮脏小秘密
闪电网络有一个很少人知道的肮脏小秘密,如果想要了解这个秘密是什么,以及这个秘密对闪电网络支付交易会有什么影响——我们需要再深入挖掘一下。
现在让我们回想一下,当Alice 通过Bob 向Carol 发送一笔支付交易的时候,其中还存在一种“中间状态”(如图7 所示)。我们就直接用比特币来做解释,渠道状态包括三种输出:
1、Alice 的比特币;
2、Bob 的比特币;
3、“交易过程中(in flight)”的比特币。
图7,此时闪电网络通道状态交易包含了三种输出:Alice 的比特币、Bob 的比特币、以及“交易过程中”的比特币。
问题在于:如果交易过程中的比特币价值低于低于比特币粉尘(dust)阙值,此时这笔费用则不能在通道状态交易中表示为第三类输出!换句话受,如果支付金额太小,则无法使用哈希锁和时间锁来保护这笔交易。(星球君o-daily 注:粉尘就是那些金额太小的UTXO,把他们花费出去需要支付的手续费高出了其自身价值,所以粉尘就花不出去了。)
为了解释闪电网络如何处理这个问题,我必须要首先坦白一个问题,一开始例子中“绳子“上的珠子数量并不是固定不变的。实际上,每根”绳子“边上都应该还有一个”篮子“,这个”篮子“的标签是”矿工的费用“,其中包含了很小一部分珠子。”篮子“里的代币价值将会由确认通道状态交易的矿工声明,然后渠道状态会被推送到区块链上。也就是说,有一部分珠子会从”绳子“上移动到”篮子“里,或者从”篮子“里移回到”绳子“上,但这种情况只有当通道两端的人都同意时才会发生。
对于小额支付交易而言,Alice 和Bob 只是将“交易过程中的价值“移动到”费用篮子“里,而不是使用哈希锁和时间锁来锁定价值(如图8 所示)。Bob 相信Alice 会与他合作,而当他公布Carol 的密码的时候,” 交易过程中的价值“就会被他从”费用篮子“里拿出来。
图8,如果“交易过程中“的比特币低于粉尘阙值,则不能使用哈希时间锁定智能合约机制,因为在广播情况下通道状态交易无法被挖掘,此时”交易过程中“的代币会被倾倒进”矿工费用篮子“里。
Bob 随后可以将“交易过程中的价值“转储到他与Carol 分享的第二个”费用篮子”里,并且承诺如果自己知道密码之后就会把这个“篮子”给Carol。Carol 告诉了Bob 这个秘密,然后Bob 和Carol 一起把“费用篮子”里的这笔支付款转移到了Carol 的一侧。接下来,Bob 又回到Alice 这边,告诉了她Carol 的秘密,然后,如果一切顺利的话,Alice 也会与Bob 合作,把“交易过程中的价值”从“篮子”里取出来并放到“绳子”上Bob 的一侧。
与前面描述的哈希时间锁定智能合约不同,上述防范依赖于信任。比如,Carol 可以向Bob 透露密码,然后Bob 可以将付款留在“费用篮子”里,接着直接去找Alice 并告诉她密码就能拿到的这笔付款了。
在这种情况下,Carol 的追索权是非常有限的:她要么什么都不做,并且接受损失,要么关闭她与Bob 的通道。但是关闭与Bob 之间的通道又无法成全自己,因为那笔她理应收到的钱其实已经被发送给了矿工。
尽管上述问题听起来非常琐碎,但在实际情况下却真的能够运作起来。当然,Bob 没有什么特别的动机不把钱给Carol,但是如果他不给的话,对自己也没什么好处,因为矿工将会保留额外的资金,这笔钱并不会留在Bob 手上。不仅如此,如果Bob 真的这么做——即不把Alice 通过自己发送给Carol 的钱给Carol,Carol 很可能会关闭通道,这意味着Bob 是不值得信任的。这样看来,Bob 能够造成的损害似乎也比较有限,除了这笔支付交易的金额之外,还有就是构建一个新闪电通道的成本(因为Carol 已经关闭通道了)。
为什么“闪电网络肮脏的小秘密” 值得关注
闪电网络这个“肮脏的小秘密”非常值得关注,因为它揭示了第一层(L1)的问题(摩擦)已经转移到了第二层(L2)中,迫使第二层协议不得不实施复杂且难以理解的解决方案。在这种情况下,这些解决方案会改变闪电网络的“去信任”本质:对于高于粉尘阙值的支付交易,Alice、Bob 和Carol 都不会因为对方的任何行为而损失资金;而对于低于粉尘阙值的支付交易,Alice、Bob 和Carol 则有可能因为对方的过错而损失资金——显然,这与人们理解的闪电网络安全支付交易模式不一样了。
可能有人会争辩说:
“我们谈论的只是小微支付,所以谁会在乎这个问题呢?”
然而,这种想法其实并不对,原因有以下两点:
1、使用区块链作为高费用清算层的比特币核心扩容计划将会提升粉尘阙值。粉尘其实是那些金额太小的未花费交易输出,把他们花费出去需要支付的链上费用高出了其自身价值,所以粉尘就花不出去了。但是如果将粉尘阙值提升,比如100 美元,那么世界上绝大部分比特币交易可能都会变成“粉尘”;
2、一些小微支付交易可能会出现快速、连续地丢失(例如发生了一起闪电网络路由攻击),可能会造成重大损失。
想象一下,未来大部分支付交易都发生在闪电网络上,第一层上的交易费用一直都超过100 美元,此时主链上低于100 美元的粉尘输出就会变得没什么价值了,因为链上费用比交易金额本身还高。
现在闪电网络还有另一个问题:即使50 美元的支付交易也可能无法做到“去信任”,因为如果50 美元低于粉尘交易阙值的情况下(考虑到50 美元在第一层协议上也可能出现链上费用比交易金额本身还高的情况,因此未来设置这个粉尘阙值政策也是合理的),哈希时间锁定智能合约就不能用于保护50 美元以下的支付交易了,也就是说用户可能会因为自己的过错导致损失50 美元。
当然,如果为了避免这个肮脏的小秘密引发“循环漏掉(loop hole)”,开发人员可以尝试将粉尘阙值设置为1 美元,这样大多数闪电网络交易就可以继续使用哈希时间锁定智能合约来保障资金安全。但问题是,当粉尘阙值设置的较低,输出就不会被花费出去。
也有人觉得路由节点可能会丢失客户资金,如果未来粉尘费用阙值提升的话,这些丢失的资金规模可能会比较大。我同样也不太认同这种看法,因为闪电网络支付路由的全部目的就是以交易费来赚钱,通常路由会利用自己的费用优势吸引更多流动性,路由节点的交易量越多,费用自然也就越多。现在,闪电网络开发人员已经意识到不可能让全部用户都来路由支付交易,对于普通用户来说,开发人员更多地是鼓励他们使用非广告通道来进行支付交易,同时永远不要把自己变成一个路由。
如果未来闪电网络上的费用变得更高,那么一个路由中心(hub)则可以对用户资金进行有效的监管控制。然而路由中心其实也不可靠,对于一个独立用户来说,如果支付交易没有得到哈希时间锁定智能合约的保护,就很难在区块链上清算并收回资金。不仅如此,如果用户余额与链上费用处于同一数量级,用户也会被路由中心困住。事实上,摆脱一个“糟糕”的通道其实很不值得,因为这么做会让用户失去自己的全部资金。
此外,路由中心还会设定一些特定条件,比如出于反洗钱(AML)和“了解你的客户(KYC)”目的而不转接洋葱路由(onion-routing)信息。如果客户无法满足这些特定条件的话,路由中心就会无限期地锁定客户资金。这样一来,对用户来说他们唯一的选择就是要么在区块链上进行清算,要么就丢失全部资金——这根本就不算是真正的选择!更可怕的是,路由中心还可以设置高额费用,用户如果想要获得自己的钱,就不得不支付这笔钱,他们别无选择。
未来,那些连接状态较好、但却收取较高链上费用的闪电网络路由中心必须要受到监管,因为他们已经能够对其客户资金进行“托管控制(custodial control)”了。
因此,我们能不能设想推出一个这样的法则:
当第二层上的支付金额低于在第一层上可实行的支付交易金额,该交易就不能被“去信任”。
如果底层区块链不受约束,闪电网络就很可能无法像人们所期望的那样工作。
最后的话
未来,当大多数比特币交易都发生在闪电网络上,而且区块链也收取高额费用的时候,人们可能会发现闪电网络和预期的有很大不同,除了本文提到的这个“肮脏的小秘密”之外,其他闪电网络的潜在问题还包括:
1、闪电网络扩容的是交易,而不是用户。运行完整闪电网络交易验证节点的成本仍然很高;
2、第一层上的问题(摩擦)会影响第二层可互换性(fungibility),代币存在“位置依赖(position-dependent)”价值;
3、流动性:通过闪电网络交易,大多数“财富状态”其实是无法获得的,支付失败也是不可避免的;
4、如果闪电网络铺的很大,路由就会变得越来越难:闪电网络路由中心将集中化地减少路由和流动性问题;
5、对于使用非托管钱包的用户来说,体验总是很糟糕:用户需要在现上接收资金,然后还要雇佣“瞭望塔(watch towers)”来监控通道是否存在欺诈行为,并且订阅源路由服务来发送支付交易,甚至还要动态备份通道状态防止数据损坏。
6、系统性风险:闪电网络通道(热钱包)里需要锁定大量代币,这样才能确保提供足够的流动性;
7、当区块奖励用完的时候,第一层上的总矿工费将不足以确保区块链安全。