前言

初看这个文章标题,咱们或许会有两个疑问:

第一,什么是去中心化网络环境?简略来说,“去中心化”指的是在一个网络环境中,一切的节点位置都是相对平等的,没有严格意义上的主从之分。咱们以数据读取写入为例,一个很典型的主从网络环境便是咱们现在运用非常广泛的MySQL主从库架构,主库担任写,从库担任读,从库从主库同步数据,从库天然的信任主库的数据。所以主从库节点之间的位置是不平等的,主从架构的名字也是将这一点表现的酣畅淋漓。

另一个问题应该是,什么是达到共同?根据第一个问题的场景,假定节点之间是相对平等的,那么在需要对某一条数据进行落库保存的时分,怎么样去保存数据,是由其间一个节点先去保存然后在同步给其他节点,仍是并行保存?节点间的数据会呈现不共同吗,呈现不共同以后该怎么办?假定有歹意最坏的节点估计捣乱整个过程,那网络是不是会溃散?等等等等,这些都是达到共同需要考虑到的问题。所以达到共同能够了解为:确保整个网络数据的共同性。

看到这儿,咱们是不是对这个话题有了一个比较直观的了解和感受了,信任咱们应该也现已刻不容缓的想要一探终究了吧。那就让咱们持续往下,来揭开这项技能奥秘的面纱吧

一个典型的运用场景

“比特币”这个词,信任咱们都有所耳闻。它的数据信息存储在一个叫做“区块链”的数据库当中,而“区块链”本身便是一个“去中心化的分布式存储架构”。区块链是一种以块+链结构完成的数据存储,运用节点之间的共同算法保存数据,运用密码学的方法确保了数据传输和拜访的安全,运用自动化脚本完成的智能合约来操作数据的去中心化分布式存储架构。

区块链的组成

去中心化的分布式存储架构。描绘了一种数据的存储结构(区块)和存储形式(链)

  • 去中心化:没有中心节点,直接经过点对点进行数据传输

  • 分布式:区块存储于各个节点

  • 区块:区块头和区块体

  • 链:依照时刻次序顺次相连前后两个区块

如何在去中心化网络环境中达成共识

针对前言中说到了问题,为了便利咱们更好的了解,咱们举两个日常生活中常见的比如来看:

  • 转账场景

如何在去中心化网络环境中达成共识

  • 提案场景

如何在去中心化网络环境中达成共识

在实际生活中,提议或许来自于团队内任何一位同学,每个同学会有自己的提议,究竟该听谁的?

假定有一套咱们都能够认可的规矩,来验证提议是否合理。假定合理就赞同,反之拒绝。这样就能够在没有中心节点(老迈)的状况下,决议计划出团队都认可的一个提议。这整个达到共同的过程便是“共同”,验证提议是否合理的规矩便是“共同算法”。

共同的目的是确保团队内,一切成员都认可这件工作,即外部人员在询问团队内任何一个同学的时分,咱们对这件事给出来的答案都是共同的。(即:全网数据的共同)

共同算法

PoW

工作量证明(Proof of work),在比特币运用中俗称“挖矿”

比特币是区块链技能的一种运用,运用的便是PoW共同算法。在一次买卖发生时,首先会对这笔买卖进行合法性校验,这儿主要会依赖于密码学的一些原理和机制。当买卖被验证是合理时,就需要对将这笔买卖记载下来,即“记账”操作。这个时分网络内一切的节点都会进行一个谜题的核算,这个谜题是SHA256算法函数,上面说到的Target和Nounce都会影响到这个函数的核算难度。第一个解出答案的节点具有记账的权利,它会创立新的区块将买卖记载写入,一同将解出的答案播送给其他节点进行验证。假定验证经过,那么其他节点也会创立新的区块并写入买卖记载。

作为报酬,第一个解出答案的节点会具有必定量的比特币。

全体买卖共同流程

如何在去中心化网络环境中达成共识

  1. 客户端A在节点1上发生新的买卖1

  2. 节点1向全网进行播送,要求对买卖1进行记账。每个记账节点接收到这个恳求后,将收到的买卖信息放入一个区块中

  3. 每个节点经过PoW算法,核算本节点的区块的哈希值,尝试找到一个具有满足工作量难度的工作量证明(解答谜题)

  4. 节点3找到了一个工作量证明并向全网播送。当且仅当包括在该区块中的买卖都是有用且之前未存在过的,其它节点才会认同该区块的有用性

  5. 其它节点接收到播送信息后,若该区块有用,承受该区块,并跟随在该区块的末尾,制作新区块延长该链条,将被承受的区块的随机哈希值视为新区块的随机哈希

