区块链分片技术相关资料收集

区块链分片技术相关资料收集

分片要提高的就是每秒交易量tps
目标是很明确的,比特币的tps是7,以太坊的tps是15,eos现在的tps是三千多,理论上可以达到10k需要很多dapp来实现,但现实生活中visa信用卡的tps是2万,淘宝的tps是20万。

分片的基本思想是,将网络中的节点分成不同的碎片,各分片可以并行处理不同交易,这样可以并行处理相互之间未建立连接的交易,以提高网络并发量。分片方案的特点是,随着节点数目的增加,网络吞吐量也随之增加。

--------------

被看做公链未来的分片技术,究竟离我们还有多远?_36氪
https://36kr.com/p/5139981.html
最近V神总说的以太坊分片技术是什么? _凤凰财经
https://finance.ifeng.com/a/20180503/16233643_0.shtml

分片技术(sharding)——区块链扩容问题的良方
http://www.cocoachina.com/blockchain/20180326/22770.html

zilliqa如何用分片技术把7笔/秒的区块链交易提升到2488笔/秒的?区块链大本营
https://mp.weixin.qq.com/s?__biz=MzU2MTE1NDk2Mg==&mid=2247485314&idx=1&sn=607b95ca6d9b9051f3a8d272423a26cd&chksm=fc7c597fcb0bd069c30b248486b9268c149b327a64cf5a34077f06b67b29dfd629622f04d1ea#%23

======================

扩容,本意是可以通过数据库拆开成小段,改变网络内部各步骤之间的验证方式实现分片,增加吞吐量。由此可见,分片是一项复杂的工作,现在很多项目为了实现扩容,采用分片技术。

分片是一种基于数据库分成若干片段的传统概念扩容技术,它将数据库分割成多个碎片并将这些碎片放置在不同的服务器上,在底层公有链的系统内,网络上的交易将被分成不同的碎片,其由网络上的不同节点组成。因此,只需要处理一小部分输入的交易,并且通过与网络上的其他节点并行处理就能完成大量的验证工作。将网络分割为碎片会使得更多的交易同时被处理和验证,因此,随着网络的增长,区块链处理越来越多的交易将成为可能。但这极其具有挑战。

其基本思想是,将网络中的节点分成不同的碎片,各分片可以并行处理不同交易,这样可以并行处理相互之间未建立连接的交易,以提高网络并发量。分片方案的特点是,随着节点数目的增加,网络吞吐量也随之增加。

然而,该技术具有一定的复杂性,在具体落地上有诸多问题需要解决,鲜有项目真正将分片方案落地。来自新加坡的公链项目Zilliqa可是说是第一个将分片技术落地的项目,目前项目代码已经开源,他们因此受到了业内的关注。

======================
分片技术(Sharding)是以太坊网络的一种增强本身性能的改进方案,你可以把它理解为比特币中的“扩容”,目的很直接就是提升交易速度,只是两者实现的途径不太相同。

相对来说,比特币的扩容的逻辑非常直接,你不是交易速度慢吗,那么我直接增大区块容量,让每个周期(约10分钟)记录到区块的交易记录数量变多,那么交易吞吐量自然就上去了,简单而粗暴。

而Vitalik Buterin认为当前主流区块链网络之所以慢,是因为每一个节点(矿工)要处理全网的每一笔交易,这种低效率的方式必然会造成低下的性能。分片技术的构想是,一笔交易不必发动全网都去处理,只要让网络中的一部分节点(矿工)处理就好了。于是,以太坊网络被划分成很多片,同一时间每一分片都可以处理不同的交易,这样性能将直线提升。

有一点值得注意的是,区块链技术的重要思想是多中心化,全网都去见证(处理)同一交易,这才具有最高的公信力。而以太坊分片技术,则是牺牲掉一定的多中心化特性来达到高性能的目的。其他主打性能的公有链,比如EOS,本质上都是牺牲一定的多中心化特性。

这下大家明白以太坊分片技术是什么,秉持一种怎么样的逻辑了吧。关于分片技术具体的实现方案,其实截稿时Vitalik Buterin也还没有最终敲定,还处在构想与探讨中。不过分片并不是什么新技术,实现并不难,主要是需要确定一种最合理、最稳妥的方式。Vitalik Buterin在最新的推文中表示以太坊分片技术最重要的原则是“最大限度地接近与单一区块链相同的性质”。

=======================
Zilliqa的白皮书提出:“在以太坊现有的3万名矿工的网络规模中,Zilliqa交易速度有望达到以太坊交易速度的1000倍。”目前在测试链上,Zilliqa的交易速度达到了每秒2488次,拥有6个碎片模块,3600个节点。

Zilliqa是来自新加坡的底层公链项目,可以实现高吞吐量。该项目通过分片技术解决区块链扩展性低的问题,为用户提供平台使用权,用于支付、交易、处理或运行智能合同。

一般来说,每个节点和区块链网络都包含区块链的完整副本,分片的概念则涉及将区块链分割成多个以并行方式处理交易的较小部分,从而加快交易吞吐量和容量,降低交易成本。分片技术先于比特币,但一直未被证明在开放式无需授权网络中的可行性。

Zilliqa所采用的分片技术是将区块链工作进行拆解,先形成头部的Boss区块,之后在主链上形成多个依附于Boss区块的分片区块,Boss区块和分片区块各自拥有独立的矿工,可以独立地执行上链消息(交易)的记账和共识指令。

事实上,以太坊也计划在未来引入分片技术。V神在其twitter里曾说:“分片即将到来。”他认为,分片将大幅度提高以太坊现有的限制,实现扩容。

相比以太坊之前提出的分片扩容方案的设计,Zilliqa加了一个最终区块回传信息的步骤,使得所有的节点也保存其他节点处理的信息。

====================
被看做公链未来的分片技术,究竟离我们还有多远?_36氪
https://36kr.com/p/5139981.html

PC时代,微软成为行业霸主。移动互联网时代,谷歌稳居市值首位。也许我们无法预测未来哪些场景搬上链会有未来,甚至无法预测区块链是否有未来。但我们可以肯定的是,如果区块链真的能带来价值互联网,必然需要能承载如此使命的公链。

然而现实是,这样的一条公链仍未出现。

EOS被寄予厚望,但现在主网刚上线,判断格局言之过早。从目前来看,可扩展性、安全性、去中心化这区块链的“不可能三角”,依然没有得到完美的解决。大致来说,目前常见的方法有如下几种:一是改变共识机制,比如Hyperledger的PBFT、EOS的DPoS,这也往往也牺牲了部分去中心化;二是改变了网络结构,比如IOTA、byteball就使用了不同于区块链的DAG(有向无环图)的数据结构;三是直接利用链外方式解决,比如链下的子链/侧链、状态通道,甚至是跨链中间件等;第四种,则是分片。

V神最近来中国演讲,讲的就是分片。作为以太坊采取的未来扩容方案的一部分,分片可谓万众期待。

其基本思想是,将网络中的节点分成不同的碎片,各分片可以并行处理不同交易,这样可以并行处理相互之间未建立连接的交易,以提高网络并发量。分片方案的特点是,随着节点数目的增加,网络吞吐量也随之增加。

然而,该技术具有一定的复杂性,在具体落地上有诸多问题需要解决,鲜有项目真正将分片方案落地。来自新加坡的公链项目Zilliqa可是说是第一个将分片技术落地的项目,目前项目代码已经开源,他们因此受到了业内的关注。其市值一度涨至加密货币21位。

