比特币二层技术-闪电网络

闪电网络浅析

Posted by Emo on June 28, 2023

比特币二层技术-闪电网络解析

EMO’s Blog

EMO’s Github

什么是闪电网络

闪电网络是针对比特币这样的区块链的Layer2扩容协议,目的是为了实现更快,更便宜的交易,以解决Layer1的拥塞问题。其实现方式比较类似“状态通道”,也就是“支付通道”,但是其通过 HTLC 和 RSMC 等技术来实现了“支付通道”之间的连接,从而形成了“支付网络”。“支付网络”使交易可以通过跳步路由的方式跨支付通道发生。

和 Rollup 对比

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

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

缺点:

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

技术点&流程

其核心和状态通道/支付通道技术比较类似,但是新增了 RSMC 和 HTLC 来实现了双向支付和跨通道支付。

以下是技术点叠加:

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

除此之外,闪电网络的每个支付通道本质上就是一个流动性池,支付就是资金在流动性池间流转。但是需要注意的是,不同通道的流动性池是彼此独立的,并不能进行资金流通。

对于整个闪电网络来说,是不存在全局状态的。每个节点需要关心的是自身运营的支付通道的状态。

支付通道开启

开启支付通道的时候,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 ,则在 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(他不会把 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,而一旦她这么做了,他就会知道这个 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。即使支付在某个环节卡住了,也没有人会遭受损失,因为资金还锁在那里,时间过了就可以取回。

支付通道关闭

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


{ % if page.mermaid % } { % endif % }