1. 啥是分布式系统

当我们评价一个新的事物或者介绍一个新的技术的时候,我们不能架空历史和环境,新的事物不可能脱离历史和环境凭空诞生。任何新的事物和新的技术总是或多或少的,与旧的事件以及过去的技术有所关联,或是他们的衍生品。所以我们谈到区块链共识的时候,就需要从计算机专业中的分布式系统来讲起,因为区块链说来说去,它也只是分布式系统中的一类而已。

分布式系统在计算机领域中定义为:组件分布在联网的计算机上,组件通过传递消息进行通信和动作协调的系统。这里的组件可以粗略的认为就是一个软件,或者某个软件的可独立运行的一部分。这里面隐含的说明了分布式系统的三个特征:组件的并发行,缺乏全局时钟、组件故障的独立性。我们区块链既然是一种分布式系统,这三个特征也都是存在的。我们经常说区块链的系统中没有一个同一的时间,区块链应用无法获得一个当前的时间,这就是分布式系统的特征之一,缺乏全局时钟。

分布式系统几乎无所不在,从信息领域来说,Google的服务器集群,我们当今的互联网和移动互联网,大型的多人在线游戏,银行的金融交易系统以及我们的区块链系统等等,无一例外都是分布式系统,现在还能找到不处于某个分布式系统的计算机么?很少!而我们身边的生活场景中,也是存在很多的分布式系统,跨地理区域的全国投票选举,地理分布的多个朋友协商聚会,一个蚁群中多个蚂蚁相互通知食物的位置等等。

2. 啥是分布式系统的共识

分布式系统对外可以提供统一的服务。在这里,如果想让分散在不同计算机的组件协调起来,我们需要有一个机制能够协调这些组件,我们把这个机制叫做分布式系统的共识,区块链的共识是我们分布式系统共识的一种。

3. 关于分布式系统的分类

分布式系统中的概念非常多,在这里面我们介绍和区块链共识相关的两组概念。第一组概念是同步和异步,我们可以把分布式系统按照同步和异步分成两类。对于同步的分布式系统,我们描述为处于分布式系统的不同计算机之间通信,消息不丢失而且秒到,也就是说通信即快而可靠。而异步的分布式系统是通信不可靠,分布式系统中的不同计算机之间相互发送消息,消息有延迟而且也可能丢失。我们可以认为我们的内部局域网是一个同步系统,大的互联网是一个异步系统,前者通信无延迟且可靠,后者通信慢而且消息可能丢失。

第二组和区块链共识相关的分布式系统概念是拜占庭容错(BFT,Byzantine Fault Tolerant),即可以容忍拜占庭错误(BF, Byzantine Fault)的分布式系统共识(即使存在拜占庭错误,分布式系统还可以正常工作),所谓的拜占庭错误,即分布式系统中的计算机(节点)不但有可能产生故障还有可能产生错误。这里故障只是不响应或者停机,而错误是指计算机(节点)有可能发送错误的消息。我们也可以理解为两军对战,其中一方出现了叛徒,出现叛徒的一方的问题就定义为拜占庭错误。所以我们可以从这个角度把分布式系统来分为:拜占庭容错的分布式系统和非拜占庭容错的分布式系统。

我们从上面的两组概念中可以把分布式系统划分为以下四类:

分布式系统类型 同步 异步
拜占庭容错 同步拜占庭容错 异步拜占庭容错
非拜占庭容错 同步的非拜占庭容错 异步的非拜占庭容错

4. 回到正题:区块链共识

如果我们想按照上面的分布式系统分类来划分区块链的话,我们可以把区块链简单的划分为一种异步的拜占庭容错的分布式系统。为什么是拜占庭容错的分布式系统,是因为区块链中是假设参与的计算机或者节点是有坏人的,它们会发错误消息和假消息,所以区块链中是存在拜占庭错误的,可以推出区块链是一个拜占庭容错的分布式系统。当然由于区块链是分布在我们的互联网上,按照上面的定义我们认为互联网是一个异步分布式系统,所以区块链也是一个异步分布式系统。

5. 题外话:关于异步分布式系统的共识

关于异步式分布式系统的共识,有这样一个基础的结论,FLP不可能原理。是在1985年由Fischer, Lynch 和 Patterson三位计算机科学家,提出了一个FLP不可能原理:“在网络可靠的前提下,任意节点失效,一个或者多个的最小化异步模型系统中,不可能存在一个解决一致性问题的确定性算法。即如果存在任意节点失效的情况下,就无法完全保证分布式系统可以达到同步”。我们可以理解为认为完全异步的分布式系统是无法达到共识的。所以我们区块链的共识机制或多或少的对异步式分布式系统加了一些限制条件,比如pBFT共识算法,它假设节点之间消息节点有延迟,但是在有限时间内是可以达到的。所以我们区块链为了达到共识,也是有一点限制条件的异步分布式系统。