最近,Odaily星球日报采访了Zilliqa的联合创始人兼技术总监贾瑶琪,后者分享了Zilliqa的进展、未来的规划,对各种区块链扩容方案的优劣,以及对行业的看法。

分片技术最早被用于数据库中,它将数据库分割成多个片并将这些片放置在不同的存储设备(分区)中,这样每个分区的数据量相对就会小很多,从而满足系统的性能需求。业内人士认为,分片增强了系统性能和可扩展性(Scalability),但与此同时也使系统的开发变得更为复杂。例如,有两条记录分别处在不同的服务器上,若需要建立关联,那么很可能表示“关联”的记录就必须在两个分区内各放一条。此外,一旦某事务需要跨数据分区处理,将大大降低性能。了解这个之后,我们也许就更能理解分片落地到区块链领域需要解决的问题。

Zilliqa对区块链分片的研究始于2015年,当时新加坡国立大学师生Prateek Saxena和Loi Luu在国际顶级安全会议CCS上发表了关于分片的论文《A Secure Sharding Protocol For Open Blockchains(公有区块链的安全分片协议)》,这也是有人在区块链领域首次提出使用分片技术。此后,Prateek参与创立的新加坡Anquan Capital公司开始了区块链分片技术研究。经过两年的研发,团队于2017年7月成立了Zilliqa公司。

根据专访内容,我们以问答形式将内容整理如下:

一、Zilliqa特点:分片技术、PoW+PBFT混合共识机制

Odaily星球日报:Zilliqa使用的分片策略是什么?分片技术落地情况如何?

贾瑶琪:Zilliqa的分片技术可以这样简单地去理解:假设我们有一个包含1000个节点的网络, Zilliqa将自动地把该网络分成10个、每个包含100个节点的分片,且所有分片可并行地处理交易。如果每个分片每秒能处理n个不同交易,则所有分片每秒可一并处理10n个交易。这是一种水平的扩容方式,即网络吞吐量随着节点数量增加而呈线性增长,这是其他扩容方式所不具备的特点。

我们目前在做的分片包括网络分片(network sharding)、交易分片(transaction sharding)和智能合约分片或计算分片(computational sharding)。

其中最重要的是网络分片,因为其他分片机制都建立在网络分片之上。简单来理解,网络分片就是将整个网络分组,每个小组叫做一个分片(shard),所有分片同时处理不同的交易。在这个过程中,我们通过不断刷新网络和分片来保证安全性。与此同时,根据我们发表在CCS安全会议上的论文,当每个分片的节点数量不低于600个时,其中三分之一的节点是恶意的概率为百万分之一。

每当一笔交易进入网络时,我们会根据交易发送者的地址,进行一定的运算,随机分配到不同的分片中,这一过程被称为交易分片。值得注意的是,这些交易是无法自主选择进入某个分片,因为每个分片里面的节点会拒绝执行不属于自己分片的交易,这样也保证了处理交易的安全性。

目前,我们已成功落地了网络分片和交易分片,将于本月底发布2.0版公测网,这一版本的公测网将允许普通用户作为节点加入网络成为矿工。

Odaily星球日报:我们知道,单纯的分片技术本身是无法保证交易的高吞吐量的,因为吞吐量也取决于每个分片的单次时间以及出块速度。Zilliqa使用的共识机制是什么?

贾瑶琪:Zilliqa采用的是PoW+PBFT混合机制。

在公有链中,恶意节点可能会试图通过操纵多个节点来破坏系统,并影响任何基于多数节点的决策过程。这就是通常所说的女巫攻击(Sybil Attacks)。有几种可能的方式可使女巫攻击代价高昂或难以进行。例如,通过要求节点存入相当多的金钱(或代币)作为抵押,或要求他们执行一些计算密集型任务如PoW。

为了保证Zilliqa网络的安全性,我们要求所有加入Zilliqa的节点都必须做PoW。与此同时,我们也知道,计算密集型的PoW需要大量的时间进行计算并且可能减慢共识协议,而且消耗能源较高。所以,在Zilliqa上,PoW是在更大的间隔上运行的,即所有节点在加入网络以及每隔一段时间做一次PoW。在其余时间,为了达成共识,Zilliqa用的是pBFT公式机制。

Odaily星球日报:大家常说,PBFT共识协议一般在更小的共识组中实现,比如少于50个节点时,所以它更适用于联盟链。Zilliqa怎么觉得这个问题?

贾瑶琪:我们刚刚提到,Zilliqa通过分片技术和PoW保证了网络的安全性。但是PoW耗时长、确认慢、耗能大等弱点。所以,Zilliqa选择了pBFT来做共识,主要考虑是:1.它不是计算资源密集型的,比PoW耗能少;2.效率更高,因为它可以利用一个小的共识组;3.它不需要反复确认,赋予了交易最终性。换句话说,不像基于PoW的中本聪共识机制,通常需要多个确认区块如比特币需要至少6个确认,pBFT由于它的共识协议确保不会发生临时分叉,所以不需要确认。

在很多人的观念中,pBFT主要用于联盟链的一个很大原因是,pBFT共识中节点之间通讯成本高昂。比如,在n个节点的网络中,使用pBFT达成共识需要的总通讯次数为n(n-1)/2,即n的二次方级,当节点数量超过50的时候这就是一个很大的数字了,且n越大通讯成本上升速度越快。为了解决这个问题,Zilliqa采用了多重签名算法和一些其他性能优化方法,减少pBFT花费的通讯成本。

二、分片技术的难点和落地情况

Odaily星球日报:你认为分片在实践过程中可能有哪些需要解决的问题,或者难点?

贾瑶琪:分片技术原理听起来很简单,但在实际落地过程中要注意以下几个关键问题:

1、对女巫攻击的防御。这个问题上边已经提到了,即使用PoW来预防,在这里我就不过多赘述。

2、创建分片、给分片分配节点和任务。如每个节点如何选择它去哪一个分片;过一段时间,整个网络肯定也有旧节点要离开,新节点要加入,怎么实现这些新旧节点的动态交换;以及每个分片里的节点处理交易,还要实现协议控制,这要如何做到高效等。每个节点分配到哪当然不能由某特定个人或团体控制,因为如果这些人决定作恶,那么他们可以将所有恶意节点集中在一个分片中来损害网络的安全性。正如之前提到的,Zilliqa采用的是随机分片和动态洗牌的方式来保证网络的流动性及安全性。

3、分片大小。分片里的节点数量越少那么达成共识也会也越快,效率也会越高。但同时,如果分片中的节点数目过少,那么攻击者就会更容易控制它。且每过一段时间,如果一个分片里面的节点掉线或长时间联系不上,那么该分片里的总节点数就会进一步减少,那么安全性也得不到保证。正如方才提到,我们通过论文证明当每个分片的节点数量不低于600个时,安全性和效率能够得到较好平衡。

4、跨片交易。区块链领域的技术专家和工程师们普遍认为,因为跨片交易需要锁协议,因此其开销成本很高,当跨片交易数量上升时,会影响整个网络的吞吐量和经济效益。

我们目前主要通过两方面来应对这个问题:一方面,在分片设计之初就尽量避免跨片交易的产生;另一方面,我们在最开始的Zilliqa分片论文中也提到了atomic commit protocol技术方案,这也是我们这几年来在研究的方向之一。除此之外我们还在研究了多个其他备选方案,我们将在实现相对优秀的方案以后,将细节分享给大家。

Odaily星球日报:目前有不少区块链项目也在考虑使用分片技术,你认为分片技术在行业内的落地情况如何?

