干货 | 如何扩展以太坊:分片原理解释

Ajian   |     |   2538 次阅读

关于扩展的讨论是加密社区的前沿和中心话题。以太猫游戏阻塞整个以太坊网络数天的重大事件的发生,让我们知道了最大的公有链在当前状态下无法扩展

所以社区决定采取什么方法呢?有两种解决方案。第一种是通过脱链的方式(也叫做第二层扩展)来提高扩展性,让其中一些交易在区块链下被处理,并且仅与区块链进行必要的交互。另一种方法是通过完全修改协议的设计,来解决区块链所面临的并行性的根本问题。不幸的是,我们很多的协议开发人员经常一看到这些问题,就对他们面临的问题感到头疼。

虽然我们仍处于以太坊的早期阶段,但社区有很多在技术上很有头脑的人,有如此多的创新以惊人的速度在发生。我们很容易会认为,有更聪明的开发者可能更有资格处理诸如扩展性这样的重大问题,但是这种感觉正在阻碍我们。真相是,社区愿意并且已准备好帮助任何想要参与进来的人,是的,也包括!这篇文章会分析以太坊核心团队当前采用的分片方法,并且揭露当前的局限性以及改进途径。在文章的最后,你会了解足够的知识来独自探索这个问题,谁知道呢,或许你就是构建第一个分片客户端的人!

什么是分片?

如今,每个运行以太坊网络的节点都必须处理通过网络传输的每一笔交易。这使得区块链因每个区块都有很多的验证而具有很高的安全性,但与此同时这意味着整个区块链的速度只能与其单个节点一样快,而不是这些节点的总和。目前,EVM 上的交易不是并行的,每笔交易在全局范围内都是串行执行的。解决可扩展性问题不得不面对这样一种理念,一条区块链最多只能拥有下列 3 种属性中的 2 种

  • 去中心化
  • 可扩展性
  • 安全性

我们如何打破这种三难的局面,才能将扩展性包含到当前的模型中呢?我们不能仅仅通过增加区块大小,或者就以太坊来说,通过增大 GAS 的使用上限来提升吞吐量吗?理论上这是正确的方法,但是我们增加得越多,区块生产就会越来越集中在使用超级计算机来运行的节点中,进而为进入系统带来更高的障碍。

更明智的方法是区块链分片的理念,我们将网络的整个状态分割成一系列被称为分片的分区,其中包含自己独立的状态片及交易历史记录。在这种系统中,特定的节点只为特定的分片处理交易,从而允许在所有分片中处理的交易吞吐量比在单个分片中处理所有交易(像现在的主链一样)要高得多。

在我们深入了解分片区块链的实际工作方式之前,先来重温一些重要术语:

  • 状态:描述系统在任何时间点的全部信息集。在以太坊中,指在特定时刻,包含当前余额,智能合约代码及 Nonce 的最新账户集合。每笔交易都会将当前状态变成一个全新的状态。
  • 交易:由用户发起的可改变系统状态的操作。
  • 默克尔树:一种可以通过加密哈希存储大量数据的数据结构。默克尔树可以很容易地在短时间内以很少的计算量检查数据是否是结构的一部分。
  • 收据:交易的附属品,不存储在系统状态中,但保存在默克尔树中,可以很容易的验证其存在。例如以太坊的智能合约日志就作为收据保存在默克尔树中。

掌握了这些,让我们看看分片系统的结构。首先,在特定分片上被称为校对器(Collator)的节点的任务是创建校对块(Collation),校对块是一种包含关于所涉及分片的重要信息的特定结构。

这些校对块就像对特定分片的状态和交易的简短描述,每个校对块都有一个校验头(Collation Header),是包含以下信息的数据片:

  • 关于校对块所对应的分片信息(比如分片10)
  • 在所有交易生效前,相关分片的最新状态信息
  • 在应用所有交易后,分片将变成的状态
  • 来自分片上占所有校对器数量 2/3 的校对器数字签名,确认校对块是合法的。

然后,超级节点将把所有分片中的校对块放到以太坊区块链中将要添加的区块中。他们的职责是处理所有校对块中的交易,并通过汇总他们的校验头来维护所有分片的状态。

在这种新的区块链中,满足以下条件时,区块是有效的:

  • 在所有校对块中的交易有效
  • 校对块的状态与交易前校验块的最新状态一致
  • 校对块交易后的状态与校验头所指定的状态一致
  • 校对块被所有校对器的2/3签名

