比特币的 “闪电网络” 解析
“闪电网络”算是比特币一个重要的扩展,它允许我们在日常生活中方便快捷地用比特币支付。想象一个场景:你今天去小卖部买一个零食,在如今支付宝微信横行的年代,你只需扫码支付便完成了交易,但如果你今天想用比特币来支付呢?我们知道常规比特币的上链确认最好要等6个区块,但这将近一小时的确认时间显然是不可接受的。
论文链接:https://lightning.network/lightning-network-paper.pdf
RSMC
说“闪电网络”之前需要先说说序列到期可撤销合约(RSMC,Revocable Sequence Maturity Contract)
RSMC是一个建立在付款人和收款人之间的一个“通道”。它的思路是这样的:双方都支付一定的保证金(为了保证公平,一般是等额的)到一个2-2的多重签名地址(这里的两个签名就是付款方和接收方的),并将该交易上链。这笔交易上链后双方私底下发送带有自己签名的交易即可完成转账(交易的金额应该小于保证金),私底下流通的带有签名的交易就像是一张支票,等你真正想兑换的时候,再把这笔交易传播出去让矿工们收到、上链并等待1小时的确认时间即可。这样就能达到双方可以在不需要信任对方、交易不上链的情况下,安全地交换比特币。(交易不上链只是暂时地,会有一定地时间限制)。
接下来我们看看RSMC的具体流程:
- 假如付款方是A,收款方是B,双方共同创建一个“每人提交5BTC保证金到2-2 AB多重签名账户”的抵押交易(Funding TX),但在这步,A B还都不对这笔交易签名(有可能还有找零输出和交易费,这里忽略):

- 在第一步中双方都先不对那笔抵押交易签名的原因是:如果这笔交易上链后,有一方故意作恶玩失踪,就会导致双方的钱都“卡”在2-2多重签名的账户中无法取出,虽然作恶方也受到了等额的损失,但受害方是“被迫”损失那些财产的。
所以在这一步,双方需要建立一个“保险栓”,能保证在对方故意作恶的情况下也能提出自己的保证金,因此有了如下四笔交易(每人两笔,总共四笔)。我们先看看A和B在这4笔交易中都干了什么:
A:(1)从2-2 AB多重签名账户中转5块给B,转5块给2-2 A2 B多重签名账户(这里的A2是A的一个临时私钥) (2)从2-2 A2 B多重签名账户转5块钱给A,但有1000个区块的时间锁
B:(1)从2-2 AB多重签名账户中转5块给A,转5块给2-2 A B2多重签名账户(这里的B2是B的一个临时私钥) (2)从2-2 A B2多重签名账户转5块钱给B,但有1000个区块的时间锁
为什么这个“保险栓”需要分成两笔交易(每人两笔,总共四笔)?为什么需要一个临时密钥(A2、B2)?为什么需要设置1000个区块的时间锁?这些问题稍后讨论。
A和B现在要做的是把各自创建的两笔交易发送给对方,让对方在交易上签名后再发回来。双方签名完了之后“保险栓”也算是建立完了,现在就可以把第一步的抵押交易签名上链,等待1个小时的确认时间后就可以正式开启支付通道了。我们分别叫这两笔“保险栓”交易为承诺交易(Commitment TX)和退款交易(Refund TX)。
- 在第一步的抵押交易被整个比特币网络确认后,就可以正式地开启A和B之间的支付通道了。A若想支付4BTC给B,双方就创建如下四笔交易:
A:(1)从2-2 AB多重签名账户中转9块给B,转1块给2-2 A3 B多重签名账户(这里的A3是A的一个临时私钥) (2)从2-2 A3 B多重签名账户转1块钱给A,但有1000个区块的时间锁
B:(1)从2-2 AB多重签名账户中转1块给A,转9块给2-2 A B3多重签名账户(这里的B3是B的一个临时私钥) (2)从2-2 A B3多重签名账户转9块钱给B,但有1000个区块的时间锁
双方再把各自创建的交易发送给对方,让对方在交易上签名后再发回来。当A在B创建的那两笔交易上签字后,B就可以放心地把零食给A,因为他所创建的交易上有A的签名,他只需要在这两笔交易上也签上字并通过比特币网络传播出去让矿工们打包上链,就可以收到对应的转账了。但这里面还有一个问题:此时此刻,A在第二步中创建的承诺交易和退款交易也有B的签名,如果A也在这两笔上签字并通过比特币网络传播出去,那就有50%的几率(瞎说的,就是有一定的几率)把A传播出去的这两笔交易打包上链——造成B给出了零食但又没收到钱。
为了防止这个问题,A就需要把第二步中的临时密钥A2也一起发给B,即B在这一步中需要收到A签完名的两笔交易、密钥A2两个东西后才能安心地把零食给A(为了方便后续B给A转账,B也应该把B2发给A)。当B有密钥A2后,A若把第二步中的交易传播到比特币网络中,B能立马用A2把钱取出做到反制(因为有1000个区块的时间锁,如果B在这段时间内把“反制”交易传播出去,矿工们就总是先确认“反制”交易)。这就是为什么需要一个临时密钥(A2、B2),同时也需要设置1000个区块的时间锁。
那为什么“保险栓”交易需要分成两笔交易呢(每人两笔,总共四笔)?这是比特币共识规则的限制:如果想把一笔交易设置为延迟确认(这里是1000个区块),那这一整笔交易都会是延迟确认的,就像是矿工过了好久才会收到这笔交易一样(注意,区别于“交易已经确认,但需要过一段时间才能消费”,“交易已经确认,但需要过一段时间才能消费”是在某一个输出的锁定脚本字段中加入CLTV时间锁,而“整笔交易延迟确认”是在交易的nLockTime字段填入延迟的时间)。所以需要把“保险栓”交易分成两笔交易,第一笔承诺交易中立刻把对应的钱转给对方,第二笔退款交易中延迟一段时间把钱转给自己避免自己作弊。 - 此后,A再想把钱转给B就只要重复第三步的操作即可,但不同的是发给B的临时密钥是上一次交易时用的临时密钥(A3、A4、A5...)。这个“通道”其实是满足A和B之间相互转钱的,B也做类似第三步的操作就也能向A发起转账。
- 某一方想正式关闭这个“通道”并结算金额时,只需把最后一次转账的交易签名并传播到比特币网络中,此后双方就再也不能用这个“通道”相互转账了——2-2 AB多重签名账户中的押金已经被取出了。但这种“单方面”地关闭通道会让关闭发起方有一点不适:需要过1000个区块才能收到钱。因此为了“和平结束”,双方最好再共同创建一个“结算”交易,并签好字传播到比特币网络中。