贾瑶琪:如今分片技术“遍地开花”,这显示出分片技术已经越来越成为解决区块链扩容的一种主流技术。另一方面,随着分片技术声音的不断提高,越来越多的社区成员也开始关注和支持分片技术。

不得不说的是,分片技术确实是一项非常难的技术,这也是为什么目前市场上宣称做分片的项目多,但真正做出来的少的根本原因。究其原因,就是分片技术对安全性要求极高。我认为目前这个市场上还是有一定乱象:

一是陷入TPS竞争陷阱,忽视了最重要的安全性。大家都知道,去年淘宝双十一交易的TPS峰值是25.6万/秒,这是发展了这么多年的中心化系统的处理速度。区块链是一个新兴技术,发展程度远不如中心化系统成熟先进,目前熟知的比特和以太的TPS都不超过30。因此很多项目在现阶段宣称链上数十万、百万甚至千万TPS,主要是为了吸引了大众眼球,但却忽视了去中心化和安全性这些根本要素。

二是没有数学运算或发表的论文支撑,前提和论断草率不严谨。分片又被称为“分而治之”,其重点不仅在于“分”,更在于“治”,即在切分的同时保证安全性。分片技术在传统领域由来已久,但在区块链中却是新兴技术,两者在概念上有些相似,但在操作上却截然不同。因此,如果对区块链的分片技术想当然,认为在每个分片里放置几个节点就算处理完成,那么在实际上却会导致恶意节点轻易地通过双花交易等恶意操作而带来一系列漏洞,而系统后期很难验证或者回滚来减少这些恶意交易带来的问题。

三是在没有经过大规模测试的情况下就轻易下结论,不够专业。当计算机带宽不是限制条件时,以太坊使用一个节点或很少的节点也能跑出成千上万甚至百万 TPS,但以太坊并在现实生活并没有达到如此高的TPS,其原因就是现实网络不是由几十个或者数百个节点组成,而是数万个。仅用数十个或者一两百个节点测试,跑出任何数据都是可能的,但这样的数据是没有说服力的。

四是一些方式可能不算真正的分片。目前,分片确实是一个非常热点的话题,我个人认为一些项目真正在做的更像是子链、状态通道、或者分层而不是分片。

如果没有经过科学的数学计算或者已发表的论文支撑,想当然地处理分片,并错误地把在理想状态下少量节点跑出的数据当做主网实现的数据,可能会带来一些严重的安全后果。相对较轻的情况是,网络多次硬分叉,严重则会给投资者带来巨大损失,这对投资者个人还是区块链自身的发展都是十分不幸的。

被看做公链未来的分片技术,究竟离我们还有多远?

Odaily星球日报:目前声称自己使用了分片的项目不少,你认为刚刚提到的子链、侧链以及状态通道的解决方案,跟分片有什么不同?

贾瑶琪:子链、侧链以及状态通道都属于链下扩容,我认为其核心思路是相似的,即每个链可以独立自主地处理交易或者事物,相互之间不需要交流,最终把结算信息放在主链上。打个简单的比方,在这些链中A链可以做广告、B链做游戏、C链做交易等。他们跟分片最本质的区别是,分片是链上扩容,是对整个区块链网络的一个重构,节点也是相互关联的。

我认为链下扩容和链上扩容是互不冲突的,反而是相互补充的,未来可以相互结合的,因为相互之间的应用范围和侧重点不同,都为区块链扩展提供了重要技术支撑。

Odaily星球日报:换言之,分片必须是对同一主链中的节点或交易做分片。既然是在同一主链,必然当中的节点都参与共识或者验证全网交易。那么,Zilliqa如何保证所有节点在参与自身分片共识的同时,也参与确认或验证全网的交易记录?

贾瑶琪:我们有一个单独的分片即DS委员会去整合每个分片的结果,收集不同分片里面交易哈希,进行一个共识协议,形成哈希的哈希,然后广播,其他节点验证签名。我们的交易确认是分几个阶段的,如果你的交易在单独一个分片里面进行确认,那么你的交易就有很高的概率被写入区块链,这样的话我们之后会做一个提示,告知交易已经初步确认,如果最终确认下来的话会再给你发一个通知,就是最终确认了。

另外,我想要提及的是,因为我们目前做的不是状态分片,所以有些人可能会产生Zilliqa网络中每个节点都是全节点的误解,误以为这会导致过一段时间信息存储会爆炸。但实际上,Zilliqa网络中每个节点要保存的是全网的最新状态,而不是所有交易的历史。当然,节点也可以自发去作为一个全节点,存储所有的这样一个历史。这样的全节点有一个好处,就是可以去做自己的服务,例如像EtherScan,提供一个区块浏览器,通过广告来赚钱。况且,即便未来把状态切成装在不同的分片,那么也是常量级别存储量减少,其实差别没那么大。与此同时,我们已经和Bluzelle、Genaro两个做去中心化存储的企业和项目合作,来支持智能合约去中心化的存储。

Odaily星球日报:每一个节点它都要同步最新的状态,未来随着节点数量增加,这会影响整个网络的确认速度吗?

贾瑶琪:在理论上,Zilliqa吞吐量随着节点数量增加而增加。但在实际上,节点数量存在一个最佳点,规模增大到这个点之前,吞吐量都是线性增长的。

举个例子,如果两万个节点就带来了带宽限制,从而导致了系统吞吐量已经无法再增加,那么整个网络可能就会限制在两万个节点这样的情况。根据最新公布的数据,以太坊目前有16000个节点,而我们仍然在通过实验获知这个最佳点。

Odaily星球日报:Zilliqa最新测试网络的TPS是多少?

贾瑶琪:我们这个数据在不断更新。在已公布出的数据中,我们使用1400个节点、6个分片,跑出了大约2800TPS的数据。理想状态下每个分片是600个节点,我们目前选择用每个分片200个节点做测试主要是考虑到成本,因为我们目前租用的节点是AWS、EC2,每年需要上百万美元的费用做测试。

被看做公链未来的分片技术,究竟离我们还有多远?

Odaily星球日报:Zilliqa在智能合约方面有什么规划,主网上线时会有智能合约系统吗?另外有观点认为,Zilliqa的智能合约语言Scilla不是图灵完备的,为什么?

贾瑶琪:就像我们路线规划那样,目前已发布的1.0版公测网是不带智能合约层的;本月底将上线2.0版公测网,从这个版本起,Zilliqa会支持部分智能合约了;第三季度上线主网;第四季度将上线一些实用的去中心化应用。

Zilliqa除了做安全分片外,还设计了新的智能合约语言Scilla,也发表了论文来论证。Scilla是一种携带证明的、中间的智能合约语言,其基础计算模型基于通信自动机。我们希望通过使用Scilla,在区块链平台上编写智能合约更加便捷简单、安全可靠、拥有更高性能。

这几年的DAO攻击和Parity漏洞等都造成了数额巨大的资金被盗和冻结,一个很重要的原因就是Solidity没有形式化验证,在沟通和计算上划分不够清晰。而Scilla为智能合约的通信和操作提供了多种分离层,是支持形式化验证的,通过使用COQ等证明助理,可以使开发者写的代码符合其想要的逻辑。

Scilla非图灵完备更多的考虑是智能合约的安全性。以太坊的智能合约语言Solidity虽然图灵完备,但是因为燃料费的存在,实际部署的智能合约是无法无限循环的,所以也做不到图灵完备。我们发现以太坊上的智能合约有成千上万个的漏洞。Scilla就是为了避免已有的智能合约中的漏洞,所以去掉了一些比较危险的API接口和功能;而且我们发现目前所有智能合约不太需要图灵完备。

