如何在 5 分钟内读懂区块链的架构思维?

作为入门者,如何在最短的时间了解区块链技术,区块链思维,以及比特币的金融原理呢?本文尝试从比特币的架构设计思维出发,让人从宏观上搞清楚区块链的技术本质。


640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

本文授权转载自阿里技术


作者 | 郑吉



块链不是一种技术实现,而是一个系统的架构设计,使用一系列的技术组合用于完成去中心化的数据存储。比特币在区块链之上融入了金融学,货币学,博弈学,甚至一定程度的哲学思想,用于电子货币的发行,运行和交易。在学习区块链之前有一些基础知识需要提前掌握好,后面将不再对具体技术展开描述,而是从这个技术解决了什么问题,为什么要用这个技术这个角度去描述。


  • P2P

  • 不可逆算法

  • 不对称加密算法

  • Merkle树

  • CAP理论

  • 最终一致性算法



比特币要做什么?


如果你是一个架构师,做一个系统的架构,你首先要搞清楚这个系统要做什么?要解决一个什么问题?带着这个问题进行分析,设计系统整体的架构。对于比特币也一样,首先搞清楚比特币是要做什么,要解决什么问题?然后带着这些问题去解析比特币的技术实现。


如果用一句话来描述比特币要做什么,那么可以这样描述:做一个去中心化电子货币发行交易系统。这里有三个关键词:

1. 去中心化
2. 电子货币发行
3. 电子货币交易



分析和设计


本章针对上述比特币的三个关键词,去中心化,电子货币发行,货币交易,进行分析和设计。


去中心化


当今世界的所有货币交易都是有一个第三方可信任的金融机构提供服务处理,任何人不能访问由这个第三方机构中心化存储的数据,理论上来说如果这个金融机构发生了欺诈或倒闭,那么存储在这个机构中的货币,以及所做的交易就会存在风险。 当然比特币的去中心化,不是因为担心这种风险,而是根本就不需要这个第三方机构了。这也是区块链的强大颠覆性之一,凡是需要某个第三方可信任的机构需要安全保存处理的数据,都可以去中心化安全存储,所有人都可以访问。


从技术角度分析,如何做到去中心化?


中心化对应的就是分布式,去中心化就是分布式。把原先存储在某个第三方机构,中心化存储的数据,进行分布式存储。



分布式存储要解决的3个基本问题


1. 网络结构
2. 数据不可篡改性
3. 最终一致性


网络结构


去中心化的分布式存储是指整个发行的电子货币,以及货币交易数据由不同机构,不通个人的成千上万的计算机共同存储,共同维护了同一份相同的数据,只有共同维护的这份相同的数据才是认为最终正确的数据,任何个人篡改自己的数据都没有意义,并且存储的数据所有人都可访问。


如果做为架构师,你会选择什么样的网络结构去实现这个分布式存储?一种方式是可采用类似Hadoop中HDFS的方式,由某个中心节点NameNode进行协调访问,但这种方式就会带来单点风险,破坏了中心节点,整个体系都将不可访问。或者采用Cassandra无中心化投票机制维护整个集群状态,但是这种方式在全球化开放式部署中会导致根本无法收敛。


所以比特币采用了一种更加简单直接的方式,利用P2P协议维护整个比特币网络集群,不需要某个中心节点协调节点之间的通信,不需要所有机器投票维护集群状态。而是通过P2P协议进行节点之间的数据传输,任何节点都可以随时加入或者离开比特币网络集群,而不会对比特币网络集群产生影响,也不需要特意去修复这个集群中的故障机器。


利用P2P协议进行节点之间数据传输主要有两个功能点


a. 把需要存储的数据广播到所有节点上进行储存。
b. 查询整个网络集群中所有节点的最新数据,如果自己节点的数据与大部分节点的数据不一致,则更新自身的数据与大部分节点存储的数据一致。

比特币是去中心化存储,最大的风险是整个比特币网络集群被破坏,篡改了整个网络存储的数据。但是上述第二个功能点能够有效的防止这种风险,由于系统会自动更新为整个集群中大部分节点存储的相同数据,所以要篡改数据,必须要同时篡改整个网络一半以上的数据,这不是说做不到,但是比特币利用区块链的方式再加上利益博弈机制,当你拥有这种能力的时候,也不需要去做篡改这种投入产出比这么低的事了,在数据不可篡改性一节中再详细描述。