如果交易跨分片进行该怎么办?举个例子,我把钱从分片 1 中的地址发送给分片 10 中的地址,该怎么办?这个系统最重要的部分之一就是跨分片通信的能力,否则我们没有任何创新。以下是收据发挥作用的地方,以及它是如何允许上述场景工作的:

Raul(在分片 1 的地址)想要给 Jim(在分片 10 上的地址)发送 100 个以太币

  1. 一笔被发送到分片 1 的交易扣除了 Raul 余额中的 100 个以太币,系统等待交易完成
  2. 一份不在状态中存储、而在默克尔树中存储的、可被轻易验证的交易收据随后被创建
  3. 一笔包括默克尔收据作为数据的交易被发送到分片 10分片 10 检查此收据是否还未被花费
  4. 分片 10 处理此交易并在 Jim 的余额中增加 100 个以太币。随后也会保存这份从分片 1 发送过来的收据已经被花费的事实。
  5. 分片 10 生成了一份新的可以在随后的交易中使用的收据。

这听起来很酷,但是否存在什么陷阱呢?

一旦我们考虑在网络上可能的攻击,分片区块链的问题就变得更加显而易见了。一个主要的问题是单片控制攻击的概念,即攻击者通过控制一个单一分片上的大多数校对器来创建一个可以提交无效校对块的恶意分片。我们该如何解决这个问题?

-图片来源:王筱维-

以太坊维基的分片 FAQ 建议在每个分片上对校对器进行随机采样。这样做的目的是让这些验证者事前无法知道他们所得的是哪个分片。每个分片都会分配到大量的校对器,并且实际验证交易的校对器会从中随机选取出来。

权益证明让这个问题变得微不足道,因为已经有一个我们可以从中挑选校对器的验证者集合了。随机源需要足够普遍(Common)以确保这种采样是完全强制性(Compulsory)的,并且不能被验证者操控。

此外,进行这种随机采样的排序会有一些潜在的延迟问题。想象一下你在运行一个以太坊节点,并且已经与整个区块链历史同步,可以开始进行交易了。如果在一些区块之后,你不得不再次与新链完全同步一遍,该怎么办?这在对验证者节点重新调整后是可能发生的,因为当验证者作为校对器被重新分配时,可能都会需要重新下载新的分片,引入大量潜在的开销。

想要阅读更多关于潜在的安全风险以及针对此问题和其他问题的详细方法,请查看以太坊分片 FAQ。

我感觉这对 Solidity 开发者以及以太坊用户来说太难以理解了!我们怎样去教他们关于分片的东西呢?

他们不需要学习。分片将专门存在于协议层,不会暴露给开发者。以太坊状态系统看起来仍旧会跟现在一样,但是协议中将有一个创造分片的内建系统,在分片间平衡状态,防止分片过小等等。这将全部在幕后完成,允许开发者继续他们当前在以太坊上的工作流程。

超越扩展:超级-二次方分片 & 难以置信的速度增长

为求卓越,以太坊可能会采用超级-二次方分片的方案(简单来说就是在分片上建立分片的系统)。目前这种复杂性很难想象,但是扩展的潜力是巨大的。此外,超级-平方-分片的区块链将为用户带来巨大利益,将交易费用降至可忽略的数量,并为各种新应用提供更加通用的基础架构。

相关资源 & 从哪儿开始

好吧,现在你想开始编写分片区块链了!如何开始呢?在最基本的层面上,建议的初始实现不会通过硬分叉来实施,而是通过一个被称为验证管理合约的智能合约来控制分片系统。

VMC 会管理分片以及来自全局验证者集合的被提议的校对器采样,并且会对所有分片状态在全局上的一致性负责。V 神在这里概述了一个用于实现分片的很棒的参考文档:https://github.com/ethereum/sharding/blob/develop/docs/doc.md

想要详细了解 VMC 的架构并学习更多关于该系统工作方式的内容,请查看以下资源:


原文链接: https://medium.com/prysmatic-labs/how-to-scale-ethereum-sharding-explained-ba2e283b7fce
作者: Raul Jordan
翻译&校对: 刘亚辉 Dev & 阿剑

本文由作者授权 EthFans 翻译及再出版。


你可能还会喜欢:

干货 | 以太坊Sharding FAQ
干货 | V神·以太坊上的分片
干货 | 以太坊分片:overview and finality
干货 | 理解以太坊的第2层扩展方案

 
2 人喜欢