我们目前正在开发Scilla语言的编译器,目的是使未来所有用Solidity编写的合约都可以通过编译器轻松转移到Scilla上。与此同时,我们也发布了Zilliqa生态构建资助计划,花费500万美元,资助为Zilliqa搭建工具和应用的优秀项目、团队和个人,也建设Zilliqa生态。

三、国内区块链行业的三大问题

Odaily星球日报:你目前在市场上有比较看好和关注的公链吗?

贾瑶琪:市场上的项目各有亮点和特色,我个人更喜欢的还是以太坊。

Odaily星球日报:如果不是这么成熟和主流的呢?可能是一些创业团队做的。

贾瑶琪:对于项目标准,我个人比较看重创新性和严谨性。严谨性指的就是要有已发表的学术论文验证,在理论上能通过。如果没有严谨的论文来证明,系统最起码要有一千个节点以上的测试网络,代码也是公开的,这样才会比较有说服力。

Odaily星球日报:从整体行业上来说,你认为目前国内外区块链领域,或说公链项目最大的问题是什么?

贾瑶琪:问题主要有三个:第一大问题是在保证去中心化和安全的情况下实现可扩展性和高吞吐量;第二大问题就是隐私问题;第三大问题就是技术人员尤其是开发者数量太少了。

在第一个问题上,目前业界很多项目都在单纯追求高tps,我认为这违背了区块链的初衷、本质和最大特性,那就是去中心化。一旦网络节点太少,那它就不算区块链了。因此,我们追求的更应该是如何在保证去中心化和安全的前提下提高吞吐量。

==========================
zilliqa如何用分片技术把7笔/秒的区块链交易提升到2488笔/秒的?区块链大本营
https://mp.weixin.qq.com/s?__biz=MzU2MTE1NDk2Mg==&mid=2247485314&idx=1&sn=607b95ca6d9b9051f3a8d272423a26cd&chksm=fc7c597fcb0bd069c30b248486b9268c149b327a64cf5a34077f06b67b29dfd629622f04d1ea#%23

我们是如何用分片技术把7笔/秒的区块链交易提升到2488笔/秒的?
原创: 贾瑶琪 区块链大本营 4月12日 Zilliqa技术总监、联合创始人

众所周知,吞吐量一直是区块链的一个痛点。比特币的底层设计仅支持每秒7笔交易,还不及传统支付工具Visa每秒8000笔交易的一个零头,更别说支付宝在去年双十一创造的每秒25.6万笔的记录。这严重制约了去中心化应用的发展。去年以太猫风靡全球,造成了以太坊的大堵塞,以至于人们戏称用是否造成区块链堵塞来评价去中心化应用的热度。

针对如何提高区块链的吞吐量,业界也在不断尝试。为改善比特币网络的吞吐量,去年比特币硬分叉出了比特币现金。

近期,Zilliqa技术总监、联合创始人贾瑶琪谈到了这一问题的解决方案。

贾瑶琪来自Zilliqa团队,之前在新加坡国立大学读博士,博士期间主要研究偏底层的网络协议,以及点对点协议的隐私保护,还有可扩展性问题。2017年,跟师兄还有导师一起创建了Zilliqa团队,主要就是用分片技术,来提高整个公有链的可扩展性,以及实现高吞吐量。

说到分片技术,里面包含很多种不同的技术。比如以太坊的分片技术,还有Zilliqa的分片技术。

公有链的吞吐量问题

大家可能都了解比特币、以太坊,以及其他的公有链。区块链技术为大家提供了很多好的特性,比如去中心化、透明性、以及不可篡改性。但如果大家把区块链作为一个记账或者帐本系统,这其中有一个很大的问题,就是关于吞吐量的问题。

比特币每秒最多只能处理7笔的交易,如果用搭火车的例子来讲,比特币就对应着手工检票,每秒只能检7个人。而传统的记帐系统,例如信用卡、VISA或者MasterCard,他们平均的处理效率超过每秒8000笔交易,就类似于现在我们高速公路上使用的ETC,或者检票中刷脸进站的系统,可以迅速地处理大量的交易。

低吞吐量的弊端

由此可见,目前公有链的低吞吐量会带来很多问题,例如大家都会见到的高手续费问题。在去年有一段时间,如果你在比特币上面进行一些交易,比如A转比特币给B,手续费可能就高达50美元。另一个方面,像以太坊去年做ICO,或者做这种代币募资,很多人为了抢资格,就会花费很高很高的手续费,来竞争去加入一个代币募集。

其实,虽然你设置了这么高的手续费,有时候也是抢不到这个资格的。高手续费会限制很多功能,从而导致我们现在没有一个很好的杀手级的应用。大家可能都知道,去年在以太坊上面最火的两个应用,一个就是ICO,另一个就是风靡全网的以太猫。但以太猫在以太坊上比较火的时候,占据了以太坊上超过30%的流量,导致整个以太坊有很多的拥塞。在那个时候,如果你想做一笔简单的转帐,必须支付更高的手续费才能完成这笔交易。

因此,这个低吞吐量导致了目前还没有杀手级应用。我们可以联想到在互联网初期,大家用的整个底层系统可能还没有搭好,同时网络费用又特别得高,我们只能浏览一些简单的网页。但随着整个互联网系统生态的发展,大家慢慢也会看到一些很伟大的公司。例如像Google、Facebook、Twitter,以及国内的百度、阿里巴巴、腾讯,他们的崛起就是因为这个底层生态系统建好了。有了这样的高吞吐量,才使得更多的企业以及程序员参与进来,创建许多杀手级的应用。

公有链的可拓展性

那么如何来解决低吞吐量问题,我们需要公有链有「可扩展性」,但可拓展性其实并不等同于高吞吐量。

很多场景下只需要高吞吐量,不需要可扩展性,所以你只需要一个很强大的服务器来提供一个很高的吞吐量。但是对于可扩展性,就要求你随着节点数的增加,你的吞吐量也得相应地增加(因为可扩展性更多地是指随着节点数目的增加,吞吐量或者性能也增加,所以很多时候大家其实是要求的高吞吐量而不是可扩展性)。

已有的解决方案

目前来看,比特币处理交易的速度小于每秒10笔,以太坊小于每秒20笔,但传统的记帐系统,例如信用卡,交易速度超过每秒8000笔交易。我们如何去解决这个可扩展性,或者说低吞吐量的问题呢?目前有几种方案。

方案一,增加区块的大小。例如比特币,我们现在一个区块的大小可能只有1MB的存储空间。如果要进行交易的话,只能把交易加到这1MB里面。如果大家也做比特币交易,可能都知道去年底的SegWit2x,将区块大小从1MB提高到2MB。但是出于对安全性和其他因素的考虑,最终Bitcoin Core取消了这个SegWit2x硬分叉。导致了当时大量的资金都投向了以太坊的ICO项目。

当你把区块大小从1MB升级到2MB,或者10MB,甚至1GB,但这个方案是否能达到提高100倍吞吐量的效果呢?不一定,因为你虽然可以把区块大小升级到1GB,但由于你的计算性能以及带宽的限制,导致整个网络不能正常运行。像比特币或以太坊,都是要通过工作量证明达成共识,工作量证明之后还要在整个网络进行广播,如果是1MB可能还好,如果1GB的话,要进行这个广播,基本上不可能在10分钟以内通知每一个矿工。所以这里面有一个很大的限制。

