比特币二层技术闪电网络原理浅析

比特币二层技术闪电网络原理浅析

什么是闪电网络

闪电网络是针对比特币这类区块链的 Layer2 扩容协议,目的是为了实现更快,更便宜的交易,以解决 Layer1 的拥塞问题。其实现方式为比较类似于支付通道和状态通道。其在支付通道的基础上,通过 HTLC (Hashed Timelock Contract ) 和 RSMC (Revocable Sequence Maturity Contract) 等技术实现了支付通道之间的连接,从而形成了支付网络。而支付网络使交易可以通过跳步路由的方式跨通道发生。

和 Rollup 对比

和目前以太坊中比较火热的 Layer 2 方案 Rollup 相比,闪电网络基本上是在比特币里发光发热,主要是因为闪电网络虽然扩展性很强,但是由于通用性上存在局限,使其几乎只能应用于支付场景。导致在主打智能合约的以太坊等链上,几乎很难和 Rollup 方案扳手腕。

闪电网络的优点:

  • 扩展性强:通道数量理论上可以无限扩展
  • 保密性强:很难追溯支付流转路径
  • 速度快:支付不用链上确认,交易确认速度很快
  • 小额支付方便:支持最少 1 聪的支付,并且支付快捷
  • 跨通道支付:可以跨通道支付

缺点:

  • 如果作为智能合约链的 Layer2,通用性差,只支持支付场景
  • 流动性池枯竭
    • 由于每个通道的流动性池完全独立,而且又大多是由一系列的小节点组成,所以容易发生流动性枯竭的情况,从而导致链路断掉。
    • 如果采用较为中心化的具备大量资金的节点来承担枢纽工作,又会导致系统的抗审查能力弱。
  • 使用难度大
    • 用户需要运行闪电网络节点,并了解如何开启和关闭通道。
    • 无法二次充值,需要把旧的通道关闭后,再重新开启一个新的通道来实现。
    • 为了保护自身利益,节点需要持续监测链上事件,以便能快速发起反制。虽然也有守望塔机制解决这个问题,也就是委托监测的方式,但是也存在安全风险。
  • 交易失败率大
    • 链路中出现流动性枯竭或者掉线等问题,都可能导致链路不通,从而交易失败。
    • 并且转账也需要交易的双方都同时在线,不然也会失败。
    • 取消可能失败的交易也比较麻烦,且都会导致资金被锁定一段时间。
  • 易被通道堵塞攻击
    • 这是一种 DoS 攻击,攻击者通过在闪电网络通道上给自己支付,从而以低成本的手段占用正常的支付通道。
    • 看似闪电网络的支付效率在链下是不受限制的,但其实受到链路方向上的流动性池资金量的限制。

闪电网络的优势在于快,易扩展且保密性强。但是缺点在于,通道的开启和关闭操作都比较重。而且为了接收,发送以及防止通道被恶意关闭,用户节点需要长期在线。除此之外,交易的成功率其实并不可靠,特别是交易流转的链路越长,失败的概率就越高。不过,交易失败虽然一定程度上影响流动性,但是一般并不会造成资金损失。

技术点&流程

其核心和状态通道/支付通道技术比较类似,但是新增了 RSMC 和 HTLC 等技术来实现了双向支付和跨通道支付的特性,从而构建出支付网络。

以下是技术点叠加:

  • 支付通道(单向):2-2多签以及时间锁
  • 支付通道(双向):在单向的基础上新增 RSMC
  • 支付网路(闪电网络):在双向的基础上新增了 HTLC ,一定程度上保证了跨通道支付的原子性

除此之外,闪电网络的每个支付通道本质上就是一个流动性池,支付就是资金在流动性池间流转。但是需要注意的是,不同通道的流动性池是彼此独立的,并不能直接进行资金流通。而且对于整个闪电网络来说,是不存在全局状态的。每个节点只需要关心自身运营的支付通道的状态。

