老K漫谈区块链的共识(3)——分布式系统和区块链共识
1. 啥是分布式系统
当我们评价一个新的事物或者介绍一个新的技术的时候,我们不能架空历史和环境,新的事物不可能脱离历史和环境凭空诞生。任何新的事物和新的技术总是或多或少的,与旧的事件以及过去的技术有所关联,或是他们的衍生品。所以我们谈到区块链共识的时候,就需要从计算机专业中的分布式系统来讲起,因为区块链说来说去,它也只是分布式系统中的一类而已。
分布式系统在计算机领域中定义为:组件分布在联网的计算机上,组件通过传递消息进行通信和动作协调的系统。这里的组件可以粗略的认为就是一个软件,或者某个软件的可独立运行的一部分。这里面隐含的说明了分布式系统的三个特征:组件的并发行,缺乏全局时钟、组件故障的独立性。我们区块链既然是一种分布式系统,这三个特征也都是存在的。我们经常说区块链的系统中没有一个同一的时间,区块链应用无法获得一个当前的时间,这就是分布式系统的特征之一,缺乏全局时钟。
分布式系统几乎无所不在,从信息领域来说,Google的服务器集群,我们当今的互联网和移动互联网,大型的多人在线游戏,银行的金融交易系统以及我们的区块链系统等等,无一例外都是分布式系统,现在还能找到不处于某个分布式系统的计算机么?很少!而我们身边的生活场景中,也是存在很多的分布式系统,跨地理区域的全国投票选举,地理分布的多个朋友协商聚会,一个蚁群中多个蚂蚁相互通知食物的位置等等。
2. 啥是分布式系统的共识
分布式系统对外可以提供统一的服务。在这里,如果想让分散在不同计算机的组件协调起来,我们需要有一个机制能够协调这些组件,我们把这个机制叫做分布式系统的共识,区块链的共识是我们分布式系统共识的一种。
3. 关于分布式系统的分类
分布式系统中的概念非常多,在这里面我们介绍和区块链共识相关的两组概念。第一组概念是同步和异步,我们可以把分布式系统按照同步和异步分成两类。对于同步的分布式系统,我们描述为处于分布式系统的不同计算机之间通信,消息不丢失而且秒到,也就是说通信即快而可靠。而异步的分布式系统是通信不可靠,分布式系统中的不同计算机之间相互发送消息,消息有延迟而且也可能丢失。我们可以认为我们的内部局域网是一个同步系统,大的互联网是一个异步系统,前者通信无延迟且可靠,后者通信慢而且消息可能丢失。
第二组和区块链共识相关的分布式系统概念是拜占庭容错(BFT,Byzantine Fault Tolerant),即可以容忍拜占庭错误(BF, Byzantine Fault)的分布式系统共识(即使存在拜占庭错误,分布式系统还可以正常工作),所谓的拜占庭错误,即分布式系统中的计算机(节点)不但有可能产生故障还有可能产生错误。这里故障只是不响应或者停机,而错误是指计算机(节点)有可能发送错误的消息。我们也可以理解为两军对战,其中一方出现了叛徒,出现叛徒的一方的问题就定义为拜占庭错误。所以我们可以从这个角度把分布式系统来分为:拜占庭容错的分布式系统和非拜占庭容错的分布式系统。
我们从上面的两组概念中可以把分布式系统划分为以下四类:
分布式系统类型 | 同步 | 异步 |
---|---|---|
拜占庭容错 | 同步拜占庭容错 | 异步拜占庭容错 |
非拜占庭容错 | 同步的非拜占庭容错 | 异步的非拜占庭容错 |
4. 回到正题:区块链共识
如果我们想按照上面的分布式系统分类来划分区块链的话,我们可以把区块链简单的划分为一种异步的拜占庭容错的分布式系统。为什么是拜占庭容错的分布式系统,是因为区块链中是假设参与的计算机或者节点是有坏人的,它们会发错误消息和假消息,所以区块链中是存在拜占庭错误的,可以推出区块链是一个拜占庭容错的分布式系统。当然由于区块链是分布在我们的互联网上,按照上面的定义我们认为互联网是一个异步分布式系统,所以区块链也是一个异步分布式系统。
5. 题外话:关于异步分布式系统的共识
关于异步式分布式系统的共识,有这样一个基础的结论,FLP不可能原理。是在1985年由Fischer, Lynch 和 Patterson三位计算机科学家,提出了一个FLP不可能原理:“在网络可靠的前提下,任意节点失效,一个或者多个的最小化异步模型系统中,不可能存在一个解决一致性问题的确定性算法。即如果存在任意节点失效的情况下,就无法完全保证分布式系统可以达到同步”。我们可以理解为认为完全异步的分布式系统是无法达到共识的。所以我们区块链的共识机制或多或少的对异步式分布式系统加了一些限制条件,比如pBFT共识算法,它假设节点之间消息节点有延迟,但是在有限时间内是可以达到的。所以我们区块链为了达到共识,也是有一点限制条件的异步分布式系统。
老K漫谈区块链的共识(3)——分布式系统和区块链共识的更多相关文章
- 老K漫谈区块链的共识(1)——免信任的共识机制
老k,柏链道捷CTO.清华阿尔山区块链研究中心高级工程师,超过17年的系统软件开发经验,在操作系统.编译器.虚拟机和符号执行方面都有实战经验.主持开发多个开眼项目,目前主要从事区块链底层系统开发工作. ...
- 再次记录老K站点的工作策略
股市开盘了. 据说今天是多空决战的日子. 7月17日.三大期指交割. 打开大盘,看着指数一会上升,一会跳水.好不欢乐.当然,今天我是来记录我的老K,关于老K的下一步. 近期每天傍晚的时候.都会去江边散 ...
- 比原链CTO James | Go语言成为区块链主流开发语言的四点理由
11月24日,比原链CTO James参加了Go中国举办的Gopher Meetup杭州站活动,与来自阿里.网易的技术专家带来Kubernetes.区块链.日志采集.云原生等话题的分享.James向大 ...
- 区块链--Ubuntu上搭建以太坊私有链
1.搭建私链所需环境 操作系统:ubuntu16.04,开虚拟机的话要至少4G,否则会影响测试挖矿时的速度 软件: geth客户端 Mist和Ethereum Wallet:https://githu ...
- 启迪链网通证经济共同体:柏链教育&火聘online推出区块链行业人才“一门式”服务
近日,启迪链网通证经济共同体旗下两个节点成员柏链教育与火聘online,达成节点间的合作,据悉本次合作是采用共同体的生态共建模式,柏链教育与火聘online共享企业端岗位需求的大数据,然后有针对性的开 ...
- CN109241772A发票区块链记录方法、装置、区块链网关服务器和介质(腾讯)
学习笔记-2 CN109241772A发票区块链记录方法.装置.区块链网关服务器和介质(腾讯) 解决什么问题? 让发票信息记录到区块链的情况下减少发票信息泄露 链上有什么数据? 发行发票事件信息(发票 ...
- 小甲鱼PE详解之区块表(节表)和区块(节)续(PE详解05)
这一讲我们结合实例来谈谈区块表的定义以及各个属性的含义. 首先,我们先用之前学过的一点知识在二进制文件中手动翻找区块表,这样做的好处是可以使你很快的对PE结构牢记于心.学来的东西就是能用的东西,不能用 ...
- 【树链剖分】洛谷P3379 树链剖分求LCA
题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每 ...
- 区块链中的密码学(-)区块链中运用最广的散列算法-SHA256算法分析与实现
在很多技术人员的眼中,区块链并不是一种新的技术,而是过去很多年计算机技术的组合运用.而在这个方方面面技术的运用上,基于密码学的加密算法可以说是区块链各种特点得以表现的根本,一旦目前使用的加密算法被证实 ...
随机推荐
- centos7安装遇到的坑
1.安装中遇到what is the location of the gcc program on your machine 直接输入 no.意思就是跳过gcc的安装了.但是系统虽然安装了vmware ...
- PXE+kickstart无人值守安装CentOS 7
kickstart+cobbler系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html 本文是PXE+kickstart无人值守安装CentOS ...
- 基于 LWIP 建立 TCP Server 与主机通信实验
LWIP 版本:2.0.3 上一篇文章是写如何将 LWIP 移植到板子上,今天晚上记录基于 LWIP 实现与主机的网络通信. 先是打开了原子的实验例程,大概浏览了一遍,觉得 TCP 网络网络通信也就是 ...
- linux基本命令手册
常用指令 ls 显示文件或目录 -l 列出文件详细信息l(list) -a 列出当前目录下所有文件及目录,包括隐藏的a(all) mkdir ...
- T-SQL:SQL语句处理顺序的坑(四)
首先看下面一条比较完成语句,都是比较常见的关键字. USE Temp; SELECT empid, YEAR(orderdate) AS orderyear, COUNT(*) AS numorder ...
- 为什么需要把页面放在WEB-INF文件夹下面?
1.基于不同的功能 JSP 被放置在不同的目录下 这种方法的问题是这些页面文件容易被偷看到源代码,或被直接调用.某些场合下这可能不是个大问题,可是在特定情形中却可能构成安全隐患.用户可以绕过Strut ...
- 通过DFS求解有向图(邻接表存储)中所有简单回路
前言 查阅了网上许多关于通过DFS算法对有向图中所有简单回路的查找,发现有很多关于使用DFS求解有向回路中所有简单回路的帖子,(在按照节点编号情况下)但大多数仅仅寻找了编号递增的回路.又或者未对结果去 ...
- Hibernate入门(二)——hibernateAPI详解
Hibernate API 详解 1.Configuration 功能:配置加载类,用于加载主配置,orm元数据加载 .创建: Configuration conf = new Configurati ...
- Excel通用类工具(二)
前言 上一篇中写到了用反射来处理类中的不用的属性,但是Excel的列名还得手动输入,这样还是比较麻烦的,今天这篇就利用自定义注解来解决手动传入列名的问题:其实很简单的,只需要在上一篇的基础上加一个类就 ...
- JS经典题目解析
此次列举出一些觉得有意思的JS题目(来源于出了名的44题),相信有非常多关于这些题目的博客,写这篇博客的目的在于巩固一些知识点,希望能和读者共同进步. 1. map函数执行过程 ["1&qu ...