美文网首页区块链区块链大学区块链研习社
链外扩容的鼻祖——闪电网络

链外扩容的鼻祖——闪电网络

作者: lencyforce | 来源:发表于2019-01-27 18:19 被阅读4次

目前区块链面临的最大问题就是扩容的问题。现在正经在运行的公链中,比特币每10分钟一个块,以太坊几十秒一个块。以这样的容量,稍微上一点点用户量就可以把整个网络拖垮,更不要提大规模的应用了。

什么?你问我EOS?那是什么?

当然DPOS的共识也是一个思路。但我觉得DPOS能够正确运行的前提是节点选举要有充分的竞争,持有投票权的用户们要是“理性用户”,这在现实情况下是做不到的。

话说回来,造成区块链系统低性能的原因是"共识"。"共识"就是保证整个P2P网络中的全部节点存储的数据都是正确的和一致的,少数的恶意节点无法对数据进行篡改或者是作弊,这是区块链的核心功能。

达成共识的基本思路是少数服从多数,因此传统的做法(拜占庭容错)就需要通过多轮次的节点间通信,保证每个节点拿到的数据都是网络中大多数节点同意的。基于BFT协议的每轮共识,都需要网络中任意两个节点间进行三次通信。这样子的话,每当网络中增加一个节点,就需要增加N * 3次网络通信(N是网络中节点总数)。当网络中节点特别多的时候,需要的网络通信次数就是一个天文数字了。这是为什么基于BFT的共识无法支持大量节点的网络的原因。我们当年用Fabric搭联盟链,基本上超过15个节点,系统就无法正常运转了。

PoW共识算法巧妙地将对于节点间通信的依赖转化成了对于算力的竞争,使得大规模的区块链网络成为了可能,同时也带来了巨大的性能瓶颈。PoS共识算法使用股东投票的方式避免了算力的消耗,使得性能得到了提升。以太坊最新的Casper升级中在PoS的基础上引入了分片,可以把性能提升几个数量级,这些都属于链上扩容的范畴,这里就不详细说了。

总的来说,将分布式系统的CAP理论应用到区块链我们可以得出,在网络规模较大的情况下,强共识和高性能是不可能同时满足的,只能做折中。分片技术其实也是通过降低了一部分共识强度换取了性能的提升。

在计算机体系里面,有一个思路是沿用了很多很多年没有变过的。

碰到解不了的问题怎么办?分层!

CPU速度快、存储量小,硬盘速度慢、存储量大,怎么办?分层!

于是在CPU和硬盘之间发展出了L1 Cache,L2 Cache,L3 Cache,内存,硬盘缓存这么多层。一层一层将速度和容量做不同程度的折中,最终的系统同时实现了高速度和大存储量。

同样的思路也可以应用在区块链系统中。底层区块链强共识、低性能。应用层弱共识、高性能。在中间插入一层(国外叫Layer 2,国内还没有名字,我一般叫做二级加速网络),做共识和性能的折中,三层结合起来,同时实现强共识和高性能。

在当年链上智能合约还没有火起来的时候,区块链的唯一用处就是Coin和转账。针对链上交易慢的问题采用分层的思想,就产生了闪电网络(Lightning Network)。后来将同样的思路应用在智能合约上,就成为了现在大家说的Layer 2、或者是状态通道(State Channel),Plasma是Vitalik提出的在以太坊上实现状态通道的一个框架。

在这一篇中我主要介绍闪电网络,状态通道的东西在下一篇写,下一篇也会再多介绍一些我们自己项目中的Layer 2设计。

闪电网络最早是作为比特币的一个扩展方案提出的。可以在不修改比特币的核心设计的情况下(还是需要一点小小的修改,在UTXO模型上支持一种新的转账类型,就是因为这个修改导致其很长时间内都没有被比特币采用),实现对于转账速度的提升。

提升转账速度的思路也很简单。链上交易不是慢嘛,那我们把交易拿到链下进行,只要最终在链上进行确认就好了。

这个过程分成了两步:

两个人之间的多次互相转账,中间的多次转账不上链,只在两个人之间以后不会再产生交易时、或者两个人中有人作弊时,才把最终的转账结果上链进行确认。

第一步中两个人之间可以随时进行链下转账,形成了一个两个人之间的“支付通道(Payment Channel)”,如果对这个支付通道做一个扩展,假如A和B之间有支付通道,B和C之间也有支付通道,那A和C之间可以通过和B之间的这两个支付通道完成转账。再进一步,任意两个人之间想要进行转账,只要能找到足够的中间人和支付通道,把这两个人连接起来,那这两个人就可以完成链下转账。