方案二,链下交易。对应比特币的闪电网络(Lightning Network)和以太坊的Raiden Network。他们给出的解决方案大致是这样的,你提前支付一些以太坊或比特币作为押金,之后你可以在链下通过一些手段,来跟其他人进行交易。这就类似于你提前在链上存了一些押金,然后其他的终端用户可以在咖啡店里和你进行交易。交易结束后,你要把这个结算放在区块链上面,这样一个链下的方案。因为你链下处理这些交易的话,可以用一个十分强大的服务器来进行处理。这样就可以大幅度提升系统的吞吐量,可以做到每秒上万,甚至是几十万的交易量,类似于淘宝。

但是大家可以看到,这里有一些问题,就是你一旦用链下的话,虽然能够达到高吞吐量,但是交易失去了开放性、透明性的优势,相当于做了客户端服务器的一个终端。同时由于你用链下交易,就没有那么多节点去进行行为监督,那么也就少了去中心化的优势。

方案三,代理人共识协议解决方案。如何选出这些代理人,你可以用权益证明,也可以通过一些官方的验证。例如我有一个公司,这个公司有相应的资质,那么官方就会给我发一张牌照,我就可以作为一个代理人。

不管是7个代理人还是21个代理人,甚至可能是几十个代理人,大家会形成一个小团体。例如我们现在这些人,都可以去做一个代理人。之后我们去运行一些共识协议或者类似功能的协议,来达成一个共识,产生区块,然后再将这个区块广播给整个网络,从而达成整个网络的共识。这样做的好处就是,这个机制可以保证在一个很小的团体内部,很快就达成共识。这样做很简单,只要使用一些已有的共识协议,你就可以很快达成共识。

不过,代理人共识协议也会带来一些问题,我们刚刚也有提到大家对于去中心化的担忧。因为像比特币或以太坊都有成千上万的节点来做共识决策。代理人共识协议目前只有一个小团体的代理人来做共识,难免会被大家质疑你是否去中心化,以及你的安全性。因为这一小部分的节点可能都是一些利益团体选出来的,他们是否能代表绝大多数人的利益呢?这些都是有待考证的。

不过以上这三个解决方案都是很好的解决方案,大家如果从不同维度,不同场景出发,这几个方案都是有很大的用处。而今天我要跟大家分享一下,我们Zilliqa是如何用另外一种解决方案,我们叫做分片技术,来实现这样一个高吞吐量的。我们的方案跟前面的几个方案不在同一个维度,但是几种方案其实是可以共生的。

一种新的解决方案

在讲分片技术前,大家可以先看看整体的结果和运行效果。这些数据都是在亚马逊的EC2上面测试得到的,通过搭测1800个节点、2400个节点以及3600个节点运行我们的算法,得到了下面的数据。直观上看,随着节点数以及分片数的提升,我们的测试数据,可以从每秒1218笔交易,达到每秒2488笔交易。

这样我们可以得出一个结论,相对于比特币或以太坊我们可以获得一个很高的吞吐量。另一点也很有意思,从图中我们可以看到随着节点数目的增加,吞吐量也是在增加的,我们真的实现了这种可扩展性。

讲了这么多,那么这个技术到底是怎样的呢?

分片技术概览

网络分片,简而言之就是并行化的分而治之。例如我们整个网络有1万个节点,我们可以把1万节点,分成不同的小组,每一个小组,可以有不少于600个节点,这样来叫做一个划分。划分之后,我们在每一个分片里,处理不同的交易。之后先在每个分片里面达成共识,然后会有一个单独的分片将共识的结果进行汇总,广播给整个网络。

在这个系统的初始化阶段,我们会将整个网络划分成不同的分片,每个分片不少于600个节点。过了一段时间,可能有一些新的节点想要加入,也可能有一些旧的节点因为自身网络的问题,或者系统的问题,想要离开。这种情况下,我们该如何将这些新的节点加入网络,将那些旧的节点从网络中剔除。

每过一段时间,我们都需要做一次工作量证明。工作量证明部分跟以太坊基本上是一样的,这要求你将上一个区块的哈希值、节点的IP地址和你的公钥一起进行哈希计算。大家都知道,哈希计算就是工作量证明,最终你要满足哈希值的阈值。对应的难度是相匹配的,例如哈希值的前100位都是0,如果你算出来的哈希值满足这个条件,就说明你完成了工作量证明。

之后你就可以产生这样的一个结果:我们会得出你的ID,之所以要你的ID就是因为我们会根据你ID的最后几位,来决定你应该被分到哪一个分片上。这样的话,对于一个新的节点来说,是无法通过自己的意志去加入某一个分片的,只能通过工作量证明,而工作量证明难度较高,因此可以避免出现新节点自己选择分片的情况。因此工作量证明的最后几位,就可以从数学上保证你的随机性是足够的。

如果一个节点想要加入我们的系统,他加入的方法就是做工作量证明,然后被随机分配到一个分片里面。这样做的好处就是,我们可以保证一些恶意节点不能直接加入到某一个分片,因为所有的节点都是被随机分配到不同的分片里面的。

有了这些分片,每个分片里面都有很多的节点,我们要怎样进行交易处理呢?我们在这里也做了一个交易分片,就是用来处理不同的交易,不同交易会被分到不同的片里面。那么每笔交易是根据什么来分到不同片里面?我们做了一个简单的分片处理,就是根据发送者的地址分片。那样的话,如果A把钱发给B和C,那么这两个交易应该是在同一个分片里面处理的,这样保证没有双重支付问题。

如果A发给B和C,但是你把A发给C的交易分到另一个分片里面,这个分片里面的节点,会很容易检测出来,然后把这笔交易拒绝掉。通过这种很简单的方式,我们达到一个交易分片的效果。因此你在不同分片里可以处理不同的交易,之后可以在每个分片里面,验证你的交易是否是正确的。验证过程很简单,例如A发给B了10块钱,分片会检查A的余额是否是足够的,如果A发给B了10块钱然后A又发给C了10块钱,那么分片就检查有没有双重支付的问题。

在每个分片内,每个节点都会进行这样的一个对交易的处理,之后通过运行一个协议达成共识,最终附上自己的签名,生成一个叫做MicroBlock的微小区块,提交给目录委员会,目录委员会会运行另一个共识协议,从而形成了一个共识。最终生成一个区块,并向不同的分片进行广播。

在这个过程中,每一个节点都可以收到最终的区块,这个区块的内容是很小的。同时,不同区块之间也会进行交换数据,从而分享最终区块内的这些交易。整个系统有三层结构:
第一层,是哈希的哈希;
第二层,交易的哈希;
第三层,真正的交易内容。

通过这种三层结构来保证整个系统在每一步进行广播的时候,内容量都是相对比较小的。因此过了一段时间之后,你的不同分片里面,大家都可以获得这一段时间以来交易处理之后的一个共同状态。

刚刚提到了,在每个分片里面,我们都会运行共识协议。那么我们是如何来保证每个分片里面,超过100个的节点能够很有效而且安全地运行共识协议。这里我们用到了在2000年之前学术界很出名的容错协议,叫做:实用拜占庭容错协议——PBFT。

这样一个容错协议可以保证在一个小范围内,例如几十个节点,或者上百个节点,大家同时运行这个协议,最终形成一个共识。共识就是A发给B了多少钱,C发给D了多少钱,大家有这样一个共识之后,就可以去完成刚刚提到的协议。

我们还用了一个叫做「集体签名」,或「多重签名」的方案,从而减少拜占庭协议里对不同节点签名的要求。因为如果有600或者800个节点,都对同一个信息进行签名的话,就会有600、800这么多的签名数据,这个数据是很大的。所以我们用多重签名来减少集体签名数据量的大小。

