# 比特币扩容方案-闪电网络 Lightening Network 机制详解

By [damian-dyor.eth](https://paragraph.com/@damian-dyor) · 2023-04-03

---

0\. 前言
------

闪电网络（Lightening Network）是比特币核心团队为了解决比特币网络容量不佳所提出的扩容方案，它实现了快速的链下转账，在需要结算时才会上链，所以实现了快捷的支付，且通过这链上、链下两层网络实现了对网络的扩容

闪电网络是基于微支付通道演进而来，创造性的设计出了两种类型的交易合约：

*   **序列到期可撤销合约 RSMC（Revocable Sequence Maturity Contract）**
    
*   **哈希时间锁定合约 HTLC（Hash Timelock Contract）**
    

其中： RMSC 解决了通道中币单向流动的问题，HTLC 解决了币跨节点传递的问题，这两种类型的交易组成了闪电网络

> 1\. RSMC（建立两个节点间的快速转账通道）
> ------------------------

现有 A 和 B 经常有业务往来，所以准备各处 0.5 BTC 放入通道，以便于业务往来

![Fig 1. 构建 RSMC 的流程](https://storage.googleapis.com/papyrus_images/a3bf8173cf2ce73edd9c4cdd168104183d7b5b95953f1b31bacfe4a303d99c6b.jpg)

Fig 1. 构建 RSMC 的流程

构建 RSMC 的流程为：

1.  双方各拿出 0.5 BTC，分别构建 Funding Tx A，Funding Tx B，且双方也建立 2/2 多签地址，用来储存这 1 BTC，相当于一个保证金账户，此时 Funding Tx 不签名（未生效）
    
2.  A 构造 Commitment Tx：Ca1 和 RD1a，并交给 B 签名，Ca1 交易的第一个输出为多重签名地址，是 A 的第二把私钥 A2 和 B 的 2/2 多重签名， C1a 这笔交易的第二个输出为 B，转 0.5 BTC
    
3.  RD1a 为 C1a这笔交易第一个输出的花费交易（将这笔输出花出去的交易），转账给 A 0.5 BTC，但此类型的交易带有 Sequence，作用是阻止当前交易进块（惩罚作用），只有前向交易有 Sequence 个确认才能进块
    
4.  B 的操作与 A 对称，此时由于并未对 Funding Tx 进行签名，所以双方任何一方均无法作恶，任何一方也不会有损失
    
5.  双方均完成对 Commitment Tx 的签名并交换后，各自再对 Funding Tx 进行签名，此时 Funding Tx 是完整的交易，之后广播交易
    

_\*注：图的左侧为 A 可见内容，右侧为 B 可见内容，A & B 2/2多签地址也是二人共同可见；C1a，C1b 这两笔交易画的钱正是两人共同建立的多签地址中的钱（A & B 2/2 多签地址）；C1a，C1b 中的第一个输出（0 号）实际去向也是一个多签地址，要把里面的钱转出也需要2个人的签名_

C1a 与 C1b 两笔交易花费的是同一组输出（两人共同建立的多签地址），所以两笔交易如果同时发布，只有其中一个可以进入区块，若 A 签名并发布了 C1a 交易，则按照交易， B 可以立即获得本就属于他的 0.5 BTC，二另外 0.5 BTC 先进入 A2 & B 的多签地址，此时 A 再签名 RD1a ，想取出 0.5 BTC，但由于 Sequence的缘故，要等 1000 个区块的确认才可以取出来，也即约 7 天：

    1000 × 10min ÷ 60 ÷ 24 ≈ 7 days
    

也就是说，**单方面毁约的人会延迟拿到币，另一方则是立即就可以拿到币**

通道建立好后，此时两个人开始交易，A 和 B 都拥有 0.5 BTC，此时 A 从 B 处购买了一件商品，价格为 0.1 BTC，那么 A 的余额变为 0.4 BTC，B 的余额变为 0.6 BTC，为了完成这笔交易，需要重新构建 Commitment Tx，对于 A 来讲是 C2a 和 RD2a，对 B 来讲是 C2b 和 RD2b，与之前的步骤一致：

![Fig 2. 重新构建 Commitment Tx](https://storage.googleapis.com/papyrus_images/66b1e83ec90c0c3d47b89eea46f87b068cbb2a2f20d1f764a639a969648c055b.jpg)

Fig 2. 重新构建 Commitment Tx

但有一个问题，之前的 C1a，RD1a，C1b，RD1b 交易签名后依然可以发布，这样很有可能会使一方的利益受损，如何才能废掉之前的交易呢？

其实在产生 C2a，RD2a，C2b，RD2b 之前，双方需要互相交换 A2，B2 私钥，这样即使 A 在完成交易后，私自发布 C1a 交易想抵赖这 0.1 BTC，那么在 1000 个区块确认时间之内，B都可以 拿着 A2 私钥，将 RD1a 的转账人改成自己，这样 A 不但得不到这 0.1 BTC，还会损失剩余的所有钱

关闭交易通道时，A，B就可以用多重签名正常把钱取回自己的地址

> 2\. HTLC（将双向支付通道扩展为闪电网络）
> ------------------------

![Fig 3. 闪电网络](https://storage.googleapis.com/papyrus_images/76a94e7224418855b537359d47bf318d22d1f21b54cbcd6457e8edee551139a7.jpg)

Fig 3. 闪电网络

上面的闪电网络图其实并不是每个节点之间都有支付通道，若 A 想给 C支付，就需要路由节点 B

    A ---> B ---> C
    

这时就需要解决一个问题：如何保证中间的路由节点是诚实的？这就需要用到 HTLC（Hash Timelock Contract）:

1.  C 会选择一个随机密文 X，计算得到其哈希值，再将此哈希值交给 A
    
2.  A 拿到哈希值后，会构建一笔转账给 B 的交易，这笔交易需要 B 拿到 X 才能解锁，且如果 B 在限定时间内没有解锁成功，这笔钱就会退回 A
    
3.  B 从 A 处拿到哈希值，B 构建一笔转账给 C 的交易，C必须拿着 X 来解锁才能取走钱
    
4.  C 输入 X 取走了钱，同时 B 也知道了 X，用 X 从 A 构建的交易中把钱取走，交易结束
    

_\*注：实际交易中，A 还需要支付 B 一定的路由费来激励 B 充当路由节点（但会比直接在链上交易便宜很多），同时还要注意两笔交易之间的哈希时间长度设置，第二步事件必须大于第三步时间，如果 B 在 A 关闭交易之后拿 X 来解锁，那么解锁将会失败_

Reference：

硬核干货｜6000字读懂闪电网络原理

[Subscribe](null)

---

*Originally published on [damian-dyor.eth](https://paragraph.com/@damian-dyor/lightening-network)*
