1. 概述
将网络的整个状态分割成一系列被称为分片的分区,其中包含自己独立的状态片及交易历史记录。
解决的问题:
(1) 网络分片
利用随机性将区块链网络中的各个节点分割成若干个小网络,每一个小网络即是一个分片,这也是分片技术的第一步。
(2) 交易分片
在进行网络分片后,根据网络内的每一笔交易的独特标识(例如哈希值)来决定这笔交易由哪个分片来处理。
(3) 状态分片
在一个状态分片的区块链网络中,某一个特定的分片只会保留一部分交易数据,而并非全网所有的交易数据。
2. 需要考虑的问题[2]
1. 跨分片通信- 如何安全地增加跨分片通信。
2. 单分片接管攻击- 在一个分片中攻击者接管了大多数协调者
3. 欺诈检测-节点如何能够得知一个无效的排序规则,以便它们可以验证欺诈行为并且确认是欺诈行为之后拒绝这个排序规则?
4. 数据可用性问题- 由于某种特定的原因,一些特定的分片遭到了攻击而导致其脱机。由于分片并没有复制系统的全部状态,所以网络不能再验证那些依赖于脱机分片的交易。
解决此问题的方法是维护存档或进行节点备份,这样就能帮助系统进行故障修复以及恢复那些不可用的数据。但是,这样就使得一些节点将不得不存储系统的整个状态,同时这还会引发一些中心化的风险。
5. 火车旅馆问题- 假设用户想要购买一张火车票并预订一家旅馆,并且想要确保这个操作是原子的。如果两者在不同的分片上,如何保证来自于跨分片的消息可以在固定的周期内被包含在另外的分片中。
6. 随机数产生- A.确定性门限签名方法是另一种不被少数群体联盟利用的随机数生成方式。B.使用区块的哈希作为随机种子。C. others
7. 用户端保存状态- 无状态客户端: 不存储整个状态树,只存储状态树根。
8. 分叉选择规则- 发生分叉的选择规则
3. 以太坊
3.1 共识机制
由于POW共识会导致算力分散,容易出现单分片接管。以太坊选择了POS共识作为分片后的共识。但是POS存在两个问题:
1. 无利害攻击问题
早期的Pos机制下,只考虑到奖励,没有对应的惩罚机制,产块者倾向于两个分支都添加,因为它不用付出额外的代价,但是增加了收益概率。
2. 远程攻击问题
某个时刻,网络中的大多数人从一个历史久远的块开始分叉。
基于上诉两个问题,以太坊设计了Casper共识[4]。Casper是一种基于保证金的经济激励共识协议,必须先缴纳保证金才可以参与出块和共识形成,一个验证人作出了任何Casper认为“无效”的事情,他的保证金将被罚没,出块和参与共识的权利也会被取消。
投注共识:验证人对每一个高度上的每一个候选块独立下注,给每个块指定一个胜出概率并公布。验证人中的绝大多数以非常高的概率下注某个块时,任何不包含这个块的分叉都不可能胜出,此时我们说这个块已最终确认。
具体细节不展开
3.2 设计框架
1) Main chain 主链
以太坊2.0的初始部署阶段,是不需要对PoW链进行共识更改的。相反的是,我们会向PoW链添加一个注册合约,以存入ETH。这个注册合约会通过beacon链发出一个带有各种参数的日志。它不会进行验证,而是把注册逻辑发送给beacon链。
2) Beacon chain 信标链
Beacon链是PoS系统的“主链”,beacon链的主要职责是:
1. 存储并维护活跃、列队等待以及退出验证者的集合;
2. 处理交联(交联是beacon链“了解”分片链更新状态的主要手段);
3. 处理逐块一致性,以及finality gadget;
4. 为每个分片指定所选的区块提议者;
5. 组织验证者进入委员会,对拟议的区块进行投票;
6. 用共识规则对验证者实施奖励和处罚;
7. 作为一个锚点,其中分片会注册它们的状态,以促进跨分片交易;
成为验证者的唯一机制,是往以太坊PoW主链发送一笔包含32 ETH 的交易至一个注册合约。
在注册器合约内质押的是 PoW 以太,获得的收据可以“创造”出PoS 以太。因为注册器合约无法撤销,所以 PoS 以太不能转回 PoW 以太,并且只有在验证者退出系统之时才能被退回到一个分片地址,而且 PoS 以太(在初期阶段)是不能交易的。双生以太并行的状况不会持续太久,除非发生以下情况[3]:
1. 状态转换即将实现,参与者可以选择撤销注册器合约,PoS 以太可以转换成等价值的 PoW 以太。
2. PoW 链变成一个分片或者存储合约,PoW 以太会被逐渐淘汰,并在匹配地址上自动转换为 PoS 以太(向后兼容)。
3) Shard chain 分片链
分片链只有一小部分的证明必须记录在主链上。 分片链上的交易处于自己独立的空间中,分片验证人只需要验证他们所关注的分片。 分片链也通过 POS 机制依附于主链,以获得更高层次的共识(higher level ofconsensus)。
跨分片通信。利用 UTXO 模型,并通过在主链上进行交易和创建一个receipt,用户可以将以太存入一个指定分片。分片链上的用户可以给定 receipt ID 创建一个消费 receipt的交易,来花费该 receipt。
3.1 细节补充
1) 节点类型:
A. Proposer
Proposer是交易池的维护者。负责为proposal(collation
header)做准备而收集交易,并负责广播collation body。任何人都可以成为proposer。
B. Collator
Collator是由为随机函数选出的合法collator,其身份的合法性只在指定时间段和指定分片内有效。它的主要作用就是collates the proposal以建立collation。Collator从所有分片的collator pool中选出。
C. Executor
Executor执行状态交易函数。其实proposer也应该是executor,都是拥有获取交易所花费gas和选择高手续费的交易等能力的身份。
2) 交易的执行流程
以太坊主链每个时间段新生成的区块,都会将在此时间点之前的五个区块打包在内。这也被成为“LookAhead”。每个validator都会借由LookAhead来确认在未来他们将负责验证的是哪个分片。也就是验证者是先得知会被划分到哪个分片的。在指定时间段内,每个区块的验证者都会面临新一轮的随机选择(共5个区块,共五个validator)。当到达主链出块时间,所有validator都会将已校验的交易发送到交易池中。检验发起者需要向交验者支付激励。交验者下载潜在的分片提案。验证者验证数据的有效性,并挑选当前分片中最新区块,然后将collation header提交给主链。由矿工负责挖矿生成新的主链的区块。
可以简单地这么认为,分片中的交易都会被装入“校对块” (collation)。 与侧链类似,校对器(collator)只有一小部分会被记录到主链
以太坊2.0将以太网络分为两层,上层为现有的以太坊(也叫主链),基本保持不变;下层为各个分片,他们相互独立,拥有不同的账户空间。各个分片延生属于自己的链,并将最新区块头发给主链。主链收集各个分片的区块头,然后生成主链区块。值得注意的是,在主链上只保存各个分片的区块头,具体交易并不在主链上保存。
4. Zilliqa[5]
Zilliqa通过Pow算法完成网络节点的划分过程:选出1个Boss分片和多个工作分片,每个分片有不低于600个节点。其设计思想来源于谷歌提出的Map-reduce编程模型的思想。
1) Map:网络上的每一笔交易会根据发送者的地址被映射到工作分片中,工作分片通过pBFT共识算法在各自的分片当中验证交易,最终形成当前工作分片中的子区块。
2)Reduce(Merge):工作分片将子区块发送到Boss分片,Boss分片将多个子区块进行验证、打包,合并生成最终区块,保存在各个节点当中。
在Zilliqa的设计中,每600-800个节点就会被分配为一个网络分片,而由多个分片形成的并行网络就是分片网络。通过多重签名协议让PBTF共识更高效,理论上在pBTF共识下,只有分片数量小于50个节点的时候,它的效率才能达到最佳。通过多重签名优化和压缩通信的次数和数据的大小,而从达到优化通信成本的目的。
节点通过pow验证的方式才准许其节点进入网络,PoW来防止女巫节点攻击、确认节点身份并随机进行分片。参与共识协议的每个矿工都可以获得对应的奖励。每个节点依然保持所有历史记录,并没有解决存储空间的扩展性问题。
5. QuarkChain
QuarkChain由两层区块链结构组成,第一层为分片层(可以理解为子链层),用于交易记账;第二层为一条根链,用于确认分片中的交易。在不影响根链的情况下,分片层的分片数量可以动态增加,从而来提高系统的整体吞吐量。
QuarkChain的分片技术没有采取任何的随机机制来合理分配分片上的节点,因此安全性方面存在潜在的隐患。跨分片交易过多,或者网络中存在大量的跨分片交易,QuarkChain 网络中的吞吐量也会下降。
QuarkChain中跨分片交易的流程分为三步:
① 发送方所属分片内记录交易信息,分片内打包成小块,10秒一个区块
② 发送方所属分片提交区块信息到根链,60秒一个区块。
③ 根链确认之后接收方分片进行同步信息,10秒一个区块。
QuarkChain上采用了分片和根链层的协同挖矿,协同挖矿的目标是通过激励机制和难度算法使得算力能均匀的分配到网络上。在实际的区块链网络和pow共识机制中,仅靠难度算法和激励机制并不能完全杜绝矿工联合作恶的问题,而QuarkChain在此问题上没有提供更好的解决方案。
QuarkChain提供了一个简单的账户管理系统。用户只需要一个帐户即可管理所有分片上的地址。在QuarkChain的设计中,每个分片中都会存在着一个账户的地址,其中一个拥有私钥的帐户可以在任何分片上执行交易。实质上当一个用户在没有余额的分片上进行交易时,首先需要由拥有余额的分片账户转到目标账户,然后用户才能进一步进行操作。根本的结构上还是需要对不同分片上的地址进行跨分片交易才能做到金额调动。