想知道更多关于区块链技术知识,请百度【链客区块链技术问答社区】
链客,有问必答!
分布式系统由Tanenbaum定义,“分布式系统是一组独立的计算机,在”分布式系统 — 原理和范例“中作为用户的单一,连贯的系统出现”。
区块链通过构建全球分布式系统,尝试实现分散的新数据存储和组织结构。
首先,定位到分布式系统的原因主要是可扩展性,位置和可用性。区块链也不例外。地理可扩展性,形成全球价值存储网络/信息保护区域,包括非集中式结构下的防篡改/零停机时间的可用性。这些未来都是使用分布式系统在block中实现的。
1.简介(同步和整体流程概述)
与集中式系统不同,在分布式系统中就时间达成一致并不容易。
在前一种情况下,可以基于全局共享时钟确定绝对顺序关系,但是在后一种情况下,由于存在时钟值错误和对应时间,因此难以共享绝对时间。
但是,绝对时间的顺序并不是绝对必要的,如果相对顺序是固定的,通常就足够了。我们如何同步分布式系统中的所有时钟?此外,需要哪些算法才能在分布式系统中实现一致性同步?
在本文中,将按以下顺序解释节点之间的同步。
时钟同步是如何发生的?
使用逻辑时钟和矢量时钟的相对排序方法
关于分布式系统一致性的排除控制算法
关于分布式系统中的领导选举算法
2.时钟同步
2–1. 物理时钟
时钟和时钟歪斜
大多数计算机都有保持时间的电路,这种设备称为“时钟”。这是基于频率的振动,该振动可以通过晶体类型,切割方法和向精确加工的石英增加张力时的压力大小明确定义。
虽然这个频率相当稳定,但不能保证不同计算机的所有晶体都能以完全相同的频率运行。由此引起的同步时间的差异称为时钟偏差。
在这种情况下,特别是在实时系统中,如何使多个时钟与现实时钟同步以及如何同步时钟是一个问题。
现实世界中的时间最初基于平均太阳秒,但现在铯133过渡9,192,631,770次的时间定义为1秒,并且定义了国际原子时间和通用协调时间(UTC)。为了向需要准确时间的人提供UTC,使用WWV并且时间以±10毫秒的精度提供。
2–2. 时钟同步算法
但是,大多数机器没有WWV接收器。因此,每台机器都需要时间跟踪和管理算法,以便所有机器都可以同步时间。
顺便提及,用于确定是否需要重新同步的错误,即时钟偏移,如下测量。
将H定义为每台机器计数的晶体振动引起的每秒中断次数(刻度数),并将C表示为该时钟的值。设Cp(t)表示机器的时钟值,当UTC时间为t时。
如果将p定义为定义允许的时钟偏差量的最大漂移率,则假定它在以下范围内运行。
1-p <= dC/dt <= 1+p
也就是说,在从先前同步开始经过At秒之后,两个时钟最多分开2pΔt。
当保证在操作执行时没有大于&的偏差时,必须至少每&/2p重新同步软件。
网络时间协议(NTP)
在许多协议中很常见,[Cristian,1989]首先提出的方法是一种与客户服务器通信的方法。由于时间服务器具有WWV接收器或具有准确的时钟,因此它可以提供当前时间。在与服务器通信时,重要的是延迟报告消息传播延迟的时间,但是通过估计延迟,这里可以最小化错误。目前,已知NTP能够在1至50毫秒的范围内实现精度。
伯克利算法
在诸如NTP的许多算法中,时间服务器是被动的并且仅回答查询。另一方面,在Berkeley算法中,时间服务器接收每个参与节点所持有的时间,并且还基于平均值改变其自己的时间。当时间值不必与现实世界有关系时,很容易在同一当前时间达成一致,并且它对此算法有效。
3.逻辑时钟
到目前为止,虽然我们描述了一种根据实际时钟将时钟与绝对时间同步作为参考的方法,但通常只执行相对同步。这里,逻辑时钟的概念用于确定相对顺序。
3–1. Lamport的逻辑时钟
为了同步逻辑时钟,Lamport定义了一个名为happen-before的关系。表达式a→b表示“a发生在b之前”,这意味着事件首先发生,然后所有进程都同意事件b将发生。发生之前 — 可以在以下两种情况下直接观察到关系。
如果a和b是同一过程中的事件且a出现在b之前,则a→b为真。
- 如果a是由一个进程发送的消息的事件,并且b是由另一个进程接收的该消息的事件,那么a→b也是如此。在发送消息之前无法接收消息,即使消息同时也需要有限的非零时间。
因为发生前关系处于过渡关系中,如果a→b和b→c,则可以证明a→c。如果事件x,y出现在不交换消息的不同进程中,则x→y和y→x都不为真,并且这些事件被认为是并发的。 (之前发生的关系未知。)
利用逻辑时钟,通过分配所有进程对每个事件a一致的时间C(a)来测量相对时间。如果这些时间值是a→b,则通过向时间添加正值来校正它们,使得C(a)<C(b)。通过分配如下图所示的时间值,可以掌握之前发生的关系。
在Lamport的逻辑时钟中,如果a→b,则可以证明C(a)<C(b),但如果C(a)<C(b)则a→b不一定成立。换句话说,a→b是C(a)<C(b)的必要条件,并且不是充分条件。 Lamport的逻辑时钟增加了改进,它是一个矢量时钟,可以满足这种必要和充足的条件。
完全有序的多播
有关详细信息,请参阅“分布式系统一致性”一文中的内容
在许多情况下,有必要在重复的副本之间执行完全有序的多播。换句话说,所有消息都需要以相同的顺序传递给每个收件人。 Lamport的逻辑时钟可用于在完全分布式系统下实现完全有序的多播。
当进程收到某个消息时,它会根据时间戳按顺序放入本地队列。收件人向另一个进程多播确认。如果您按照Lamport的算法调整本地时钟,则所有进程实际上都具有本地队列的相同副本。只有当消息位于队列的头部并且被所有其他进程确认时,才有一个进程可以将队列中的消息传递给正在运行的应用程序,因此,所有消息都以相同的顺序传递到各处。换句话说,已经建立了完全有序的多播。
3–2. 矢量时钟
使用矢量时钟,可以掌握Lamport逻辑时钟无法掌握的因果关系。 假设事件a的向量时钟是VC(a),则执行以下步骤,使得a→b成为VC(a)<VC(b)的必要和充分条件。
在通过网络发送消息之前,节点Pi向矢量时钟VCi [i]添加1,或者操作一些内部事件。
-
如果处理Pi将消息m发送到Pj,则Pi在执行前一步骤之后将m的向量时间戳ts(m)设置为等于VCi。
-
当接收到消息m时,进程Pj执行步骤1,将消息分发给应用程序,然后更新其自己的向量时钟的每个k,如下所示:VCj [k]←max {VCj [k],ts(m)[k]}。
因果关系多播
通过使用向量时钟,可以实现稍微弱于上述完全有序多播的因果有序多播。
通过比较矢量时钟的值并掌握发生在之前的关系,对于特定事件x,其他事件可以被分类为过去事件,并发事件和未来事件。例如,在上图中,当事件d用作参考点时,过去事件是a,b,c,i,并发事件是j,l,m,未来事件是f,g,h。
此时,假设因果有序多播是过去事件和因果事件的序列,其中发生所有因果关系,以便在所有过程中保持一致,但是关于并发事件的顺序是无关紧要的。通过这种方式,与Lamport的逻辑时钟不同,可以用向量时钟来掌握因果关系。
4.独家控制
多个进程之间的并发操作和协作操作是分布式系统的基本,但是为了保证对资源的独占访问,以便通过多个进程同时访问相同资源时不处于不一致状态时,需要分布式排他算法。
分布式独占控制算法可以分为以下两种类型。
基于Token的解决方案
基于权限的方法
在基于Token的方案中,很容易避免Starvation(很长时间内不允许访问资源)和死锁(多个进程等待彼此的进展)。一个代表性的例子是Token环算法。但是,当持有Token的过程异常停止并且Token丢失,有必要只生成一个新Token,这种复杂性是一个严重的缺点。
许多其他分散的独占控制算法采用基于权限的方法,并有许多不同的获取权限的方法,我们将分别具体解释。
4–1. 集中算法
通过模拟单处理器系统的功能,可以轻松实现分布式系统中独占控制的单一访问。在集中式算法中,一个进程被指定为协调器,并且当进程访问共享资源时,请求消息被发送到协调器以获得许可。如果其他进程未访问共享资源,则协调器返回权限响应,并且在接收到回复之后,所请求的进程执行该进程。
很容易看出,该算法保证了对资源的独占访问,但它具有单点故障的严重缺点。虽然这可能是大型系统中的性能瓶颈,但这种简单性带来的优势仍然可以弥补这些缺点。
4–2. 分散算法
假设各项都会重复n次。在分散算法中,当进程访问资源时,需要批准大多数m> n / 2。如果获得大多数批准,则该过程获得许可并可以进行处理。
虽然该方案解决了集中式算法的单点故障问题,但是如果有太多的节点试图访问,则存在另一个问题,即没有节点可以获得足够的投票而无法获得充分的性能。
4–3. 分布式算法
在该算法中,假设系统上所有事件的顺序可以定义为完全有序的关系。作为这个基础,使用了前一章中描述的Lamport的逻辑时钟,并且假设没有消息会丢失。
当进程尝试访问共享资源时,它会创建一条消息,其中包含资源名称,自己的进程号和当前逻辑时钟,并将其发送给所有其他进程。当接收到该请求消息时,根据其自身状态执行以下操作。
- 如果收件人未访问该资源且未尝试访问该资源,则收件人会向发件人返回“确定”消息。
- 如果收件人已在访问资源,请不要回复并执行排队请求。
- 如果收件人正在尝试访问资源但尚未完成,请将输入消息中的时间戳与发送给其他进程的消息中的时间戳进行比较,并将较低的一个作为获胜者。如果收到的消息具有小的时间戳,则收件人返回OK消息。如果自己的消息具有较小的时间戳,则接收方将不会将输入消息排队。
显然,如果它不像process1或2那样冲突,这个算法就能正常工作。即使在冲突的情况下,也只建立了唯一一个进程可以访问的条件。
与集中式算法一样,该算法可以保证独占控制,不会出现死锁或饥饿。 此外,没有单点故障。 尽管如此,单点故障被故障n位置特征所取代。 它可以通过回复权限或拒绝权限并引入超时来解决,但也会出现其他问题,例如需要多播通信原语。 不幸的是,目前尚未设计出超越集中式算法的分布式算法,并且仍在研究中。
当比较各个算法时,变为如下。
5.领导者选举算法
许多分布式算法需要一个特殊的过程,它具有领导者作为协调者或发起者的角色。哪个过程是领导者,唯一过程是否可以成为领导者是一个重要问题,研究人员在过去几十年中一直在努力。
5–1. 欺负算法
当协调员失败并且任何进程P注意到该情况时,P根据以下过程激活选举。
· P向所有具有比其自身更高数值的进程发送ELECTION消息。
· 如果没有人回复,P将赢得选举并成为协调员。
· 如果来自具有高于P的数值的过程的答案,则将替换它。 P的工作结束了。
使用该算法,可以唯一地确定协调器。但是,该算法需要大量的消息和数据流量,可以说是冗余的。作为替代方案,存在环算法。
5–2. 环算法
与一般环算法不同,该算法不使用Token。发现协调器不工作的任何进程构造一个包含其自己的进程号的ELECTION消息,并将该消息发送给其后继者(环网中的下一个节点)。如果继任者失败,请跳过。如果没有比您更高的数值的节点,您的消息将仍然返回给您自己的进程号,因此它将被指定为协调员。
在该算法中,执行具有减少数量的消息的领导者选举,但是还可以通过将消息的目的地设置到两个相邻节点来实现具有较少量数据流量的算法。
6.阻止链和同步作为分布式系统
因此,在作为分布式系统之一的块链中,进程之间的同步如何发生?
6–1. 区块链和时钟同步
块链和逻辑时钟
首先,考虑是否可以使用区块链中的物理时钟来掌握绝对时间关系。如第2章所述,参与网络的每个节点并不总是保持正确的物理时钟,并且应该存在时钟偏差。由于比特币区块链的平均生成时间是10分钟,因此认为即使一定程度的大时钟偏差也是可接受的。然而,当节点散布在世界各地时难以同步各个物理时钟,并且还可能存在伪装时钟的节点。通过引入网络时间协议(NTP)来重新同步节点之间的正确时间是一项困难的技术。
区块链和逻辑时钟
因此,准备逻辑时钟而不是物理时钟是切合实际的。实际上,通过在块中加入时间标记,可以制备出与Lamport逻辑时钟非常相似的机制。
如[比特币:点对点电子现金系统Satoshi Nakamoto]中所述,对作为矿工的区块执行写操作的每个节点本身具有作为时间戳服务器的角色。每个时间戳通过在其哈希中包含前一个时间戳来形成链。但是,无法保证这些节点保持正确的物理时钟。时间戳的数值,即每个事务的顺序和时间相对模糊。
由于时钟的这种模糊性,有可能会进行双重付款。但是,在比特币区块链中,只有最长的链是合法的,在次要验证后丢弃不正确的交易。因此,区块的顺序随着时间的流逝唯一确定。随着每个时间戳的增加,前一个时间戳被加强。
总之,在区块链中的模糊时间戳下,事务的顺序一致性是不准确的。然而,利用链式连接的简单机制,每个交易的发生前关系随着时间的推移而建立。此外,还有一种激励结构,以便矿工转移到良好,交易不一致的顺序不会发生。
可以说,实现类似于Lamport的逻辑时钟的时钟同步方法,因为事务之间的相对顺序关系,即发生在之前的关系变得更清楚。
对于大多数交易,没有因果关系,因此如果您引入向量时钟并采用因果关系排序的概念,则可以极大地放松订单关系的约束。然而,在区块链中,由于结构本身默认共享所有块的顺序关系,所以保持总排序(相对于在一段时间之后的块)。
6–2. 区块链和独占控制算法
即使在作为分布式系统的区块链中,也需要排除控制。在区块链网络中,每个节点并行地异步操作。此时,要共享的区块链本身的信息不应该不一致。
PoW·PoS中的独占控制算法
如第4章所述,分布式排他控制算法可分为以下两种类型。
· 基于Token的解决方案
· 基于权限的解决方案
PoW和PoS是基于权限的,其中,可以说它是类似于分布式算法的机制。那么,您什么时候获得访问资源的权限?是的,就在你找到一个随机数时。
在PoW中,只有当找到在哈希值后跟0后跟n为0的随机数时,才可以执行有效的新块写操作。执行操作的矿工将其广播给所有矿工并分享。
通常,当节点找到一个nonce并创建一个比他自己更早的块时,minor会同步该信息并移动以搜索下一个nonce值。这是因为如果您使用最长链被认为合法的规则搜索下一个nonce值,它们可以获得更多利润。尽管PoS优先为具有较大硬币持有量的人提供资源访问,但基本排除控制算法结构也类似于分布式算法。
但是,严格来说,不执行排除控制。这是为了在公共时间内同步并形成共识10分钟,直到下一个区块为止。当两个或更多个节点同时找到随机数值时,写入操作以非独占状态执行。此时,由于只有最长的链被认为是合法的,因此区块链网络中的信息与时间的流逝保持一致。叉子发生的一个问题是因为没有执行严格的排他控制而且没有确认最终结果。
BFT类型的独占控制算法
另一方面,通过BFT类型,基于许可的分散算法执行排他控制。该算法解决了分叉和终结问题,这是PoW中与分布式算法类似的问题。
在BFT类型中,只有一个名为Proposer,Orderer等的节点有权生成新区块。创建区块时,您可以从所有参与节点收集投票,获得超过2/3的同意,您才有权创建新块。此时,有必要同意超过2/3而不是多数的原因是处理拜占庭故障,有关此问题的详细信息在“分布式系统中的容错”一文中有所描述。
在BFT类型算法中,与PoW等不同,只有一个节点可以获得对区块链的独占访问权限,因此不会立即确定fork和finality。但是,任何人都可以作为矿工参与网络的财产往往会丢失。
6–3. 区块链和领导者选择算法
PoW,PoS和领导者选择算法
区块链上的领导者选择算法类似于独占控制算法的机制。在比特币中,用于选举领导者的算法,即,新创建块的节点是PoW。
PoW允许添加一个块作为一个好的领导者,为比特币网络提供有计算复杂性和发现nonce的节点。每个成为领导者的矿工都会尝试为比特币网络做出贡献,因为更容易早期同步到首先发现现时的节点并开始搜索下一个块的现时值更有可能获得奖励。尽管存在链条完全由硬叉分支的问题,但是通过基于博弈论准备非常简单的激励结构,在块链网络中实现作为分布式系统的同步。
在以太坊的情况下,由于块生成的时间很短,因此倾向于发生更多的分叉。关于这一点,通过采用unkle块的概念,我们实现了一种结构,即使产生不合法的链条也会给予一定的奖励。
将来引入未来的PoS允许优先生成具有大硬币保持量的节点的块作为引导者。这是一种解决/改善PoW中必要电量变得巨大且易受51%攻击的问题的算法。这是一种基于博弈论的选举算法,如果一个节点持有大量硬币,就不会采取破坏网络等恶意行为。
BFT和领导者选择算法
BFT类型算法的问题在于如何选择将投票给块生成的领导者作为Proposer或Orderer。
在PBFT采取的HyperLedger当中,原为可信赖的机构才会注册为Orderer。 但这是集中式的领导者选择方法,与分布式系统存在着明显的区别。
在Tendermint协议当中,领导者以循环方式被选出,以通过与不同验证者的轮换交替来提出建议。 此时,领导候选者是基于PoS,并且可以说是可以在分布式系统中实现领导者选择的算法之一。