0

分片

分片知识专题栏目,提供与分片相关内容的知识集合,希望能快速帮助您找到有用的信息以解决您遇到的分片问题。

分享

浏览

7271

文章

9

什么是分片技术?

全文共 1081 字

+ 加入清单

OK区块链60讲第27集:什么是分片技术文字版:

简单来说,分片技术和我们之前提到的侧链、闪电网络、隔离见证等技术一样,都是为了解决区块链的效率问题和可扩展性问题而诞生的一种技术。只不过它最开始想要解决的,不是比特币的拥堵问题,而是以太坊的效率问题。

以太坊是一个区块链搭建的智能合约平台,就和我们手机的安卓系统一样,开发者可以在上面创建各种的去中心化App(Dapp),但因为区块链的效率问题,导致这些去中心化App很难和我们日常用的中心化App相媲美。为了解决这个问题,有人就提出能不能把传统互联网中的分片技术引入到区块链中?于是就有了区块链中的分片技术。

分片技术之所以叫分片技术,是因为它背后的逻辑就是分而治之。分片技术源于传统中心化的数据库,是用来提高数据库的处理效率,一个分片是数据库的一个水平部分,每个分片储存在担负的服务器中,由此负载便分散开来使数据库的效率大大提升。而它在区块链中的应用原理是这样的:

我们要知道,区块链也是一个数据库,只不过它是一条链式结构,这条链要承担整个系统的全部功能,而且每笔交易要经过所有的节点处理后才能确认,这种方式下,处理效率自然快不起来。

而分片技术就想办法,将这条链划成一个个的区域,一个区域就叫做一个分片,每个分片承担专职的功能,而节点也会分散到各个分片上,处理相应的工作。这样一来,处理时,交易会划分到各个分片上同时进行处理,就好像各部门分工协作一样,分摊下来,每个节点处理的只是网络中的一小部分交易,如此以来,自然就能大大提升这条链的处理效率。

但这又引发了一个新的问题,就是网络的安全性和去中心化性会下降,比如原来我想要在你网络中作恶,因为公识机制的原因,我需要搞定全网的大部分节点才行,但现在因为分片技术把节点分散到一个个小的区域中,我只用搞定你这个小区域的大部分节点就行。

所以,分片技术另外一个非常重要的机制就是随机分配的机制,它会专门有一个地方来负责生成随机数、为其他分片分配节点等功能,把节点随机分配出去,这样的话,想要作恶的人,就很难知道一个小区域中的节点都有谁,作恶成本会大幅提高,从而分片技术才能在保证安全与去中心化的同时,解决效率与可扩展性问题。

总的来说,分片技术虽然是目前区块链用来解决效率问题与可扩展性问题的主流技术之一,可因为该技术源于传统互联网数据库,致使这个方案无法直接应用在去中心化的区块链上,所以分片方案从提出却到现在也没有落地。

不过源于它的特性,一但落地,这项技术极大可能推进区块链技术被快速地大规模使用,所以大家一直对它期望甚高。希望随着这项技术的成熟,让区块链的世界中,也能诞生出像facebook、微信这样世界级的超级应用。

展开阅读全文

轻松理解ETH2.0的分片概念

全文共 1018 字

+ 加入清单

我们先抛开那些复杂的技术实现细节,就可以用非常简洁的文字描述分片这个概念

以太坊地址

我们先看一下以太坊的地址格式。下面是一个典型的以太坊地址,我在浏览器里随便复制过来的。

0x506dDF5a547EaaE34bAE6Ff57c78B5aD50a6A1BF所有的以太坊地址开头两个字符都是0x,代表了使用的是十六进制。从第三个字符开始,每个字符就是从0到F,一共16个可能性。

分类

我们从第三个字符开始分类,如果采用一个字符分,把0到F,分别分成一类,就可以分成16类。而如果采用两个字符,比如从00到FF,就可以分成16^2 = 256类。而选三位数来分,就是16^3=4096类。

(我们先不考虑以太坊地址规范里的一些限制条件,比如大小写,比如校验码之类的。先只考虑分片的思想。如果考虑地址设计规范,实际的可分类要少。)

现在的以太坊1.0所有的账户是没有按上述字母进行区别对待,所有的地址都是一样地位,包括外部账户和合约账户,都是一样的。

这里说的一样,指的是以太坊节点、钱包、及各种软件是不会将地址分门别类,都是一视同仁。包括以太坊的区块打包,也不会按地址分类排序。

在ETH2.0的分片设计思路中,地址就会按前几个字母进行分类。

分片

ETH2.0的地址设计规则会进行分类,一类地址就是一个分片。这就是大名鼎鼎的分片,就这么简单。

第一阶段,以太坊2.0会有64个片,这意味着只需要选择地址的第3和第4个字符来分类就可以了。

按地址分类后,ETH2.0的节点、钱包、各种软件,以区块的设计,就可以区别对待各类的地址的交易。

地址分类之后,区块就会按地址分类进行打包。一个区块里只会包含一类地址。而所有这些同一个分类地址的区块,就共同组成了一个以太坊的分片。

定义

现在我们可以来定义ETH2.0的分片了。

先把地址按前几个字母进行分类。

分片就是所有打包了同一类地址交易的区块,并且同一分片只打包一类地址的交易。

跨片

如果一个片的地址相互发送币,非常好处理。但如果是跨片区发送交易呢?这就要用到信标链了。

信标链我们以后说,这里简单描述信标链如何帮助不同类地址跨片通信。

比如0x00地址要发1ETH到0x01地址。

每一个分片区块,都是跟随着信标链的一个区块,一对一的关系。

方法就是0x00先把1ETH发给自己片区的那个信标链区块上,信标链有一个叫状态转换函数的东西,这个状态转换函数会把这1ETH发给0x01分区的那个信标链的区块上,然后再转发给0x01地址。

展开阅读全文

一文了解明星公链NEAR分片设计

全文共 22613 字

+ 加入清单

众所周知,以太坊作为迄今为止最广为使用的通用区块链,主网每秒只能处理不到20笔交易。在以太坊网络流行后,由于这个局限,导致了高昂的以太坊gas价格(gas是以太坊网络上执行交易的费用)和过长的确认时间。尽管在撰写该文的时候,以太坊平均每10到20秒可以产出一个新块,然而根据ETHGas监测站的数据,一笔交易实际上要花1.2分钟才能加到链上。低产能,高费用和长延迟,都导致了以太坊不适合运行大规模使用的链上服务。

以太坊低产能的主要原因是,每个节点都要处理全网的每一笔交易。开发者们提出了许多解决方案,试图在协议层面解决这个问题。这些方案主要分为两类:一类是把所有的计算工作交给数量有限的强力节点;另一类是让网络中的每个节点只做所有计算工作的一部分。前一种方案的例子是Solana,系统中的每个节点通过细致的低层优化和GPU的使用,来支撑每秒几十万笔简单的支付交易。Algorand,SpaceMesh,Thunder都可归入这一类;他们通过改进共识以及区块结构本身来超过以太坊的TPS,虽然有一定的效果,但仍然受制于单台机器的处理能力。

后一种方案,即把工作分给所有的参与节点。这种方法叫做分片。这也是当前以太坊基金会打算的扩展方案。撰写本文时,以太坊的分片规范还未定稿,最新的规范可以点击查看。

NEAR协议基于分片搭建。NEAR团队的成员包括:多位世界级电脑竞赛获奖者;若干前MemSQL工程师,负责构建分片、跨分片交易以及分布式的JOIN;9位前谷歌、脸书员工,他们在构建分布式系统方面等有着丰富的行业经验。

本文重点阐述了区块链分片的通用方法,以及需要解决的主要问题,包括状态有效性和数据可用性问题。本文还提出了NEAR协议创新的夜影方案。

关于分片的基础知识

让我们从最简单的分片方法开始。举例来说,不同于运行一个链,我们运行多个链,每个链称为一个「分片」。每个分片有自己的验证节点集合。在下文里,不管是POW中挖矿的方式,还是投票机制,我们都会使用这个原生词汇「验证节点」,去指代那些进行交易验证和生产区块的参与者。同时,让我们先假设各个分片之间互不通信。

这一设计,虽然简单,但却足够概括早期分片面临的一些主要挑战了。验证节点分区和信标链

假设一个系统包含10个分片。第一个问题是,由于每个分片有自己独立的验证节点,现在每个分片的安全性都只有原先整条链的十分之一了。如果一个包含X位的非分片链决定硬分叉成一个分片链,X位验证节点就会分布到10个分片上,每个分片现在仅有X/10位验证节点。攻击一个分片只需要买通5.1%(51%/10)的验证节点(见图1)。

图1:分片之间分割后的验证节点

这就带来第二个问题:谁负责为每个分片选择验证节点?如果5.1%的验证节点被攻破,但也只有在这些验证节点正好处于同一个分片时才有威胁。如果验证节点不能自主选择去验证哪个分片,那么一个控制了5.1%验证节点的参与者是很难让他控制的所有验证节点都在同一个分片的。这也就就大大降低了他破坏系统的能力。

当今几乎所有的分片系统都依赖给分片随机分配验证节点。区块链上的随机性本身就是一个极富挑战的话题,它超出了本文讨论的范畴。现在,让我们假设有这样一个可用的随机性。我们会在2.1节介绍验证节点分配的更多细节。

随机性和验证节点分配都要求计算工作与任意分片之间不存在对应关系。目前对于分片计算而言,几乎所有设计都使用一个额外的独立区块链,来执行维护整个网络所需要的操作。除了随机数生成和给分片分配验证节点外,这些操作通常还包括了接收分片更新以及执行分片快照,处理POS中的质押和取消验证节点资格,以及在支持再平衡功能的分片系统上进行分片的再平衡。这种独立链的名称,以太坊上叫信标链,波卡上叫中继链,Cosmos上叫CosmosHub。

本文统一将其称为信标链。信标链的存在引出了下面一个有趣的主题,即二次方分片。二次方分片

分片经常被视为一种可以随着网络中节点数的增加而无限扩展的方案。虽然从理论上看,人们是有可能设计出这种方案的,但任何使用信标链概念的方案都不可能无限扩展。为了理解其原因,我们要意识到,信标链要做一些记账的计算工作,例如给分片分配验证节点,或快照分片链区块,而这些都与系统中的分片数量成比例关系。因为信标链本身只是一条单独的链,计算量受限于运行节点的算力,因此分片数量自然就受到了限制。

然而,分片网络的结构确实对节点的改进产生了倍增的效果。想象一下这样一个场景,对网络中节点效率作出一定量的改进,从而使得节点处理交易的时间缩短。

如果节点(包括信标链中的节点)运行网络的速度提高了四倍,那么,每个分片都可以处理原先交易量的四倍多,而信标链也可以维持原先分片数量的四倍多。整个系统吞吐量的将提升:4×4=16倍,这就是二次方分片名称的由来。

当前,对于究竟能支持多少分片,很难提供精确的度量。但是,在可以预见的未来,区块链用户的吞吐量需求不太可能超过二次方分片的能力。运行如此众多的分片所需要的节点数,可能比当今所有区块链节点数的总和还要高出几个数量级。状态分片

目前为止,我们还未准确定义当网络切割成分片后,究竟什么被分割开,什么没有被分割出去。尤其要注意,区块链中的节点需执行三个重要任务:1)执行交易,2)把经过验证的交易和构建完成的区块中继给其他节点,3)存储整个网络账本的状态和历史。三个任务中的每一个都对运行网络的节点提出了不断增加的需求:

随着需要处理的交易量的增加,执行交易的必要性导致更高的算力需求;

随着需要中继的交易量的增加,中继交易和区块的必要性导致更高的网络带宽需求;

