闪电网络(Lightening Network)是比特币核心团队为了解决比特币网络容量不佳所提出的扩容方案,它实现了快速的链下转账,在需要结算时才会上链,所以实现了快捷的支付,且通过这链上、链下两层网络实现了对网络的扩容
闪电网络是基于微支付通道演进而来,创造性的设计出了两种类型的交易合约:
序列到期可撤销合约 RSMC(Revocable Sequence Maturity Contract)
哈希时间锁定合约 HTLC(Hash Timelock Contract)
其中: RMSC 解决了通道中币单向流动的问题,HTLC 解决了币跨节点传递的问题,这两种类型的交易组成了闪电网络
现有 A 和 B 经常有业务往来,所以准备各处 0.5 BTC 放入通道,以便于业务往来

构建 RSMC 的流程为:
双方各拿出 0.5 BTC,分别构建 Funding Tx A,Funding Tx B,且双方也建立 2/2 多签地址,用来储存这 1 BTC,相当于一个保证金账户,此时 Funding Tx 不签名(未生效)
A 构造 Commitment Tx:Ca1 和 RD1a,并交给 B 签名,Ca1 交易的第一个输出为多重签名地址,是 A 的第二把私钥 A2 和 B 的 2/2 多重签名, C1a 这笔交易的第二个输出为 B,转 0.5 BTC
RD1a 为 C1a这笔交易第一个输出的花费交易(将这笔输出花出去的交易),转账给 A 0.5 BTC,但此类型的交易带有 Sequence,作用是阻止当前交易进块(惩罚作用),只有前向交易有 Sequence 个确认才能进块
B 的操作与 A 对称,此时由于并未对 Funding Tx 进行签名,所以双方任何一方均无法作恶,任何一方也不会有损失
双方均完成对 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,与之前的步骤一致:

但有一个问题,之前的 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就可以用多重签名正常把钱取回自己的地址

上面的闪电网络图其实并不是每个节点之间都有支付通道,若 A 想给 C支付,就需要路由节点 B
A ---> B ---> C
这时就需要解决一个问题:如何保证中间的路由节点是诚实的?这就需要用到 HTLC(Hash Timelock Contract):
C 会选择一个随机密文 X,计算得到其哈希值,再将此哈希值交给 A
A 拿到哈希值后,会构建一笔转账给 B 的交易,这笔交易需要 B 拿到 X 才能解锁,且如果 B 在限定时间内没有解锁成功,这笔钱就会退回 A
B 从 A 处拿到哈希值,B 构建一笔转账给 C 的交易,C必须拿着 X 来解锁才能取走钱
C 输入 X 取走了钱,同时 B 也知道了 X,用 X 从 A 构建的交易中把钱取走,交易结束
*注:实际交易中,A 还需要支付 B 一定的路由费来激励 B 充当路由节点(但会比直接在链上交易便宜很多),同时还要注意两笔交易之间的哈希时间长度设置,第二步事件必须大于第三步时间,如果 B 在 A 关闭交易之后拿 X 来解锁,那么解锁将会失败
Reference:
