分片技术(一):并行计算 | 以太坊知识普及

2018-08-13  本文已影响0人  链圈社区

对于比特币来说,绝大部分的交易仅仅用于简单转账,如果闪电网络能得到大规模应用,那么拥堵问题应该基本能化解。闪电网络今年3月开始在比特币主网测试,6月底时锁定的比特币有了30多个,7月21日首次突破100个,应该在以一种慢指数的方式增长,所以发展得不错。

但是对于以太坊来说,上面有千千万万的智能合约和token,也有更加丰富多样的交易和操作,即使出块速度已经大大高于比特币,但拥堵问题仍比比特币严重得多,光一个状态通道技术(包括雷电网络),尚不足以完成解决。

于是,提出了另一个解决方案:分片。

在以太坊现在的架构中,所有账户状态构成了以太坊的世界状态,然后世界状态完整地存储在每一个节点中。唯一能导致世界状态变更的,就是交易。每一笔交易都需要所有节点的以太坊虚拟机进行计算处理,计算完毕后,所有节点更新世界状态。从这里可以看出,虽然以太坊有千千万万的节点,但整个以太坊网络的处理能力就等于一个节点的处理能力。

而分片技术,则是将世界状态划分成一个个的小片,可以按照账户地址的前缀来划分,比如a开头的属于分片1,b开头的属于分片2。同时,将所有节点也分成一个个的小组,一个小组负责处理一个分片。这就相当于,原来的以太坊只是一台机器,一笔笔交易,一条条指令,按顺序处理,这是串行处理,但分片后的以太坊,那就是一堆机器,这一堆机器可以各自同时处理不同的指令,由串行处理变成了并行处理,处理能力大大提升。

如果以太坊划成100个分片,那处理能力就是原来的100倍,如果划成1000个分片,那就是1000倍,这种提升是相当恐怖的。所以,V神是把分片当做以太坊的一个重点工作在抓的。

分片的思路其实就这么简单,但实现起来是相当复杂的,而且会带来一些新问题。

首先是安全性的下降,假如以太坊分成100个片,那么每个分片的规模只有原来的百分之一,对于攻击者来说,攻击的成本也大大降低,因为他只要攻击一个分片就可以了。为了安全性考虑,以太坊对于节点的分组并不是固定的,而是随机的,也就是说,对于一个分片,对应哪些节点去处理,是经常变动的。这样,对于攻击者来说,即使他有能力攻击一个分片,但他很大可能压根就找不到攻击的对象,因为他不知道这个分片现在有哪些节点在处理。

另一个问题是,如果两个分片的账户之间要进行交易,该怎么办?

实话说,以太坊的账户状态模型和比特币的UTXO模型相比,并行处理能力是被后者碾压的。对于以太坊来说,一个账户是不能同时发起两笔有效交易的,但比特币可以。这话是什么意思呢?

我们举个例子。

假如以太坊账户A有10个以太币,现在他想转2个给B,转3个给C,表面上看来,这同时转应该没问题,但其实是不行的。因为以太坊节点无法预判你第一笔交易后是否仍有余额支付另一笔交易,所以,在以太坊的账户状态和交易里都有一个序列号字段,一笔交易的序列号与账户状态里的序列号相同,这笔交易才是有效的。所以,以太坊的账户要发起多笔交易,只能按着序列号,排着队,一笔笔处理。

再看比特币。同样,假如比特币账户A有10个比特币,要转2个给B,3个给C。我们知道,一笔UTXO交易,都有自己的“输入”,也就是指明了比特币的来源。这一点,就决定了同一比特币账户的多笔交易是有可能并行处理的,前提条件是,不同的交易对应不同的输入。

比如,如果A的这10个比特币分别来源于三个不同的输入:输入一(2个)、输入二(4个)、输入三(4个),那么他就可以同时发起对B和C的两笔交易,第一笔交易的输入就用“输入一”的那2个比特币,第二笔交易用“输入二”或“输入三”的比特币都可以。

对于比特币节点来说,有可能一部分先收到发给B的交易,那他们就先处理到B的这笔交易,另一部分先收到发给C的交易,那就先处理到C的交易。这两笔交易在比特币网络同时有效,同时被节点处理。

基于此,以太坊在处理跨分片交易时,也引入了更适合并行处理的UTXO模型,具体原理后面我们会讲到。

上一篇下一篇

猜你喜欢

热点阅读