随着状态数据的增长,存储数据的必要性导致更大的存储需求。重要的是,不像算力和网络需求,存储要求是持续增长的,即使交易速率(TPS)保持恒定。

上面的列表可能让人觉得,存储需求是最急迫的,因为它是唯一一个随着时间持续增长的因素(即使每秒交易量不变)。但实际上,当前最急迫的需求是算力。撰写本文时,以太坊的全网状态大小是100GB,大部分的节点都可以轻松应对。而以太坊的每秒可处理交易量在20笔左右,比许多实际应用场景的需求低了好几个数量级。

Zilliqa是最广为人知的对交易处理而不是存储进行分片的项目。对处理分片相对容易:因为每个节点都有完整的状态,意味着一个合约可以自由调用其他合约,从链上读取任何数据。为了确保对状态同一部分进行更新的多个分片不会产生冲突,还需要一些细致的技术工作。从这方面来说,Zilliqa的方法有些简单(2)。

尽管之前有提出过对存储分片但不对处理分片的方案,但这是极不寻常的情况。在实践中,对存储分片,也就是状态分片,几乎总是隐含了对处理分片和网络分片。

实际上,状态分片中,每个分片中的节点都在构建他们自己分片的区块链,这条链仅包含那些对被分配给该分片的全局状态的本地部分产生影响的交易。因此,分片的验证节点只需要存储全局状态的本地(分片)部分,也仅仅执行和中继那些影响到这些本地状态的交易。这种分区线性地减少了所有包括算力、存储、带宽的需求。但是这也带来了新的问题,例如数据可用性和跨分片交易的问题。这两个问题我们会在下文阐述。跨分片交易

迄今为止,我们描述的分片模型还不是很有用。如果单个分片不能跟其他分片互相通信,整个系统不过就是多个独立的区块链而已。甚至在分片技术还不可用的今天,不同区块链之间的互操作性依然是一个巨大的需求。

现在,让我们只考虑简单支付交易,每个参与者仅在一个分片上拥有账户。如果有用户希望在同一分片内从一个账户转账到另一账户,这笔交易可以由本分片的验证节点全权处理。然而,如果分片1上的Alice想转账给分片2上的Bob,无论是分片1上的验证节点(他们无法把账存入Bob的账户),还是分片2上的验证节点(他们无法把账从Alice的账户取出),都不能处理整笔交易。

有两种跨分片交易的实现方案:

同步:无论何时,一笔跨分片交易需要执行时,所涉及分片上含有相关交易状态转移信息的区块都同时生成。这些分片的验证节点合作执行此类交易。

异步:影响多个分片的跨分片交易在其所涉及的分片上异步执行。贷记方的分片一旦有了充足的证据,表明借记方分片已经执行了借记那边的工作,就可以执行自己这边的贷记工作。这种方案更趋于流行,因为它比较简单,并且易于协同。这种系统被Cosmos、以太坊宁静、NEAR、Kadena等采用。这种方案有一个问题,如果区块是独立产生的,相关区块中的某个成为孤块的可能性总归存在,导致整个交易仅被部分执行。

想一下图2中描述的情况:两个分片都遭遇分叉。同时,一笔跨分片交易相应记录于块A和块X’中。如果链A-B和链V’-X’-Y’-Z’成为了各自分片的正统链,则跨分片交易完全确认。若A’-B’-C’-D’和V-X成为正统链,则跨分片交易完全被遗弃,这也是可以接受的。但如果A-B和V-X成为正统链,则跨分片交易的一部分确认,另一部分被遗弃,这会导致一个原子性错误。我们在第二部分中提出的协议里,会介绍该问题的解决办法,包括分片协议提出的分叉选择规则以及共识算法的变动。

图2:异步跨分片交易

值得注意的是,跨链通信不止在分片区块链有用。链间的互操作性是个复杂的问题,许多项目想要解决这个问题。在分片区块链中,该问题相对简单些,因为区块结构和共识在分片之间都是相似的,还有一个信标链可以用来做协调。所有的分片链都是大同小异的,然而全局的区块链生态体系中有许多不同的链,他们有不同的目标使用场景、不同的去中心化程度和隐私保证程度。

构建这样一个包含公共信标链,和一系列虽然拥有不同属性、但有一系列足够类似的共识和结构的区块链系统,可以实现一个有可用互操作子系统的异构区块链生态。这样的系统不太可能有验证节点轮替的功能,所以需要采取一些额外措施确保安全性。Cosmos和波卡实际上都属于这种系统。恶意行为

这一节,我们将回顾,如果恶意验证节点想破坏一个分片,会采用什么样的行为。我们将在2.1节回顾那些防止分片破坏的经典实现方法。

恶意分叉

一部分恶意验证节点也许试图创建一个分叉。需要注意的是,无论底层共识是否是BFT,买通足够数量的验证节点就都可能创建一个分叉。

相对来说,最可能发生的是买通一个分片中的50%以上(的验证节点),而不是买通整个链的50%以上(的验证节点)(我们将在2.1节详细阐述这些可能性)。正如1.4节中所讨论的,跨分片交易牵涉到多个分片中的某些状态改变,这类分片中应用这些状态变化的相应区块要么全部确定(即出现在对应分片被选中的分支上),要么全部成为孤块(即不出现在对应分片被选中的分支上)。一般意义上看,分片被破坏的可能性是不可忽视的,即使分片验证节点之间已经达成了某种拜占庭共识或是包含状态变化的块之上已经产出许多区块,我们也不能假设不会发生分叉。

这个问题有多种解决方案,最常用的一种是将分片链上最新的区块偶尔交叉连接到信标链上。分片链上的分叉选择规则相应变化为总会优选那些交叉连接的链,并且只对最后一个交叉连接之后产生的区块使用分片特定的分叉选择规则。

审批无效块

一些验证节点也许会尝试创建一个包含了不正确状态转换函数的区块。例如,从Alice有10枚通证、Bob有0枚通证的状态开始,区块可能包含包含一笔Alice转给Bob10枚通证的交易,但是最终状态如图3所示,Alice有0枚通证,Bob却获得了1000枚。

图3:无效区块的一个例子

在一个经典的非分片区块链中,这种攻击是不可能成功的,因为网络中所有参与者都会验证所有的区块。一个带有无效状态转换的区块,其他出块人和不出块的网络参与者都会拒绝。即使恶意验证节点继续在这个无效区块之上以相对诚实验证节点更快的速度堆积新的区块,使得包含无效区块的链更长,也没有关系。因为,不管出于何种目的使用这个区块链的参与者都会验证所有区块,并丢弃那些构建在无效区块之上的所有区块。

图4中有五个验证节点,其中三个是作恶者。他们创建了一个无效区块A’,并继续在其上创建新的区块。两个诚实验证节点丢弃无效的A’,并在最后一个在他们看来有效的区块上构建区块,导致了一个分叉。因为诚实验证节点的分叉中验证节点的数量更少,所以他们的链更短一些。然而,在经典的非分片区块链中,每个出于各种目的使用区块链的参与者都负责验证所收到的所有区块,并重新计算状态。因此,任何关注该区块链的人都能发现A’是无效的,并立即丢弃B’、C’和D’。这样一来,链A-B就是当前最长的有效链了。

图4:试图在非分片区块链中构建无效区块

但是,分片区块链中,任何参与者都无法验证所有分片上的全部交易。所以它们需要某种方法确认,链上任何分片的任何历史状态中,都不存在无效的区块。

需要注意的是,与分叉不同,交叉连接到信标链并不是该问题的一个充分的解决方案,因为信标链无法验证所有区块。它只能验证该分片中有足够数量的验证节点签名(并以此作为其正确性的证据)。

我们将在下面的2.2节讨论该问题的解决方案。

状态有效性和数据可用性

分片区块链的核心思想是大部分操作和使用网络的参与者无法验证所有分片的区块。因此,任何时候,参与者需要与某个特定的分片互动时,他们一般都无法下载和验证该分片的完整历史状态。

然而,分片的分区属性,引起了一个显著的潜在问题:如果不下载和验证特定分片的完整历史状态,参与者无法确信他们互动的状态是某个有效区块序列的结果,而且也不能确信这个序列就是该分片的正统链。这个问题在非分片区块链上是不存在的。

首先,我们会呈现解决该问题的一个简单方案,许多协议中也提出过这个方案。然后分析如何破解该方案,以及为了防止破解进行了哪些尝试。验证节点轮替

解决状态有效性一个比较简单天真的方案如图5所示:假设整个系统有数千位验证节点,其中不超过20%的是作恶者或会失效(比如掉线无法出块)。然后,如果我们取出200个验证节点作为样本,那么样本中超过1/3的验证节点会失效的概率在实际中可以视为0。

图5:验证节点取样

1/3是个很重要的阈值。有一个共识协议族,叫做BFT共识协议,可以保证只要少于1/3的参与者失效,不管是宕机或以某种方式违反了协议,整个系统还是能达成共识。

在这种诚实验证节点百分比的假设下,若某分片的当前验证节点集合提供了某个块,简单的方案就认为该块是有效的,且构建在这些验证节点开始验证工作时就认定的该分片的正统链上。这些验证节点从之前的验证节点集合中识别了正统链,而根据同样的假设,这些验证节点构建的区块就在正统链的前面。这样推导下去,整个链都是有效的。而且,既然任何时间节点的验证节点集合都没有产生分叉,这种简单的方案也确信当前链就是该分片的唯一链。观察图6可获得一个直观感受。

图6:每个块都通过BFT共识确定的区块链

如果我们假设验证节点受到自适应攻击,这个简单的方案就失效了。这个假设并非不合情理。自适应攻击拥有1000个分片的系统中的一个分片,其成本远低于去收买整个系统。因此,协议的安全性随着分片数量的增加而线性降低。为了确信一个块的有效性,我们必须知道系统的所有分片在任何历史时间点上,其大多数验证节点都没有勾结在一起。然而这种自适应破坏导致我们不再可以确信块的有效性。正如在1.5节中讨论的,被收买的验证节点可以实行两种基础的破坏行为:创建分叉,以及创建无效区块。

恶意分叉可以通过向信标链交叉连接区块的方式解决。信标链通常在设计上就比分片链有明显更高的安全性。然而,创建无效区块显然是个更难解决的问题。状态有效性

看一下图7的情况:分片1被攻破了,恶意行为人产生了无效的区块B。假设在这个区块B里,Alice的账户上凭空铸造了1000枚通证。恶意行为人接着在B后面创建了有效区块C(意思是C中的交易正确执行),从而掩盖了无效的区块B,并发起了一个到分片2的跨分片交易,内容是转账那1000枚通证给Bob的账户。此时,非法生成的通证反而驻留在分片2中一个完全有效的区块里。

图7:来自一个无效区块的跨分片交易

以下是应对该问题的一些简单方法:

分片2的验证节点(跨分片)验证产生交易的那个区块。这个方法在上图的场景中都不起作用,因为区块C看起来是完全有效的。

分片2的验证节点(跨分片)验证交易所在区块之前的一大批前置区块。自然的,对于接收分片验证的任何区块个数N,恶意验证节点都可以在产出的无效区块上创建N+1个有效区块来应对。

解决该问题的一个可行的方法是:把分片排列成无向图,每个分片都与若干其他分片相连。并且只允许这些相邻分片之间的跨分片交易(例子有,这就是VladZamfir的分片精要的做法(3),而且在Kadena的Chainweb中也用了相似的思想[1])。如果非相邻的分片需要一个跨分片交易,多个(相邻)分片路由的方式可以解决。在这个设计中,每个分片中的验证节点都要验证自己分片和相邻分片的所有区块。下图有10个分片,每个都有4个相邻分片,对于跨分片交易的两个分片之间最多仅需要两跳(见图8)。

图8:一个跨分片的无效交易会在类chainweb系统里被检测到