最终通过结合PBFT和集体签名,我们实现了所要求的安全、高效的共识协议。在共识协议部分,如果大家只是把它当做一个黑盒的话,其实我们还有很多种选择的。

第一种,像比特币或者以太坊里面的共识协议,学术界把它叫做Nakamoto Consensus,用中文讲就是「中本聪协议」。可能有时候大家会把这个协议理解为只能做工作量证明,这种理解其实是不完整的。比特币的共识协议其实分两部分:第一部分,大家都在做工作量证明,过了十分钟,会有一个成功获得结果的人,他会生成一个新的区块。

这样是不够达成一个共识的,因为你之后还要再继续做工作量证明,在后面,要生成超过6个的确认区块,才能保证你在第一个区块里面那些交易被整个网络接收。所以比特币的共识协议分两部分,第一部分是工作量证明,第二部分还要有超过6个确认区块,才能保证你的共识结果是有效的。

但问题是这样的共识协议消耗的时间是很大的,例如在比特币里面,一个共识中运行一轮工作量证明要花费10分钟,再加上6个确认的区块时间,超过1个小时。那么你整体算下来,有可能会超过一个半小时才能确认你的交易。这样就导致比特币的吞吐量低,同时时间消耗高。

我们是否有其他选择呢?在学术界,只要使用PBFT或者类似的共识协议就可以相对高效地去实现多个节点之间的共识。举个例子,在一个房间里,A要给B发10块钱,A要给C发20块钱,B要给D发50块钱,那么我们这个屋子要形成一个共识,最终有哪些交易要加入到区块链里面?可能初期的话,会有一个领导者把大家的建议都收集起来,然后再分发给每一个人,说我现在收集到这么多交易,大家就跟随我把这些交易收集起来加入到区块链里面。这样每个节点都会收到一个请求,对于节点该如何决策呢?我作为一个节点,我怎么确定其他人也收到同样一个请求,或者同样一个区块呢?

那我就全网广播我收到的信息,广播给所有人,其他人也会广播给我。这样通过预准备,达到了初步共识的效果,即每个人都确定我收到这样一个区块,或者对应一系列的交易。最终再通过这样一个广播,来保证我知道超过三分之二的人也收到同样一个区块,或者同样一系列的交易信息。这样才能保证整个网络里面,大家都在同一个状态下面,每个人都知道,所有人收到了同样一个区块,大家可以继续往下一步走了。

这个共识协议很高效,运行几十个节点达成一个共识,大概只需要几十秒的时间。同时也很节能,不用做工作量证明。你的电脑不用无时无刻都在做哈希运算才能获得最终性。我们都知道,在下一个区块里面,这些交易是会被加进去的。

但是有一个问题,这中间有好多轮的广播。我收到交易之后,要广播给大家,大家也要广播给我,这样的话,信息的交换量是很大的,导致整个网络的拥塞程度是很高的。如果我们只用一个简单的数字签名来做,比如你把你的信息发给我,其他人广播也把他们的信息发给我,同时附上他们的签名。这样的话,如果600个人用传统数字签名,可能就会产生600条数字签名信息。这会导致整个网络非常拥塞,网络会很慢。所以我们之后就采用了多重签名技术。这个技术不算是新的密码学技术。好处就是可以把600个签名压缩成一个签名,大家可以想象,如果之前广播600个签名,现在换成一个签名,整个网络的拥塞程度会减轻很多。通过使用多重签名,整个网络的消息规模会减少,同时沟通成本会降低。

做一个简要的总结,就是每一个分片首先收到了多条交易,接着会运行拜占庭容错协议,大家先达成一个共识,有哪些交易要被写到区块里面。之后因为要记录下来,我们整个屋子N个人都同意把N个交易写在区块链上,我们就会采用多重签名,从而减少签名的大小,使得整个协议消耗比较小。

智能合约

当我们知道了分片技术带来的好处,以及分片技术给整个系统带来的高吞吐量之后,相当于我们有了一条高速跑道,还应该有一个相对安全,同时可以支撑高速性能的一辆跑车。所以我们就要开发对应的智能合约。

对于已有的智能合约,大家如果作为开发者可能都知道以太坊上的Solidity,在过去的两年里,以太坊上面的智能合约遇到了很多的漏洞和攻击。例如两年前,其中的The DAO漏洞导致价值6000万美金的以太坊被盗,去年Parity多重签名钱包的漏洞,导致超过3亿美金的帐户被冻结。

究其原因的话,首先是因为智能合约是一个很年轻,同时也是很复杂的编程框架。很多程序员写的一些逻辑,复杂性是很难想象的。我们知道编程时很多时候我们都是随着逻辑写代码,但是问题是我们写出来的代码,可能会有很多的不可预知性,比如那些边边角角的漏洞。还有就是目前的智能合约,没有一个形式化证明。在学术界现在有很多语言,它们都是支持形式化证明。形式化证明的意思很简单,就是我写出来了一系列的代码,我可以保证我写的代码就是我想要的逻辑,没有越出我想要的逻辑的框架。

基于这些原因,我们团队设计开发了一个基于自动机的智能合约语言,叫做SCILLA。

对于一个程序,例如开关灯的操作,你可以有不同的状态,例如关闭、暗光、明亮,同时你也有很多行为来去触发使一个状态跳到另一个状态。例如短按一下、按一秒、以及长按。如果你在关闭状态,简单地按一下,就会切换到暗光状态,再按一下,切换到明亮状态。在智能合约里面,你可以很清楚地把这些状态互相进行切换的行为定义清楚。

这样我们就可以提供一个形式化的证明。同时对于程序员来说,也可以很清晰地得出自己想要执行的逻辑。目前SCILLA是非图灵完备的。之所以我强调非图灵完备,是因为我们发现像以太坊的Solidity,虽然是图灵完备的,但有时候是不需要的。你如果写以太坊智能合约,应该知道它的燃料限制,因此很多时候智能合约是不需要做无限循环的,同时燃料的限制也支持不了无限循环。虽然支持图灵完备,但更多的时候对于程序来说,非图灵完备可以保证一个更加安全的逻辑执行,而且非图灵完备其实大多时候也可以实现很多你想要的功能。

上图是一个SCILLA提供的众筹智能合约。大家可以看到,类似于以太坊上智能合约的这些不可变参数,以及可变的状态。不同于智能合约里面,我们这里用的是一个状态转换来实现每个人要贡献多少钱,以及退款是如何进行的。

下图是模拟的一个两年前的攻击,大家可以看到,智能公约要进行一个退款行为。最开始智能合约会检查发起人当时有没有给我打钱。如果给我打钱了,我在退款的时候就会按同样的数目退款给你,最终把智能合约针对投资人部分,设置为0。但问题是在攻击的时候,不是最终直接把这个状态设置为0,而是在最终设置为0。中间的部分,进行了一个跨智能合约的调用。结果是,如果智能合约碰到一个恶意的程序可以退回重来,再执行一遍这部分逻辑。这部分逻辑就会导致这个投资人的钱数,可以循环地进行增加。例如你运行一次代码,可以使得投资人的钱数增加一倍,反过来恶意的程序再运行回来,进行一个回调,又可以使得把投资人的钱数再增加一倍。这样无限地运行下去,导致他损失了超过6000万美元。

那么我们如何去做安全补救?很简单,如果程序员小心一点的话,可以去遵循这样一个模式。先去检查这个投资人是否当初投资了我,之后进行执行:如果你投资了我,我先把你这部分的数目在我这里设置为0(反正我后面要转帐的),之后再进行交互。交互时把那部分钱转帐给之前的投资人。

