博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
区块链入门-完整版V1.0-Part4
阅读量:4171 次
发布时间:2019-05-26

本文共 6815 字,大约阅读时间需要 22 分钟。

P2P网络

在读一些区块链技术介绍文章中,一般都会看到P2P网络这个词汇,这里对P2P和区块链中P2P网络作一个简要说明。 

P2P(peer to peer):这个peer中文翻译就是对等、对等者、伙伴、对端的意思。所以P2P网络一般叫做对等网络,其确切定义:网络中每个参与节点共享节点所拥有的一部分计算能力、存储能力、网络连接能力,这些能力或者称为共享资源通过网络提供的服务和内容,可被对等节点直接访问,访问过程中不需要再经过中间实体,所以每个节点既是资源和服务的使用者、又是整个资源和服务的提供者。P2P网络中各个节点都是出于一个对等的地位,没有主、从的区分,联系实际环境,你目前在操作的一台电脑终端既可以作为服务器。又可以作为终端去获取对等节点的资源。整个网络中不存在中心节点,每个节点都可对任意对等节点做出响应,提供资源,包括计算资源、存储资源等。 
P2P不是一个新的技术,早在2000年该模型就已出现,他于传统的客户端/服务器(Client/Server)结构(也就是WWW所采用的结构方式)的一个本质区别是,整个网络结构中不存在中心节点(或中心服务器)。这和区块链的去中心化概念完全契合。 
屏幕快照 2018-07-04 下午4.47.51.png-510.5kB

第一个图示P2P网路和传统架构的区别,对比区块链网络结构,很相似。 

P2P的理念,“我为人人、人人为我”让所有加入互联网的人,直接通过互联网交互,不需要一个中间商,这样沟通,共享,交互更加自由和方便,最终把互联网的权利交换给用户,而不是一些集中网络中心。 
用过BT下载的同学肯定印象很深刻,种子的多少很大程度上决定了你的下载速度,P2P网络的一大特点区别于传统网络架构中,网络中的资源和服务分散在所有节点上,信息的传输和服务的实现都直接在节点之间进行,可以无需中间环节和服务器的介入,避免了可能的瓶颈。P2P的非中心化基本特点,带来了其在可扩展性、健壮性等方面的优势。在P2P网络中,随着用户的加入,不仅服务的需求增加了,系统整体的资源和服务能力也在同步地扩充,始终能比较容易地满足用户的需要。理论上其可扩展性几乎可以认为是无限的。例如:在传统的通过FTP的文件下载方式中,当下载用户增加之后,下载速度会变得越来越慢,然而P2P网络正好相反,加入的用户越多,P2P网络中提供的资源就越多,下载的速度反而越快。P2P架构天生具有耐攻击、高容错的优点。由于服务是分散在各个节点之间进行的,部分节点或网络遭到破坏对其它部分的影响很小。P2P网络一般在部分节点失效时能够自动调整整体拓扑,保持其它节点的连通性。P2P网络通常都是以自组织的方式建立起来的,并允许节点自由地加入和离开。在P2P网络中,由于信息的传输分散在各节点之间进行而无需经过某个集中环节,用户的隐私信息被窃听和泄漏的可能性大大缩小。此外,目前解决Internet隐私问题主要采用中继转发的技术方法,从而将通信的参与者隐藏在众多的网络实体之中。在传统的一些匿名通信系统中,实现这一机制依赖于某些中继服务器节点。而在P2P中,所有参与者都可以提供中继转发的功能,因而大大提高了匿名通讯的灵活性和可靠性,能够为用户提供更好的隐私保护。 
以上这些P2P特点阅读后发现和区块链的特点有众多相似,区块链技术在前文中就提到他是前人各种技术结合后产生的一种新的架构,很好的结合了之前那些技术的特点,实现了多种组合后公共的优良性。 
P2P的网络拓扑结构(这个网上很多资料,我基本参考转载于:)

中心化拓扑(Centralized Topology); 

屏幕快照 2018-07-04 下午4.47.59.png-578.6kB

中心化拓扑中,网络主体由一个处于中心地位的索引目录服务器连接到目录服务器和各网络节点中。这种方式维护简单,资源发现率高,可实现复杂查询,但容易出现单点故障。

分布式P2P网络拓扑包括:全分布式非结构化拓扑(Decentralized Unstructured Topology);全分布式结构化拓扑(Decentralized Structured Topology,也称作DHT网络); 

屏幕快照 2018-07-04 下午4.48.06.png-439.1kB