为了能快速地找到连接任意两个人之间的支付通道,需要另外的一些节点来记录已有的支付通道的信息,这些节点组成了另一个P2P网络,就是我们所说的闪电网络。当A和B之间想要进行一笔链下交易时,闪电网络中的节点通过路由算法在全网范围内寻找能够把A和B连接起来的支付通道,如果能够联通,就可以完成A和B之间的链下转账而无需发起比特币网络上的转账交易。

整个过程中最有意思的地方在于上述第一步的实现,也就是怎样在两个人之间做到链下交易、链上结算。

两个人A和B如果要开始使用闪电网络,需要先各自在链上锁定一部分Token,用于未来的交易结算。两人未来可以进行的转账操作,也必须在锁定的Token额度内。这部分Token的转移必须同时获得A和B的签名认可。A和B单方面无法将Token转移,只能发起清算,按照链上目前记录的各自的额度将Token转移回自己的账号。

然后A和B可以开始进行链下转账,每一笔链下转账,都要经过AB双方的签名确认,确认后的转账记录双方各自保存,不发送到比特币网络。直到双方决定以后不再进行转账了,把最后一次的转账记录发送到比特币网络,完成最终的清算。

比如,一开始,A和B各自锁定10个Token,开通支付通道。这时区块链网络上记录的结果是A和B各有10个Token。

然后A给B转账5个Token。A和B一起签名一笔交易,内容是A给B转账5个Token。这笔交易双方签名后各自保存,不发送到区块链网络。这时候区块链网络上记录的仍然是A和B各有10个Token。

然后B给A转账了3个Token。这时A和B一起签名一笔新的交易,内容是A给B转账2个Token。注意这笔交易的内容其实是两次交易的最后结果

这时A和B决定结束支付通道,到链上完成清算。A和B中的任意一个人广播最后的这笔A给B转账2个Token的记录到比特币网络,经比特币网络确认后,交易完成。

通过这样的操作,A和B之间实际进行了2次转账,但是比特币网络上只需要记录一次。配合整个闪电网络间的支付路由,这会极大减少比特币网络上的交易数,从而提升网络的整体负载能力。

那么问题来了,假如链下发生了多笔交易,其中作弊的一方选择将多笔交易中的一个中间状态上链,并且立即清算,可以做到抵赖链外的后续交易。

比如在刚才的例子中,假如在第二笔交易后,B选择将第一步中的交易记录发送到链上并完成清算,那么之后的B给A转账3个Token的交易就被取消了。假如第二笔交易是B从A那买了什么东西,那么B就做到了买东西不花钱。

闪电网络通过一个博弈来解决这个问题。其实博弈论,或者说是机制设计(Mechanism Design)在区块链系统中的使用还是很多的,经济激励体系本质上就是一个机制设计问题。

闪电网络中的博弈是这样的,两人在链下的多笔交易会记录一个经过双方确认的顺序。当其中一个人把链下交易发送到比特币网络上进行清算时,比特币网络会等待一段时间再进行清算,在这段时间内,假如有人发送了一个发生更晚的交易记录,那么之前提出清算请求的那个人会被惩罚,他锁定在链上的Token会被全部转移给对方。

通过这种方法,交易双方没有人敢把一系列链外交易中的中间某一笔交易发送到链上,从而防止作弊的情况发生。这也同时带来了一个问题,就是交易双发都需要时刻关注比特币网络上的交易状况,在对方作弊后立即提出作弊的证明。如果没有及时提出证明,对方的作弊仍然会成功。这也是闪电网络的一个用户不友好的地方。

目前闪电网络已经在比特币网络中运转了很久,闪电网络中的节点已经超过了4000个,负担了比特币网络中相当一部分的负载。同样的技术在其他一些Token中也得到了支持。

闪电网络技术在智能合约上的扩展形式"状态通道"支持对于智能合约区块链的链下扩容,有可能成为区块链系统扩容、支持大规模应用的关键钥匙。我会在下一篇文章中详细介绍状态通道、Plasma,以及我们自己在链外扩容上的一些尝试。

本文经「原本」原创认证,作者一个洋葱,访问yuanben.io查询【64MPU5S3】获取授权

相关文章

网友评论

    本文标题:链外扩容的鼻祖——闪电网络

    本文链接:https://www.haomeiwen.com/subject/zklnjqtx.html