说起来很简单,但很多时候,作为程序员,我们可能会忽略掉这些安全检查。在SCILLA这里,我们可以用自己的编译器,做一个自动的检查。就是你如果在写类似代码的时候,必须要符合安全规范。就像刚才说的,先去检查,然后再去进行交互。如果你不遵循这个规范的话,我们的编译器是不会通过的,或者会给你提供一些对应的提示。

去中心化应用的落地场景

未来的话,因为我们有了这样一个相对高吞吐量的区块链平台系统,共享经济,例如OfO、Uber,这样的共享经济公司都可以将主要的业务逻辑放在区块链上,运用智能合约来处理不同的用户请求。目前大家都是通过一个服务器来进行这种中心化交易,但之后如果用区块链进行去中心化的交易,就可以省去很多中间的费用,以及中间的一些可能比较灰色的花销。当然区块链也可以用作支付网络,支付网络目前的痛点就是手续费很高,但是如果能实现高吞吐量,大家可以用相对低廉的手续费去做一些支付。

另一个方面,因为有了分片技术,我们之后可以做一些分片的并行计算,即类似于MapReduce的一些计算。包括深度学习,在不同分片里面,可以放不同的神经元(neuron)来进行科学计算。我们目前还是在做更多的测试,以及其他功能例如智能合约的开发。在上个月,我们已经放出了我们的测试网络,以及数字钱包。

大家可以通过https://explorer.zilliqa.com,去访问Zilliqa的测试网络。目前我们在其中加入了很多自己的交易,对这个网络进行压力测试。钱包的话,你可以通过https://wallet.zilliqa.com去访问,来生成自己的帐户,之后我们还会将一些测试代币放到你钱包里,你可以在我们的测试网络中进行一些简单的测试,包括对交易的测试。

====================
分片技术(sharding)——区块链扩容问题的良方
https://www.8btc.com/article/179733

任何一个曾经开发过DApp的程序员都必须考虑到当前公共区块链的局限性,其中区块链局限性的最重要和最明显的问题就是有限的吞吐量,比如,每秒处理的交易量过少。为了运行一个能够处理实际吞吐量需求的DApp,区块链就必须具有可扩展性。

进行区块链扩容的一个答案就是分片技术(Sharding)。分片技术承诺通过改变网络验证的方式来增加吞吐量。分片技术独特于其他解决扩容的链上技术的关键特性,就是它可以进行水平扩容,也就是说,网络的吞吐量随着挖矿网络的扩展而增加。这种特殊的特性可能使它成为推动区块链技术被快速采用的理想技术。

本文将简要地讨论现有区块链平台的扩容问题,因为大多数读者都必须要熟悉这一问题。然后我们将进一步讨论分片技术和它的不同形式将如何成为一个有希望解决扩容问题的方案。这篇文章还将涉及到实现分片技术的一些理论基础和其所面临的实际挑战,以及我们如何能克服这些挑战。

现有区块链的扩容问题

公共区块链平台今天面临的最大问题之一就是可扩展性。所有主流的平台都在努力提高每秒的交易量。事实上,当今的公共以太坊网络和比特币网络平均每秒可以处理7-10笔交易。这一数字远低于像Visa这样的集中支付处理器,后者平均每秒能处理约8000笔交易。

缓慢的交易处理造成了一个主要问题,因为大量的未完成交易阻塞了网络,使得那些诸如实时支付这样的应用程序很难在区块链上一展身手。随着确认支付的时间拉长,最终就会给用户带来诸多不便;这也是为什么像PayPal和Visa这样的信用卡支付方式仍然更具吸引力的主要原因之一。随着更多更复杂的DApps开始依赖于相同的一个区块链网络,迟缓的交易速度所导致的问题只会变得更加复杂。

从技术角度来看,所有区块链的共识协议都有一个具有挑战性的限制:网络中的每一个完全参与的节点都必须要验证每一笔交易,并且这些节点必须和它的其他节点保持一致,这是区块链技术的组成部分,它通过创建分布式的账本来保证区块链的安全。

在大多数像比特币和以太坊这样的区块链上,节点都是由公众进行运行的。虽然去中心化的共识机制提供了一些重要的优势,比如容错性、安全性、政治中立和真实性,但是这种验证链的方法是以降低可扩展性为代价的。当这些公共区块链变得更大时,它将需要越来越多的处理能力来验证这些公共区块链,这可能会在这些区块链的网络中造成瓶颈,从而减慢那些创建新应用程序的速度。

分片技术:分而治之

分片技术是一种基于数据库分片传统概念的扩容技术,它将数据库分割成多个碎片并将这些碎片放置在不同的服务器上。在公共区块链的情境中,网络上的交易将被分成不同的碎片,其由网络上的不同节点组成。因此,每个节点只需处理一小部分传入的交易,并且通过与网络上的其他节点并行处理就能完成大量的验证工作。将网络分割为碎片会使得更多的交易同时被处理和验证。因此,随着网络的增长,区块链处理越来越多的交易将成为可能。这种属性也称为水平扩容。

我们可以想象一下,现有的区块链就像一条繁忙的高速公路,这条高速公路的收费站只有一个收费口。这种布局的结果将是导致交通堵塞,因为人们将排着长队等待通过这唯一的收费站。实现一个基于分片技术的区块链就像在高速公路上增加15或20个收费口。它将极大地提高汽车通过收费站的速度。因此,分片技术将带来巨大的差异,并显著提高区块链的交易速度。

基于分片技术的区块链的实现对公共区块链有着不同的好处。首先,区块链上处理交易的速度变成了每秒上千笔甚至更多,这改变了人们对加密货币作为支付方式效率的看法。改善交易吞吐量将会给去中心化的系统带来使越来越多的用户和应用程序,而这将反过来促进区块链的进一步采用,也使挖矿变得更有利可图,同时也能吸引更多加入到公共网络上的节点,从而形成一个良性循环。

此外,分片技术可以帮助降低交易费用,因为验证单笔交易的处理量减少了;节点可以在依然盈利运营的同时收取较小的费用。在现实世界中,我们将低费用与高交易处理能力结合起来,会使公共链将变得越来越有吸引力。这些积极的趋势所持续的时间越长,我们就会越能看到更多的主流的加密技术和区块链应用程序的出现。

分片技术的策略

这部分主要讲的是相关的基本概念,但是我们有更细分的方法来实现分片策略,如网络分片和交易分片,以及状态分片等。通过网络和交易分片,区块链节点的网络被分割成不同的碎片,每个碎片都能形成独立的处理过程并在不同的交易子集上达成共识。通过这种方式,我们可以并行处理相互之间未建立连接的交易子集,通过提高数量级显著提高交易的吞吐量。

另一方面,在当今的主流公共区块链上,所有公共节点都承担着存储交易、智能合约和各种状态的负担,这可能使其在为了获得更大的存储空间而进行巨大的花费,以维持其在区块链上的正常运转。

为了解决这一问题,有一种可被称为状态分片的可行方法已被提出。这一技术的关键是将整个存储区分开,让不同的碎片存储不同的部分;因此,每个节点只负责托管自己的分片数据,而不是存储完整的区块链状态。

分片技术的复杂性

尽管所有不同形式的分片技术都可能非常直观,但通过对技术细节的解读,我们可以看到这一方法的复杂性和潜在的挑战。分片技术的其中一些挑战是很容易克服的,而另一些则不然。一般来说,网络和交易分片更容易实现,而状态分片则要复杂得多。下面,对于不同的分片机制,我们会明确地讨论它们所面临的一些挑战,以及它们的可行性。