通过图示看一下比特币网络结构的运行:



640?wx_fmt=png



Jack把某一笔交易数据往A服务器上提交,A服务器验证数据合法性后存储到自身的数据库中,同时把这笔交易数据点对点的传输到比特币网络集群的所有B,C,D,E节点上。A和所有其它的B,C,D,E节点保持点对点通信,自动更新为这个集群中大多数节点维护的相同的数据。如果B,C,D三台服务器保存的数据相同,但是与A,E不一致,则A和E自动更新为与B,C,D相同的数据。所以Jack的这笔交易,需要等待这个比特币网络集群中所有节点都接受到,并且认为合法存储后,才认为这笔交易成功完成。当然在现实情况下,不需要等待所有节点都确认完成,通常只需要少数服务器确认完成后即可认为交易完成,因为每个服务器维护的自身与整个网络集群的数据状态,当少量服务器都认为与整个集群一致时,此时从概率上就是一致的。在最终一致性一节中将继续对这种网络结构下的数据存储进行描述。


数据不可篡改性


在设计了比特币系统运行的网络结构之后,需要考虑数据的不可篡改性,因为这种数据存储是去中心化的,任何人都可以访问,那么就容易被篡改,上节描述了在这种网络结构的运行机制下,要篡改数据,必须同时更改这个网络集群上一半以上的节点数据,如果每个节点没有一个安全的保护机制的话,那是很容易做到被同时修改网络集群中一半以上节点的数据。


先想想,如果你是架构师,你会如何设计这个保护机制,确保存储的数据无法被篡改?在传统上,我们把交易数据一条记录一条记录的保存在数据库表中,数据库放在某个第三方机构的服务器上,这个第三方机构给服务器所处的网络,服务器,数据库设置了严格的访问限制用于数据的安全性。但是在一个去中心化,没有一个机构或者一个人可以控制系统的访问权限的情况下,如何去保护数据的安全性?


一种方式是每个人把自己的插入的这条数据hash后用自己的密钥进行签名,然后附带上自己的公钥,系统可以用签名和公钥验证插入的数据是否被修改过。如果把数据库表比喻为一本帐本,表中的每一条数据就认为是账本中记录的每一笔交易。这里还有两个问题,第一,不能随意插入数据,如果你没有比特币,但还是插入一条转帐给某人的数据,系统需要发现是不合法的,拒绝此次插入请求。第二,除了不能随意插入和修改外,也需要防止删除数据,上述把每条记录进行签名并不能阻止被恶意删除。带着这些问题,如果你是架构师,你会做什么样的架构设计实现这些需求?


这里就开始要引出区块链的设计了。上面把数据库表比喻为一本帐本,如果系统中只有一张表,也就是一本帐本,那么这本帐本中的数据很容被更改。如果让系统每10分钟自动生成一张表,也就是生成一本新帐本,新的交易记录都记录在新帐本中。 并且创建这个新帐本需要一定的条件,用当前帐本的顺序号,上一个帐本的所有记录的hash值,系统时间戳(10分钟一个维度),再找一个随机值,几个数据加在一起Hash后满足一定的条件,比如开始多少位都是0,那么系统就接收这个新帐本。产生的新帐本通过帐本顺序号串在上个帐本之后,形成一个帐本的链式结构,新的帐本依赖于上一个帐本的数据和当前系统时间戳,因此一旦新帐本产生后,历史帐本的数据就无法被篡改,因为一旦篡改,就与之后的帐本对不上,帐本被破坏,按照上节网络结构中描述的自动更新为网络集群中大部分节点维护的相同的帐本。



640?wx_fmt=png



一旦形成了链式帐本后就无法去更改某个历史帐本中的数据,更改了某个历史帐本,那么在它之后的所有帐本都需要更改,但是每个帐本都是根据当前的系统时间戳验证hash值是否满足条件才能接收,所以无法去篡改历史帐本的数据。所能做的只能另外投入非常大的代价再构建一个比特币集群,这个集群超过当前的集群,那么数据就自动按照新构建的集群为准。这就是多个帐本的相互保护机制比单个帐本更难以被篡改。后续货币的发行和交易中再会描述,当你有能力重新构建一个新的比特币网络集群用于去攻击篡改数据时,你获得的收益将远远低于你投入的成本。


