区块链链上扩容导论(上)
链上扩容(即一层扩容)是针对区块链协议层的扩容,是对底层区块链进行改造,包括其数据层、网络层、共识层和激励层,把区块链自身变的更快、容量变的更大,达到扩容的目的。本文将从共识层、网络层以及数据层出发分析现有扩容技术。链上扩容这一层如下图蓝色部分所示:

数据层
有向无环图
DAG(Directed Acyclic Graph,有向无环图)是一种数据结构。原本是计算机领域一种常用数据结构,因为独特的拓扑结构所带来的优异特性,经常被用于处理动态规划、导航中寻求最短路径、数据压缩等多种算法场景。
作为最新的分布式账本主力竞争技术,DAG 可以用来解决传统区块链的效率问题。最早是在 2013 年的 bitcointalk 论坛中作为“Ghost 协议”被提出,这一提议是为了解决当时比特币的扩容问题,Vitalik 在以太坊紫皮书描述的 PoS 共识协议 Casper,也是基于 GHOST PoW 协议的 PoS 变种。后来,在 NXT 社区,又有人提出了DAG of block,将 DAG 的拓扑结构用来存储区块并解决性能问题。
传统区块链只有一条单链,打包出块无法并发执行,而 DAG 的网状拓扑可以并发写入。通过将把同步记账提升为异步记账,DAG 被认为可以解决传统区块链的高并发问题,是区块链从容量到速度的一次革新。
什么是有向无环图?
简单来讲,有向无环图就是多条支链跟随主链,这些链的大方向一致且不存在环路。

DAG vs Blockchain

区块链的组成单元是 block(打包多笔交易的区块,至于区块容量之争暂且不表),DAG 的组成单元是 tx(交易)。
区块链是单线程的,DAG 是多线程的。
区块链所有交易记录记在一个个区块中,DAG 每笔交易单独记录在每笔交易中。
区块链上最新的区块只需要加入到最长的一条链上,DAG 中的新增交易需要加入到之前的所有“链”上。
区块链需要矿工,DAG 不需要矿工(不需要打包、验证交易)。
优点:
提高交易速度:DAG 可以多线程交易,而区块链只能单线程交易,而且 DAG 中交易者越多速度越快。
节省成本:DAG 把交易确认的环境直接下放给交易本身,因此不需要手续费,这一点将有助于提升交易量。
节约资源:DAG 中没有矿工角色,所以不需要消耗社会资源。
缺点:
交易时间难确定:DAG 是一种异步通讯模式,异步通讯所带来最大的问题在于一致性不可控,因此确认时间会更长。
双花问题难解决:DAG 是多链结构,因此很容易出现双花问题,并且这个问题目前还没有很好地解决方案。
交易冗余:很容易出现多条链处理同一交易的情况、从而造成系统压力指数增长。
DAG 项目:

