前言:区块链要想构建Dapp生态,要想走向主流人群,优先要解决扩展性问题。但区块链是去中心化的系统,任何节点都可以自由加入,要在多样化的节点快速达成共识,是非常困难的事情。那么,区块链的真的无法扩展了吗?本文作者Preethi Kasireddy认为,虽然现在不能,但未来有希望。
方案 #1: SegWit(仅针对比特币)
每个比特币交易包含:
输入
发送者之前的交易详情
发送者的私钥(即scriptSig)以便验证发送者是否有足够的余额(基于之前的交易历史)来完成这笔交易
输出
需要发送的金额
接收者的公开地址(即ScriptPubKey)
在这些元素中,数字签名(scriptSig)体积最大,占用交易60–70%的空间大小。然而,签名只有在验证阶段才需要。
隔离见证(通常被称为Segwit)是一种隔离(即“segregate”)交易签名(即“witnesses”)与其他交易数据的解决方案。把签名从输入中剥离,移动到交易末尾的一个结构中。
此外,使用SegWit,签名被移动到交易数据中的一个新的“witness”字段中,这使得我们可以改变区块大小的计算方式。区块大小限制不再通过字节数来衡量。取而代之的是,根据它们对节点资源的需求,区块和交易被赋予一种称为“权重”的新的度量方式。
特别的,隔离见证(签名)的每个字节的权重为1,区块中其他字节的权重为4,每个区块允许的最大权重是4百万,和目前的最大区块大小相比,包含SegWit交易的区块可以容纳更多的数据。这将有效地把1MB大小限制增大到接近4MB,可以增加~70%的交易。
SegWit也可以解决扩展性之外的其他问题,比如交易的延展性和增强的安全性(由于和扩展性无关,我在这里就不继续深入了)
方案 #2:2MB区块大小(仅针对比特币)
比特币社区中一方(用户)强烈支持SegWit,而另外一方(矿工)则更希望通过硬分叉把区块大小限制从1MB增加到2MB(注意:要修改1MB的区块大小限制必须进行硬分叉)。
基本想法很简单:通过增加区块大小,更多的交易可以被打包进区块,网络就可以在每秒处理更多的交易。
增加区块大小的计划已经成为比特币社区长期激烈争论的话题,从2015年初开始就已经获得了日益增长的关注,因为从那时起区块大小就已经开始逼近目前1MB的硬限制了。
方案 #3: 链下状态通道
状态通道本质上是一种把区块链的链上交互传导到链下的机制。这是通过一种密码学安全的方式完成的,不会增加每个参与者的风险,同时可以极大改善消耗和速度。我个人相信状态通道将会成为区块链技术扩展到更高层应用过程中的关键组成部分。
状态通过工作流程如下:
1. 区块链的部分状态通过多重签名或者某种智能合约进行锁定,更新状态的唯一方式是一组特定参与者全部同意。
2. 参与者们通过构建或者签名交易在他们内部更改状态,但不提交到区块链上。每一次新的更改覆盖之前的更改。
3. 在之后的某个点上,参与者们把状态提交回区块链上,关闭状态通道并解锁状态。
第1和第3步包含区块链操作,会被发布到网络上,支付费用并等待确认。然而,第2步完全不需要区块链参与。
状态通道可以包含无限次数的更新,并可以永远保持开放状态。从这个意义上讲,区块链纯粹作为一个结算层来处理一系列交互产生的最终交易以便完成最终结算,从而大大减轻了底层区块链的负担。
(在这个过程中的任意一个点上,任何参与者都可以向合约发送一笔交易来关闭通道并启动结算流程。这启动了一个时间窗口允许参与者们提交交易,序列号最高的交易会被处理。如果某个参与者离开或者试图欺诈,另一个参与者可以在任何时间把最新的交易发布到区块链上以形成最终状态,前提是所有参与者都完全同意该状态。)
使用状态通道不仅可以增加交易容量,还提供了另外两个非常重要的好处:提升速度、降低费用。因为大部分交易都是在链下发生的,两方之间的更新不需要被网络处理和验证,因而支付可以被瞬间处理。
其次,支付费用也会降低。因为只有一小部分链上交易用于结算状态通道,大部分交易是在链下完成的,无需付费。
这套机制有很多不同的实现方式。例如,闪电网络是一种通过智能合约实现用户网络即时和可扩展支付的去中心化网络。刚开始闪电网络是为比特币创建的,但是似乎现在他们也考虑了跨链交易。
雷电网络是以太坊上的闪电网络。雷电网络也是利用链下状态网络在以太坊上支持可扩展的即时交易。
方案 #4: 分片
区块链世界中的分片和传统软件系统中的数据库分片类似。在传统数据库中,分片是数据库中数据的一个横向分割,每个分片存储在一个单独的数据库服务器实体上。这样可以把负载分散到不同的服务器上。
类似的,通过区块链分片,区块链的总状态被分散到不同的分片中,状态的各个部分被存储到网络中的不同节点上。
(一个简单的分片)
(区块链分片的顶层框图)
网络上发生的交易会被转发到不同的节点,取决于它们能影响哪些分片。每个分片只处理状态的一小部分,分片之间是并行处理的。为了能在分片之间进行通信,还需要一些消息传递机制。
实现消息传递有各种各样的方式。在以太坊中采用的是一种“收据”模型:当执行某个分片中的交易时,可以改变它所在的分片的状态,同时产生“收据”,这些收据被存储在某种分布式共享内存中,并且之后可以被其他分片查看(但不能修改)。
以太坊的收据模型
以太坊的收据模型
总体来说,区块链分片要求我们创建一个网络,其中每个节点只处理所有交易中的一小部分,并且要仍然维持高安全性…至少可以说这是一个艰巨的挑战。
为什么?
首先,区块链协议假设网络中的所有节点互相不信任彼此。其次,尽管交易是在不同计算机上处理的,最终需要在一个公共状态上达成一致。
由于节点之间不信任彼此,在分片A上处理交易的节点仅仅通知分片B上处理交易的节点发生了一笔交易是不够的,还必须通过某种方式向它们证明。
另外,由于分片的目的不是让每个节点验证每笔交易,我们需要找出一种机制来以安全的方式决定哪个节点验证哪个分片,并且不让那些在系统中拥有大量算力的攻击者有可乘之机来干扰网络。
分片实现困难的另一个原因是区块链上执行的交易可能会依赖之前状态的任意部分,这会对并行计算形成挑战。此外,使用并行化,需要一种傻瓜式的证明方法来减轻竞态条件或者类似的东西。
关于如何在以太坊上实现分片还有很多技术上引人入胜的东西 – 特别的,如何利用“加密货币经济激励”来驱动系统中的节点不发生欺诈(在这种情况下,保证该节点向其他节点传递有效信息) – 这是我希望在后面的文章中进行探讨的内容。
—未完待续—
(本文来自于hackernoon.com,由蓝狐笔记社群“鑫鑫”翻译。)