为了防止上个帐本的数据被篡改,产生新的帐本需要依赖于上一个帐本中的所有交易记录的hash值,这样一旦上个帐本的数据发生变化就与新帐本对应不上。但是帐本中所有交易记录计算hash值是一件耗时的计算,因此比特币采用了merkle树对某个帐本中的所有交易记录进行hash计算。它主要是解决帐本中交易记录hash计算的效率问题。如下图HA,HB...HP是具体的交易记录,每相临的两条交易记录向上形成一个Hash值,再与相邻的节点再往上形成hash值,一直到树根形成所有交易记录的唯一hash值。



640?wx_fmt=png



之前描述的网络结构和本节描述的帐本链式结构,本质上都是用于解决去中心化的数据安全存储。


最终一致性


是分布式存储就绕不开CAP理论,比特币也一样,比特币采用P2P协议进行节点之间的数据传输,放弃了CAP中的Consistency,采用了AP两个维度。如果放弃了Consistency这个属性,那么就产生了拜占庭将军问题,这么多节点如何达成数据一致性。拜占庭军队都是一个个小分队组成,每个小分队都有一个将军负责,将军们通过号令兵传达一系列行动,但是当中出现一些叛将,故意破坏号令怎么办?


分布式存储系统和拜占庭将军问题一样,做到一致性是很难的,在比特币开放式的全球化部署的系统集群更是如此。所以比特币放弃了强一致性,并且通过P2P点对点通信,没有中心节点,整个集群中的服务器故障,离开,加入集群都不会对整个集群产生影响。


上节中描述了帐本的产生基本机制,用当前帐本的顺序号,上一个帐本的所有记录的hash值,系统时间戳(10分钟一个维度),再找一个随机值,几个数据加在一起Hash后满足一定的条件,比如开始多少位都是0,那么系统就接收这个新帐本,这就是这个集群中所有节点的共识,所有节点只接收这样的帐本,而寻找这个随机值是需要庞大的计算能力。在比特币中称它为Proof-of-Work(POW)挖矿。


当每隔10分钟找到这个值,就是生成了新的帐本。但网络集群都是开放的,可能同时找到了两个值,在集群中少部分节点中产生了2个帐本,针对这种情况比特币系统设计为:整个网络集群采用少数服从多数原则,集群中大部分采用了哪个帐本,少数节点服从多数节点,丢弃没被大多数采用的帐本,达到最终一致性。


电子货币发行


上一章节去中心化中,主要描述了一个去中心化系统,如何做到安全的数据存储,不被篡改。它主要采用了P2P网络结构+区块链式结构解决了数据的安全存储。但是对于一个货币,还需要解决一个货币的发行,如何发行,发行给谁?如何让比特币系统能够让所有的人自发的运行下去?货币的发行需要公平,公开,公正,而且货币不能发行到某个第三方机构中,任何人只要符合一定的条件就能获取发行的货币。想一想,如果你是架构师,你会如何设计系统去发行货币?


本质上讲,比特币系统自身就可以寻找一个随机值,产生新的帐本。但是比特币把发行货币和寻找新帐本背后的计算力结合在一起。寻找新帐本需要消耗计算力,谁找到了符合新帐本条件的随机值,代表了他消耗了大量的计算力,新帐本一旦被系统接收,那么系统自动在该新帐本中记录一条转帐给他一定个数比特币的纪录,就完成了货币的发行。


比特币的运行必须依赖于新帐本的产生,而谁找到新帐本,谁就能获得系统自动生成的转帐纪录,也就是获得了一定数量的比特币,这就是挖矿。这也就激励了人们不断的投入到挖矿中,不断的挖出新帐本,通过激励维持着比特币系统的运行。


这里体现设计天才的地方是,比特币融入了金融学,货币学,博弈学,通过系统形成了一定的运行机制,激励着人们让这个系统能够自发的运行下去。


电子货币交易


上节电子货币发行一节中描述了,谁通过算力找到了新的帐本,系统就会自动记一笔账,转一定数量的比特币给谁,他也就获得了比特币。那么如何确认记录的这笔交易是属于你的,而不被别人拿走呢?做为架构师的你如何解决这个问题?