全分布式非结构化拓扑的P2P网络是在重叠网络(Overlay Network)采用了随机图的组织方式,结点度数服从Power-law规律,从而能够较快发现目的结点,面对网络的动态变化体现了较好的容错能力,因此具有较好的可用性。同时可以支持复杂查询。 

全分布式结构化拓扑的P2P网络主要是采用分布式散列表(Distributed Hash Table, 简写成DHT)技术来组织网络中的结点。DHT是一个由广域范围大量结点共同维护的巨大散列表。散列表被分割成不连续的块,每个结点被分配给一个属于自己的散列块,并成为这个散列块的管理者。通过加密散列函数,一个对象的名字或关键词被映射为128位或160位的散列值。分布式散列表起源于SDDS(Scalable Distribute Data Structures)研究,Gribble等实现了一个高度可扩展,容错的SDDS集群。DHT类结构能够自适应结点的动态加入/退出,有着良好的可扩展性、鲁棒性、结点ID分配的均匀性和自组织能力。由于重叠网络采用了确定性拓扑结构,DHT可以提供精确的发现。只要目的结点存在于网络中DHT总能发现它,发现的准确性得到了保证。 
半分布式拓扑(Partially Decentralized Topology) 
屏幕快照 2018-07-04 下午4.48.12.png-429kB
吸取了中心化结构和全分布式非结构化拓扑的优点,选择性能较高(处理、存储、带宽等方面性能)的结点作为超级结点(英文表达为SuperNodes或者Hubs),在各个超级结点上存储了系统中其他部分结点的信息,发现算法仅在超级结点之间转发,超级结点再将查询请求转发给适当的叶子结点。半分布式结构也是一个层次式结构,超级结点之间构成一个高速转发层,超级结点和所负责的普通结点构成若干层次。

实际应用中这4种P2P各有优缺点: 

屏幕快照 2018-07-04 下午4.48.19.png-276.4kB

那区块链技术模型中,一般都认可有一个网络层,在这一层,通过P2P组网机制,数据传播和验证机制来保证,所以P2P网络是区块链的基础,也是组成区块链技术的重要一环。区块链系统建立在IP通信协议和分布式网络的基础上,不依赖传统的电路交换,而是建立与网络通信之上,完全通过互联网交易信息。网络中的节点对等,没有中心化和层级概念,每个节点都承担维护网络路由、验证数据区块的功能。


共识机制

共识机制基础概念:

首先,共识机制在分布式系统中是无解的,为什么说是无解,众多的节点之间通信,必然存在网络自身不可靠的原因、主机故障原因、恶意操控等原因,故是无法保证实现完全的共识,这里不是笔者随便下的结论,Fischer, Lynch 和 Patterson三位在1985年就提出了一个FLP不可能原理:在网络可靠的前提下,任意节点失效,一个或者多个的最小化异步模型系统中,不可能存在一个解决一致性问题的确定性算法。这三位的论文后来获得了Dijkstra奖。这一理论已被可靠的论证过,所以不用再花大力气在异步分布式系统中去设计一个完全一致的共识算法。(这里不深究FLP原理,有兴趣可以百度Lynch的)

FLP说明在异步分布式系统中完全一致性是不可能的,但这是一个科学理论,应用到现实工程中,我们可以牺牲一些代价把不可能变成可能,这就是科学和工程的最大区别,就像你炒股吧,官方肯定会告诉你股市有风险,入市需谨慎,但你肯定认为在你高超的操作下还是能赚钱的。那在计算机工程领域中2000年 Eric Brewer在ACM 研讨会提出猜想,CAP猜想,CAP拆解后就是一致性(Consistency)所有节点上的数据时刻保持同步、可用性(Availablity)每个请求都能接受到一个响应不论响应成功或失败、分区容忍性(Partition)系统内部有消息失效的情况下仍能提供持续服务。 

屏幕快照 2018-07-04 下午5.05.46.png-668.2kB

实际运用在工程环境下,适当取舍这三者,一致性、可用性和分区容错性三者无法在分布式系统中被同时满足,并且最多只能满足其中两个。这样就出现了以下三种情况:

CA without P:如果不要求P(不允许分区),则C(强一致性)和A(可用性)是可以保证的。但其实分区不是你想不想的问题,而是始终会存在,因此CA的系统更多的是允许分区后各子系统依然保持CA。Zookeeper为此类设计。

CP without A:如果不要求A(可用),相当于每个请求都需要在Server之间强一致,而P(分区)会导致同步时间无限延长,如此CP也是可以保证的。很多传统的数据库分布式事务都属于这种模式。MongoDB、Redis为此类设计。

