当前位置:  首页 →热点 →正文

尚未解决的区块链分片问题

2019-01-02 9:17:57 区块链小咖

区块链分片的核心问题是链上的节点无法验证所有分片中的区块。因此,每当任一节点需要与特定分片交互时,他们通常无法下载并验证该分片的整个历史记录。

尚未解决的区块链分片问题

然而,一个重大的潜在问题出现了:如果不能下载和验证一个特定的分片的整个历史记录,节点如何确定接收到的交易来自于有效区块。非分片区块链中不存在这样的问题。

简单的应对策略

我们将首先讨论一个简单的解决方案,这个解决方案在许多协议都提到过,我们将进一步分析这个解决方案如何尝试解决它想要解决的问题。

解决数据有效性的简单方案如下:假设整个系统有数千个验证器,其中不超过20%是作恶的,或者无效的(例如无法联机生成一个区块)。然后,如果我们对约200个验证器进行采样,假定超过1/3的节点失败率为零。

尚未解决的区块链分片问题

值得注意的是:1/3是一个重要的门槛。拜占庭共识协议中指出,只要确保少于1/3的节点失败,无论是作恶还是违反协议的某一条,最后都将达成共识。

假设诚实的验证器百分比,如果分片中的验证器为我们提供了一些区块,解决方案假定该区块是有效的,并且验证器建立在该分片的规范链基础上。他们开始验证时,验证器从前一组验证器中学习规范链。通过归纳,整个链是有效的,由于任何一组验证器都有产生分叉,解决方案也确定当前链是分片中唯一的链。

尚未解决的区块链分片问题

如果假设验证器可能被破坏,上述简单的解决方案就会不起作用,这是个合理的假设。在含有1000个分片的系统中破坏单个分片比破坏整个系统的成本要低得多。因此,随着分片数量的减少,协议的安全性相应地减小。为了确定一个区块的有效性,我们必须确保,在记录中的任何一个节点,系统中的分片都不存在大多数验证者串通的情况;但是对于自适应对手,我们无法确保。正如我们在前一部分中所讨论的,串通验证器可以执行两种基本的作恶行为:创建分支和生成无效的块。

恶意分叉可以通过交叉链接到信标链的区块来解决,信标链通常比分片链更具安全性。然而,生成无效的区块是一个具有挑战性的问题。

数据验证

如下图,分片#1已经被攻击,作恶者挖出了无效块B。假设区块B凭空捏造出来1000个token,并记录在Alice的账户上。接着,作恶者在区块B的基础上挖出有效区块C,然后在分片#2发起了跨分片交易,把这1000个token转到了Bob的账户。此事凭空造出来token在分片2上是完全有效的。

尚未解决的区块链分片问题

解决上述问题的方案有:

1.  让分片#2的验证者检验发起这笔交易的那个区块。但由于区块C似乎完全有效,因此,此方案不适用于上述示例。

2.  分片#2的验证者可以大量检验发起这笔交易之前的区块。但是,通常对于接受交易的分片要验证的N个区块,恶意验证者可以在他们创建的无效块上创建N+1个有效块。

比较好的解决方案是将分片按照无向图进行排列(如下图),每个分片都连接多个分片,跨分片交易只能在相邻的两个分片上进行。(例如,Vlad Zamfir分片本质上就依赖于这个原理)。

如果要在不相邻的两个分片之间进行跨分片交易,这笔交易需要通过多个分片相互验证。在这个设计里,每个分片的验证者都要验证他们的分片以及与他们相邻的分片上的所有区块。假设有10个分片,每个分片相邻4个分片,不需要考虑两个以上的分片之间的交叉分片通信。

尚未解决的区块链分片问题

分片#2不仅验证自己的链,还需要验证所有相邻的链,包括分片#1。所以,如果分片#1上的恶意分子试图创建无效块B,然后在B的基础上构建区块C,并发起跨分片交易,分片#2就可以通过验证分片#1上的所有历史记录,识别出无效区块B。

虽然现在攻击一个分片不再是可行的攻击方法,但是如果攻击多个分片仍是个问题。下图中,如果对方成功攻击了分片#1和分片#2,用无效区块B生成的“资金”可与分片#3进行一笔跨分片交易。

尚未解决的区块链分片问题

分片#3验证了分片#2上所有的区块,但是并未验证分片#1上的区块记录,那么仍无法检测到无效块B。

解决这个问题的其中一个主要方案是采用fishermen机制。

这个方法背后的原理:无论何时,为了关联信标链或是发起分片交易(或是其他原因),链之间相互通信区块头信息,在一段时间内,任意诚实验证者都可以提供无效区块的证明。有各种结构可以非常清楚的证明某个区块是无效的,接收节点的通信成本要比接收整个区块的成本小得多。

使用这种方法,只要有一个节点是诚实的,系统就是安全的。

尚未解决的区块链分片问题

但是这种方法有两个缺陷:

1.这段验证的时间需要足够长,以便让诚实节点识别挖出的区块,下载并进行完全验证。这段验证时间会极大降低跨分片交易的速度。

2.会创造出一个新的攻击向量,恶意的节点可以故意发起大量无效的验证请求。解决这个问题的方案是让验证者在指定的账户里存入一些Token,待验证成功时再返还。这只是部分解决方案,由于恶意的节点向系统发起大量无效的验证请求带有无效区块(例如,防止来自诚实验证者的有效区块通过)可能仍然存在,这些攻击被称为恶意破坏攻击。

针对这两个问题,目前还没有很好的解决方案,但是这个方案仍然是解决数据验证问题的一个主要方法。