网络分片

分片的第一个也是最重要的挑战是创建碎片。开发者需要开发一种机制来确定哪些节点可以按照安全的方式保留在哪些碎片中,这样就能避免那些控制大量特定碎片的人所发起的攻击 。

打败攻击者的最佳方法(至少在大多数情况下)就是建立随机性。通过利用随机性,网络可以随机抽取节点形成碎片。这样一种随机抽样的方式可以防止恶意节点过度填充单个碎片。

但是,我们如何建立随机性呢?最容易获得公共随机性的来源是区块,例如,交易的Merkle tree root。在区块中所提供的随机性是可被公开验证的,并且可以通过随机提取器中提取统一的随机比特。

然而,简单地使用随机机制将节点分配给碎片仍是不够的。我们还必须要确保网络的一个碎片中不同成员意见的一致性。这可以通过像工作量证明这样的共识协议来实现。

交易分片

交易分片可听起来那么简单。考虑到在一个类似于比特币的系统中引入交易分片(没有智能合同),系统的状态是用UTXOs来进行定义的。我们假设网络已经由碎片所组成,用户发送一笔交易,每一笔交易有两个输入和一个输出。那么,该笔交易将如何分配给一个碎片呢?

最直观的方法是根据交易哈希值的最后几位来决定碎片。例如,如果哈希值的最后一个比特是0的话,那么交易将被分配给第一个碎片,否则它被分配给第二个碎片(假设我们只有两个碎片)。这允许我们在单个碎片中验证交易。但是,如果用户是恶意的,他可能会创建另一笔具有两个相同输入但不同输出的交易——是的,就是一个双花交易。第二笔交易将有一个不同的哈希值,因此,这两笔交易就可能形成不同的碎片。然后,每个碎片将分别验证接收到的交易,同时忽略在另一个碎片中验证的双花交易。

为了防止双花问题,在验证过程中,碎片将不得不进行相互通信。事实上,由于双花交易可能会在任何碎片中出现,因此特定碎片所接收到的交易将不得不与其它的碎片进行通信。而实际上,这种相互之间的通信可能会破坏交易分片的整个目的。

另一方面,当我们有一个基于账户的系统(没有智能合约)时,问题就简单得多了。每一笔交易将会有一个发送者的地址,然后系统可以根据发送者的地址分配一个碎片。这确保了两笔双花交易将在相同的碎片中得到验证,因此系统可以很容易地检测到双花交易,而不需要进行任何跨碎片的通信。

状态分片

状态分片带来了新的挑战。事实上,状态分片是迄今为止最具挑战性的分片技术提案。

继续使用我们的基于账户的模型(我们暂时不在我们的例子中引入智能合约),在一个状态分片的区块链中,一个特定的碎片只会保留一部分状态。例如,如果我们有两个碎片和两个用户帐户,分别为Alice和Bob,那么每个碎片将保留一个用户的余额。

假设Alice创建了一笔交易,她将支付Bob一笔钱。这笔交易将由第一个碎片进行处理,一旦该笔交易被验证,关于Bob的新余额的信息就必须与他所在的碎片进行共享。如果两个受欢迎的帐户由不同的碎片进行处理,那么这可能需要进行频繁的跨碎片通信和状态交换。确保跨碎片通信不会超过状态分片的性能收益仍然是一个值得公开的研究问题。

减少跨碎片通信开销的一种可能方法,是限制用户进行跨碎片交易。以我们上面的例子来说,这就意味着系统不允许Alice直接与Bob进行交易。如果Alice必须与Bob交易的话,她将不得不在那块碎片中占有一个帐户。虽然这确实消除了任何跨碎片通信,但它可能会限制平台的可用性。

状态分片的第二个挑战是数据的可用性。我们可以考虑这样一个场景,由于某种原因,一些特定的碎片遭到了攻击而导致其脱机。由于碎片并没有复制系统的全部状态,所以网络不能再验证那些依赖于脱机碎片的交易。因此,在这样的情况下区块链基本上是无法使用的。解决此问题的方法是维护存档或进行节点备份,这样就能帮助系统进行故障修复以及恢复那些不可用的数据。但是,这样就使得节点将不得不存储系统的整个状态,因此这还可能会引发一些中心化的风险。

我们在任何分片机制(当然不是特定于状态分片)中需要考虑的另一个要点是,确保碎片在抵御攻击和失败时是具有弹性的; 网络必须接受新的节点并以随机的方式将这些分配给不同的碎片。换句话说,网络必须在一段时间内进行节点的重新分配。

然而,在状态分片的情况下,重新分配节点是非常棘手的。由于每个碎片只保留了状态的一部分,所以在一次重新调整网络的过程中,在同步完成前可能会出现导致使整个系统失效的问题。为了防止系统的中断,我们必须对网络进行逐步调整,以确保每个碎片在所有节点被清空前仍有足够多的旧节点。

类似地,一旦一个新节点加入了一个碎片中,系统就必须确保该节点有足够的时间与碎片状态进行同步;否则,传入节点将完全拒绝每一笔交易。

结论
综上所述,分片技术是区块链的一个令人兴奋的技术,他让我们看到了希望,它可以在不影响去中心化和透明度的情况下解决扩容问题。然而,毫无疑问的是,分片技术,尤其是状态分片,在设计层面和实现层面都是非常困难的。

我们应该小心的处理分片技术。此外,开发者们还需要做更多的研究来确定状态分片的可行性,因为它可能不是解决存储问题的法宝。研究人员和开发者们正在积极寻找那些可替代的解决方案。也许,答案就在我们眼前。

===================
TPS 是一种糟糕的评价标准
http://www.meirijinrong.com/wechatarticle-62830.html
在评估整个价值转移系统时,至少要考虑三个重要变量,而交易吞吐量只是其中之一:
交易吞吐量( tps)
一般交易特性(交易大小)
清结算保证

交易吞吐量和平均交易大小共同决定了系统的经济生产力,用于衡量系统在每个单位时间的流转过的财务流量;清结算保证则告诉我们该系统属于什么 类型 :包括你能否确定不会遇到交易失败、诈欺?交易是否如现金交易一样及时结算?还是像信用卡一般,有 90 天的退款期?

虽然说比特币是虚拟的,但它更像是实体的清结算系统,而非如信用卡这类的推迟结算系统。比特币是一种虚拟的价值承载工具:如果你持有未花费输出(UTXO)的私钥,那么你就是这笔钱的所有者,并且有权对其进行任何操作;这种资产也不是某个实体的负债。从这个角度来看,比特币更像实体现金或是黄金。如果你弄丢了比特币或是发送到错误地址,这笔钱也没有讨回来的方法。当然,在某些情况下,系统能追讨回误操作的钱是件好事;而信贷费用之所以存在,正是为了处理这些反悔的交易或是诈欺行为。这些处理信贷诈欺和补救行为带来的成本,最终会以手续费的形式转嫁到终端用户身上,这也是为什么通常我们无法用信用卡支付少于 1 或 2 美元交易的原因。

那么,我们该如何用一致的标准来比较不同的价值转移系统,如比特币、 Paypal、Visa、SWIFT、和现金?我希望你们能将注意力扩展到除了交易吞吐量之外的特性,因为这只是构成系统的经济生产力的其中一项因素而已。
=======================

posted @ 2018-12-14 03:02  大自然的流风  阅读(883)  评论(0编辑  收藏  举报