AP wihtout C:要高可用并允许分区,则需放弃一致性。一旦分区发生,节点之间可能会失去联系,为了高可用,每个节点只能用本地数据提供服务,而这样会导致全局数据的不一致性。CouchDB、cassandra为此类设计。

CAP猜想出现至今都一直存在很多质疑,有人提出概念的混乱、不适应数据库事务架构等各种质疑,2002年对CAP猜想被证实为一个定理,证明了CAP三者不可能同时满足,但没有证明任意两者都可满足,对C\A\P作了更明确的声明:(论文原文:),最初这个辩证是在webserver集群环境下的。

C:一致性被称为原子对象,任何的读写都应该看起来是“原子“的,或串行的。写后面的读一定能读到前面写的内容。所有的读写请求都好像被全局排序。

A:对任何非失败节点都应该在有限时间内给出请求的回应。(请求的可终止性)

P:允许节点之间丢失任意多的消息,当网络分区发生时,节点之间的消息可能会完全丢失。

质疑一直存在。2012年lynch重写论文,再次对CAP做了进一步的解释:

把CAP理论的证明局限在原子读写的场景,并申明不支持数据库事务之类的场景。

一致性场景不会引入用户agent,只是发生在后台集群之内。

把分区容错归结为一个对网络环境的陈述,而非之前一个独立条件。这实际上就是更加明确了概念。

引入了活性(liveness)和安全属性(safety),在一个更抽象的概念下研究分布式系统,并认为CAP是活性与安全熟悉之间权衡的一个特例。其中的一致性属于liveness,可用性属于safety。

把CAP的研究推到一个更广阔的空间:网络存在同步、部分同步;一致性性的结果也从仅存在一个到存在N个(部分一致),引入了通信周期round,并引用了其他论文,给出了为了保证N个一致性结果,至少需要通信的round数。

(论文原文:)

谈论了以上CAP原理,目的就是为了说明共识机制是相对的,目前没有一种决对完美的共识机制,所有各种共识机制都是理论结合工程实践产生的。


拜占庭问题:

拜占庭将军问题就会时常看到,拜占庭将军问题是一个协议问题,拜占庭帝国军队的将军们必须全体一致的决定是否攻击某一支敌军。问题是这些将军在地理上是分隔开来的,并且将军中存在叛徒。叛徒可以任意行动以达到以下目标:欺骗某些将军采取进攻行动;促成一个不是所有将军都同意的决定,如当将军们不希望进攻时促成进攻行动;或者迷惑某些将军,使他们无法做出决定。如果叛徒达到了这些目的之一,则任何攻击行动的结果都是注定要失败的,只有完全达成一致的努力才能获得胜利(来自百度百科)

这里不讨论军事问题,把拜占庭将军问题引入到计算机领域,在分布式系统中,网络中各节点由于硬件设备故障、网络延时或故障、恶意攻击导致整个系统中出现不可预知的错误。


POW共识机制 

* 在bitcoin中挖矿目的不是创造新的bitcoin,这是一种激励机制,这种机制也实现了分布式的安全。

  • 参考:《精通比特币》

POW机制简介 

POW(Proof of Work),工作量证明机制。我们最直观的理解就是,一份证明,这个证明确认你做了一定的工作量,类似于现代生活中一些检测考试,通过检测考试你就取得了一份证明,只不过这个证明是一个工作量的证明。 
工作量证明一开始是以工作量证明系统提出,这个概念来自Cynthia Dwork 和Moni Naor 1993年在学术论文中,是一种拒绝服务攻击和滥用服务的对策,要求发起者需要消耗一定量的计算机资源来进行计算。那么POW这个词汇在1999年 Markus Jakobsson 和Ari Juels的文章中正式提出。 
提到工作量证明,一般都会说到hash现金,亚当·贝克(Adam Back)在1997年发明的,用于抵抗邮件的拒绝服务攻击及垃圾邮件网关滥用。在比特币之前,哈希现金被用于垃圾邮件的过滤。哈希现金也被哈尔·芬尼以可重复使用的工作量证明(RPOW)的形式用于一种比特币之前的加密货币实验中。另外,戴伟的B-money、尼克·萨博的比特金(Bit-Gold)这些比特币的先行者,都是在哈希现金的框架下进行挖矿的。

工作证明原理 

首先工作量证明需要客户端做一个有难度的工作且得出一个结果,这个结果公布后,验证的一方需要很快能进行验证。这是不对等的。比如我们在一个字符串后加一个随机数(nonce),对这个字符串进行SHA256计算,然后得到的结果用16进制来表示,我们要求这个计算后的16进制表示的初始几位为:0000,那么才能算通过了验证。这种规则就需要计算机去不断的尝试,当然你可以记得其中一些,但是这个概率毕竟是很小的。正常情况下需要不断的输出计算尝试,直到出现正确的要求结果。 
数学期望值,计算过程中会统计实际的计算次数,平均后得到的计算的次数,这个数学期望就是要求的“工作量”,当然这是一个符合数学统计学中的概率事件。

