硬核科普:6000字读懂闪电网络原理

转载
2138 天前
13458
火星财经

来源:碳链价值    作者:白鱼   特别感谢:Conflux研究总监、密码学专家杨光博士为此文提供校对

说明:此文的思路取之于Aaron van Wirdum于2016年写就、发布于Bitcoin Magzine的《闪电网络三部曲》,许多基本说明的制图亦取之于此。在此对Bitcoin Magazine及Aaron van Wirdum先生本人表示感谢。想要查看英文原版的,链接见https://bitcoinmagazine.com/articles/understanding-the-lightning-network-part-building-a-bidirectional-payment-channel-1464710791/

闪电网络(LN)最近再次火爆,一方面是由于“闪电火炬“的传递,一方面是闪电网络节点数目的明显增加。据闪电网络浏览器(https://1ml.com/ )数据显示,全网节点已经达到6294,活跃节点达3235,资金量达到691BTC,通道数目为27030。

全球范围看,美国部署的节点最多,共929个,占节点总数的28.56%;来自美国的通道数共12008个,占节点总数的43.75%。其次是德国、法国、加拿大。


值得一提的是,美国的这929个节点大部分是商户,这其中不仅仅包括被人津津乐道的爱华斯披萨店、自由职业服务网站ND Work,还包括著名的社交软件商Twitter。Twitter首席执行官Jack Dorsey公开表示,正在尝试在推特上使用闪电网络进行比特币打赏,这个想法可能会在今年落地。甚至还有传言称,麦当劳美国也在测试比特币的闪电网络。

毫无疑问,美国正在刮起一阵“闪电网络”的旋风。如果这些商家最后都成功采用了闪电网络,这将给比特币的支付推广带来的影响不可小觑。

但可惜的是,这股风潮尚未在中国落地开花。闪电网络浏览器(https://1ml.com/ )显示,截至目前,中国一共只部署了11个节点,其中上海占4个,北京2个,江苏2个,相比起美国来说简直少的可怜。可以说,虽然闪电网络很重要,但它还未在国内引起足够的重视。


01 

直观图像

下面两张图分别是ACINQ开发的LN浏览器(https://explorer.acinq.co/ )展示的节点连接可视化拓扑图像以及比特币全球节点的分布图。从图中可以看出,闪电网络与比特币网络结构类似,它首先是一种软件,需要在本地部署一种独立的客户端,从而成为节点,然后节点寻找到活跃节点建立通道,最后连接成网络。

从下图中可以看出,欧洲和北美是闪电网络和比特币节点部署最多的地方,而在东亚、澳大利亚等地方也有部署,但数量较少。这种直观的初步认知对理解LN是非常有必要的。


闪电网络节点图


比特币网络节点图

02 

闪电网络原理白话版

很多人说闪电网络是比特币的未来,是趋势。但笔者始终觉得,如果不能理解底层的技术原理,就无以言对上层应用的深刻理解,更不足以谈对未来趋势的判断。接下来,我将在Aaron van Wirdum 编写的《闪电网络三部曲》的基础上,用更加通俗的语言介绍闪电网络。感谢Aaron van Wirdum绘制的交易结构图,这对我们理解闪电网络将会起到莫大的帮助。

理解闪电网络主要分为两步,一是理解双向支付通道,二是诸多通道扩展成闪电网络。

闪电网络想要解决的是比特币扩容、交易即时确认和手续费高的问题。举个例子来说明闪电网络整体思路,设想我们的老朋友Alice要给Bob转1个比特币,她该怎么做呢?

传统做法是Alice可以挑选出其未花费的输出用对应私钥签名,并向比特币网络广播,矿工验证打包,一般来说6个区块之后即可确认交易。这个过程很慢,需要等待一个小时左右,并且还要支付给矿工的手续费。于是呢,天才的程序员们碰撞出了闪电网络的解决方案。

操作过程是这样的,Alice和Bob先各自把5个BTC转给一个由两人共同控制的多重签名地址。这笔交易和比特币网络上其他普通交易没什么太大区别,只是转出的地址是一个多签地址。这个过程称为开启通道。

多重签名技术(multisig)是多个用户同时对一个数字资产进行签名。可以简单地理解为,一个账户多个人拥有签名权和支付权。如果一个地址只能由一个私钥签名和支付,表现形式就是1/1;而多重签名的表现形式是m/n,也就是说一共n个私钥可以给一个账户签名,而当m个地址签名时,就可以支付一笔交易。例如,多重签名2/3,表示3个人拥有签名权,而两个人签名就可以支付这个账户里的比特币;多重签名1/2,表示2个人拥有签名权,谁都可以单独来支配这笔资金。

开启通道后,这个多签地址里面就拥有10个比特币,这是被区块链记录了的,全网承认。接下来就是Alice和Bob私底下的交易了,不广播,不记在链上,正因如此,交易确认速度快,几乎零手续费(其实可能还有较低的路由费,后文会讲),这个过程称为链外交易,在交易通道(channel)中进行。(注意:有很多人问为什么闪电网络很快,我想说,没有第三方记账当然快啊。)

1.构建双向支付通道

什么是通道?怎么在通道进行交易呢?它安全吗?

简单来说,Alice和Bob都会在各自的小本本上记账,他们都知道对方怎么记的,且有密码学设计保证谁也不能多记耍赖。这当然也是由闪电协议精巧的设计保证的,后文再讲技术细节。

那么我们就可以想象出这样一个通道:在这个通道中,一开始Alice和Bob各有有5个,如果第一笔记“Alice有4个,Bob有6个”,这就相当于Alice给Bob转了1个比特币。如果,过了几天,Alice又要向Bob支付2个比特币,那么他俩会再记一次账,这次记“Alice有2个,Bob有8个”,同时上次记的“Alice有4个,Bob有6个”在两人共同确认后作废,也就是说,本次记账后,Alice只有2个比特币,她不能再拿出旧账单说“Alice有4个,Bob有6个”。

注意,在通道关闭之前,这10个比特币只能在Alice和Bob之间使用。也就是说,在不关闭通道的情况下,主网只知道多签地址有10个比特币,并不知道Bob已经拥有了其中的8个比特币,这就是所谓“双向支付通道”。

关于这个记账过程,EthFans翻译的《用算盘了解闪电网络》可以说很形象了。


之后Alice和Bob就可以在通道里过上你来我往的相互转账的愉快生活,远离主链的拥堵与高费用。这就好比俩人结婚了,夫妻们想要私下结算,只要俩人同意,想怎么算就怎么算。

天有不测风云,突然有一天,Alice不想和Bob这么转来转去了,想取出自己在通道里的钱去外面的花花世界潇洒快活。那么就需要关闭通道了,常有两种方式,一是协议离婚,如下图,这种方式很和平,双方共同从最开始的多签地址签名发起一笔交易分别转到两人各自控制的地址对应数额的比特币,同时将之前记在小本本上的所有旧账一笔勾销。


二是起诉离婚,Alice想离而Bob不想离,这时Alice可以单方面强制关闭通道,将小本本最后一笔交易广播出去,只要矿工验证并打包进区块,这婚也算离了,代价是Alice并不能立马得到比特币,需要等待一定时间。本着劝和不劝分的原则,闪电协议设置了哈希时间锁定合约,单方面强制离婚(关闭交易通道)会受到延迟收到退款的惩罚,这是为了保证双方交易的稳定。

以上最后一个过程是通道关闭。注意,不管是协议离婚还是起诉离婚,这都是要法院受理登记的。关闭通道一定要发起交易并广播到主网,最后矿工记录,所以还是要忍耐一定确认时间和支付手续费的,这与闪电网络无关。

至此我们已经知道了Alice和Bob链下互相转账的那点事儿了,这就是所谓“双向支付通道”。开启通道需要在主链交易,这是锁定资金,关闭通道也需要在主链交易,这是释放资金。中间可以进行任意多次转账支付,是0确认0手续费的。

2.将双向支付通道扩展成闪电网络

新问题来了,世界上除了这两位,还有Carol、Eric、Diana等等。设想Alice想转给Carol 1个BTC,她该怎么办呢?自然地,她俩可以再重复上述操作建立一个双向通道。但是,如果我们为了应用闪电网络,需要世界上每两个人之间都建立一条通道,这将是非常大的工作量且不切实际的。为了解决这一问题,我们需要将双向支付通道扩展成闪电网络。

假如Bob和Carol之间已经建立了支付通道,而Alice和Bob之间也有支付通道,那么Alice可以先把钱转给Bob再由他转给Carol,即Bob充当了支付的中间人,在网络里他就是一个路由节点。


如上图,B和C,A和B之间有通道, A和C就通过B来达成交易。更一般地,A和F可以经过B、D来交易。

当很多的节点相互建立通道,最后就会形成闪电网络。


03 

闪电网络原理技术细节版

通过上文,我们差不多了解了闪电网路是如何形成的。但是看完大家一定会觉得有哪里不对劲。哪里不对劲呢?

我们来回顾一下历史。

如果Alice和Bob完成了一笔交易,他们手头各自都有账本,在没有第三方见证的情况下,他们都可能把账本按照对自己有利的方向进行篡改。银行是怎么解决这个问题的呢?在传统的银行业中,由于Alice和Bob都信任银行,因此银行充当了双方都信任的第三方来进行记账,并且以第三方的账目为准,因此双方不管怎么篡改账本都没用。区块链是怎么解决这个问题的呢?区块链同样引入了第三方来充当记账者,虽然Alice和Bob都不信任记账者,但系统会想尽办法来保证记账者的诚实性。

但是到了闪电网络,请注意,这里再也没有一个第三方记账者了!Alice和Bob又重新拿回了他们的小本子,各自记起了各自的账本。问题在于怎么保证他们都诚实记账!

1.双方支付通道:如何使记账的双方保持诚实?

这是一个非常有意思的问题,使得我们的第一步——建立“双向支付通道”,变得难以维持了。那么,Alice和Bob这样两个完全不信任对方的陌生人,究竟该如何在没有主链矿工记录的情况下,相互转账交易?

作为铺垫,我们需要讲解两个概念,哈希时间锁定和哈希密钥锁定。首先是哈希时间锁定,这是在交易脚本里面设置时钟,必须要等设定时间之后,才能用地址的私钥签名解锁地址里的比特币。例如Alice收到了一笔2 BTC转账,但是对方设定了1000个区块之后才能解锁,所以Alice必须等待1000个区块之后才能用自己的私钥签署交易,花费其中的BTC转给Bob。


其次是哈希密钥锁定。哈希函数可以把一串输入转换成256位固定长度的输出,计算过程称为一次哈希运算,其中输入称为密文,输出称为密文的哈希值。哈希函数具有单向性,即从密文可以算出哈希值,但是从哈希值反向算出密文几乎是不可行的。计算的办法是暴力破解,逐一输入密文进行哈希运算,验证运算结果是否为要求的哈希值。基于这种特性,可以把一个密文的哈希值放入交易的输出当中充当哈希密文锁,也就是必须得输入该哈希值对应的密文才能解锁脚本中的比特币。例如,例如Alice收到了一笔2BTC转账,但是对方设定了哈希值锁定,所以Alice必须得到交易方的密文,同时配合自己的密钥签名才能签署交易,花费其中的BTC转给Bob。


有了这两个工具,让我们看看那群程序员天才们是如何构想出一个程序,使得互不相识的双方能够诚实记账的。

在原理的白话版我们已经讲过了关于通道的三个步骤:开启通道,通道内交易,关闭通道。

开启通道较为简单,Alice和Bob分别向多签地址1转入5个BTC。这是一个2/2地址,也就是必须两人都签名,此地址的比特币才可以转出去。


接下来是通道内交易,我们需要讲解Alice和Bob之间的两次交易才能完全明白双向支付通道的巧妙之处。第一次Alice需要向Bob支付1个BTC,第二次Bob需要向Alice支付1个比特币。

第一次交易的流程是,Bob首先在自己电脑的闪电网络软件上构建交易,如下左图所示。


Bob在构建交易时需要通过闪电网络软件的通信模块和Alice建立联系,获得Alice创建的密文的哈希值,然后把这个哈希值作为哈希锁放在自己构建的交易里。这笔交易Bob把10个比特币分别转给Bob控制的普通地址6个和另一个“多签地址2”4个BTC。(通俗来讲,就是A和B的财产放在一起,但是B主动从A那里要了一把锁把A的财产锁住了,没有A的钥匙B也无法打开。)

多签地址2是一个1/2地址,也就是两个条件有一个满足即可解锁。具体来说,需要Bob用自己的私钥和Alice的密文(此时Bob只有密文的哈希值,并不知道密文,所以Bob是不可能获得这6个比特币的)同时来解锁;或者Alice等待1000个区块后用私钥来解锁。如下图,这两个条件是双向支付通道的精髓所在,请先记住它,稍后分析中会讲设计的原因。


Bob构建完交易后会签名,然后把这笔未完成的交易以点对点方式发送给Alice,而不是广播到全网。显然,上述交易是对Bob有利的,一旦Alice签名并广播,Bob可以立即获得6个比特币,而Alice需要等到1000个区块之后才能拥有4个比特币。这也就是上文提到的单方面“起诉离婚”会受到延时惩罚的技术实现细节。然而,这笔对Bob有利的交易的主动控制权却掌握在Alice手里,因为Alice不签名并广播的话,这笔交易暂时不会生效的。

在Bob创建这笔对自己有利的交易同时,Alice也创建了类似的一笔对自己有利的交易,两者是一种镜像。这个过程相当于是Alice帮Bob在他的小本本上记了一笔账,这10个比特币Bob占6个,Alice占4个,同理Bob也帮Alice记账了。具体来说,就是Alice电脑里保存着Bob创建并签名的未完成交易,Bob保存着Alice创建并签名的未完成交易。两者合在一起,就完成了他们之间第一笔交易的记账过程,完整过程如下图


这个过程并不需要互相信任,只需双方同时在线,建立联系并交换哈希值,再在各自的电脑里创建交易最后发送给对方。整个过程不需要经主链由矿工打包确认,所以非常快速并且没有手续费。也可以看到,任何一方都可以随时强制关闭通道,将自己占主动权的交易签名并广播全网,代价是1000区块延时。

但是这里仍然有一个问题,就是外界无法知道通道内的交易次序,因此无法鉴别通道关闭后广播出去的交易,是否为最终交易。例如,如果双方在这个通道里不断发生交易,最后导致Alice手中有9个,Bob手里有1个,但假设最后Bob强制关闭交易通道,并广播出去Alice有5个,Bob有5个,Bob便能凭空赚得4个。(虽然这4个要等到1000个区块后才能获得,但这是值得的。)该怎么解决这个问题呢?

这次我们就要再次用到上文提到的哈希密钥锁了。

现在我们考虑过了两天,Bob要向Alice转1个BTC,即双方发生第二笔交易B。类似他们仿照上述第一笔交易操作进行第二次记账,此时应当是Alice 5个,Bob 5个。


一个最大的区别是建立第二笔交易B之前,两人会相互交换第一笔交易中的密文,即对方第一把锁的钥匙。这么做的目的在于作废第一笔交易记录A,使得两人都只能承认最新的交易记录B有效。

设想Bob在第一笔记录中拥有6个比特币,而第二笔记录变成了5个,那么如果他想作弊去签名并广播第一条记录呢?

结果是他将失去通道内所有的比特币!

因为Bob签名并广播了下图交易之后,Alice立马会获得4个BTC,同时Bob则必须等待1000个区块之后才能解锁6个BTC。然而,由于此时Alice已经获得了密文即钥匙1,所以Alice可以赶在Bob之前解锁这6个BTC。综合来看,只要Bob想要广播旧交易记录,他就会一无所有。


有了能作废旧账的保证,双方就可以在通道内反复任意多次交易,每次交易之后的状态都是资金池资金的划分比例的最新确认状态。

最后,关闭通道。如本文第二部分所讲,有两种方式关闭通道,一是单方面强制关闭,即某一方将自己控制的最新交易签名后广播出去即可。二是商议后关闭,此时双方再从最开始的多签地址构建一笔交易。


至此,我们明白了如何在无信任的条件下如何建立双向支付通道。

2.闪电网络:如何使路由节点保持诚实?

同样的,在建立闪电网络的时候,我们同样会遇到信任问题:Alice想转给Carol 1个BTC,需要经过Bob,但Bob会担心自己给Carol转1BTC后,Alice耍赖;同样Alice会担心如果先给Bob转了1BTC,Bob也耍赖不转给Alice。在传统的金融系统中,是由大型知名金融中介机构的信用提供保证的。但闪电网络中,并没有这样一个独立于交易者的第三方去提供信用担保。

闪电网络采用了一种HTLC(哈希时间锁定合约)完美解决了这个问题。


过程是这样的,第一,Carol会选择一个随机密文并运算得到其哈希值,再将此哈希值交给Alice。第二,Alice拿到哈希值后,会构建一笔转账给Bob的交易。这笔交易需要Bob拿到Carol的密文才能解锁,如果Bob在限定的时间内没有解锁成功,这笔钱则退回给Alice。第三,Bob从Alice处拿到哈希值,他也构建一笔转账给Carol的交易,Carol必须拿密文来解锁。第四,当Carol提供密文从Bob处获得1个BTC,Bob立马会拿密文从Alice处获得1个BTC,这就完成了从Alice给Carol转账的任务。

上述过程可以看作一个智能合约。故事类似于这样:A想经过B转账给C,那么C先给A一把锁,C有钥匙A有钱。A跟B说,你从C那里拿到了钥匙,我的钱就是你的了。B就拿着锁去找C,用钱跟C换钥匙,然后拿钥匙去换A的钱。如此一来,就实现了钱和锁从A到B再到C,钥匙从C到B再到A的一个流转。

当然,在实际操作过程中,Alice给Bob转账金额需要大于1个BTC,支付必要的路由费以激励Bob充当路由节点。其次,要注意两笔交易之间的哈希时间长度设置,第二步时间必须长于第三步时间。如果Bob在Alice关闭交易之后拿到Carol的钥匙,他将无法找Alice拿回1个BTC。


到这里,我们已经明白了闪电网络中通过路由节点达成交易的技巧,最后一步只需把之前两步整合进交易即可,就不再赘述了。

闪电网络原理科普就到这里了,下一篇笔者会讲一下闪电网络对改善比特币扩展性的优势与不足,包含路由节点中心化,路由费等问题。