分片2不仅验证自己的区块,还验证所有相邻分片,其中包括分片1。如果一个分片1上的恶意行为人试图创建一个无效区块B,在其上创建区块C并发起跨分片交易,则这样的交易无法成功。因为分片2会验证分片1的完整历史,由此识别出无效的区块B。

尽管只攻破单个分片不再是可行的攻击方法,攻破若干分片仍然是个问题。在图9中,一个对手同时攻破了分片1和2,使用来自无效区块B的资金,执行了到分片3的跨分片交易:

图9:一个在类chainweb系统中检测不到的无效跨分片交易

分片3验证了分片2的所有区块,但是并不验证分片1的区块,因此无法检测到那个恶意区块。正确解决状态有效性问题有两个主要方向:渔夫与密码学计算证明。渔夫

第一种实现方法背后的思想是:一旦一个区块头(header)因为某种目的(比如交叉连接到信标链或跨分片交易)在链间传递,就有一个时间窗口让诚实的验证节点提交那个区块无效的证明。如今存在各种各样的设计,允许通过简洁的证明即可指认无效区块。对于接收节点来说,区块头的通信远比要接收整个区块小多了。通过这种方法,只要分片中至少有一个诚实验证节点,系统就是安全的。

图10:渔夫

这是当前提出的协议中主流的实现方法(除非假设这个问题不存在)。然而,这种实现有两大主要缺陷。一是质疑的时间窗口要足够长,让诚实验证节点可以识别产生的区块、下载并完全校验区块,并准备好在验证出无效区块时提出质疑。引入这么一种时间段会明显拖慢跨分片交易。

二是质疑机制的存在导致了一个新的攻击维度,作恶者用大量无效的质疑冲击系统。该问题的一个直接解决方案是让质疑者抵押一定量的通证,质疑有效才归还。但这也只是部分解决了问题,因为有可能对手(在抵押被没收的情况下)仍然能通过无效质疑获利。例如,以此阻止诚实验证节点的质疑获得通过。这种攻击被称为GriefingAttack(损人不利己)。处理后面这个问题的方法,参见3.7.2节。简洁的非交互知识论证

第二种应对多分片贿赂的方案是使用某种密码学的措施,允许一个人证明某个计算(比如从一系列交易中算出区块)被正确执行了。这种措施确实存在,比如zk-SNARKs、zk-STARKs等技术,经常用在当今隐私支付领域的区块链协议中,其中最知名的是ZCash。那些方案的主要问题是计算起来非常慢。例如,Coda协议,专门使用zk-SNARKs证明链上的所有区块都是有效的,在一次访谈中表示,为了创建一个证明,每笔交易要花费30秒时间(目前这个数字可能要小些)。

有趣的是,证明未必需要一个可信实体进行计算。因为证明不仅能证实它的目标计算的有效性,还能证实其自身的有效性。因此,这种证明的计算工作可以分配给一系列参与者,与必须执行某些无需信任的计算相比,显著降低了冗余。它也允许计算zk-SNARKs的参与者运行在特殊的硬件上,同时不会减低系统的去中心化程度。

除了性能外,zk-SNARKs面临的挑战还有:

依赖于鲜有研究和缺少时间验证的密码学基元(primitives);

「有害废弃物」--zk-SNARKs依赖于一个可信的设置过程,其中一组人执行某种计算,并丢弃该计算的中间值。如果该过程的所有参与者互相勾结,保留了中间值,则就能创建虚假证明;

系统设计引入额外的复杂性;

zk-SNARKs只适用于所有可能计算的一个子集。所以,支持图灵完备的智能合约语言的协议将不能使用SNARKs证明链的有效性。数据可用性

我们遇到的第二个问题是数据可用性。一般来说,运行特定区块链的节点分为两种:全节点,指那些下载每一个完整区块并验证每一笔交易的节点;和轻节点,指那些仅下载区块头、并对其关注的部分状态和交易应用默克尔证明的节点。参见图11。

图11:默克尔树

如果大部分全节点互为勾结,他们可以创建有效或无效的区块,并发送其哈希值给轻节点,但从不暴露该区块的全部内容。有多种方式可以让他们从中受益。例如,图12的情况:

图12:数据可用性问题

这里有3个区块:前置区块A,由诚实验证节点创建;当前区块B,由受贿的验证节点签发;以及接下来的区块C,也将由诚实验证节点创建(区块链描绘在图的右下角)。

假设你是个商家。当前区块B的验证节点从前代验证节点手里接收到区块A,接着计算出你收到钱的区块,并发送给你一个包括默克尔证明的该块区块头,显示拥有这笔钱的状态(或者是发送给你钱的有效交易的默克尔证明)。你确信这笔交易已确定,所以提供了相应服务。

然而,验证节点从未把区块B的全部内容分发给任何人。因此,构建区块C的诚实验证节点无法获取该区块,只能强制终止整个系统,或者在区块A上构建新块,同时剥夺你作为商家对那笔钱的所有权。

当我们把相似的场景放到分片上,全节点和轻节点的定义一般可以对应到每个分片上:每个分片的验证节点下载该分片的每个区块并验证其中的每笔交易,但是系统中的其他节点,包括那些快照分片链状态到信标链的节点,都只下载区块头。因此,分片验证节点对该分片来说,实际上就是全节点,而系统的其他参与者,包括信标链,就像一个轻节点那样运作。

为了让我们前面讨论的渔夫方案发挥作用,诚实验证节点需要能下载交叉连接到信标链的区块。然而,如果恶意验证节点交叉连接一个无效区块的头部(或使用它发起跨分片交易),但从不分发该区块,那么诚实验证节点就无法发起质疑。我们将介绍应对该问题的三种互补的解决方案。

托管证明

亟待解决的最直接问题是,区块一旦被发布是否就是可用的。一种想法是,使用被称为公证人(Notary)的角色,让其在分片中以比验证节点更快的频率轮转。他们唯一的工作是下载一个区块并证明他们有能力下载它。他们之所以能更频繁的轮转,是因为无需下载分片的整个状态,不像验证节点,后者每次轮转都要下载分片的状态,因此不能频繁轮转,如图13所示。

图13:验证节点需要下载状态而不能频繁轮转

该想法不足之处在于,后面无法验证某个公证人是否真能下载那个区块。因此,一个公证人可以选择总是声称他们能下载那个区块,甚至不用尝试获取这个区块。一个解决方案是让公证人提供某种证据证明其下载了区块或质押一定数量的通证作为担保费。这里讨论了该类方案的其中一种。

纠删码

当一个特定的轻节点收到一个区块哈希值时,为了提升节点对区块可用性的信心,它可以尝试下载该区块的一些随机碎片。这还不是一个完整的方案,因为除非轻节点联合下载完整区块,恶意出块人可以选择扣押区块中未被任何轻节点下载的那部分内容,因此仍可以使区块不可用。

一个解决方案是使用一种称为「纠删码」的措施,即使在只有区块的部分内容可用的情况下,也能恢复整个区块,如图14所示。

图14:建在纠删码数据上的默克尔树

波卡和以太坊宁静都采用了基于这种思想的设计,为轻节点提供了一种方式,使其能确信区块是可用的。以太坊宁静的实现在参考文献2中有详细介绍[2]。

波卡对数据可用性的实现

和大部分分片方案一样,波卡每个分片(叫做平行链)快照它的区块到信标链(叫做中继链)。假设中继链有2f+1个验证节点。平行链的出块人叫做整理人.平行链区块一产出,整理人便计算该区块的一个纠删码版本,其中包含2f+1个部分,因此任意f个部分都能重建整个区块。

然后他们给每个中继链的验证节点分发一个部分。一个特定的中继链验证节点,只有在中继链验证节点拥有每个被快照至该中继链区块的每个平行链区块的专属部分,该验证节点才对该中继链区块签名。因此,如果一个中继链区块包含来自2f+1个验证节点的签名,且只要其中不超过f个验证节点违反了协议,那每个平行链区块都还是能从那些遵循了协议的验证节点手中重建出来。见图15。

图15:波卡的数据有效性

长期数据可用性

值得注意的是,上述方案都只能证明一件事:已经发布一个区块且当前可用。一段时间后,由于以下各种原因,区块可能变为不可用:节点下线,节点故意删除了历史数据等。

对于该问题,Polyshard[3]的白皮书值得一提:使用纠删码确保区块在分片之间是可用的,即使一些分片完全丢失了他们的数据也无妨。不幸的是,他们的特定实现需要任一分片都下载其他所有分片的区块,成本过于高昂。

还好长期可用性问题并不太急迫,因为系统并不指望其参与者能验证所有分片上的所有链。所以,分片协议的安全性设计需要能够做到:即使一些分片的旧区块变得完全不可用,整个系统依然是安全的。

夜影分片协议

从分片链到分片段

这种多个分片链加一个信标链的分片模型非常强大,但也相当复杂。特别的,分叉选择规则需要在每个链上独立执行,而且分片链和信标链的分叉选择规则一定要有区别的构建和独立的测试。

在夜影中,我们把系统建模成一个单一的区块链,其中每个块逻辑上包含所有分片的全部交易,以及改变所有分片的整个状态。然而,从物理的角度看,任何参与者都不会下载完整的状态或完整的逻辑区块。网络的每个参与者其实只是维护他们为之验证交易的分片上对应的状态。区块中的所有交易的列表都被分割成物理上的段,每个分片对应一个段。

在理想的条件下,每个(逻辑)块里,每个分片都正好有一个分段对应。这基本上对应到分片链模型中,分片链和信标链以相同的速度出块。然而,由于网络延迟,一些分段可能错过(出块),所以在实践中,每个(逻辑)块的每个分片对应着0个或1个分段。对如何出块的详细介绍参见3.3节。

图16:一个(分片比较)模型,左边是分片链,右边是一个链将其区块分段共识

当今区块链共识的两个主流方法是:最长(或最重)链共识,指由最多工作量或权益打造的链被认为是正统链;以及BFT共识,指对于每个块,都由一批验证节点在其中达成一个BFT共识。

在最近提出的协议中,后一种共识的实现更加流行一些。因为它提供了即时的确定性,而在最长链规则中,需要更多的区块创建在目标区块之后,才能确保确定性。通常,为了达到一个严谨的安全等级,需要小时级别的时间才能有足够数量的区块(在目标区块之后)创建出来。

对每个块使用BFT共识,也有些缺点,例如:BFT共识涉及相当多的通信量。尽管最新进展允许以参与者达成共识的时间与网络参与者的数量形成线性关系(见[4]),但这个工作量对每个块来说仍然是不可忽视的;

所有网络参与者都参与每个块的BFT共识是不现实的,因此通常仅有一个参与者的随机样本子集参与达成共识。一个随机的样本集合,原则上是可能受到自适应攻击的,因此理论上分叉是会出现的。系统在设计上要么需要为这种情况做好准备(因此,除了BFT共识,依然还要有分叉选择规则),要么就要在这种情况下关闭。值得一提的是,某些设计,例如Algorand[5],已大大降低了自适应攻击的可能性。

最重要的是,如果1/3或更多的参与者掉线,系统将中止。因此,任何临时的网络小故障或一个网络分裂就会使系统完全瘫痪。理想情况是,系统必须能够继续运行,只要至少一半的参与者在线(基于最重链的协议,甚至能在少于一半参与者在线的情况下继续运行,但是这个特点是否必要在社区内还有不少争论)。

在一个混合模型中,共识使用的是某种最重链规则,但是周期性的对一些块使用BFT确定性工具来实现其确定性。这样就同时保有了两种共识模型的优点。这种BFT确定性工具有用于以太坊2.0(1)的CasperFFG[6]、CasperCBC和用于波卡的GRANDPA。