支付通道开启

两个用户 A 和 B 之间可以开启一个资金可双向流动的支付通道。在开启支付通道的时候,A 和 B 都需要给支付通道押入一笔初始资金(假如都押入了 5 btc)。这时,A 和 B 都会收到一笔被对方签名的【承诺交易1】。拿着这笔【承诺交易1】,A 和 B 随时都可以去链上关闭通道。

A 手上的【承诺交易1】的内容是:B 立马获得 5 btc,A 延迟 T 个区块后获得 5 btc 。而 B 手上的则内容相反。

至于为什么自己的资金退出需要延迟执行,目的是为了防止有人恶意的将旧的【承诺交易】上链,从而谋利。关于这点,这就要说到 RSMC 机制了。为了防止旧的承诺上链,RSMC 实现了 “可撤销承诺” 机制,也就是每笔【承诺交易】都会带上一个只有发起人自己知道的【承诺密钥】。

比如 A 手上的【承诺交易1】的内容是 “B 立马获得 5 btc,A 延迟 T 个区块后获得 5 btc” 。这时的承诺密钥为 x1 ,只有 A 知晓,如果 B 知晓 x1 ,则 B 在 T 区块延迟内可以随意使用 A 的这 5 btc。

如果现在 A 想要转账 1 btc 给 B。那么 A 就需要构建新的【承诺交易2】,内容是 “B 立马获得 6 btc,A 延迟 T 个区块后获得 4 btc,上一个承诺密钥为 x1“。并更新新承诺密钥为 x2 ,依旧只有 A 知晓,如果 B 知晓 x2 ,则在 T 区块延迟内可以随意使用 A 的这 4 btc。

现在我们可以看到,如果 A 想要作恶,使用旧的【承诺交易1】上链关闭通道,由于 B 这时已经知晓了 x1 ,则可以在 T 区块延迟内将 A 的所有钱拿走。所以 A 不敢这样作恶。反之,B 也是一样的。

所以,闪电网络通过【可撤销的承诺交易】这种机制,解决了恶意提交旧承诺来作恶的问题。

支付交易

在闪电网络的支付过程中,可能发生【跨通道支付】,而所谓的【跨通道支付】实际上是由多笔【通道支付】组成的。也就是当前只存在 A → B 和 B → C 两个通道的情况下,如果 A 想要转账给 C ,那么实际上的发生逻辑是 A 先通过 ”A → B“ 转账给 B ,B 再通过 "B → C" 转账给 C 。为了让这两笔支付交易具备原子性,闪电网络采用了 HTLC (哈希时间锁) 技术。HTLC 的核心思想是:Alice 将 10 BTC 使用密文 Hash(s) 锁在 HTLC 内 x 天,等待 Bob 来取。在这 x 天内,掌握明文 s 的 Bob 可以通过 hash 匹配的方式取走 HTLC 锁内的资金。如果等待 x 天后,Bob 资金没有被取走,那么Alice 可以将资金取回。