IOTA、 Byteball 以及 NANO 作为代表项目,分别提出了各自的创新点,例如 IOTA 提出的 Tangle(缠结)是基于 DAG 的分布式账本结构。这几个项目其实挺有意思,这里先挖个坑,后面有时间来填。
总结
总的来说,DAG 速度快、吞吐量高,但作为一个很年轻的数据结构,安全性和一致性还有待更多验证和认可,应用场景也还不像传统区块链那么广泛。但 DAG 技术的优势和创新速度已经崭露头角,越来越多后继基于 DAG 的创新项目和 DApp 正源源不断的涌现。
隔离见证 or 扩块
我们知道,BTC 的出块时间约为 10分钟 = 600 秒,每个区块的大小为 1 MB,每笔交易的交易状态和见证数据的大小约为 250 B,这样算下来,BTC 的每秒交易上限约为 1,000,000 / 250 / 600 ≈ 7 tps(tx per second)。7 tps 意味着什么呢,与现有的银联、支付宝等交易系统动辄上百万的 tps 相比,实在相形见绌。我们再来看看这个简单的公式, BTC 的吞吐量由三个因素决定:分子——区块大小,分母——一笔交易的大小和出块间隔时间。
出块间隔时间
中本聪在比特币网络中,使用 difficulty 参数,每间隔 2016 个区块会动态调节一次新区块的产生速率,使得平均出块时间约等于 10min 不变。这么做是有原因的,出块间隔时间是由验证时间、传播时间和共识时间(BTC: PoW 时间)构成的,一味降低出块间隔,会使得分叉率上升,BTC 选择的 10 min 作为出块间隔时间其实是对于网络效率和网络安全性的一个折衷。看来缩短出块时间带来的提升有限且对于 BTC 而言暂时是行不通的。
单笔交易大小
比特币的交易信息主要包括两个部分,交易状态(基于 UTXO 的交易明细)和见证数据(验证交易的合法性,主要是签名)。这两个部分的数据大小约是相同的,实际情况是,并不是所有的参与者都需要关心这两部分数据。也就是说,如果将见证数据从从单笔交易数据中抽离出来,即使在区块大小不变的情况下,也能提升打包区块中的交易数量,从而提升比特币的吞吐量,这一技术,称为隔离见证。
隔离见证,即 Segregated Witness (简称 SegWit),由 PieterWuille (比特币核心开发人员、Blockstream 联合创始人)在 2015 年 12 月首次提出。见证(Witness)在比特币里指的是对交易合法性的验证。隔离(Segregated)指的就是把见证数据从交易信息里抽离出来,单独存放。
大致上隔离见证的底层数据变化如下:
在此之外,隔离见证更主要的目标是
解决比特币的交易延展性(Transaction Melleability)问题。(Ref: Transaction Melleability Explained)
为闪电网络铺路。(Ref: BTC Lightning Network)
虽然隔离见证能够将比特币进行一次软扩容,但仅仅使用隔离见证,在单笔交易大小上做文章带来的性能提升是有限的,与理想的性能之间仍然存在着好几个数量级的差距。
区块容量大小
也就是扩块。区块大小调整的话题争论喋喋不休,甚至牵扯到信仰与底层哲学,导致 BTC、BCH、BSV 三足鼎立的局面,详尽的来龙去脉请自行谷歌#区块链扩容之争#,在这里不再赘述。
简单来将,所谓扩块,就是将比特币的区块容量大小的限制由 1 MB 扩大到 2 MB、4 MB 甚至 TB 级别,以求达到扩容的目的。我们试着来总结一下扩块之争这核心矛盾:
主要矛盾来自于比特币开发者团队内部,对于比特币的底层哲学以及信仰的分歧,有点虚,但的确是根本原因。
扩大区块容量大小,需要修改比特币代码,带来的直接影响是硬分叉。也就是后来的 BCH、BSV 等分叉链,在某种程度上这会削弱比特币的地位。
区块大小的增加,对于需要下载整个账本的全节点来说,其硬件及网络的投入成本及维护成本会越来越高,这会使得资源集中的大型矿场愈发获得优势,越来越多的节点会被淘汰,节点的减少将不利于整个网络的安全性和去中心化。
区块大小增加,对矿池而言需要更大的网络带宽和网络延时,对于拥有 4/5 大矿池但网络带宽不足的中国矿业(以及所有不占网络优势的矿主)来说,是难以接受的。往远了说,不公平竞争,这会导致美国在互联网时代所累积的雪球(根服务器等网络优势)将继续在区块链网络中越滚越大,北美的矿业将迅速碾压世界,这明显是违背区块链的全球化愿景的。
我们再来看看比特币以及其两个分叉币:
BTC 电子黄金,采用隔离见证 + 闪电网络的软扩容方向,区块大小仍保持 1MB。
BCH 电子现金,在 2017 年 8 月 1 日从 BTC 中分叉出 BCH,将区块大小从 1MB 提升至 8MB(最终会增加到 32MB),并降低交易费用,号称自己才是中本聪“点对点电子现金系统”的真正体现。
BSV 全球账本,2018 年 11 月 15 日,BCH 内部再次因为 BCH 的未来发展方向出现分歧,11 月 15 日进行了硬分叉诞生了 Nchain 系 BCHSV(后来命名为 BSV),区块大小为 128MB。2019 年 7 月 24 日,Bitcoin SV 进行了协议升级,区块上限调整为 2 GB。
我们再来看看这三条链的现状,如下图所示,BTC 还是当之无愧的龙头老大,BCH 和 BSV 的市值也分别成功挤进加密货币的前 5 位与前 11 位。
在线全节点数 BTC 遥遥领先 BCH 和 BSV,这从一方面代表了矿业及全网算力的支持度,也是硬分叉之后矿主用脚投票的结果。
从网络安全层面(即防范 51% 算力攻击方面)来看,BCH 的算力维持在 2.13 EHash/s,约为 BTC 的 1/40。BSV 维持在 903 PHash/s,约为 BTC 的 1/80。
链上交易次数 从图上看到的结果似乎差距没有那么大,但其实,另一项数据报告显示: BCH、BSV 目前大部分是 OP_RETURN 操作码开头的数据记录输出(Data Recording Output),而非真正的交易。
如果某个交易输出,其锁定脚本以 OP_RETURN 操作码开头,这笔交易也被称为 OP_RETURN 交易,或 Null Data 交易,会随交易一同被写到账本中,但不会被当成 UTXO,不会带来 UTXO 集的膨胀,所以其金额通常为 0。BCH 和 BSV 对其数据大小的限制是 220 B。
BCH 及 BSV 的交易手续费远远低于 BTC,这得益于大区块所带来的以低手续费就能吸引矿工来打包区块的优势,以及 BCH 及 BSV 的设计策略。