工作量证明流程

如何在去中心化网络环境中达成共识

考虑

为什么核算难度这么大

比特币的创立者以为,10分钟发生一个区块是一个比较合理的状况。在全网算力不断提升的状况下,只能够增加核算的难度,来确保10分钟左右稳定发生一个区块。而这个限制现在现已成为了比特币网络的一个瓶颈,依照10分钟一个区块来算,一个区块的大小是1M,最多只能包括2000笔左右的买卖,也便是3~4笔/秒的买卖。

数据不共同怎么办

由于网络通讯的关系,每一个节点收到的买卖记载次序并不是完全相同的。比如同一时刻,发生了2笔买卖记载Tx1和Tx2。A节点收到了Tx1,然后开端核算;B节点收到了Tx2,然后开端核算。这两笔买卖都是合法的,所以A和B都会将记载写入到各自本地的区块链中,一同宣布播送音讯给其他节点。这个时分,整个网络就会一同存在一条分叉链。如下图:

如何在去中心化网络环境中达成共识

比特币协议规定,分叉点开端,后续哪个分支最早到达6个区块,则被认定为正式的链,其他分支都会被丢掉。算力决议了区块的生成,假定大部分算力集中在一个分支上,那么这条分支大概率是被咱们可信的。

PBFT

实用拜占庭容错算法(Practical Byzantine Fault Tolerance)

故事布景

拜占庭帝国想要进攻一个强大的敌人,为此派出了10支戎行去围住这个敌人。这个敌人虽不比拜占庭帝国,但也足以抵挡5支惯例拜占庭戎行的一同突击。这10支戎行在分隔的围住状况下一同进犯。他们任一支戎行独自进攻都毫无胜算,除非有至少6支戎行(一半以上)一同突击才干攻下敌国。他们分散在敌国的四周,依托通讯兵骑马彼此通讯来洽谈进攻意向及进攻时刻。困扰这些将军的问题是,他们不确定他们中是否有叛徒,叛徒或许私行改变进攻意向或者进攻时刻。在这种状况下,拜占庭将军们才干确保有多于6支戎行在同一时刻一同建议进攻,然后赢取战斗?

状况剖析

  1. 先看在没有叛徒状况下,假定一个将军A提一个进攻提议(如:明日下午1点进攻,你乐意参加吗?)由通讯兵通讯别离告知其他的将军,假定幸运的话,他收到了其他6位将军以上的赞同,建议进攻。假定不幸,其他的将军也在此时宣布不同的进攻提议(如:明日下午2点、3点进攻,你乐意参加吗?),由于时刻上的差异,不同的将军收到(并认可)的进攻提议或许是不相同的,这是或许呈现A提议有3个支持者,B提议有4个支持者,C提议有2个支持者等等。

  2. 再加一点复杂性,在有叛徒状况下,一个叛徒会向不同的将军宣布不同的进攻提议(告知A明日下午1点进攻, 告知B明日下午2点进攻等等),一个叛徒也会或许赞同多个进攻提议(即赞同下午1点进攻又赞同下午2点进攻)。

前提条件

  1. 体系中“非拜占庭(正常)”节点的状况是共同的,会履行正确的验证逻辑和提议回复,同样的输入会给相同的成果

  2. 体系中“拜占庭(歹意)”节点或许给出多种提议回复,也或许不给出回复

  3. 体系中存在一个“主节点”,主节点是经过view-change推举出来的,主节点的作用是用来对客户端的恳求进行排序和分发

详细处理思路

整个共同过程包括以下五个阶段:

如何在去中心化网络环境中达成共识

REQUEST恳求阶段

C向主节点0发送恳求,恳求包括<REQUEST:详细提案详情,提案摘要,客户端标识,客户端签名>等信息

PRE-PREPARE预准备阶段

主节点0验证收到的客户端恳求。假定经过,分配当时视图v下的一个仅有编号n,然后播送<PRE-PREPARE:详细提案信息,提案摘要,v,n,主节点签名>信息

v:view,一个主节点会对应一个view,主节点发送的提案假定超越必定时刻没有被reply,那么就会触发view-change,改变主节点

n:number,详细某一个view下的提案编号

PREPARE准备阶段

副节点(1,2,3)在收到主节点的音讯后,会顺次进行如下校验过程:

  1. 验证主节点签名是否正确(正确:经过)

  2. 当时副本节点是否现已收到了同一视图v下的n(否:经过)

  3. 验证音讯和提案摘要