夜影使用最重链共识。尤其当一个出块人产生一个区块时(参见3.3节),他们可以从其他出块人和验证节点中收集签名,作为对前一个区块的证明。参见3.8节对于如何积累如此大量签名的详细介绍。一个区块的权重就是所有那些在区块中签了名的签名者积累的抵押权益。而一个链的权重就是区块权重的和。

在最重链共识之上,我们使用一个确定性工具,利用证明确定区块。为了减低系统复杂度,我们使用的确定性工具在任何情况下都不影响分叉选择规则,而只是引入额外的罚没质押通证条件。这样一来,一旦一个区块被确定性工具确定下来,就不可能出现分叉,除非占总权益极大百分比的权益都被罚没了。

CasperCBC就是这样一种确定性工具,我们在设计时有参考CasperCBC。

我们也在研究一个独立的BFT协议,叫做TxFlow。撰写本文时,尚不清楚TxFlow是否会用来取代CasperCBC。然而,我们注意到,确定性工具的选择在很大程度上与设计的其余部分无关。出块

夜影中有两种角色:出块人和验证节点。设系统有w个出块人,以及wv个验证节点(v在这里指的是验证节点和出块人的比例),在我们的模型里w=100,v=100(此处v的定义原文中没给),wv=10000。作为一个权益证明(POS)系统,意味着出块人和验证节点把一定数量的内部货币(称为「通证」)锁定一段时间,且这段锁定期远超过他们用来执行构建和验证链的时间。

与所有的PoS系统一样,不一定w个出块人和wv个验证节点都是不同的实体,因为这是无法强制的。然而,w个出块人和wv个验证节点中的每一个节点都单独抵押权益。

系统包含n个分片,我们的模型中n=1000。正如3.1节提到的,夜影中没有分片链,取而代之的是,所有的出块人和验证节点共同构建单一的区块链,我们称之为主链。主链的状态被分到n个分片中。每个出块人和验证节点在任何时候都只在本地下载对应某个分片子集的状态子集,且只处理和验证影响这部分状态的交易。

要成为出块人,一个网络参与者锁定一大笔通证(一笔质押权益)。网络按周期(epoch)进行维护,一个周期是数天级别的时间长度。每个周期之初,质押权益最多的前w个参与者就是该周期的出块人。每个出块人指派给sw个分片,(设sw=40,则每分片有swW/n=4个出块人)。在周期开始前,出块人下载所指派分片的状态,然后在整个周期中收集影响该分片的交易,并把它们应用到状态上。

对于主链上的每个块b,和每个分片s,都有一个指定给s的出块人负责生产b上有关该分片的区块部分。这个部分被称为分片段,包含了b中有关该分片的交易列表,以及结果状态的默克尔树根。b最终只包含该分片段的一个很小的段头,也就是所有应用交易的默克尔树根(具体信息参见3.7.1节),和最终状态的默克尔树根。

本文剩余部分,我们通常把在特定时间为特定分片创建分片段的出块人称为出段人,出段人一定是出块人之一。

出块人和出段人根据一个固定的安排轮换每个块。出块人有个顺序并依序重复出块。例如,如果有100个出块人,第一位出块人负责创建块1、101、201等,第二位出块人负责2、102、202等。

创建分片段与创建区块不同,需要维护状态。而且对每个分片来说,仅仅swW/n位出块人维护着每个分片的状态,相应的也就只有这swW/n位出块人轮换创建分片段。例如,按照上面的常量设定,一个分片指定了4个出块人,每个出块人每四个块创建一次分片段。

确保数据可用性

为了确保数据可用性,我们使用了跟2.5.3节描述的波卡类似的方式。一旦一个出块人创建了一个分片段,就创建该分片段的一个纠删码版本,纠删码参数为(w,⌊w/6+1⌋),然后发送该段纠删码的每一片(我们称这样的码片为段颗粒chunkparts,或者就叫颗粒parts)给每个出块人。

我们计算出一棵默克尔树,其中每个颗粒都是叶子,并在每个段的头部都包含该默克尔树的根。这些颗粒通过单颗粒消息(onepartmessage)发给验证节点。每条这种消息包含该段的段头、颗粒序号以及颗粒内容。消息中还包含创建该段的出块人的签名,以及证明该颗粒对应头部且由正确的出块人创建的默克尔路径。

一旦一个出块人收到一个主链的块,他首先检查自己是否有该块包含的每个段的单颗粒消息。如果没有,该块就不被处理,直到获取到缺失的单颗粒消息。

一旦所有的单颗粒消息收全了,这个出块人从其他出块人那里拿来剩余部分并重建他们为之持有状态的那些段。

出现以下情况时,出块人不会处理主链区块:如果区块中至少有一个分片段的对应单颗粒消息未收到;或如果他负责维护状态的分片中至少有一个分片无法重建出对应的完整段。

若要一个特定的分片段可用,只要有⌊w/6⌋+1的出块人持有并能提供相关的颗粒即可。因此,只要作恶者的数量不超过⌊w/3⌋,就不会让一个超过半数出块人(在线)的链含有无效的分片段。。

图17:每个块包含每个分片的0到1个段,每个段都经过纠删编码处理

处理懒惰的出块人

如果一个出块人遇到一个缺失了一条单颗粒消息的块,他可能仍然会签名。因为如果这个块最终上链了,就能使该出块人的利益最大化。而且这对出块人没有风险,因为过后无法证明这个出块人没有那条单颗粒消息。

了解决这个问题,我们让每个出段人在创建段的时候为后面经过编码的段的每个颗粒选择一个颜色(红或蓝),并在编码前将所选颜色的掩码存入段中。每条单颗粒消息都包含该颗粒指定的颜色,这个颜色也用来计算编码颗粒的默克尔根。如果出段人违反协议,将被轻易检测出来。因为,要么默克尔根对不上单颗粒消息,要么匹配了默克尔根的单颗粒消息中的颜色与段的掩码不匹配。

当出块人签名一个区块时,他将收到的该块中所有段的红色颗粒做成掩码放在签名中。发布一个不正确的掩码是一种可罚没质押通证的行为。如果一个出块人没有收到某条单颗粒消息,是无法知道其颜色的,因此尝试盲签区块就有50%的可能性会被惩罚。状态转换的执行

出段人创建段时,只是选择哪些交易要放在段中,而不会执行状态转换。相应的,段头部包含执行该段交易之前的默克尔状态的默克尔根。仅当一个包括该段的完整区块得到处理时,这些交易才会执行。而一个参与者仅在以下条件达成时处理区块:

前一个区块已经接收并得到处理;

对于不维护状态的那些段,参与者见到了单颗粒消息;

对于需要维护状态的那些段,参与者拥有完整的段。

一旦区块得到处理,对于那些需要维护状态的每个分片,参与者执行交易并计算交易执行后的新状态。之后,如果被分配到任何分片,参与者就准备好创建下个区块的对应段,因为他已经有了新默克尔状态的默克尔根。跨分片交易和收据

如果一笔交易不止影响一个分片,就需要在不同的分片中连续独立执行。完整的交易发给第一个相关的分片。一旦该分片的段中包含了该交易,且在该段被包含进区块之后被执行,就会产生一笔收据(receipt)交易。该收据被路由给下一个需要执行该交易的分片。如果跨分片交易需要更多的步骤,则当执行收据交易的时候,会产生一笔新的收据交易,如此循环。

收据交易生命周期

理想的情况是,收据交易在产生收据的块的下一个块中立刻被执行。只有在维护源分片的出块人接收并执行了前一个块后,收据交易才会生成。并且,需要在目的分片的出块人为下一个区块创建段之前被其知晓。因此,在这两个事件间的一段短时间内,收据必须由源分片通信到达目的分片。

假设A是最后产生的区块,包含交易t,而t产生了收据r。把下一个将产生的区块记为B(也就是说,这个块将A作为其前置区块),我们希望在B中包含r。假设t在分片a中,而r在分片b中。如图18中所述,收据的生命周期如下:产生和存储收据。分片a的出段人cpa收到块A,执行交易t,并生成收据r。cpa接着将所有生成的收据存储在它内置的持久化存储中,以源分片的id为索引。

分发收据。一旦cpa准备为块B创建分片a的段,他获取到所有通过执行块A中分片a的相关交易时产生的收据,并将它们包含在块B对应分片a的段中。段生成后,cpa产生它的纠删码版本,和所有对应的单颗粒消息。cpa知道哪些出块人维护哪些分片的全状态。对一个特定的出块人bp,cpa在发布区块B里对应分片a的段时,把一些收据放进单颗粒消息中,这些收据是执行块A中有关分片a的交易的结果,且这些交易的目的分片是bp去维护状态的(收据放进单颗粒消息的展示参见图17)。

接收收据。回忆一下,参与者(包括出块人和验证节点)不会执行块,除非他们有了块中每个分片段的单颗粒消息。因此,在任何参与者执行区块B的时候,他们已经获得B中所有段对应的全部单颗粒消息,也就拥有了所有传入的收据,这些收据以参与者维护状态的分片为目的地。当执行一个特定分片的状态转换时,参与者既执行单颗粒消息中与该分片有关的收据交易,也执行该段自身包含的所有交易。

图18:收据交易的生命周期

应对过量的收据

有可能指向一个特定区块的特定分片的收据的数量过大,超过了其处理能力。例如,图19的情况,每个分片的每笔交易都产生了一个指向分片1的收据。到下个区块时,分片1需要处理的收据数量已经与上个区块中所有分片合起来要处理的收据数量一样多了。

图19:如果收据指向同一个分片,该分片可能无力处理它们

要解决这个问题,我们使用一个类似QuarkChain(2)中使用的技术。特别的,对每个分片,最后的区块B中最后一条被执行的收据所在的分片s被记录下来。当新的段创建时,会首先从块B中遗留还未处理的收据开始执行,接着才是块B之后的区块,直到新的段被塞满为止。

在正常情况下,随着负载均衡,这个过程的结果是所有收据都被执行(因此每个段中记录的都是最后一个块的最后一个分片)。然而,当负载不均衡时,如果一个特定的分片收到了过多的收据,该技术也能允许这些收据在段中交易条数有限制的前提下被处理。

需要注意的是,如果这种负载不均衡持续了很长时间,则收据从创建到执行之间的延迟可能持续地无限增长。一种解决方式是,当收据指向的是处理延迟超过了某个常数(例如,一个周期)的分片时,该收据产生的交易会被丢弃。

考虑图20的情况。直到区块B时,分片4还没有处理完所有收据。它仅处理到来自区块A中分片3所产生的收据,并记录了下来。在区块C时,收据处理跟进到区块B的分片5,最后在区块D时,该分片赶上了进度,处理了区块B里所有遗留的收据和区块C里的全部收据。

图20:延迟的收据处理分片段有效性

一个特定分片的段(或在分片链模型中一个特定分片链的分片块)只能由那些维护其状态的参与者验证。他们可以是出块人、验证节点或仅仅是那些下载状态并对存有他们资产的分片进行验证的外部见证人。

本文中,我们假设大部分验证节点不会存储绝大部分分片的状态。然而值得一提的是,确实有一些分片链,是基于这样的假设设计的:大部分参与者都有能力存储和验证大部分分片的状态,例如QuarkChain。

因为仅有一部分参与者拥有能够验证分片段的状态,这就有可能对那些有状态的参与者进行自适应攻击,执行一个无效的状态转换。

在多个分片设计方案中,每隔几天就对验证节点采样。一天内,分片链中的任何块,只要获得了超过2/3的验证节点对该分片的签名,就立刻视为确定的块。通过这种方法,一个采用自适应攻击的对手只需贿赂一个分片链中2n/3+1的验证节点,就能执行一个无效的状态转换。尽管这种攻击很难实现,但对于一条公链来说,这种等级的安全性还不够。