老K漫谈区块链的共识(3)——分布式系统和区块链共识的更多相关文章

  1. 老K漫谈区块链的共识(1)——免信任的共识机制

    老k,柏链道捷CTO.清华阿尔山区块链研究中心高级工程师,超过17年的系统软件开发经验,在操作系统.编译器.虚拟机和符号执行方面都有实战经验.主持开发多个开眼项目,目前主要从事区块链底层系统开发工作. ...

  2. 再次记录老K站点的工作策略

    股市开盘了. 据说今天是多空决战的日子. 7月17日.三大期指交割. 打开大盘,看着指数一会上升,一会跳水.好不欢乐.当然,今天我是来记录我的老K,关于老K的下一步. 近期每天傍晚的时候.都会去江边散 ...

  3. 比原链CTO James | Go语言成为区块链主流开发语言的四点理由

    11月24日,比原链CTO James参加了Go中国举办的Gopher Meetup杭州站活动,与来自阿里.网易的技术专家带来Kubernetes.区块链.日志采集.云原生等话题的分享.James向大 ...

  4. 区块链--Ubuntu上搭建以太坊私有链

    1.搭建私链所需环境 操作系统:ubuntu16.04,开虚拟机的话要至少4G,否则会影响测试挖矿时的速度 软件: geth客户端 Mist和Ethereum Wallet:https://githu ...

  5. 启迪链网通证经济共同体:柏链教育&火聘online推出区块链行业人才“一门式”服务

    近日,启迪链网通证经济共同体旗下两个节点成员柏链教育与火聘online,达成节点间的合作,据悉本次合作是采用共同体的生态共建模式,柏链教育与火聘online共享企业端岗位需求的大数据,然后有针对性的开 ...

  6. CN109241772A发票区块链记录方法、装置、区块链网关服务器和介质(腾讯)

    学习笔记-2 CN109241772A发票区块链记录方法.装置.区块链网关服务器和介质(腾讯) 解决什么问题? 让发票信息记录到区块链的情况下减少发票信息泄露 链上有什么数据? 发行发票事件信息(发票 ...

  7. 小甲鱼PE详解之区块表(节表)和区块(节)续(PE详解05)

    这一讲我们结合实例来谈谈区块表的定义以及各个属性的含义. 首先,我们先用之前学过的一点知识在二进制文件中手动翻找区块表,这样做的好处是可以使你很快的对PE结构牢记于心.学来的东西就是能用的东西,不能用 ...

  8. 【树链剖分】洛谷P3379 树链剖分求LCA

    题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每 ...

  9. 区块链中的密码学(-)区块链中运用最广的散列算法-SHA256算法分析与实现

    在很多技术人员的眼中,区块链并不是一种新的技术,而是过去很多年计算机技术的组合运用.而在这个方方面面技术的运用上,基于密码学的加密算法可以说是区块链各种特点得以表现的根本,一旦目前使用的加密算法被证实 ...

随机推荐

  1. Long类型时间如何转换成视频时长?

    数据库中存放的视频时长是一个Long类型的毫秒/秒时间,现在需要把这个时间转换成标准的视频时长格式,在我看来这应该是一个很常用的转化有一个很常用的转换方法工具才对,可是我百度找了许久,没有一个简单直观 ...

  2. 面向连接的TCP概述

    TCP连接概述     TCP是因特网运输层面向连接的(connection-oriented)可靠运输协议.之所以说它是面向连接的是因为  一个应用进程向另外一个应用进程发送数据之前,两个进程必须先 ...

  3. 【Go】slice的一些使用技巧

    原文链接:https://blog.thinkeridea.com/201901/go/slice_de_yi_xie_shi_yong_ji_qiao.html slice 是 Go 语言十分重要的 ...

  4. TensorFlow的图切割模块——Graph Partitioner

    背景 [作者:DeepLearningStack,阿里巴巴算法工程师,开源TensorFlow Contributor] 在经过TensorFlow的Placer策略模块调整之后,下一步就是根据Pla ...

  5. 详细分析MySQL的日志(一)

    官方手册:https://dev.mysql.com/doc/refman/5.7/en/server-logs.html 不管是哪个数据库产品,一定会有日志文件.在MariaDB/MySQL中,主要 ...

  6. java 8 双冒号运算符

    前言 java8增加了双冒号运算符.lambda本质上都是语法糖,学习过C#委托.匿名委托再理解java8中的双冒号运算符就容易多了.双冒号就是把方法当作参数传递给需要的方法,或者说是传递到strea ...

  7. YTKNetwork网络封装

    本篇是答应在端午写iOS网络-四篇源码解析以及封装的最后一篇,是针对上一篇YTKNetwork源码解析后的一次封装,也是自己实际项目中所使用过的.在对YTKNetwork封装的时候,还是需要对YTKN ...

  8. 适用于WebApi的SQL注入过滤器

    开发工具:Visual Studio 2017 C#版本:C#7.1 最有效的防止SQL注入的方式是调用数据库时使用参数化查询. 但是如果是接手一个旧的WebApi项目,不想改繁多的数据库访问层的代码 ...

  9. [转]RPA简介

    本文转自:https://www.cnblogs.com/wendyzheng/articles/9211530.html 开篇: 公司正在全面推广RPA,正好借此机会学习一下,发现国内对RPA的了解 ...

  10. echarts地图 禁止高亮显示(转载)

    转载来源: https://blog.csdn.net/john1337/article/details/54666759 案例一:在实际应用中希望(没有数据的省会)禁止高亮颜色,解决方案: mapC ...