比特币采用了非对称加密技术对用户的帐户操作,公钥就是用户的帐户号码,谁找到了新帐本,系统自动往新帐本发现者的公钥帐户,记一条特定数量比特币的纪录。当用户要消费比特币时,需要用私钥进行签名,系统会用帐户号码也就是公钥验证签名是否正确,并且根据用户的帐户号码从历史的交易中计算出当前帐户中的真实金额,确保用户操作的资金在帐户真实金额之内。这里的设计有两个要点


  1. 插入的每一条纪录都需要用私钥签名,系统用帐户号码也就是公钥进行验证签名是否正确,验证正确则认为合法。

  2. 如果满足第一个条件,则验证插入的纪录中转帐金额是否正确,验证的方式是对该公钥以往的所有交易纪录进行计算得出该帐户当前的金额,如果不超过该金额值则为合法。图示如下:



640?wx_fmt=png



这种机制能够保证只能对自己的帐户进行操作,再结合P2P网络结构下的最终一致性原则,以及帐本的链式结构,一个攻击者需要建立超过目前比特币网络集群,并且算力超过目前的集群下才能创建另外一个帐本分之,而且也只能更改自己的帐户,所以这种攻击投入和产出的收益极低,而对于比特币系统来说,你构建了庞大的集群以及强大的算力,即使攻击成功了,获得了一部分的收益,反过来却让比特币系统更加的稳健了。



区块链的应用


比特币系统解决了去中心化的安全存储问题,解决了货币的发行问题,解决了货币交易的帐户安全问题后,就构建了一个当前的比特币电子虚拟货币系统了。而比特币使用的区块链被认为是一个颠覆性的技术,革命性的技术,那他的颠覆性体现在什么地方呢?它不是技术上面的颠覆,主要是在思想层面上的,商业运作模式层面上的革命性。就比如一个国家从集权式的到民主式的转变,对这个国家和社会就是一个革命性的变化。而区块链技术带来两个基本功能:


1. 去中心化的数据存储
2. 保证帐户的安全性


理论上让原先需要通过某个第三方机构提供的数据服务,都可以革命性更改为去中心化的方式提供服务,比如比特币可以替代各个国家的法币使用。区块链这种特性也会衍生出各行各业的商业模式颠覆性的变化。



原文发布时间为:2018年03月19日
本文作者:区块链大本营
本文来源:CSDN,如需转载请联系原作者。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/538904.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

arduino 上传项目出错_Arduino多核编程:简单例子

不管你是Arduino领域的新手还是经验丰富的开发人员,很可能你还只使用过单核在进行编程。 这没有什么好笑的---- 事实上,直到几天前我才使用Arduino IDE进行了第一次多核编程。 我和所有其他Arduino粉丝都非常喜欢IDE的易用性以及MicroController 开发所需…

Hadoop-RPC应用demo

Hadoop里的rpc框架可以单独拿出来使用。jar包全在hadoop-common工程里。 导入hadoop-common工程里(hadoop-2.7.3为例): hadoop-common-2.7.3.jar \hadoop-2.7.3\share\hadoop\common\lib下的全部jar包 实例 rpc.client 客户端 rpc.pr…

宝塔面板服务器ip地址修改_「网站」快速搭建服务器环境及网站

目录:「NAS」我的搭建NAS全过程在文章开头我想说明的是,此文章中所使用的工具为 BT 面板即宝塔面板,适合小白使用但是对于想要提升个人能力来说, BT 面板并不是一个好选择,而作为新手来说,可以使用该面板进…

杨辉三角python_Python面试150题汇总,都是常问的面试题!

周末,Python面试题每日一题暂停更新,下面把最近整理的1-50篇Python面试文整理一下,平时文章都放在比较末尾,阅读量都不高,相信很多人都没看过,如果对于Python感兴趣的,建议可以认真阅读一下&…