正如2.3节所讨论的,常见的方案是在出块后留出一个时间窗口,让任何持有状态的参与者(无论是出块人、验证节点还是外部观察者)质疑其有效性。这类参与者被称为渔夫。为了让渔夫能够质疑一个无效区块,必须确保区块对渔夫来说是可用的。夜影中数据可用性的讨论在3.4节。

夜影中,一个块产生后,(其中的)分片段除了实际的出段人,没人可以验证。特别是,发布区块的出块人自然不持有大部分分片的状态,并且无法验证分片段。当下一个区块创建时,会包含多个出块人和验证节点的证词(参见3.2节),但既然大部分出块人和验证节点都不持有大部分分片的状态,所以仅包含一个无效分片段的区块也能收集到超过半数的证词,并继续存在于最重的链上。

为了解决该问题,我们允许任何维持分片状态的参与者,对该分片产生的任何一个无效分片段,提交一个链上质疑。

状态有效性质疑

一旦参与者检测到一个特定的分片段是无效的,他们需要提供一个证实该段无效的证明。因为大部分网络参与者并不维护无效段所在分片的状态,证明中需要包含足够的信息证明无需持有状态即可确认该块无效。

我们设了一个门限Ls,代表单一交易所能累积读取或写入的状态数量上限(以字节为单位)。任何访问超过Ls个状态量的交易都被视为无效。3.5节中说过,特定区块B中的段只包括将被执行的交易,不包括新的状态根。区块B中该段包括的状态根是执行这些交易之前的状态根,是执行了区块B之前区块中同一个分片的最后一个段中交易的结果。一个作恶人想要执行一个无效状态转换,就要把一个错误的状态根放到区块B中,这个状态根与执行前段中交易的结果状态并不对应。

我们把出段人放在分片段中的信息扩展一下。不再放置执行所有交易之后的状态,而是将交易分割成相邻集合,每个集合都总计读写了Ls字节的状态。然后逐个集合的执行这些交易,存储这些连续交易集合的状态跟。有了这些信息,渔夫就可以创建一个错误状态转换的质疑挑战,找到第一个无效的状态根,在上一个带有默克尔证明的状态根(有效的)和当前带有默克尔证明的状态根之间发生的交易所影响到的Ls字节状态放入。这样,任何参与者都可以验证这批交易,确认该分片段是无效的。

类似的,如果出段人试图把一个读写超过Ls字节状态的交易包含进来,对质疑来说,只要包括带有默克尔证明的、该交易访问的前Ls个字节即可。这已足够执行交易并证明在某个时刻,有过尝试读写超过Ls字节内容的情况发生。

渔夫和快速跨分片交易

正如2.3节中讨论的,一旦我们假设分片的段(在分片链模型中的分片区块)可能无效,并引入了质疑时间,就会对确定性以及跨分片通信有负面影响。尤其是在质疑结束前,任何跨分片交易的目的分片无法确认源分片的段或块是否确定(参见图21)。

图21:在执行收据之前等待质疑时间

解决办法是,用某种方式让跨分片交易立即完成:对目的地分片,不等原分片交易发布后挑战结束,立即执行收据交易。如果后面发现源段或块无效,就目的分片和源分片一起回滚(参见图22)。对于夜影的设计来说,应用该方案很自然。因为分片链不是独立的,而是由分片的段一起,发布在同一个主链区块中。如果发现任何段是无效的,包含这个段的整个块、以及构建在其上的块都被视为无效。参见图23。

图22:立即执行收据和当源链有无效区块时目的链的回滚

图23:夜影中的渔夫挑战

假设整个质疑过程足够长,上面的方案就都具有原子性。我们采用后一种方案,因为在普通情况下提供快速的跨分片交易,相比目的分片回滚带来的不便,前者更重要。这种因某个源分片上无效的状态转换所导致的目的分片回滚,是极度罕见的事件。

潜伏的验证节点

质疑机制的存在已经显著降低了自适应攻击的可能性。因为确定一个含有无效状态转换的段并通过挑战时间,采用自适应攻击的对手需要贿赂所有维护该分片状态的参与者,包括所有(该分片的)验证节点。

预测发生这种事情的可能性是极端复杂的,因为当今活动的分片链都没有经历足够长的时间,让人尝试这种攻击。我们认为这种风险,尽管可能性很低,但对于一个预期要执行数百万笔交易和执行世界级金融操作的系统来说,还是足够高了。

这个判断来自两个主要原因:大部分POS链的验证节点和POW链的矿工主要受经济方面的激励。如果一个自适应攻击的对手提供的金钱超过诚实操作的预期回报时,可以预计许多验证节点会接受贿赂。许多做POS链验证的都是专业的实体,预计任何链上大部分权益抵押来自这种实体。这种实体的个数对一个自适应攻击的对手来说足够小,对手可以了解大多数实体,了解他们被贿赂的意向。

通过隐藏验证节点分配到分片的信息,我们进一步减少了自适应攻击的可能性。这个思想与Algorand[5]隐藏验证节点的方法有些类似。

有一点需要重要指出的是,即使是Algorand或下文描述的方法,把验证节点隐藏了,自适应攻击还是存在理论上的可能性。尽管自适应攻击的对手不知道参与者会创建或验证一个区块或分片段,参与者自己却是知道他们将要做的任务,并有一个相关的密码学证明。

因此,作恶者可以广播他们贿赂的意图,并支付给愿意提供那个密码学证明的参与者。但是,我们注意到,因为作恶者不知道他们将要贿赂的分片上的验证节点,除了在整个社区里广播他们贿赂特定分片的意图外,别无他法。这是让任何诚实参与者都可以开启全节点去验证那个分片来获得经济利益的时机。因为在那个分片上出现无效区块的几率变大了,这就是创建质疑、获得相关奖励的机会。

为了不暴露特定分片的验证节点,做如下处理(参见图24):

使用VRF进行分派。每个周期开始时,每个验证节点使用VRF得到指定分片的掩码。每个验证节点的掩码都将含有sw个比特位(参见3.3节对sw的定义)。接下来,验证节点获取相关分片的状态,并在整个周期内,对收到的每个块验证其中指派给自己的分片所对应的分片段。

对区块块签名而不是分片段。既然分片指派是隐藏的,验证节点就不能在段上签名,而是通常对整个块签名,这样就不会暴露他验证哪些分片。特别的,当一个验证节点收到一个区块并验证了所有的分片段后,他要么创建一条消息,证明他负责的所有分片(没有以任何方式表明是哪些分片)中所有的段都是有效的;要么在任意一个段无效时,创建一条消息,包含一个无效状态转换的证明。对如何聚合这些消息的详细介绍,参见3.8节。对如何防止验证节点照抄其他验证节点消息的详细介绍,参见3.7.4节。以及3.7.5节,详细介绍了当一个成功的无效状态转换质疑发生时,如何奖惩验证节点。

图24:夜影中的验证节点隐藏

承诺生成(commit)-展示(reveal)

验证节点的一个常见问题是,他可以跳过状态的下载和对分片段和区块的实际验证,而是观察网络,看其他验证节点提交的内容并重复他们的消息。采用这种策略的验证节点并不能给网络带来任何安全的提升,只是获得奖励。

一个解决该问题的常见方案是,要求每个验证节点提供一个证明,证实他们确实验证了区块。例如,提供一个执行状态转换的独有痕迹,但是这种证明大大增加了验证的开销。

图25:承诺生成-展示

与其我们让验证节点先承诺(commit)一个验证结果(要么是一条证明段有效的消息,要么是一个无效状态转换的证明),等待一段时间,之后才能展示(reveal)实际的验证结果,如图25所示。承诺阶段和展示阶段不会重叠,因此一个懒惰的验证节点无法抄袭诚实验证节点。此外,如果不诚实的验证节点承诺了一条证实所负责的分片段都有效的消息,而最终有一个段无效。只要这个段的无效性被公开,该验证节点就无法逃避惩罚。就如我们将在3.7.5节所展示的,那种情况下,唯一不被惩罚的方式就是(在展示阶段)呈现一条包含无效状态转换证明的消息,并与自己的(在承诺阶段的)的申明匹配。。

处理质疑

如上所述,一旦验证节点收到一个含有无效分片段的区块,他们先准备一个无效状态转换的证明(参见3.7.1节),然后提交这样一个证明(参见3.7.4节),再在一段时间后展示这个质疑。一旦块里包含一个被展示的质疑,接下来会:

从包含无效段的块开始,直到包含质疑展示的块为止,期间发生的所有状态转换都失效。包含质疑展示的块之前的状态回到包含无效段的块之前的状态。

在一段时间内,每个验证节点必须展示自己负责验证的区块的掩码。因为掩码通过VRF创建,如果他们被指派到发生了无效状态转换的分片,就无法绕过这个展示。任何没有成功展示掩码的验证节点都被认为是被指派到这个(含有无效状态转换的)分片的。

经过掩码展示阶段后,任何一个被指派到该分片的验证节点,如果当时提交的不是该区块包含无效的段,或者没有展示匹配他们提交的无效状态转换的证明,就被惩罚。每个验证节点重新指派分片,在一段足够验证节点下载对应状态的时间后,新的周期开启,参见图26。

图26:处理质疑

要注意的是,因为验证节点的分片分派情况已公开,从验证节点公开他们所分派的分片开始,直到新周期开启,这段时间系统的安全性降低了。网络的参与者在该期间使用网络时,需要牢记这一点。签名聚合

为了让一个拥有上千分片的系统安全运行,我们需要有上万级或更多的验证节点。如3.7节所述,我们想要每个验证节点在每个块都承诺某条消息并签名。即使承诺的消息是一样的,聚合出一个BLS签名并对其进行验证都是极度昂贵的。更不用说承诺和展示的消息在验证节点之间通常是不同的,所以我们需要某种别的方法来聚合这些消息和签名,以支持后面对它的快速验证。

我们使用的方法如下:验证节点关联出块人。因为周期开始前要留出下载状态的时间,所以在周期开始前的某个时刻,出块人就确定了。而且与验证节点不同,出块人不是隐藏的。每个出块人有v个验证节点槽位。验证节点提交链下请求给出块人,让自己成为其v个(关联)验证节点之一。如果出块人愿意关联该验证节点,就提交一笔交易,包括最初来自验证节点的链下请求和出块人同意其加入的签名。要注意,被指派给出块人的验证节点所验证的分片无需和其关联的出块人负责出段的分片一致。如果一个验证节点申请加入多个出块人,只有来自第一个出块人的交易会成功。

出块人收集提交信息。出块人始终收集来自验证节点提交和展示的消息。只要积累了一定数量的这些消息,出块人就计算这些消息的默克尔树,给每个验证节点发送默克尔根和各自的默克尔路径。验证节点验证路径并在默克尔根上签名。接着,出块人就在验证节点给的默克尔根(译者注:含有验证节点签名)上累积一个BLS签名,然后仅仅发布默克尔根和累积签名。

出块人也使用廉价ECDSA签名方式,签名保证前面那个多签的有效性。如果多签与提交的默克尔根不匹配,或者与验证节点的掩码不匹配,就是需要惩罚的行为。同步链时,参与者可以选择验证来自于验证节点的所有BLS签名(这个开销将极度昂贵,因为牵涉到聚合验证节点的公钥),或仅验证出块人的ECDMA签名,并且该出块人没有被质疑和惩罚。

使用链上交易和默克尔证明进行质疑。你会注意到,没有检测到无效状态转换时,展示验证节点的消息是没有价值的。只有那些包含无效状态转换实际证明的消息需要展示,也仅仅只有这些消息需要表现出自己与之前的承诺相匹配。展示消息有两个目的:

为了实际开启往无效状态转换之前时刻的链上回滚(参见3.7.5节)。

为了证明验证节点没有试图证明一个无效段是有效的。

