2019独角兽企业重金招聘Python工程师标准>>>
分片是提高区块链效率的一个主要流派。下面简单通俗的解释一下分片算法。
以太猫(Cryptokitties)堵塞了以太坊网络好几天,以太坊--世界上最大的,公开的区块链目前是无法扩容的,也众所周知。解决方案是两方面的:第一种是通过把某些交易下链并降低和这些交易交互的频率来扩容。这个称之为下链方案(off-chain solutions), 也被称为2层扩容(layer-2 scaling). 另外一方面,是修改协议的整体设计来修复区块链所面对的基本性问题。很不幸的,很多协议开发员都被巨大的困难吓倒了。
为了解决扩容问题,大致有3个提案:
- 扩大块的大小
- 让用户使用别的代币
- 分片(Sharding)
分片(Sharding)
EVM上的交易不是并行的,上面的每个交易从全局上看起来是顺序执行的。扩容问题必须处理好区块链里的3个特性。一个流行的说法是,区块链最多能具有这3个特性中的2个:
- 去中心化(Decentralization)
- 扩容(Scalabiltity)
- 安全(Security)
如果我们现在具有扩容性和安全性,这就意味着我们的区块链是中心化的而且会有更好的吞吐率。很可惜,现在以太坊具有去中心化特性和安全性.
分片的方案是把整个网络的状态分成一系列的叫Shard的分区,每个分区里都有自己独立的状态和交易历史。在这个系统里, 特定的节点只处理特定分区里的交易, 总体上来说,所有分区处理的吞吐率要远远高于单个分区处理所有的工作。
Terminology
我们先来熟悉一下分片的词汇:
- 状态(State): 描述一个系统在任意时间点的状态。在以太坊中,包括当前余额,智能合约代码和特定时间点的Nonce。 每个交易可以改变状态成为一个全新的状态
- 交易(Transaction): 用户触发的操作,该操作会影响系统的状态
- 默克尔树(Merkle Tree): a data structure that can store a large amount of data via cryptographic hashes. Merkle trees make it easy to check whether a piece of data is part of the structure in a very short amount of time and computational effort.
- 收据(Receipt): 尚未存到系统状态的交易的副产品。该交易被存在默克尔树中,所以对于节点来说,可以很容易验证。在以太坊中的智能合约的日志被作为收据存到默克尔树中.
Shard
Level1是交易组。每个Shard都有自己的交易组。交易组被分为交易组头和交易组体(transaction group header and the transaction group body).
Transaction Group Header
头被分为清晰的左边部分和右边部分.
左边部分:
- Shard ID: 交易组所属的Shard ID
- Pre-state root: 分片的当前的状态(所有交易应用前).
- Post state root:分片的当前的状态(所有交易应用后).
- Receipt root: 所有交易应用后的receipt root.
右边部分:
右边部分是所有被随机选出的验证者,来验证该Shard中所有的交易.
Transaction Group Body
包含Shard里所有交易的ID.
Level One的特性
- 每一个交易都指定它所属的Shard ID.
- 一个交易属于一个特定的Shard,意味着交易发生在两个账户之间,而这两个账户都是这个Shard上的账户
- 交易组包含的交易都属于哪个特定的Shard,而且是唯一的.
- 指定pre 和 post state root.
首先,在一个特定的分片上,我们会有一些被称为校勘者的节点。 每个分片都会生成一个校勘。校勘是一个特殊的数据结构包含关于该分片的重要信息。
这些校勘(collations)集合就像关于一个特定分片的状态和交易的迷你描述。每个校勘集合有一个头,包含如下信息:
- 校勘者相关的分片的信息 -- Shard ID
- 分片的当前的状态(所有交易应用前)-- Pre-State
- 分片的当前的状态(所有交易应用后)-- Post-State
- 所有校勘者里的三分之二的数字签名,来保证一个校勘是合法的
我们有超级节点,把从所有的分片中把所有的校勘(Collations),打包到一个块中并加入以太坊的公链中。超级节点的职责是处理所有校勘中的交易并且通过收集所有的校勘头来保持所有分片中状态的一致性。
在这个新区块链中,满足以下条件,一个块是合法的:
- 在所有校勘中的交易是合法的
- 交易前,校勘的状态和当前校勘的状态是一致的
- 交易后,校勘的状态和校勘头指定的状态是一致的
- 校勘集合获得了三分之二的校勘者的签名
Level Two的特性:
- Level two 像一个简单的区块, 只接受交易组,不接受单个交易.
- 交易组在满足以下条件时才是合法的:
- Pre-state root和全局状态里的Shard root一致.
- 交易组里的签名都被验证为真.
- 如果交易组计入,全局的state root就变成特定Shard ID里的post-state root .
每个交易的receipt通过交易组的默克尔根很容易访问到。在shard里的每个交易做下面两件事:
- 改变它所在的shard的状态state
- 生成一个receipt
有趣的是,所有的receipts被放到一个分布式的共享内存中,其他shard可以看但是不能修改。因而, 跨Shard通信可以以如下方式通过receipt发生:
实例
考虑一下一个交易是跨分区的情况。比如,如果我从一个在分区1的地址上送钱给一个在分区10上的地址。最重要的就是跨分区的通信能力。下面详细解释收据如何扮演角色,解决上面的问题。
Raul (地址在分区1上) 需要送100 ETH 给 Jim (地址在分区10)
- 一个交易就被送到分区1: 该交易从Raul的账户里减去100ETH并等待交易结束
- 对于没有反应到状态,但是已经在默克尔树中存在的交易,创建一个收据
- 一个交易被送到分区10,该交易包含默克尔收据作为交易数据。分区10检查该收据是否被使用。
- 分区10处理该交易并且给Jim的账户增加100ETH,并且保存从分区1来的收据被使用的事
- 分区10创建一个新的收据,可以为以后的交易所使用
有什么缺点呢?
分区区块链的一个最大的问题是:单个分区取代攻击。如果攻击者获得了在单个分区里多数校勘者的控制权,攻击者就可以产生一个恶意的分区,提交非法的校勘信息。我们如何解决这个问题?
The Ethereum Wiki’s Sharding FAQ 建议在每个分区上进行随机的抽样,这么做的目的是,这些验证者不能预先知道他们会验证哪个分区。 每个分区会有很多的校勘者,真正去校勘交易的校勘者会从那些集合里随机选出.
POS共识使这项工作更简单,因为它已经有一系列的全局的验证者集合。我们可以从中选取校勘者。我们必须保证随机性,以保证这个抽样是完全强制的而且不能被有问题的验证者所左右。
随机的抽样选择校勘者,可能会有一些延迟的问题。想象一下,当你运行一个已经同步完成的以太坊节点上的时候,过了一些块,你可能不得不重新同步。这个是可能的:当我们对验证者进行重新洗牌的时候。这个时候就必须下载一个新的分区当它被指定为校勘者。而这必然增加潜在的费用。
分区算法将位于协议层,对所有的开发程序员都是透明的。以太坊的状态系统看起来和现在一样,但是协议层会内置一个系统,去创建分区,跨区状态调整,去除过小的分区。。。 所有这些工作都是幕后进行,而对开发程序员继续在以太坊开发没有阻碍。
扩容之外:超级二次分区方案和不可思议的速度提高
以太坊可能采用一种超级二次分区方案(意味着在分区上建分区)。超级二次分区会给用户带来极大的利益,降低交易费用至几乎可以忽略不计,成为一个普通的基础设施。
如何开始
最初的实现不会导致硬分叉,而会是一个智能合约(Validator Manager Contract. 简称VMC)来管理所有的分片系统。这个 VMC 管理分片并且从全局的验证者集合中抽样选取校勘者(collators),负责解消所有分片状态之间的矛盾。Vitalik 提出了一个实现分片的文档: https://github.com/ethereum/sharding/blob/develop/docs/doc.md
资源:
- Sharding FAQ:https://github.com/ethereum/wiki/wiki/Sharding-FAQ
- Ethereum Sharding Technical Overview: https://medium.com/@icebearhww/ethereum-sharding-and-finality-65248951f649
- Sharding Reference Doc: https://github.com/ethereum/sharding/blob/develop/docs/doc.md
- https://blockgeeks.com/guides/blockchain-scalability/
- https://github.com/xitu/gold-miner/blob/master/TODO/making-sense-of-ethereums-layer-2-scaling-solutions-state-channels-plasma-and-truebit.md
参考这篇文章