现在假设 Alice 要给 Eric 支付 1 btc,但是 Alice 和 Eric 之间没有支付通道,那么正常情况下的支付流转过程详情如下:

  1. Eric 生成了一个秘密值 R,并把其对应的哈希值发给了 Alice(Eric 不会把 R 展示给其他人)
  2. Alice 使用这条哈希值创建了一个 HTLC,而时间锁设置为未来 10 个区块,输出的数额是 1.003 btc 。这额外的 0.003 btc 是给支付通道链条内的中间方的手续费。那么,Alice 现在用 HTLC 锁住了 1.003 btc,而 HTCL 的具体条件以大白话表述如下:“Alice 会给 Bob 支付 1.003 btc,只要他能在 10 个区块内交出秘密值 R,否则这些钱会返回给 Alice”。他们之间的通道的余额也会因为这笔承诺事务而发生相应变化,现在 Bob 在通道内拥有 2 btc,Alice 有 0.997 btc,还有 1.003 btc 锁在 HTLC 里面。
  3. 流转到了 Bob 这里,他可以随意处置 Alice 的承诺事务(这笔 HTLC 事务是通过他们之间的通道来发送的)。他在自己跟 Carol 的通道中创建了一个 HTLC 输出,数额是 1.002,时间锁设定为 9 个区块,使用了跟 Alice 所提供的同样的哈希值。Bob 知道 Carol 如果想获得这笔钱,就不得不找出秘密数值 R 来解锁这个 HTLC,而一旦Carol 她这么做了,Bob 也就会知道这个 R,因此也能解锁 Alice 的 HTLC,拿到 1.003 btc。如果 Carol 没法找到这个秘密值 R,Bob 和 Alice 就都能在时间锁解锁后拿回自己的钱。注意,Bob 发送的资金数额比自己能够得到的数额小 0.001 btc,这就是他收取的手续费数额。Bob 和 Carol 在通道内的余额变成:Carol 拥有 2btc, Bob 拥有 0.998 btc,还有 1.002 btc 锁在 HTLC 中。
  4. Carol 获得 Bob 发出的承诺事务之后,也如法炮制,在与 Diana 的通道中创建一个 HTLC ,使用的哈希值与 Bob 提供的无二,时间锁设置为 8 个区块,数额为 1.001 btc。如果 Diana 能在 8 个区块以内揭示这个秘密数值 R,就能解锁这个 HTLC,获得 1.001 btc,相应地,Carol 也会知道这个秘密数值,解锁 Bob 给她的 HTLC,获得 1.002 btc,赚得 0.001 btc。Carol 和 Diana 通道内的余额变成:Diana 拥有 2btc、Carol 拥有 0.999 btc,还有1.001 btc 锁在 HTLC 里面。
  5. 最终,当 Diana 将一个 HTLC(使用同一个哈希值作为锁)通过通道发送给 Eric 时,她把数值设为 1 btc,时间锁设为 7 个区块。Diana 和 Eric 的通道内余额变成:Eric 拥有 2btc、Diana 拥有 1 btc,还有1 btc 锁在 HTLC 里面。
  6. 现在,我们来到了这个连锁支付的终点。Eric 拥有这个秘密值 R,这个 R 的哈希值用在了所有的 HTLC 承诺事务中。Eric 可以解锁 Diana 发给他的 HTLC,获得 1 btc;而 Eric 取回资金之后,Diana 也会知道这个 R。Diana 与 Eric 的通道内余额会变成:Eric 拥有 3 btc,Diana 拥有 1 btc。
  7. Diana 收到这个秘密之后,也拿来解锁 Carol 发给她的 HTLC,获得 1.001 btc 的同时也向 Carol 公开了秘密值。他们通道内的余额变成了:Diana 拥有 3.001 btc,Carol 拥有 0.999 btc。
  8. Carol 收到秘密值 R 之后,解锁了 Bob 发过来的 1.001 btc,因此 Bob 也知道了这个秘密值。他们通道内的余额变成了:Carol 拥有 3.002 btc 和 Bob 拥有 0.998 btc 。
  9. 最后,Bob 使用秘密值 R 获得了和 Alice 通道中的 1.003 btc。于是通道内的余额变成了:Bob 拥有 3.003 btc,Alice 拥有 0.997 。

这样一个流程下来,Alice 就给 Eric 支付了 1 btc,无需在彼此间另开一个直接相连的通道。整个支付链条中,也没有人需要信任另一个人,而且他们还因为中介服务赚到了 0.001 btc 。即使支付在某个环节卡住了,也没有人会遭受损失,因为资金还锁在那里,时间过了就可以取回。

最后,在关闭通道时,通道的任何一方都可以随时使用【最新的承诺交易】来关闭通道。如果想要恶意的使用【旧的承诺交易】来关闭通道则会面临上面描述的惩罚。