对于这两条,我们需要解决两个问题:链上并不包括承诺本身,有的只是它与其它消息聚合出的默克尔树根。验证节点需要使用出块人提供的默克尔路径和原始承诺来证明他确实进行了质疑。

有可能出现无效状态转换的分片的所有验证节点都正好被指派给审查他们的受贿的出块人。为了解决这个问题,我们允许验证节点提交自己的展示信息作为链上常规交易,并绕过聚合。

后一种机制仅允许用来证明无效状态转换。这种情况极其罕见,因此不会导致区块中的垃圾交易问题。最后一个要解决的问题是,出块人可以选择不参与消息聚合,或故意审查特定的验证节点。我们通过将出块人的奖励与关联的验证节点数量挂钩,使那种行为在经济上不可取。我们也注意到,因为周期之间的出块人有很大的交集(因为总是权益抵押最多的前w个参与者入选),验证节点可以很大程度上坚持与相同的出块人合作,也就降低了将其指派给曾对其进行审查的出块人的风险。快照链

因为主链上出块非常频繁,下载全历史可能很快就变得昂贵。而且,因为每个块包含一个大批参与者的BLS签名,仅仅是聚合公钥来检查签名的开销就会变得过高。

最后,因为在可以预见的未来,以太坊1.0很可能依旧是最常用的区块链之一,需要一条重要的渠道能从NEAR往以太坊转移资产。而目前,通过验证BLS签名来确保NEAR区块在以太坊那一侧的有效性是暂时行不通的。

夜影主链上的每个块可选择是否在上一个包含Schnorr多签的区块的头部上包含一个Schnorr多签。我们称这样的块为快照块(snapshotblock)。每个周期的头一个块必定是快照块。当处理这样一个多签时,出块人也必须积累上一个快照块上验证节点的BLS签名,并以3.8节描述的方法聚合他们。

既然整个周期中,出块人集合都是不变的,仅验证每个周期的第一个快照块就足够了。前提是没有发生大比例的出块人和验证节点相互勾结和出现一个分叉的情况。

周期的第一个块必须带有足以计算本周期出块人和验证节点的信息。我们把仅包含快照块的主链的子链,称为一条快照链。

创建Schnorr多签是个互动的过程,但既然我们仅需要低频的执行它,那么不管多低效,任何过程都可以满足。Schnorr多签可以在以太坊上方面得到轻松验证,为安全的跨链通信提供了重要的基础。

为了同步NEAR链,只需要下载所有的快照块,并确认Schnorr多签是正确的(也可以选择验证个别验证节点BLS签名),然后仅仅从最后一个快照块开始同步主链上的块。

结语

这篇文章中,我们讨论了构建分片区块链的方式,以及两个主要挑战和现存的应对方案,分别是状态有效性和数据可用性。然后我们提出了夜影,一个助力NEAR协议的分片设计。参考文献[1]MonicaQuaintanceWillMartinoandStuartPopejoy.Chainweb:Aproofof-workparallel-chainarchitectureformassivethroughput.2018.[2]MustafaAl-Bassam,AlbertoSonnino,andVitalikButerin.Fraudproofs:Maximisinglightclientsecurityandscalingblockchainswithdishonestmajorities.CoRR,abs/1809.09044,2018.[3]SongzeLi,MingchaoYu,SalmanAvestimehr,SreeramKannan,andPramodViswanath.Polyshard:Codedshardingachieveslinearlyscalingefficiencyandsecuritysimultaneously.CoRR,abs/1809.10361,2018.[4]IttaiAbraham,GuyGueta,andDahliaMalkhi.Hot-stuffthelinear,optimalresilience,one-messageBFTdevil.CoRR,abs/1803.05069,2018.[5]YossiGilad,RotemHemo,SilvioMicali,GeorgiosVlachos,andNickolaiZeldovich.Algorand:Scalingbyzantineagreementsforcryptocurrencies.InProceedingsofthe26thSymposiumonOperatingSystemsPrinciples,SOSP’17,pages51–68,NewYork,NY,USA,2017.ACM.[6]VitalikButerinandVirgilGriffith.Casperthefriendlyfinalitygadget.CoRR,abs/1710.09437,2017.

来源链接:mp.weixin.qq.com

撰文:Alex、一龙

展开阅读全文

一文读懂ETH2.0的未来:将分片作为数据可用性层

全文共 1451 字

+ 加入清单

每当风云变幻之时,人们都会开始思考我们所部署的系统下一步的发展是什么。

DeFi在以太坊的崛起也把这样的疑问带到智能合约平台层面。目前以太坊的gas费达到了史上最高,各种的拥堵使得用户和应用开发者不由得发出这样的疑问:以太坊真的是对的选择吗?

这是一个非常微妙的问题,需要考虑多个变量的影响:

➤ 主网发布后的一系列新Layer2方案

➤ Eth 2.0+分片进程

➤ 新的、资金充足的layer1链,例如Solana、Near

➤ 以太坊在社区或工具层面的惯性

➤ 应用链+互操作性技术,例如Cosmos、Polkadot

➤ 在DeFi基元互操作性和新应用低费用间的权衡

需要追踪的信息太多了!生态里的很多叙事都受叙事者的逐利动机影响,很多时候无济于事。

我想讨论一个让我感到兴奋的、可能的未来——将Eth 2.0的分片用作Layer2的一个数据可用性层。

这是非常技术性的表述,也是我觉得它不像其他网络文章中的概念得到那么多关注的原因。我希望这能提供另一个关于未来的思维模型,供读者在未来5到10年里用作参考。

数据可用性到底是什么?

“数据可用性”不怎么为人熟知,却是非常重要的概念。它经常出现在研究者间的对话里,但我很少看到它在圈外被讨论到。

数据可用性可能成为区块链的一个特性。除了了解它是什么,了解它不是什么也非常有帮助。

目前,链上数据的可靠性是没有得到保障的。比如,如果想知道在某区块的交易里发送者的账户余额是否足以支付,这一信息不是数据可用性能提供的。

数据可用性可提供的是保证任何用户 (包括轻客户端) 都可以在区块链上找到所有数据。

下图将数据可用性区块链进行了可视化:

它只是数据元素的一个序列,而不对其内容进行解读。大概可以简单将它看作是一个有序的、无须许可、仅添加的数据库。

但对于像比特币或以太坊这样的区块链,我们需要更多功能,我们需要知道哪些交易是有效的、哪些是无效的。

我们不必在区块链上处理这个问题,我们可以在一些“执行环境”里解释数据可用性区块链,它能分辨出哪些数据块是有效的、哪些是无效的:

如果我们在“执行环境1”里解释我们的区块链,那么数据块1代表有效数据,数据块2代表无效数据。这个执行环境在其他地方是可用的,比如layer2。

这个方法的美妙之处在于它完全将数据从执行里分离出来。我们可以架构一条能快速将数据进行排序和处理执行的链。然后,通过一个layer 2的执行环境对数据进行解释,像optimistic rollup那样。

Eth 2.0分片作为数据可用性层

Eth 2.0的一个可能未来是,除去一个分片外,其他所有分片都变成Layer 2的高吞吐量数据可用性区块链。而那个例外分片用作eth1的数据过渡,因此是唯一一个能在共识层面上定义数据意义的分片。

下图为执行环境可视化:

那些认为不可能实现跨分片交易的忧虑在未来将会得到解决。Layer2可以在它的交易里利用所有的分片。最终,分片间的经济区隔将完全取决于layer 2。

我们不必等到Eth 2.0的阶段2才能实现。在此我不做个人估计,但这会加速更加可扩容、可执行化以太坊的到来。

当然这只是一个愿景。最终无法实现的可能性也存在,但如果真的实现了,这将带来深远影响。

新一轮的协议战正在进行中!

我们准备要进入一个充满未知的世界,因为区块链和扩容技术试图在这个新的、高度拥堵的DeFi体制里进行自我实现。

聪明人会考虑许多不同的可能性,并且紧密追踪其发展,理解正在发生的事。本文对未来的可能性进行了简单探索,我希望它能够为读者增加一种关于未来的构想。

展开阅读全文

一文读懂将分片作为数据可用性层的可能性

全文共 1509 字

+ 加入清单

每当情况突然偏离预期,人们就开始思考如何更改已有系统。

随着以太坊上 DeFi 的兴起,人们就开始思考以太坊的区块空间问题。以太坊的 gas 价格达到了前所未有的高点。面对以太坊上的拥堵问题,用户和应用开发者不由得产生了疑问:以太坊是正确的选择吗?

事实证明,这是一个非常复杂的问题,我们需要考虑以下几个变量:

一些新的 Layer2 方案即将主网上线

Eth 2.0 +分片的进度

资金充足的新型 Layer 1 链,如,Solana/Near

以太坊社区怠惰,对工具开发积极性不高

Cosmos/Polkadot 等应用链 + 互操作性技术

新型应用要在与 DeFi 项目的互操作性和低手续费之间进行权衡

如上所述,我们要了解的有很多!但是了解这些也无济于事,因为在整个生态系统中,很多漂亮话都是因为叙事者由经济利益驱动。

在此,我想要探讨我非常期待的一个关于未来的设想:将 ETH 2.0 分片链作为Layer 2 的数据可用性层。

数据可用性是一个非常专业的技术术语,我想这就是为什么在科普型技术文章中,这个术语不像其它概念那样受欢迎。

我希望,在接下来的 5 至 10 年,数据可用性能够成为人们拿来参考的维度之一。

数据可用性是什么?

“数据可用性(data availability)” 是大多数人没有理解的重要概念之一。虽然研究人员经常提到这个概念,但是我很少看到其他人讨论它。

我将在本文中讨论数据可用性的概念,但是不会涉及具体的技术细节。如果你想深入了解技术细节,这里有一些非常专业的文章可供阅读。

数据可用性是区块链可能具备的一种特性。除了理解它是什么之外,理解它不是什么也很有帮助。

数据可用性并不能保证链上数据的完整性。例如,要想知道区块中交易的发送者是否有足额多的余额,需要的就不只是数据可用性。

数据可用性只能保证任何用户(包括轻客户端)都能在区块链上找到所有数据。

以下是具备数据可用性的区块链的示意图:

如上图所示,就是一个有序的数据元素序列,但是不知道这些数据元素代表什么。简单来说,你可以把它想象成一个只能添加数据的免许可型有序数据库。

对于比特币和以太坊之类的区块链来说,我们需要的不只是数据可用性,还要能够知道哪些交易是有效的,哪些是无效的。

如下图所示,我们可以将具备数据可用性的区块链放到某个能够辨别数据块有效性的 “执行环境” 中进行翻译:

假设我们将这条区块链放到 “执行环境 1 ” 中翻译,数据块 1 代表有效数据,数据块 2 代表无效数据。“执行环境 1” 可以在其它地方,如 Layer 2,上运行。

这个方法的优点在于,它将数据与执行完全分开。我们可以构建一条能够真正快速进行数据排序并处理执行的链,然后通过 Layer 2 执行环境(如 Optimistic rollup)来翻译这些数据。

将 Eth 2.0 分片链作为数据可用性层

Eth 2.0 未来的一种可能是,除了一条分片链之外,剩下所有分片链都成为高吞吐量的数据可用性区块链,供 Layer 2 使用。唯一例外的那个分片链由 Eth 1.0转化而成,用来存储达成共识的数据。

示意图如下所示:

一切关于跨分片交易不可行的担忧都将烟消云散。Layer 2 可以使用所有分片链来执行交易。最终,分片链之间的经济差异完全取决于 Layer 2。

我们不一定要等到 Eth 2.0 Phase 2 上线。

当然了,这只是一个愿景,也有可能不会实现,但是一旦实现了,就会带来重要意义。

新的协议之战即将开启!