BTC、BCH、BSV 关于区块链扩容之争,简单来讲,主要就是区块大小之争,那我们来看看这三者的实际区块大小与其区块大小上限的现状:
我们简单地使用公式 区块使用率 = 区块实际大小 / 区块大小上限 来得出。
BTC 的区块使用率维持在 80% 左右,几乎出于满负荷的状态,可以想象一旦交易需求增长,网络将会陷入拥堵状态。值得注意的是,图中所统计的值是隔离见证以及闪电网络上线后的情况。
BCH 及 BSV 的区块使用率通常不足 1 %,尤其是在 BSV 扩块到 2GB 之后更是如此。值得注意的是,BCH 和 BSV 与 BTC 的交易构成完全不同,如上文所提及的那样,BCH 和 BSV 大部分交易是由 OP_RETURN 交易构成的,而 OP_RETURN 交易的数据大小上限仅为 220 B,这是与 BTC 做对比的一个非单一变量。

其实在理论上,从设计的角度来讲比特币的区块大小是有上限的,在《On Scaling Decentralized Blockchains》这篇论文中提到:
[Throughput limit.] The block size should not exceed 4MB, given today’s 10 min. Average block interval (or a reduction in block-interval time). A 4MB block size corresponds to a maximum throughput of at most 27 transactions/sec.
根据论文中一系列的论证过程,得出的结论是:在目前区块间隔 10 分钟的情况下, 区块大小不应该超过 4MB, 相应的吞吐量至多为 27 笔交易/秒。
总结
以上,我们分析了 BTC 与 BCH & BSV 不同的扩容策略:BTC 采取的是不改变区块大小 1MB 的情况下,通过隔离见证+闪电网络的“软”扩容方案,而 BCH、BSV 采取的是扩块以及增加操作码的“硬”扩容策略。同时我们还分析了三者目前的现状,以及实际的区块利用率。
个人认为,BTC 目前的链上扩容方案能够增强吞吐量及降低交易费用,但其瓶颈也显而易见,很难适应未来的大批量交易的需求,而 BCH 尤其是 BSV 的大区块策略,虽然能够有效提升交易吞吐量和降低交易费用,但由此引发的趋中心化的问题以及带来的安全性问题仍然是个巨大挑战,尤其是 BSV 将 区块大小由 128MB 扩大到 2GB 这一行为在以上两个问题没有得到解决之前显得有些盲目,完全没有必要。似乎话题又回到了区块链的“不可能三角”问题,如何在扩展性、安全性、及去中心化这三个问题中寻找微妙的平衡,既是哲学,也是信仰。
网络层
分片
分片概念源于数据库领域。分片指数据库中数据的水平分区(将表的不同行分到不同的分区),每个分片都保存在一个单独的数据库服务器实例上,以分散负载。区块链分片的基本思路是将区块链网络中的节点分成若干个相对独立的分片,单个分片处理规模较小的事务甚至只存储部分网络状态,多个分片并行处理事务,理论上整个网络的吞吐量将会提升。
在 Near 的官网上看到一篇博客,介绍了主流分片协议的思想,非常值得参考。下面我们从这篇文章的观点出发,介绍分片技术分类以及分片所面临的挑战,来构建我们对这个区块链未来方向的协议的认知。
分片面临的挑战:
网络安全性
网络安全性最直接的挑战就是作恶成本降低,网络分片中通过将网络中的节点按照既定规则分配到不同的分片以达到扩容的目的,这会带来一个问题:单个分片中的算力大小和验证人节点数将远小于原来的整个网络,这将使得攻击单个分片较攻击整个网络的成本大大降低
针对 PoW 共识网络发起 51% 攻击
针对非 PoW 共识网络发起女巫攻击
分片前后作恶成本对比如下:

针对网络安全性的问题,现在的分片设计主要思路集中在采用何种共识算法、如何划分分片大小、随机节点分配等来降低单片分片被攻击的概率以及提升作恶成本。
数据有效性
数据有效性主要是关于如何识别不合法区块。
典型的一个场景如下图所示,作恶节点共谋在 1 号分片上产生一个不合法区块 B,在区块 B 中打包了一笔不合法交易使得 Alice 获得了 1 个 token,作恶者之后在 B 区块之上出了一个合法区块 C,企图混淆不合法区块 B,并在 C 中发起一笔跨分片交易,将这 1 个 token 转移给了 Bob,至此,不合法交易的 token 停留在了正确的分片 2 以及合法的区块 Y 中。

解决以上问题的一个有可能的方案是采用无向图的结构来排列分片,其中每个分片都与其他几个分片连接,并且仅允许相邻的分片之间执行跨分片交易,非相邻分片之间进行跨分片交易需要通过多个分片进行路由,每个分片中的验证人都需要同时验证本分片以及相邻分片的所有交易。采用这一实现的是 Kadena 的 Chainweb。