bitcoin中的POW共识机制 

bitcoin的出现让人们开始了解到POW共识机制,在bitcoin中,把挖矿生成一个新的区块并把交易数据写入区块看做是一道 工作量证明的数学难题,那么这道题目中有四个重点: 
1.工作量证明函数:bitcoin中使用的就是SHA256算法,这个算法是输出256位的hash函数(本文不对hash函数和SHA265函数做具体说明)。目前还未出现针对SHA256算法的有效攻击方法,当然通过算法算法漏洞攻击这里不展开讨论。 
2.区块头:bitcoin中的一个区块由区块头和区块中包含的交易列表组成(大小为1M),这里简述下区块头的组成:

  • 区块头大小为80字节。
  • 4字节的版本号。
  • 32字节的上一个区块的散列值。
  • 32字节的Merkle Root Hash,体现区块头和区块中的交易的关系,区块中包含的交易列表,通过Merkle Tree算法生成Merkle Root Hash。
  • 4字节的当前的难度值。
  • 4字节的随机数(nonce)。

3.难度值:difficulty,这是一个指标,不恒定。它最为关键的作用就是决定了bitcoin网络中,矿工需要经过多少次hash运算才能获得记账权生成区块,进而获得区块奖励(12.5bitcoin)。bitcoin中区块产生的平均速率是10分钟一个,每经过2016个区块后,节点按照公式:新难度值 = 旧难度值 * ( 过去2016个区块花费时长 / 20160 分钟 )调整难度值。控制区块的平均产生时间,如果产生区块速率比10分钟快,那么增加难度值,比10分钟慢就降低难度。

4.目标值:target,目标值公式:目标值 = 最大目标值 / 难度值 

最大目标值是一个恒定值: 
0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF。目标值的大小和难度值是一个反比的关系。在bitcoin中矿工计算出来的区块的hash值必须小于这个目标值。换个说法方便理解:工作量证明过程中不断尝试变换nonce进行SHA256的计算,那么尝试的目的是为了找到一个指定前面有一定数量000的值,这个时候前面要求的0越多,那么表示你的难度越大。 
(为什么0越多难度越大?你尝试下用不断扔一对骰子以得到小于一个特定点数的游戏。第一局,目标是12。只要你不扔出两个6, 你就会赢。然后下一局目标为11。玩家只能扔10或更小的点数才能赢,假如目标降低为了2,那就难度可想而知。)

工作量证明过程 

整个工作量证明过程其实不复杂。

  • 生成币基交易coinbase。
  • 打包交易,组成一个交易列表。
  • 通过Merkle Tree算法生成Merkle Root Hash。
  • 组装区块头。
  • 区块头作为工作量证明的输入,不断变换nonce值,通过公式:SHA256(SHA256(Block_Header))双重SHA256计算。结果不断和当前网络的目标值进行比对,一旦发现小于了目标值(target),那么工作量证明完成。
  • 广播区块到网络中,网络中节点验证。
  • 验证后等待后续区块生成确认(一般6个)。

大致介绍了POW共识机制。

你可能感兴趣的文章
最近几天搭建MySql且连接问题总结
查看>>
搭建Tomcat
查看>>
在MyEclipse中运行tomcat出现Error initializing endpoint错误
查看>>
JSP文件中的上传功能(JSP中的相对路径)------JSP
查看>>
jsp中上传文件的源代码
查看>>
使用SQL语句查询表中重复记录并删除
查看>>
将xml中的数据导入到数据库
查看>>
Qt容器测试
查看>>
自定义插件
查看>>
编译数据库ODBC
查看>>
无法解析的外部符号的 3 种可能
查看>>
webalizer流量分析软件windows下的配置与使用
查看>>
Java的数组(Array)、Vector、ArrayList、HashMap的异同
查看>>
Apache的使用方法
查看>>
PHP环境配置:Apach+Tomcat+mysql+php
查看>>
深入理解Glibc堆的实现(上)
查看>>
C&C远控工具:Ares
查看>>
窃密团伙瞄准企业机密信息,备用病毒超60个
查看>>
勒索软件的“中流砥柱”:深入分析GandCrab新型Evasive感染链
查看>>
FIN7 2.0归来:“借尸还魂”的可疑组织们
查看>>