简洁的非交互知识论证

解决攻击多个分片的第二种方法是使用某种密码结构,允许人们证明正确执行某个计算(例如从一组交易中计算区块)。例如zk-STARKs和其他一些共识协议,以及一些被广泛地用于私人支付的共识协议,其中最著名的是ZCash。这种共识协议存在的主要问题是计算速度非常慢。例如: Coda Protocol,使用zk-SNARKs专门证明区块链中的所有区块都是有效的,每次交易可能需要30秒来进行一笔交易证明(这个数字现在可能更小)。

有趣的是,证明不需要由可信方来计算,因为不仅需要证明它所构建的计算的有效性,而且需要证明本身的有效性。因此,这种证明的计算可以在一组参与者之间进行划分,它比执行某些不可信计算更加简洁。除此之外,它还允许计算zk-SNARK的节点在特定的硬件上运行,而不会降低系统的分布式。

除了性能外,zk-SNARK的局限性是什么?

依赖于较少研究过的和较少时间测试的密码学原语;

“Toxic waste” 是 zk-SNARK依赖于一组可信的设置,其中一组人执行一些计算,然后忽略该计算的中间值。如果程序的所有节点都串通并保留中间值,则可以制造假证明;

系统设计中引入了额外的复杂性算法;

zk-SNARK仅适用于可能计算的子集,因此,具有图灵完备智能合约语言的协议将无法使用SNARK来证明链的有效性。

数据的可用性

我们将要讨论的第二个问题是数据的可用性。通常,将特定区块链的节点分为两类:全节点,下载每个完整区块并验证每笔交易的节点,以及仅仅下载区块头的轻节点,并使用Merkle校样来处理他们感兴趣的状态和交易。

尚未解决的区块链分片问题

现在,如果大部分主要全节点串通,则它们可以生成有效或无效的区块,并将其哈希值发送到轻节点,但不透露区块的全部内容。他们可以通过各种方式从中受益。如下图所示:

尚未解决的区块链分片问题

假设有三个区块:前者A,由诚实的验证者生成; 当前区块B,由验证者串通;下一个区块C,由诚实的验证者产生;

假设你是商家。当前区块(B)的验证者从先前的验证者那接收到区块A,计算出你接收钱的区块,并向你发送该区块头,其中通过Merkle证明包含你有钱的状态(或Merkle证明将有效汇款发送给你的有效交易)。确保交易最终确定,你就可以提供服务。

但是,验证器永远不会将区块B的全部内容分发给任何人。因此,区块C的诚实验证器无法检索该区块,并且被迫停止系统或构建在区块A之上,从而剥夺了你作为商家的权利。

当我们将相同的场景应用于分片时,全节点轻节点的定义通常适用于每个分片:每个分片中的验证者下载该分片中的每个区块并验证该分片中的每笔交易,但验证系统中的其他节点,包括那些快照分片链状态进入信标链,只需要下载区块头。因此,分片中的验证者实际上是该分片的全节点,而系统中的其他参与者(包括信标链)作为轻节点。

对于我们上述的fisherman方案,诚实的验证者需要能够下载与信标链交叉链接的区块。如果恶意验证者交叉链接无效区块头(或用于启动交叉分片交易),而从未分发区块,则诚实的验证者无法进行验证。

监管权证明

需要迫切解决的问题是一旦区块发布,是否区块就具可用性?一个名为公证人的解决方案是让分片之间公证人轮换的频次比验证者高,验证者的唯一的工作是下载一个区块,并证明他们能够下载。与验证者不同的是,公证人可以更频繁地轮换,因为他们不需要下载分片的整个状态。

尚未解决的区块链分片问题

这种的方法的问题是,无法证明公证人是否能够下载该区块,因此公证人可以选择始终证明他们能够下载该区块而不尝试检索它。解决该问题方案是公证员提供一些证据,或者投入一定数量的Token来证明该区块已被下载。

纠删码技术

当特定的轻节点接收到一个区块的哈希值时,为了提高节点对该区块可用的信心,它可以尝试下载该区块的一些随机片段。这不是一个完整的解决方案,因为除非轻节点共同下载整个区块,否则恶意区块生产者可以选择保留未被任何轻节点下载的区块的部分,从而导致区块不可用。

对此问题的解决方案是使用一种称为纠删码技术的结构,即使只有区块的某些部分可用,也可以恢复整个区块:

尚未解决的区块链分片问题

Polkadot和以太坊Serenity都围绕这个想法进行了设计,为轻节点提供了合理地确信区块可用的方法。这两种方法都依赖于验证者,因此可能容易受到恶意攻击。

长期可用性和结论

上述讨论的所有解决方案都证明了一个事实,即一旦一个区块发布,则该区块立即可用。区块随后可能由于各种原因变得不可用,例如:节点脱机、节点故意删除历史数据等等。

一篇值得借鉴的解决方案是Polyshard,即使几个分片完全丢失了它们的数据,Polyshard使用纠删码技术让跨分片区块依然可用。不幸的是,他们的解决方案要求所有分片从其他分片那下载所有区块,合格过程成本高昂。

由于预计系统中没有节点能够验证所有分片中的所有链,因此分片协议的安全性需要以这样的方式设计:即使某些分片中的某些以前的区块变得完全不可用,系统也是安全的。

在设计安全协议时,数据有效性和数据可用性仍然是首先需要关注的问题。

BB财经从区块链眺望未来

BB财经|BBcaijing.com原创,作者区块链小咖,转载请注明出处:http://www.bbcaijing.cn/news/42141.html