随着区块链和可扩展性技术试图进军高度拥堵的 DeFi 领域,我们即将进入一个充满未知的世界。

聪明的人会考虑到多种可能性,并密切关注 DeFi 领域的发展情况。我希望我们能够一起探索本文提到的未来设想。

我将在之后的文章中进行更深入的探索。

展开阅读全文

分片到极致分片?ETH2.0信标链和波卡中继链有何区别?

全文共 1363 字

+ 加入清单

2020年的区块链行业风起云涌,defi的泡沫之夏,分布式存储项目的全面铺开,几大公链巨头集中爆发,热潮退烧之后,下半年也始终围绕以太坊的公链扩容和波卡的多链生态进行探讨。

就在本月初,以太坊项目宣布信标链主网(Beacon Chain)计划于12月1日上线,但前提是存储合约最低存入 524,288ETH ,验证者不少于16384 个。按照官方公布的路线图,ETH2.0主网上线将分为0、1、2三个阶段,0阶段的任务就是上线信标链。

作为ETH2.0启动的排头兵,信标链的重要性不言而喻。而,言外之意波卡和ETH2.0在结构上极为相似。那么作为两者核心枢纽的“信标链”和“中继链”上有何异同呢?

ETH2.0信标链:中央性的服务性管理者

信标链英文字面意思是灯塔,信号浮标,意味着分片链在工作时将以信标链的信号为指示。举个例子,

信标链作为ETH2.0的核心,将建立和维护全新的权益证明共识机制。信标链开始工作的基础要组建团队,即现在合约存款质押,在这一步达成之后,信标链就立马启动工作。

其次,将为碎片区块提供证明和随机性,证明指信标链将存储一系列经过计算的字符串也称为认证,随机性来源于一个随机数生成器,帮助选择区块生产者和质押的监管者,通过提供随机性来分配分片验证者的任务,将防止作恶事件发生。再次,信标链负责区块提议,在前后区块产生的间隙中,信标链所选择的提出者,会收集来自先前区块的信标链验证者集的所有协议投票(证明),并将它们纳入将要发布的区块。

总体来说,信标链多以管理工作为主,在其之上没有交易也没有智能合约,其作为同构状态下的“管理中台”,必须具备ETH2.0的骨干与以太坊1.0完全兼容的能力,这也是确保1.0和2.0有序连接中至关重要的一步。

波卡中继链:负责记录、传递、安全的枢纽性大厅

而波卡的异构环境,给予平行链充分的自由度,项目可根据需要自行设定共识机制,自定义开发基础框架,

如何来理解?中继链就像是一个共识容器,将定时将平行链产生的区块收集起来,并最终打包区块。

举个例子,这种任务交办的最终确认主要依赖于波卡系统强大的共识机制,其在保证平行链项目方安全性同时,让项目方可以专注于技术研发及本身业务,而不担心本链可能存在的共识问题。

此外,中继链不止于平行链的管理,还有平行线程的管理,不同点在于平行链永久占用中继链资源,而平行链只在需要时占用。而且,其会发生和网络治理、平行链拍卖等少量的交易类型,这也就表示,与内与外它都承担着更为重大的责任。虽然中继链想要弱化平行链一致性和有效性的绑定关系,但由于承担较大的安全管家角色,未来中继链技术升级方案上,安全问题将是它的头等大事,这也将是整个行业所要面临的问题。

因此我们看到波卡和ETH2.0在大致的结构上极其相似,但是由于各自的出发点不同,波卡的异构多链和ETH2.0的分片结构在细节和实际上还是存在极大的差别。理论上ETH2.0是为了向Dapp提供足够强的扩展性和性能,因此信标链的任务最主要是保证效率的前提下确保系统的安全。而波卡中继链的任务更加复杂。

总之,以目前项目的发声来看,技术逻辑和升级路线都是根据项目的自身需要和未来愿景展开的。波卡打造的是万链互通、价值互联的生态,而 ETH 2.0 则在打造强大统一的底层区块链系统,通过提升性能实现不同行业Dapp的彼此赋能,二者在方案上没有孰优孰劣之分,均在推动区块链行业发展做出了很好的表率。

展开阅读全文

一文了解ETH2.0:信标链和分片技术

全文共 2544 字

+ 加入清单

该栏目由全球顶尖的区块链研究机构中币(ZB)研究院推出的区块链热点科普课程,由中币运营主编树莓带领国内外区块链专家学者、技术极客和行业精英,钻研区块链当前热点项目,结合深刻的分析和有趣鲜活的案例,并采用多媒体录制方式呈现给广大区块链爱好者。该课程兼顾圈外新手小白,和圈内投资者的思维方式,兼顾深刻和有趣,实时性和重要性合一,力求达到深入浅出,“食”之有味也。

12月1日,ETH2.0的信标链(Beacon Chain)终于上线了,对于以太坊持有者是一个非常好的消息。ETH价格也顺势飞升,突破630USDT。但好景不长,第二天便跌回阻力位600美元以下。

上一期树莓讲了ETH2.0的共识机制为PoS,PoS是ETH2.0区别于ETH1.0的一个重要的不同之处。结合了PoS的信标链,也对以太坊的应用和治理生态产生极大的影响。本期的主题是信标链和分片技术。信标链对ETH2.0十分重要,它是ETH2.0的骨架,未来所有的功能都会在信标链上逐渐加上,最终形成ETH2.0公链。

采用了PoS共识的信标链在上线之后,所有用户可以向在当前以太坊网络上部署的智能合约发送ETH1.0代币进行质押,换取信标链上的代币BETH(Beacon ETH),从而参与信标链的PoS的质押挖矿。

说到质押挖矿大家可能就精神了,可是信标链究竟是什么呢?我们凭什么要往信标链上发送代币?这样会有风险吗?这些也许是大家心中的疑惑。那么今天树莓将带领大家了解信标链和分片技术这两个概念。信标链和分片技术是两个紧密关联的概念,为了能让大家能更容易地了解信标链,先了解分片技术则是必要的。

分片技术

去年关于以太坊网络手续费的争议特别多,由于网络日渐拥堵,以太坊的矿工费逐渐提高,甚至一度高到让人无法接受,如发送一个ETH则需要0.032个ETH(按3000元一个ETH算的话就是96元)作为手续费。于是人们开始讨论以太坊网络的扩容问题是否能够得到解决,如果不能,以太坊就没有未来可言。

事实上,以太坊联合创始人V神比任何人都更早发现这个问题。在2018年6月中国举行的一场以太坊技术及应用的会议中,V神分享了分片技术的最新进展。

分片的目的实际上就是扩容,以提高网络处理事务的效率。当前以太坊网络的可延展性不足,美妙执行事务的数量大概为30,远不能满足网络的需求。比如一个以太猫(一个区块链游戏)就能在几天内把以太网络堵死,导致全网崩溃。

当前区块链网络处理速度慢的原因是每个节点都要处理系统中的所有交易,这样可以保证系统的安全性和去中心化。但这种方式带来的好处实际上是牺牲了系统的可延展性,内存不足、交通拥堵的问题就随之而来。那么,有没有更好的解决方案,既能保证安全性、去中心化程度,又能解决网络拥堵问题?分片技术就这样应运而生。

我们可以用一个很形象的例子来比喻以太坊网络和分片技术。我们把以太坊比作一个人流量很多的大超市,在它扩容之前,只有一个收银台,大家都得在同一个地方排队结账,十分耗时,之后超市改造,平行出10个收银台,这10个收银台的数据是共享汇总的,用户选择任意收银台结账都会被记入总账,这样结账的人流就被疏散成10份,效率大大提升。

以太坊地址

我们先看一下以太坊的地址格式。大家可以打开中币APP,在充值资产页面选择ETH查看地址:

0xd46f1b4d86320ff0beb8cdbb3cd0e031af169d0b

所有的以太坊地址开头两个字符都是0x,代表了使用的是十六进制。从第三个字符开始才没有规律,而每个字符的范围是0到9的阿拉伯数字,或者英文字母a到f。每个字符都有16个可能性。

以太坊地址的分类

如果你要对以太坊地址进行分类,你可以从第3个字符开始分,因为刚刚说了,所有以太坊地址都是0x开头的。如果你只看第3个字符来分类,那么你可以分成16组,对吧?第三个字母是1的一组,是2的一组,是英文字母a的一组,是b的一组……以此类推。如果你从第3个字符到最后一个字符也区别分类,那地址分类就太多了,片区过于冗杂和繁多,不适用于当前以太坊网络的交易量。

分片

第1阶段,以太坊2.0有64个片,这意味着以太坊只选择了地址的第3和第4个字符来分类。比如0xa开头的都属于同一分片,0xab开头的也属于同一分片。

从定义来讲,分片就是所有打包了同一类地址交易的区块,并且同一分片只打包一类地址的交易。按地址分类后,ETH2.0的节点、钱包、各种软件,以区块的设计,就可以区别对待各类的地址的交易。

跨片

分片之后,同一个片区的地址交易,只需要在片区内相互发送就可以了,无需联动其他片区,能够大大提高整个网络的处理效率。那如果是跨片区发送交易呢?这里就要用到信标链了。

每一个片区都有且只有一个区块,这些区块组合起来就形成了信标链。信标链能够帮助不同片区的地址跨片通信和交易。比如a片区的地址要发送1个ETH到c片区的地址,方法就是a片区的地址把要发送的1个ETH发到自己片区的信标链区块上,而信标链有一个叫状态转换函数的东西,这个函数会把那1个ETH发到c片区的信标链区块上,然后再转发到收款地址上。

所以信标链就是这么回事。因为信标链属于第0阶段,分片技术属于第1阶段,所以虽然目前信标链上线了,但是交易等功能还没开放。ETH2.0实际进展的突破还需要等到第2阶段的完成。

尽管只是完成了第0阶段,但是已经让人感到十分期待了。信标链推出之后,用户就可以正式参与信标链的PoS质押挖矿了。但是需要注意的是,用户发送抵押的ETH1.0代币会锁定在现在的以太坊区块链上等待销毁且不可取回。因此用ETH换取BETH的是单向不可逆的。此外由于当前第0阶段的信标链还没有转账功能,所以BETH不能在交易所交易。

如果你既希望参与ETH2.0的质押挖矿,就想保留持有ETH的流动性,则可以参与由QuickCash开启的把ETH换成QETH的活动。QETH由QuickCash发行,换成QETH之后,用户只需持仓就可以获得年化4%-35%的收益权以及交易流通权,意味着用户可随时变现,无需锁仓。

目前该活动在中币平台上开启,用户可以打开中币APP,在ZAPP中找到【QuickCash跨链兑换】,将自有ETH兑换成QETH,兑入成功即参与挖矿,十分便捷。

展开阅读全文

以太坊2.0详述:什么是ETH 2.0权益证明、信标链、分片、对接?

全文共 2950 字

+ 加入清单

人们对以太坊2.0期待已久。权益证明、信标链、分片对接是指什么?它们将分别在哪个阶段推出?本文将为您揭晓。

概述

首先,介绍以太坊2.0概念以及需要它的原因。

以太坊2.0(或eth2)是一套互联的以太坊升级计划,旨在提高以太坊的可扩张性、安全性和可持续性。这些升级由以太坊生态系统中的多个不同团队主导,每个团队都专注于构建整个升级中的特定部分。

现在,让我们快速了解以太坊2.0的主要目标。

可扩展性

目前,以太坊网络每秒支持约15笔交易。当数百万新用户涌入并启动更多的去中心化应用程序时,这无疑成为一个限制因素。以太坊 2.0 希望在扩容后可以每秒支持 1000 笔交易。需要注意的是,每秒交易量的增加不应该以增加网络中节点的大小为代价。

安全性

