链上扩容是针对区块链协议层的扩容,是对底层区块链进行改造,包括其数据层、网络层、共识层和激励层,使得区块链自身变得更快、容量变得更大,达到扩容的目的。本文将从共识层、网络层以及数据层出发介绍现有链上扩容技术。
数据层
有向无环图
DAG是一种数据结构。原本是计算机领域一种常用数据结构,因为独特的拓扑结构所带来的优异特性,经常被用于处理动态规划、导航中寻求最短路径、数据压缩等多种算法场景。
作为最新的分布式账本主力竞争技术,DAG可以用来解决传统区块链的效率问题。最早是在2013年的bitcointalk论坛中作为“Ghost协议”被提出,这一提议是为了解决当时比特币的扩容问题,Vitalik在以太坊紫皮书描述的PoS共识协议Casper,也是基于GHOSTPoW协议的PoS变种。后来,在NXT社区,又有人提出了DAGofblock,将DAG的拓扑结构用来存储区块并解决性能问题。
传统区块链只有一条单链,打包出块无法并发执行,而DAG的网状拓扑可以并发写入。通过将把同步记账提升为异步记账,DAG被认为可以解决传统区块链的高并发问题,是区块链从容量到速度的一次革新。
什么是有向无环图?
简单来讲,有向无环图就是多条支链跟随主链,这些链的大方向一致且不存在环路。
图:有向无环图数据结构
DAGvsBlockchain
资料来源:https://medium.com/@kotsbtechcdac/dag-will-overcome-blockchain-problems-dag-vs-blockchain-9ca302651122?
区块链的组成单元是block,DAG的组成单元是tx。
区块链是单线程的,DAG是多线程的。
区块链所有交易记录记在一个个区块中,DAG每笔交易单独记录在每笔交易中。
区块链上最新的区块只需要加入到最长的一条链上,DAG中的新增交易需要加入到之前的所有“链”上。
区块链需要矿工,DAG不需要矿工。
优点:
提高交易速度:DAG可以多线程交易,而区块链只能单线程交易,而且DAG中交易者越多速度越快。
节省成本:DAG把交易确认的环境直接下放给交易本身,因此不需要手续费,这一点将有助于提升交易量。
节约资源:DAG中没有矿工角色,所以不需要消耗社会资源。
缺点:
交易时间难确定:DAG是一种异步通讯模式,异步通讯所带来最大的问题在于一致性不可控,因此确认时间会更长。
双花问题难解决:DAG是多链结构,因此很容易出现双花问题,并且这个问题目前还没有很好地解决方案。
交易冗余:很容易出现多条链处理同一交易的情况、从而造成系统压力指数增长。
DAG?
项目:
图:DAG相关项目,图片来源:https://www.daglabs.io
IOTA、?Byteball?以及?NANO?作为代表项目,分别提出了各自的创新点,例如IOTA提出的Tangle是基于DAG的分布式账本结构。这几个项目其实挺有意思,这里先挖个坑,后面有时间来填。
总结
总的来说,DAG凭借其速度快、吞吐量高的优势,有望在区块链数据层这一块被使用以寻求突破。但作为一个较新的数据结构,其安全性和一致性等问题还亟待解决,大规模的测试也还需要一定时间。我们关注到,越来越多基于DAG的创新项目和DApp正源源不断的涌现,DAG值得我们保持持续关注。
隔离见证or扩块
我们知道,BTC的出块时间约为10分钟=600秒,每个区块的大小为1MB,每笔交易的交易状态和见证数据的大小约为250B,这样算下来,BTC的每秒交易上限约为1,000,000/250/600≈7tps(txpersecond)。7tps意味着什么呢,与现有的银联、支付宝等交易系统动辄上百万的tps相比,实在相形见绌。我们再来看看这个简单的公式,BTC的吞吐量由三个因素决定:分子——区块大小,分母——一笔交易的大小和出块间隔时间。
吞吐量≈区块容量大小/(交易数据大小*出块间隔时间)
出块间隔时间
中本聪在比特币网络中,使用difficulty参数,每间隔2016个区块会动态调节一次新区块的产生速率,使得平均出块时间约等于10min不变。这么做是有原因的,出块间隔时间是由验证时间、传播时间和共识时间构成的,一味降低出块间隔,会使得分叉率上升,BTC选择的10min作为出块间隔时间其实是对于网络效率和网络安全性的一个折衷。看来缩短出块时间带来的提升有限且对于BTC而言暂时是行不通的。
单笔交易大小
比特币的交易信息主要包括两个部分,交易状态和见证数据。这两个部分的数据大小约是相同的,实际情况是,并不是所有的参与者都需要关心这两部分数据。也就是说,如果将见证数据从从单笔交易数据中抽离出来,即使在区块大小不变的情况下,也能提升打包区块中的交易数量,从而提升比特币的吞吐量,这一技术,称为隔离见证。
隔离见证,即?Segregated?Witness,由PieterWuille在2015年12月首次提出。见证在比特币里指的是对交易合法性的验证。隔离指的就是把见证数据从交易信息里抽离出来,单独存放。
大致上隔离见证的底层数据变化如下:
1)SegWit为区块中定义了一个新的数据结构,增加了一个属性“witness”;
2)将原区块数据中的见证数据部分,挪到witness数据结构中,
并且该结构数据是与交易数据独立分开提交到区块中的。
3)在witness结构中的数据只与验证交易有效性有关,与实际的交易详情数据无关。
4)在“隔离见证”版本中,增加了一种新的权重计量单位:WU。每个区块的大小最大允许4MWU。
处在原始1MB区域中的数据,每1字节大小等于4WU;处在witness数据结构中的数据,每1字节大小等于1WU。
5)虽然隔离见证并没有直接提升原始区块大小,但将见证数据抽离,签名等信息后移,实际上的区块容量大小已经到了1.8MB
在此之外,隔离见证更主要的目标是
解决比特币的交易延展性问题。
为闪电网络铺路。(Ref:?BTCLightningNetwork)
虽然隔离见证能够将比特币进行一次软扩容,但仅仅使用隔离见证,在单笔交易大小上做文章带来的性能提升是有限的,与理想的性能之间仍然存在着好几个数量级的差距。
区块容量大小
也就是扩块。区块大小调整的话题争论喋喋不休,甚至牵扯到信仰与底层哲学,导致BTC、BCH、BSV三足鼎立的局面,详尽的来龙去脉请自行谷歌#区块链扩容之争#,在这里不再赘述。
简单来将,所谓扩块,就是将比特币的区块容量大小的限制由1MB扩大到2MB、4MB甚至TB级别,以求达到扩容的目的。我们试着来总结一下扩块之争这核心矛盾:
主要矛盾来自于比特币开发者团队内部,对于比特币的底层哲学以及信仰的分歧,有点虚,但的确是根本原因。
扩大区块容量大小,需要修改比特币代码,带来的直接影响是硬分叉,也就是后来的BCH、BSV等分叉链的出现,当然硬分叉本身具有两面性,仁者见仁智者见智。
区块大小的增加,对于需要下载整个账本的全节点来说,其硬件及网络的投入成本及维护成本会越来越高,这会使得资源集中的大型矿场愈发获得优势,越来越多的节点会被淘汰,而节点的减少将不利于整个网络的安全性和去中心化。
区块大小增加,对矿池而言需要更大的网络带宽和网络延时,对于拥有4/5大矿池但网络带宽不足的中国矿业来说,是难以接受的。往远了说,不公平竞争明显是违背区块链的愿景的。
我们再来看看比特币以及其两个分叉币:
BTC电子黄金,采用隔离见证+闪电网络的软扩容方向,区块大小仍保持1MB。
BCH电子现金,在2017年8月1日从BTC中分叉出BCH,将区块大小从1MB提升至8MB,并降低交易费用,号称自己才是中本聪“点对点电子现金系统”的真正体现。
BSV全球账本,2018年11月15日,BCH内部再次因为BCH的未来发展方向出现分歧,11月15日进行了硬分叉诞生了Nchain系BCHSV,区块大小为128MB。2019年7月24日,BitcoinSV进行了协议升级,区块上限调整为2GB。
我们再来看看这三条链的现状,如下图所示,BTC还是当之无愧的龙头老大,BCH和BSV的市值也分别成功挤进加密货币的前5位与前11位。
在线全节点数?BTC遥遥领先BCH和BSV,这从一方面代表了矿业及全网算力的支持度,也是硬分叉之后矿主用脚投票的结果。
从网络安全层面来看,BCH的算力维持在2.13EHash/s,约为BTC的1/40。BSV维持在903PHash/s,约为BTC的1/80。
链上交易次数?从图上看到的结果似乎差距没有那么大,但其实,另一项数据报告显示:BCH、BSV目前大部分是?OP_RETURN?操作码开头的数据记录输出,而非真正的交易。
如果某个交易输出,其锁定脚本以OP_RETURN操作码开头,这笔交易也被称为OP_RETURN交易,或NullData交易,会随交易一同被写到账本中,但不会被当成UTXO,不会带来UTXO集的膨胀,所以其金额通常为0。BCH和BSV对其数据大小的限制是220B。
BCH及BSV的交易手续费远远低于BTC,这得益于大区块所带来的以低手续费就能吸引矿工来打包区块的优势,以及BCH及BSV的设计策略。
图:BTC、BCH和BSV的现状
BTC、BCH、BSV关于区块链扩容之争,简单来讲,主要就是区块大小之争,那我们来看看这三者的实际区块大小与其区块大小上限的现状:
我们简单地使用公式区块使用率=区块实际大小/区块大小上限来得出。
BTC的区块使用率维持在80%左右,几乎出于满负荷的状态,可以想象一旦交易需求增长,网络将会陷入拥堵状态。值得注意的是,图中所统计的值是隔离见证以及闪电网络上线后的情况。
BCH及BSV的区块使用率通常不足1%,尤其是在BSV扩块到2GB之后更是如此。值得注意的是,BCH和BSV与BTC的交易构成完全不同,如上文所提及的那样,BCH和BSV大部分交易是由OP_RETURN交易构成的,而OP_RETURN交易的数据大小上限仅为220B,这是与BTC做对比的一个非单一变量。
图:2019年BTC、BCH、BSV实际区块利用率现状
其实在理论上,从设计的角度来讲比特币的区块大小是有上限的,在《OnScalingDecentralizedBlockchains》这篇论文中提到:
Theblocksizeshouldnotexceed4MB,giventoday’s10min.Averageblockinterval(orareductioninblock-intervaltime).A4MBblocksizecorrespondstoamaximumthroughputofatmost27transactions/sec.
根据论文中一系列的论证过程,得出的结论是:在目前区块间隔10分钟的情况下,区块大小不应该超过4MB,相应的吞吐量至多为27笔交易/秒。
总结
以上,我们分析了BTC与BCH&BSV不同的扩容策略:BTC采取的是不改变区块大小1MB的情况下,通过隔离见证+闪电网络的“软”扩容方案,而BCH、BSV采取的是扩块以及增加操作码的“硬”扩容策略。同时我们还分析了三者目前的现状,以及实际的区块利用率。
个人认为,BTC目前的链上扩容方案能够增强吞吐量及降低交易费用,但其瓶颈也显而易见,很难适应未来的大批量交易的需求,而BCH尤其是BSV的大区块策略,虽然能够有效提升交易吞吐量和降低交易费用,但由此引发的趋中心化的问题以及带来的安全性问题仍然是个巨大挑战,尤其是BSV将区块大小由128MB扩大到2GB这一行为在以上两个问题没有得到解决之前显得有些盲目,完全没有必要。似乎话题又回到了区块链的“不可能三角”问题,如何在扩展性、安全性、及去中心化这三个问题中寻找微妙的平衡,既是哲学,也是信仰。
网络层
分片
分片概念源于数据库领域。分片指数据库中数据的水平分区,每个分片都保存在一个单独的数据库服务器实例上,以分散负载。区块链分片的基本思路是将区块链网络中的节点分成若干个相对独立的分片,单个分片处理规模较小的事务甚至只存储部分网络状态,多个分片并行处理事务,理论上整个网络的吞吐量将会提升。
在Near的官网上看到一篇博客,介绍了主流分片协议的思想,非常值得参考。下面我们从这篇文章的观点出发,介绍分片技术分类以及分片所面临的挑战,来构建我们对这个区块链未来方向的协议的认知。
分片面临的挑战:
网络安全性
网络安全性最直接的挑战就是作恶成本降低,网络分片中通过将网络中的节点按照既定规则分配到不同的分片以达到扩容的目的,这会带来一个问题:单个分片中的算力大小和验证人节点数将远小于原来的整个网络,这将使得攻击单个分片较攻击整个网络的成本大大降低
针对PoW共识网络发起51%攻击
针对非PoW共识网络发起女巫攻击
分片前后作恶成本对比如下:
图:攻击非分片网络与攻击分片网络分区对比,图片来源:nearprotocol.com
针对网络安全性的问题,现在的分片设计主要思路集中在采用何种共识算法、如何划分分片大小、随机节点分配等来降低单片分片被攻击的概率以及提升作恶成本。
数据有效性
数据有效性主要是关于如何识别不合法区块。
典型的一个场景如下图所示,作恶节点共谋在1号分片上产生一个不合法区块B,在区块B中打包了一笔不合法交易使得Alice获得了1个token,作恶者之后在B区块之上出了一个合法区块C,企图混淆不合法区块B,并在C中发起一笔跨分片交易,将这1个token转移给了Bob,至此,不合法交易的token停留在了正确的分片2以及合法的区块Y中。
图:跨分片交易数据有效性问题示例,来源:nearprotocol.com
解决以上问题的一个有可能的方案是采用无向图的结构来排列分片,其中每个分片都与其他几个分片连接,并且仅允许相邻的分片之间执行跨分片交易,非相邻分片之间进行跨分片交易需要通过多个分片进行路由,每个分片中的验证人都需要同时验证本分片以及相邻分片的所有交易。采用这一实现的是?Kadena的Chainweb。
图:采用无向图的分片结构
有意思的是,虽然强制验证人同时验证相邻分片可以解决单个分片被攻陷的潜在风险,但是如果多个分片被攻陷的共谋作恶仍然会出现上述问题。例如下图:分片2与1、3相邻,但分片1与3不相邻,其中分片1、2是由作恶节点控制的分片,3是可信任分片。如果分片1、2共谋作恶,在分片1上产生的不合法交易通过跨分片交易在分片2中被确认并打包,请注意,此时在分片2上被打包的区块Y是完全合法的可以通过分片3验证人验证的,但分片3无法验证分片1上发生的不合法交易。
图:利用无向图解决数据有效性的失败场景,来源:nearprotocol.com
目前看到的正确解决数据有效性的主要方向有两个:钓鱼人机制和计算加密证明
钓鱼人机制
钓鱼人方案的思路是在有跨分片传递区块头信息时设置质疑期,期间任何诚实节点都可以提供区块无效证明,只要在分片中至少有一个诚实验证人节点,这种方法就能保证系统的安全性,如下图所示:
图:Fisherman机制示意,资料来源:nearprotocol.com
在目前提出的协议中,这是主要的方法,但是这会存在两个主要的缺点:
质疑期需要足够长,这样才能保证诚实节点能够下载潜在的无效区块并进行验证和发起质疑,这会降低网络效率。
第二个问题是质疑的存在使得攻击者可以将其作为新的攻击媒介,攻击者通过无效质疑向网络发起大量垃圾信息从而拖延诚实节点进行有效质疑,使不合法的交易顺利通过质疑期。
无独有偶,钓鱼人的机制也同样在其他扩容方案中被采用,虽然钓鱼人的方案已经比直接确认无效区块的方案要更优化,但以上两个问题的解决目前还没有看到较好的答案,后续发展值得关注。
简洁的非交互式知识论证
第二种解决方案是通过使用某种加密结构证明某个计算是正确执行的,关于SNARK以及zk-SNARKs是什么,请自行Google。这里推荐Zcash的一篇介绍文章:Whatarezk-SNARKs?
zk-SNARKs的主要挑战来自:
性能,创建证明本身需要一定的时间,例如?Coda?协议中每笔交易需要大约30s来创建证明。
该技术本身还处在初期研究阶段,也未经过长时间的测试。
“Toxicwaste”/“有废物”。SNARK依赖于一个信任预设,在这个预设中一部分人执行一些计算并会守信地丢弃掉计算中间产物。反过来,一旦所有参与者共谋并保留计算中间产物,那么造假和就会发生。
系统设计引入了额外的复杂性。
具有图灵完备的智能合约语言的协议将无法使用SNARK来证明链的有效性。
数据可用性
数据可用性简单来讲就是指一个区块上记录的数据是否可用。
通常,操作特定区块链的节点分全节点和轻节点。那么,在分片的场景下,每一个分片中的验证者实际上是该分片的全节点,而系统中的其他参与者则充当轻节点。
图:全节点共谋破坏数据可用性场景示意,资料来源:nearprotocol.com
现在,如果大部分的全节点共谋,它们可以生成一个有效或无效的区块,并将哈希提供给轻节点,套取利益,之后全节点不再分发这个区块内容,即使下个区块的验证人是可信的,也无法阻止节点恶意删除历史数据导致区块不可用的问题。而这类问题,在全节点数量更小的分片场景下,作恶成本更加低廉。
解决这一问题的辅助方法主要有监护证明和纠删码
图:监护证明示意图,资料来源:nearprotocol.com
监护证明的主要思路是让公证人比验证人更频繁地在分片之间轮换。公正人唯一需要做的事情是证明区块能够被下载即数据是可用的。因为公证人不需要下载完整的区块数据,所以可以更快、更频繁地在不同分片之间进行轮换和验证。
图:纠删码示意图,资料来源:nearprotocol.com
另一种思路是使用纠删码的结构,使得即使在区块的部分不可用的情况下仍然可以完整恢复整个区块。Polkadot和EthereumSerenity也在围绕纠删码进行设计,以保障其轻节点能够确认区块数据是可用的。
总结
本文中我们简单介绍了区块链扩容中链上扩容技术的一部分,包括数据层和网络层的主流思路和技术,在后文中,我们会主要从共识层展开来继续分析链上扩容,并对上卷的内容作一定补充,包括零知识证明等。
参考文献
TheauthoritativeguidetoBlockchainSharding,part1-NEARProtocol
UnsolvedProblemsinBlockchainSharding-NEARProtocol
深度介绍区块链链上扩容解决方案之分片Sharding
白话DAG:第3代区块链技术DAG全面盘点
下一代区块链DAG技术研究室
报告|比特币扩容之争始末
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。