闪电网络和HTLC
虽然上面介绍的方法能让两个用户私底下快速转账且不需要信任对方,但还存在一个问题:建立这个“支付通道”需要一个小时,且需要一定金额的押金。在小卖部买东西时不可能等1个小时的建立时间,去多家小卖部也不行和每一家都建立一个“通道”(没那么多钱来支付押金)。
那如果A和B已经建立了“支付通道”,B和C之间也已经建立“支付通道”,那A是否可以通过B把前转给C呢?这就是“闪电网络”,每个用户在自己已经建立的连接中找是否有能通向目标用户的路径,就像一张大网一样(如果找不到还是依然要重新建立“通道”)。
闪电网络中用的是一种叫哈希时间锁合约(HTLC,Hashed Timelock Contract)的交易来把转账操作从A“传递”到C:这种交易的一个输出将会是一个带有IF...ELSE的脚本,如下所示。下面这段逻辑表示任何知道这个哈希值H的原始数据R的人都能领取这笔金额,或者在50个区块后可由A认领。我们称哈希值的原始数据为该哈希值的前图像(preimage)。
我们看看HTLC是怎么将转账操作从A“传递”到C的:由于A和B、B和C之间都已经建立了“支付通道”,因此直接来到上面说的第三步。在开始前A会先把哈希值H的前图像R发给C,然后A和B、B和C之间像上面第三步说的一样创建交易:
假设A转4BTC个给C,A会将生成的交易签名好发给B,同时一并发送私钥A2:
A:(1)从2-2 AB多重签名账户中转5块给B,转4块给知道哈希值H的前图像R的人、或者在50个区块后可由A认领,转1块给2-2 A3 B多重签名账户(这里的A3是A的一个临时私钥) (2)从2-2 A3 B多重签名账户转1块钱给A,但有1000个区块的时间锁
B:此时B不能建立交易,也不能把签名好的交易发给A。如果发了会导致A可以用带有B签名的交易加上R来把钱取走(一定几率下会成功)。
B在收到A签名好的交易和私钥A2后,生成如下交易并签名好发给C:
B:(1)从2-2 BC多重签名账户中转5块给C,转4块给知道哈希值H的前图像R的人、或者在25个区块后可由B认领,转1块给2-2 B3 C多重签名账户(这里的B3是B的一个临时私钥) (2)从2-2 B3 C多重签名账户转1块钱给B,但有1000个区块的时间锁
C:不需要生成交易
C需要把B生成的交易签名好发回给B,防止C长时间不提供R,B能在时间锁到期后取回钱;B在收到C签名好的交易后,需要把B2发给C,防止B用上一轮的承诺交易和退款交易来“反悔”。
由于C是知道哈希值H的前图像R的,所以他会创建一笔交易把R填到解锁脚本里,并把它和B创建的那笔交易一起传播到比特币网络中,以此来领走B的4BTC;B在看到C传播出来的交易后便知道了R,于是B也会创建一笔交易把R填到解锁脚本里,并把它和A创建的那笔交易一起传播到比特币网络中,以此来领走A的4BTC(A可以多转一点给B当作交易费,以此来激励B来帮他。一般这个交易费比真正上链时的交易费低很多)。而且B留给C的时间要比A留给B的时间来的短,这样B才有足够的时间“反应”。