去中心化网络的安全始终是头等大事。以太坊 2.0 旨在提高网络的安全性,防止一切形式的攻击,包括「51% 攻击」,即个人可以通过控制网络的大部分算力来强制进行欺诈性变更。

可持续性

众所周知,当前以太坊网络是基于工作量证明(PoW)共识,需要大量算力和能源。以太坊 2.0 将用权益证明(PoS)取代消耗大量能源的工作量证明,更有利于环境。

最初,实现这些目标所需的一系列变化称为「宁静」(Serenity),但现在大多数人称之为「以太坊 2.0」或者仅仅是 Eth2。

有趣的是,所有这些目标几乎都在以太坊路线图中,甚至在以太网络正式启动前就已经讨论过了。

让我们谈谈以太坊最大的变化之一——共识模型由「工作量证明」变为「权益证明」。

权益证明(PoS)

当前,以太坊共识模型是工作量证明。这是是一种众所周知且经过实践检验的构建加密货币的方法。

在工作量证明中,矿工投资资源(主要是电力)来验证交易并保护网络。该模型需要大量电能才能正常工作,且可保护网络免受「51% 攻击」。

而权益证明试图通过完全脱离矿工来解决电力消耗问题。它不是通过投入资源来保护网络安全,而是依靠经济激励手段。

在权益证明中,要保护网络安全的用户,通过质押以太坊成为验证者(validator)。与工作量证明中的矿工类似,验证者在验证网络交易后,可获得区块奖励和交易费用激励。

为了阻止验证者玩弄系统和验证欺诈性交易,权益证明系统实施了一种称为「罚没」(slashing)的机制。如果验证者行为不诚实,就会失去其质押的部分以太坊。

在PoS系统中,为了成功实现「51% 攻击」,攻击者必须控制 51% 的验证者,这需要拥有以太坊质押总量的51%,这无疑是一个巨额资本。

为了成为以太坊 2.0 的验证者,需要32枚以太坊。另外,可以通过质押池(如 Rocketpool), 质押低于32个以太坊。

验证者的回报取决于系统中质押的以太坊数量。如果系统中的以太坊不足一百万个,那么回报率可以高达每年 18%;如果系统中的以太坊超过 1亿个,那么收益率可以低至 1.81%,甚至更低。

权益证明解决了以太坊 2.0 的 三个主要问题。通过消除能源密集型矿工,让以太坊更具可持续性;通过加大「51% 攻击」难度让系统更加安全;通过解锁分片增加可扩展性,分片在工作量证明模型中难以实现,因为它很可能会导致跨分片间的计算能力下降。

这实际上也是流畅进入分片很好的方式。

分片(sharding)

分片的概念并非以太坊 2.0 升级特有。实际上,它是计算机学科中一个常见过程。它是指将一个数据库分割成多个部分,每个部分包含整个数据集的一部分。每个部分被称为「分片」。

在以太坊 2.0 中,每个「分片」基本上是一个独立的新链。最初,将会有 64 个分片。这直接解决了以太坊的扩展性问题,因为分片将提高网络的工作量。

最重要的是,每个以太坊节点只需运行一个分片。这意味着只存储一小部分数据,并且无需强大的硬件即可更轻松地运行节点。节点易于运行会吸引更多网络参与者,带来更多的去中心化和更高的安全性。

最初,分片只会提供额外数据,分片链无法处理交易或智能合约。

此时,你可能会有这样一个问题:分片如何在不处理交易或智能合约的情况下提高扩展性?

这是因为 Layer 2扩展——特别是 Rollups。Rollups 允许链外打包交易(和执行智能合约),生成加密证明并将其提交到链上。这个过程只需要一个可用的数据分片来存储证明,这意味着它可以与分片的初始版本一起使用。

这还没有结束。尽管数据分片和 Rollups 的混合让以太坊能够每秒处理超过 100,000 个交易,但是还有一个可改进的地方。有可能升级分片并使它们完全可执行,就像当前的以太链一样。是否需要这种改进仍然有待观察,它取决于数据分片和 Rollups 解决方案的流行程度。

同样值得一提的是,在数据分片模型中,当前的以太链成为了分片之一。这是唯一能够处理交易和智能合约的分片。

信标链(Beacon Chain)

为充分理解以太坊 2.0,信标链是下一个要重点掌握的概念。

信标链负责协调基于权益证明的系统,通过随机分配验证者(staker)来验证不同分片。随机性很重要,因为它可以防止验证者串通和控制分片。

信标链基本上创建了一个新的权益证明网络,并与目前的以太坊网络平行运行。启动它是以太坊 2.0 路线图中最基础的步骤之一。

最初,验证者将向信标链添加新块,但它们不会验证当前的以太坊 1.0 主网的交易。一旦当前以太坊 1.0 链成为以太坊 2.0 的一个分片,这种情况将会反转。

对接(Docking)

这将我们带到整个太坊 2.0 谜题的最后一部分–对接。

对接是指将当前以太链变为以太坊 2.0 权益证明系统的分片之一的过程。

这个过程也将标志着我们今天所知道的以太坊工作量证明的结束,以及向新的权益证明模型的全面过渡。

对接将帮助智能合约运行于 PoS 网络上。最重要的是,它将提供以太坊的完整历史和现状,让所有以太坊持有者和使用者平稳过渡。

阶段时间表

让我们看看上述概念在以太坊 2.0 中的时间表。整个开发过程会分为多个阶段。

阶段 0 是以太坊 2.0 的第一阶段,重点是推出信标链。要实现这一点,必须达到 16,384 个验证者的阈值。该数量已经在 11 月 24 日达到要求,阶段0可以最早于2020年12月1日启动。

下一个阶段,也就是阶段 1的重点是分片或我们前面描述的数据分片。

一旦阶段1完成,下一个阶段是阶段1.5,重点是对接——使当前的以太链成为以太坊2.0中的分片之一。看起来阶段1和阶段1.5都会在 2021 年实现。

达到阶段 1.5 之后,有两种可能情况。其一,数据分片和 Rollups 的组合将足够满足需求,没有必要进行下一步。其二,仍然需要完整的分片解决方案,这将把我们带到最后阶段,即阶段2。在阶段 1.5成功实现后,还有待观察。

总结

值得一提的是,尽管最初的阶段 0并没有较大幅度变更当前的以太链,但它可能引发一些潜在的重大经济影响。这是因为发送到以太坊 2.0 的以太币被锁定并且在阶段 1.5完成之前无法撤销。也就是说,在此系统中有一部分以太坊被锁仓。

当涉及到 DeFi 时,大多数活动可能将集中在可执行分片或 Layer 2 Rollup 解决方案之上——至少在最初阶段是这样。这是因为 DeFi 充分利用了智能合约的可组合性和更复杂的交互,所以不能轻松地交互的 DeFi 协议是没有多大意义的。

对于以太坊2.0,您有什么看法?您是否认为它最终将让其他智能合约区块链(即“以太坊杀手”)黯然失色?

展开阅读全文

自我修复的区块链可以解决分片的可扩展性问题

全文共 1857 字

+ 加入清单

自我修复区块链是十年内创建真正去中心化世界的唯一途径。

全世界都在热切期待下一代高性能,无许可的区块链,并且该区块链应该能够在工业上扩展所有分散式应用程序。到目前为止,加密社区已经见证:

点对点区块链网络使用所有对等点来验证交易并提供计算和存储(或传统的区块链),例如比特币和以太坊。

分片交易,计算和存储(或分片区块链)的 P2P区块链网络,例如以太坊2.0和Zilliqa。分片机制为区块链的无限,可持续的可扩展性带来了希望,但是区块链领域的许多人都坚信可扩展性或分片已达到临界点,但事实并非如此。让我们深入研究它。

在区块链世界中,为什么我们需要分片?

当前,互联网用于支付,物联网,智慧城市,机器人技术,网络搜索,流视频,电子商务,自动驾驶汽车等。因此,互联网产生:

每秒超过10亿笔交易(交易)。

每秒进行1亿以上的计算(计算)。

每秒超过2.5亿字节的数据(存储)。

这个工作需要在P2P网络中的所有对等方之间和谐地分配。这种工作拆分称为分片技术。分片可应用于事务,计算和存储。

困扰分片机制的问题

无许可的P2P网络是不可预测的,为了补偿这种不可预测性,各种区块链协议将验证次数和存储副本的数目固定为一个常数,该常数是根据某些假设从数学计算得出的。这限制了区块链的可扩展性,因为系统将过度补偿并限制规模,或者补偿不足并冒着安全性/完整性的风险。

如果可以预测P2P网络怎么办?验证和存储对等方的数量是否可以灵活地根据P2P网络的混乱程度而定?也就是说,如果P2P网络行为理想,则仅需要一个验证和存储副本,而如果P2P网络中的对等节点行为不良或偏离理想性质,则验证和存储副本的数量将成比例增加。 。

P2P网络中的对等/分片面临的问题包括:

互联网连接问题,断电,数据丢失等等。

始终在全球范围内加入和退出网络。

数据可用性和数据一致性问题。

如果对等/分片脱机,则属于该分片的数据将永远丢失。

对等/分片随时可能变恶意。

罪魁祸首是P2P网络的不可预测性!这降低了验证,计算和存储的性能。

自我修复的区块链

由于P2P网络的不确定性,因此引入了一种自我修复机制。

案例一:传统的区块链。网络中的所有N个节点将验证/计算/存储网络中的所有事务。(N)

案例二:理想的P2P。考虑一个理想的P2P区块链网络,其中网络中的所有对等点都可以24/7全天候访问,并具有良好的互联网,带宽,电力供应等,并且是没有恶意的良好对等点。然后,可以由一个对等方验证/计算/存储到达网络的任何事务/计算/存储。(1)

案例三:分片区块链。真正的P2P区块链网络不是那么理想,因此,基于与理想的P2P区块链网络的最大可能偏差以及设置固定数量(例如22–600个对等点)以进行验证/计算/的某些假设,得出数学公式。存储,具体取决于区块链协议。(N / x)

案例四:自我修复的区块链。情况一,二和三是极端情况,如下图所示。事务/计算/存储的数量应取决于与理想状态的偏离程度(具有足够的安全裕度)。(N / x(c)),其中(c)代表网络的混沌性。网络的混乱度(c)是Internet带宽,电力,数据可用性,数据一致性以及加入或离开的节点数的函数。如果功能与理想状态相比有任何变化(无论是肯定的还是负面的),P2P网络都会相应地部署对策。因此,如果网络受到任何压力,网络将自动修复。

自我修复区块链的比喻

让我们以巴黎地铁为例,根据人们的交通情况,地铁列车会更改其时刻,班次,车厢数量和速度。

传统:最大频率的地铁列车,最大的车厢数量和最大的速度将始终保持不变。(浪费了很多能量。)

理想选择:始终有最少数量的地铁列车,其频率最低,车厢数量最少,速度始终最低。(人们上下班要花很多时间。)

碎片化:地铁列车的数量及其频率,车厢数量和速度将小于最大值,但无论想要乘坐地铁的人数如何,该数量都是固定的。

自我修复:根据人数,是在早上7点至上午9点的高峰时段内,还是在下午4点至晚上7点的高峰时段,以及可用列车的数量等,地铁列车的数量及其频率,数量车厢和速度会相应变化,并且灵活协调输出。

结论

自修复区块链的设计方式使其可以生存数十年(甚至数百年)。这些类型的区块链实现的可扩展性接近集中式系统,但它们仍保持真正的去中心化。因为具有高可伸缩性,所以任何集中式应用程序都可以在自愈式区块链上构建。

将人工智能应用于时间序列-互联网带宽,电力,数据可用性,数据一致性,数据丢失,节点加入/离开的节点数等-可以进一步改善自我修复的区块链,使其更快并能够预测事件之前它发生了,因此能够在它发生之前部署对策。

展开阅读全文