java.lang.RuntimeException: Error receiving broadcast Intent { act=android.net.wifi.SCAN_RESULTS flg

E/AndroidRuntime: FATAL EXCEPTION: main Process: com.nokia.wlanapp, PID: 18526java.lang.RuntimeException: Error receiving broadcast Intent { actandroid.net.wifi.SCAN_RESULTS flg0x4000010 (has extras【外部】) } in com.nokia.wlanapp.Receive…

php处理上传文件的步骤,php文件上传步骤

我们在开发网站的时候,经常会遇到需要制作文件上传功能,下面我们就为大家介绍一下php制作文件上传功能的详细步骤。推荐教程:PHP视频教程第一步:创建一个文件上传表单允许用户从表单上传文件是非常有用的。请看下面这个供上传文件…

matlab求傅里叶级数展开式_傅里叶级数:从向量的角度看函数

帮助你理解线性代数与机器学习紧密结合的核心内容下文节选自北大出版社《机器学习线性代数基础》, [遇见]已获授权许可. 这本书不同于传统教材, 从新的角度来介绍线性代数的核心知识, 讲解也很棒, 又刚好参加参加了当当每满100-50的活动, 感兴趣的朋友可以关注下. 傅里叶级数&a…

c++实现超声回波包络检测_超声波物位计的选用

超声波物位计超声波在气体、液体和固体介质中以一定速度传播时因被吸收而衰减,但衰减程度不同,在气体中衰减最大,而在固体中衰减最小;当超声波穿越两种不同介质构成的分界面时会产生反射和折射,且当这两种介质的声阻抗…

Android应用开发:CardView的使用及兼容

原文:http://blog.csdn.net/airk000/article/details/39520977 点击阅读原文 --------------------------------------------------------------- 引言 在Google I/O 2014上,Google公布了Android L Preview版本,此版本的UI有了非常大的改变…

云海技术u盘怎么恢复成普通盘_BITLOCKER加密中断数据无法读取恢复一例

同行求助此问题,密码客户是知道的,输入密码后提示如图:如果点击RESUME则提示如下:无视提示关闭提示框后再次提示分区需要格式化:PC3000 DE中可以添加虚拟驱动器解析BITLOCKER加密的分区,但该例添加虚拟驱动…

git 未能顺利结束(退出码1)

按照这个博客上安装完小乌龟git后:https://blog.csdn.net/jdsjlzx/article/details/51098588win10下安装完乌龟git后无法上传文件进行文件上传时出现错误如下:git 未能顺利结束(退出码1)(922ms2018/4/17 22&#xff1a…

交际过程的两个基本环节_男女相处,若不介意这些“小动作”,基本可以确定“关系暧昧”...

当你对我说再见的时候,我看到你的笑容里有祝福,眼神里却有遗憾……——南明夫人爱情中最美好幸福的事,莫过于你深爱的人,恰好也钟情于你。这种两情相悦的爱情总是如此难得,让人心生羡慕。这份甜蜜与美好,让…

Android之NetworkOnMainThreadException异常

原文链接:http://blog.csdn.net/mad1989/article/details/25964495 点击阅读原文 ------------------------------------------------------------------ 看名字就应该知道,是网络请求在MainThread中产生的异常 先来看一下官网的解释: Cl…

中国信通院金融科技负责人韩涵:大数据是生产资料的变革,区块链是生产关系的变革...

在近日召开的“2018中国金融科技产业峰会”上,中国信息通信研究院主任工程师、金融科技负责人韩涵正式发布了《中国金融科技前沿技术发展趋势及应用场景研究报告》,详细讲解了A(人工智能)B(区块链)C&#x…

java简单纸牌游戏_活动回顾 | 畅玩法语纸牌游戏

11月17日下午,20级小伙伴们迎来了第二次法语角活动!这次外教Anne-Flore Vrac 老师为同学们安排了丰富有趣的法语纸牌游戏,快来一起回顾活动的精彩瞬间吧!集体游戏一:从1到30老师首先带领同学们进行了“从1到30”的小游…

人脸识别门禁_小区人脸识别门禁或取代传统门禁刷卡方式

可以说,社区是一个人口聚集的小型社会。首先社区的人流量很大,进出是十分频繁。其次,社区的大门以及各处进出口是业主与访客、外来人员等进进出出最关键的通道。因此,每个社区都会有一套成型的门禁系统,常见的是使用门…

元类编程--property动态属性

from datetime import date, datetime class User:def __init__(self, name, birthday):self.name nameself.birthday birthdayself._age 0# def get_age(self):# return datetime.now().year - self.birthday.yearproperty #动态属性def age(self): #属性描述符&#x…

vscode运行python文件_vscode怎么运行python文件

1、首先需要确保安装了VScode的Python插件,打开Python脚本,可以直接拖入,点击文件,点击首选项里的用户设置,这时候会用户设置配置文件。2、然后在左边文件CtrlF搜索Python关键字,找到pythonPath所在行3、然…

逻辑回归算法_算法逻辑回归

logistic回归又称logistic回归分析,是一种广义的线性回归分析模型,常用于数据挖掘,疾病自动诊断,经济预测等领域。例如,探讨引发疾病的危险因素,并根据危险因素预测疾病发生的概率等。以胃癌病情分析为例&a…