有意思的是,虽然强制验证人同时验证相邻分片可以解决单个分片被攻陷的潜在风险,但是如果多个分片被攻陷的共谋作恶仍然会出现上述问题。例如下图:分片 2 与 1 、3 相邻,但分片 1 与 3 不相邻,其中 分片 1、2 是由作恶节点控制的分片,3 是可信任分片。如果分片 1、2 共谋作恶,在分片 1 上产生的不合法交易通过跨分片交易在分片 2 中被确认并打包,请注意,此时在分片 2 上被打包的区块 Y 是完全合法的可以通过分片 3 验证人验证的,但分片 3 无法验证分片 1 上发生的不合法交易。

目前看到的正确解决数据有效性的主要方向有两个:钓鱼人机制(Fisherman)和计算加密证明(cryptographic proofs of computation)
钓鱼人机制(Fisherman)
钓鱼人方案的思路是在有跨分片传递区块头信息时设置质疑期,期间任何诚实节点都可以提供区块无效证明,只要在分片中至少有一个诚实验证人节点,这种方法就能保证系统的安全性,如下图所示:

在目前提出的协议中,这是主要的方法,但是这会存在两个主要的缺点:
质疑期需要足够长才能保证诚实节点能够下载潜在的无效区块并进行验证和发起质疑,这会降低网络效率。
第二个问题是质疑的存在使得攻击者可以将其作为新的攻击媒介,攻击者通过无效质疑向网络发起大量垃圾信息从而拖延诚实节点进行有效质疑,使不合法的交易顺利通过质疑期。
无独有偶,钓鱼人的机制也同样在其他扩容方案中被采用(例如二层扩容项目 Polkadot),虽然钓鱼人的方案已经比直接确认无效区块的方案要更优化,但以上两个问题的解决目前还没有看到较好的答案,后续发展值得关注。
简洁的非交互式知识论证(SNARK,Succinct Non-interactive Arguments of Knowledge)
第二种解决方案是通过使用某种加密结构证明某个计算是正确执行的,关于 SNARK 以及 zk-SNARKs 是什么,请自行 Google。这里推荐 Zcash 的一篇介绍文章:What are zk-SNARKs?
zk-SNARKs 的主要挑战来自:
性能,创建证明本身需要一定的时间,例如 Coda 协议中每笔交易需要大约 30s 来创建证明。
该技术本身还处在初期研究阶段,也未经过长时间的测试。
“Toxic waste” / “有毒废物”。SNARK 依赖于一个信任预设,在这个预设中一部分人执行一些计算并会守信地丢弃掉计算中间产物。反过来,一旦所有参与者共谋并保留计算中间产物,那么造假和欺骗就会发生。
系统设计引入了额外的复杂性;
具有图灵完备的智能合约语言的协议将无法使用 SNARK 来证明链的有效性。
数据可用性
数据可用性简单来讲就是指一个区块上记录的数据是否可用。
通常,操作特定区块链的节点分全节点(下载每个完整块并验证每笔交易的节点)和轻节点(仅下载块头,仅对感兴趣的部分状态和交易使用默克尔证明)。那么,在分片的场景下,每一个分片中的验证者实际上是该分片的全节点,而系统中的其他参与者(包括信标链)则充当轻节点。

现在,如果大部分的全节点共谋,它们可以生成一个有效或无效的区块,并将哈希提供给轻节点,套取利益(例如将转账信息提供给商户,骗取商户提供服务),之后全节点不再分发这个区块内容,即使下个区块的验证人是可信的,也无法阻止节点恶意删除历史数据导致区块不可用的问题。而这类问题,在全节点数量更小的分片场景下,作恶成本更加低廉(网络安全性这块有讲)。
解决这一问题的辅助方法主要有监护证明(Proof of Custody)和纠删码(Erasure Code)

监护证明的主要思路是让公证人比验证人更频繁地在分片之间轮换。公正人唯一需要做的事情是证明区块能够被下载即数据是可用的。因为公证人不需要下载完整的区块数据,所以可以更快、更频繁地在不同分片之间进行轮换和验证。

另一种思路是使用纠删码的结构,使得即使在区块的部分不可用的情况下仍然可以完整恢复整个区块。Polkadot 和 Ethereum Serenity 也在围绕纠删码进行设计,以保障其轻节点能够确认区块数据是可用的。
上卷总结
本文中我们简单介绍了区块链扩容中链上扩容技术的一部分,包括数据层和网络层的主流思路和技术,在下卷中,我们会主要从共识层展开来继续分析链上扩容,并对上卷的内容作一定补充。
参考文献
The authoritative guide to Blockchain Sharding, part 1 - NEAR Protocol
最后更新于