假定验证经过,那么当时节点会向一切其他节点播送一条<PREPARE:提案摘要,v,n,i,i节点签名>音讯

i:当时节点编号(1,2,3)

COMMIT阶段

一切节点收到PREPARE音讯,会进行以下校验过程:

  1. 验证副节点签名是否正确(正确:经过)

  2. 当时副本节点是否现已收到了同一视图v下的n(否:经过)

  3. 验证音讯和提案摘要

假定验证经过,而且当时节点收到超越2/3同一个<v,n>的PREPARE音讯,那么当时节点会向一切其他节点播送一条<COMMIT:提案摘要,v,n,i,i节点签名>音讯

Reply阶段

一切节点,若收到commit音讯,依托签名查看音讯是否正确,若同一个<v,n>的commit的音讯数量超越一切节点的1/3,则以为能够完成request要求的事务。构建reply音讯,直接回复给client。Client根据是否收到超越1/3个节点的正确回复,判别体系是否完成了恳求request。

考虑

什么是view-change

分布式共同性算法都需要供给必定的共同性和可用性。假定缺少了可用性,那么这个共同性算法没有办法长期供给共同性服务。假定主节点是歹意节点,一直不给副本节点宣布音讯,那么客户端的恳求永久没有办法达到达到共同。经过View Changes,能够推举出新的、让恳求在有限时刻内达到共同的主节点,向客户端响应,然后满足可用性的要求。

PBFT有一个大局的视图编号view number: v,主节点是根据 v mod n =i 得到节点i为主节点。视图转化,便是v递增,主节点也相应转移到另一个节点

  1. 当client发送恳求给主节点后,必定时刻没收到回复,则会发送恳求给其他backup节点, backup节点收到request后,起一个timer,假定timer过期,还没履行这个request(commit还没达共同),则backup节点建议view-change

  2. backup节点会播送一个view-change音讯,包括本来视图编号v和下个视图编号v+1。假定节点收到的view-change音讯多于2/3,则阐明view-change达到共同

  3. 当 v+1 mod n = j , 新的主节点是j,收到满足的view-change音讯后, 就播送new-view音讯,告知其他节点运用新视图。

  4. 其他节点收到new-view后,确认音讯签名正确,进入新视图

有了视图转化,假定主节点down了,就会触发视图转化替换另一个主节点,假定下一个主节点也是down的,则持续切换,直到找到可用的主节点。

PREPARE-COMMIT为什么是2/3

假定节点总数是n,其间作恶节点有f,那么剩下的正确节点为n – f,意味着只需收到n – f个音讯就必须做出决议(因为f个歹意节点或许不会发送音讯),但是这n – f个音讯有或许有f个是由作恶节点(作恶节点也能够什么都不干)假充的,那么正确的音讯便是n – f – f(最恶劣的状况下)个,为了大都共同,正确音讯必须占大都,也便是n – f – f > f,即n>3f。所以容错概率便是1/3,节点收到收到2/3的音讯就能确保大都共同了。

COMMIT-REPLY为什么是1/3

假定客户端收到了f+1条的音讯,那么就必定能够确保有1条音讯是来自于非歹意节点所发送的COMMIT音讯。非歹意节点在宣布COMMIT音讯的时分,现已能够确保全网大大都节点赞同了这次提案。

比照

属性/算法 Pow PBFT
容错 (n-1)/2<50%,n为节点总数 (n-1)/3<1/3,n为节点总数
长处 1)节点自在进出,简单完成2)歹意进犯者完成本钱高 1)运用了加密技能来避免欺骗进犯和重播进犯,以及检测被损坏的音讯。音讯包括了公钥签名、音讯验证编码(MAC)和无磕碰哈希函数生成的音讯摘要(message digest)2)能够忍受歹意节点
缺点 1)资源糟蹋,一切的节点都需要参与共同核算2)呈现算力集中(矿场),违背了去中心化的原则3)链分叉问题 1)通讯复杂度On2,节点数量超越100个的时分,功能呈现明显下降2)受网络影响,推迟较大
运用场景 公有链:比特币,以太坊 私有链/联盟链:Hyperledge

参考文档

【区块链整理】四、区块链数据结构 – 走看看

走近区块链(二):区块链的数据结构

区块链共同机制技能一–POW(工作量证明)共同机制_a soldiers的博客-CSDN博客_共同机制

分布式共同算法(拜占庭容错算法)的系列整理一:PBFT、PoW、PoS、DPos_每天净瞎搞的博客-CSDN博客_pow和pbft

万字长文:解读区块链7类共同算法 – 走看看

一文读懂SHA256算法原理及其完成