不少童鞋反馈,区块链技术有点绕,有点晦涩,大都是只知其一;不知其二,理解不够通彻。但在阿里技术专家郑吉看来,区块链特别是比特币自己,并无使用高大上复杂的新技术,只是对现有技术的组合。其天才的地方体如今系统的架构上,体如今把金融学,货币学,博弈学,甚至是哲学思想体如今比特币的系统架构上。若是单纯从系统中的技术点着手学习研究,那么每每就会以为有点绕,有点晦涩。这就像咱们在平时工做中了解某个系统,若是首先搞清楚业务自己,了解清楚系统架构的设计,再去看具体的实现技术,从大局到面到点,那么就有豁然开朗的感受。算法 今天,郑吉将试着帮助你们转换视角,从架构的思惟分析去解析比特币,从而对区块链技术有一个更深刻的理解。数据库 准备工做安全 区块链不是一种技术实现,而是一个系统的架构设计,使用一系列的技术组合用于完成去中心化的数据存储。比特币在区块链之上融入了金融学,货币学,博弈学,甚至必定程度的哲学思想,用于电子货币的发行,运行和交易。在学习区块链以前有一些基础知识须要提早掌握好,后面将再也不对具体技术展开描述,而是从这个技术解决了什么问题,为何要用这个技术这个角度去描述。服务器 P2P网络 不可逆算法架构 不对称加密算法分布式 Merkle树oop CAP理论学习 最终一致性算法区块链 比特币要作什么? 若是你是一个架构师,作一个系统的架构,你首先要搞清楚这个系统要作什么?要解决一个什么问题?带着这个问题进行分析,设计系统总体的架构。对于比特币也同样,首先搞清楚比特币是要作什么,要解决什么问题?而后带着这些问题去解析比特币的技术实现。 若是用一句话来描述比特币要作什么,那么能够这样描述:作一个去中心化电子货币发行交易系统。这里有三个关键词: 1. 去中心化 2. 电子货币发行 3. 电子货币交易 分析和设计 本章针对上述比特币的三个关键词,去中心化,电子货币发行,货币交易,进行分析和设计。 去中心化 当今世界的全部货币交易都是有一个第三方可信任的金融机构提供服务处理,任何人不能访问由这个第三方机构中心化存储的数据,理论上来讲若是这个金融机构发生了欺诈或倒闭,那么存储在这个机构中的货币,以及所作的交易就会存在风险。 固然比特币的去中心化,不是由于担忧这种风险,而是根本就不须要这个第三方机构了。这也是区块链的强大颠覆性之一,凡是须要某个第三方可信任的机构须要安全保存处理的数据,均可以去中心化安全存储,全部人均可以访问。 从技术角度分析,如何作到去中心化? 中心化对应的就是分布式,去中心化就是分布式。把原先存储在某个第三方机构,中心化存储的数据,进行分布式存储。 分布式存储要解决的3个基本问题 1. 网络结构 2. 数据不可篡改性 3. 最终一致性 网络结构 去中心化的分布式存储是指整个发行的电子货币,以及货币交易数据由不一样机构,不通我的的成千上万的计算机共同存储,共同维护了同一份相同的数据,只有共同维护的这份相同的数据才是认为最终正确的数据,任何我的篡改本身的数据都没有意义,而且存储的数据全部人均可访问。 若是作为架构师,你会选择什么样的网络结构去实现这个分布式存储?一种方式是可采用相似Hadoop中HDFS的方式,由某个中心节点NameNode进行协调访问,但这种方式就会带来单点风险,破坏了中心节点,整个体系都将不可访问。或者采用Cassandra无中心化投票机制维护整个集群状态,可是这种方式在全球化开放式部署中会致使根本没法收敛。 因此比特币采用了一种更加简单直接的方式,利用P2P协议维护整个比特币网络集群,不须要某个中心节点协调节点之间的通讯,不须要全部机器投票维护集群状态。而是经过P2P协议进行节点之间的数据传输,任何节点均可以随时加入或者离开比特币网络集群,而不会对比特币网络集群产生影响,也不须要特地去修复这个集群中的故障机器。 利用P2P协议进行节点之间数据传输主要有两个功能点: a. 把须要存储的数据广播到全部节点上进行储存。 b. 查询整个网络集群中全部节点的最新数据,若是本身节点的数据与大部分节点的数据不一致,则更新自身的数据与大部分节点存储的数据一致。 比特币是去中心化存储,最大的风险是整个比特币网络集群被破坏,篡改了整个网络存储的数据。可是上述第二个功能点可以有效的防止这种风险,因为系统会自动更新为整个集群中大部分节点存储的相同数据,因此要篡改数据,必需要同时篡改整个网络一半以上的数据,这不是说作不到,可是比特币利用区块链的方式再加上利益博弈机制,当你拥有这种能力的时候,也不须要去作篡改这种投入产出比这么低的事了,在数据不可篡改性一节中再详细描述。 经过图示看一下比特币网络结构的运行:  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,那么系统就接收这个新账本。产生的新账本经过账本顺序号串在上个账本以后,造成一个账本的链式结构,新的账本依赖于上一个账本的数据和当前系统时间戳,所以一旦新账本产生后,历史账本的数据就没法被篡改,由于一旦篡改,就与以后的账本对不上,账本被破坏,按照上节网络结构中描述的自动更新为网络集群中大部分节点维护的相同的账本。  一旦造成了链式账本后就没法去更改某个历史账本中的数据,更改了某个历史账本,那么在它以后的全部账本都须要更改,可是每一个账本都是根据当前的系统时间戳验证hash值是否知足条件才能接收,因此没法去篡改历史账本的数据。所能作的只能另外投入很是大的代价再构建一个比特币集群,这个集群超过当前的集群,那么数据就自动按照新构建的集群为准。这就是多个账本的相互保护机制比单个账本更难以被篡改。后续货币的发行和交易中再会描述,当你有能力从新构建一个新的比特币网络集群用于去攻击篡改数据时,你得到的收益将远远低于你投入的成本。 为了防止上个账本的数据被篡改,产生新的账本须要依赖于上一个账本中的全部交易记录的hash值,这样一旦上个账本的数据发生变化就与新账本对应不上。可是账本中全部交易记录计算hash值是一件耗时的计算,所以比特币采用了merkle树对某个账本中的全部交易记录进行hash计算。它主要是解决账本中交易记录hash计算的效率问题。以下图HA,HB...HP是具体的交易记录,每相临的两条交易记录向上造成一个Hash值,再与相邻的节点再往上造成hash值,一直到树根造成全部交易记录的惟一hash值。  以前描述的网络结构和本节描述的账本链式结构,本质上都是用于解决去中心化的数据安全存储。 最终一致性 是分布式存储就绕不开CAP理论,比特币也同样,比特币采用P2P协议进行节点之间的数据传输,放弃了CAP中的Consistency,采用了AP两个维度。若是放弃了Consistency这个属性,那么就产生了拜占庭将军问题,这么多节点如何达成数据一致性。拜占庭军队都是一个个小分队组成,每一个小分队都有一个将军负责,将军们经过号令兵传达一系列行动,可是当中出现一些叛将,故意破坏号令怎么办? 分布式存储系统和拜占庭将军问题同样,作到一致性是很难的,在比特币开放式的全球化部署的系统集群更是如此。因此比特币放弃了强一致性,而且经过P2P点对点通讯,没有中心节点,整个集群中的服务器故障,离开,加入集群都不会对整个集群产生影响。 上节中描述了账本的产生基本机制,用当前账本的顺序号,上一个账本的全部记录的hash值,系统时间戳(10分钟一个维度),再找一个随机值,几个数据加在一块儿Hash后知足必定的条件,好比开始多少位都是0,那么系统就接收这个新账本,这就是这个集群中全部节点的共识,全部节点只接收这样的账本,而寻找这个随机值是须要庞大的计算能力。在比特币中称它为Proof-of-Work(POW)挖矿。 当每隔10分钟找到这个值,就是生成了新的账本。但网络集群都是开放的,可能同时找到了两个值,在集群中少部分节点中产生了2个账本,针对这种状况比特币系统设计为:整个网络集群采用少数服从多数原则,集群中大部分采用了哪一个账本,少数节点服从多数节点,丢弃没被大多数采用的账本,达到最终一致性。 电子货币发行 上一章节去中心化中,主要描述了一个去中心化系统,如何作到安全的数据存储,不被篡改。它主要采用了P2P网络结构+区块链式结构解决了数据的安全存储。可是对于一个货币,还须要解决一个货币的发行,如何发行,发行给谁?如何让比特币系统可以让全部的人自发的运行下去?货币的发行须要公平,公开,公正,并且货币不能发行到某个第三方机构中,任何人只要符合必定的条件就能获取发行的货币。想想,若是你是架构师,你会如何设计系统去发行货币? 本质上讲,比特币系统自身就能够寻找一个随机值,产生新的账本。可是比特币把发行货币和寻找新账本背后的计算力结合在一块儿。寻找新账本须要消耗计算力,谁找到了符合新账本条件的随机值,表明了他消耗了大量的计算力,新账本一旦被系统接收,那么系统自动在该新账本中记录一条转账给他必定个数比特币的纪录,就完成了货币的发行。 比特币的运行必须依赖于新账本的产生,而谁找到新账本,谁就能得到系统自动生成的转账纪录,也就是得到了必定数量的比特币,这就是挖矿。这也就激励了人们不断的投入到挖矿中,不断的挖出新账本,经过激励维持着比特币系统的运行。 这里体现设计天才的地方是,比特币融入了金融学,货币学,博弈学,经过系统造成了必定的运行机制,激励着人们让这个系统可以自发的运行下去。 电子货币交易 上节电子货币发行一节中描述了,谁经过算力找到了新的账本,系统就会自动记一笔帐,转必定数量的比特币给谁,他也就得到了比特币。那么如何确认记录的这笔交易是属于你的,而不被别人拿走呢?作为架构师的你如何解决这个问题? 比特币采用了非对称加密技术对用户的账户操做,公钥就是用户的账户号码,谁找到了新账本,系统自动往新账本发现者的公钥账户,记一条特定数量比特币的纪录。当用户要消费比特币时,须要用私钥进行签名,系统会用账户号码也就是公钥验证签名是否正确,而且根据用户的账户号码从历史的交易中计算出当前账户中的真实金额,确保用户操做的资金在账户真实金额以内。这里的设计有两个要点: 插入的每一条纪录都须要用私钥签名,系统用账户号码也就是公钥进行验证签名是否正确,验证正确则认为合法。 若是知足第一个条件,则验证插入的纪录中转账金额是否正确,验证的方式是对该公钥以往的全部交易纪录进行计算得出该账户当前的金额,若是不超过该金额值则为合法。图示以下:  这种机制可以保证只能对本身的账户进行操做,再结合P2P网络结构下的最终一致性原则,以及账本的链式结构,一个攻击者须要创建超过目前比特币网络集群,而且算力超过目前的集群下才能建立另一个账本分之,并且也只能更改本身的账户,因此这种攻击投入和产出的收益极低,而对于比特币系统来讲,你构建了庞大的集群以及强大的算力,即便攻击成功了,得到了一部分的收益,反过来却让比特币系统更加的稳健了。 区块链的应用 比特币系统解决了去中心化的安全存储问题,解决了货币的发行问题,解决了货币交易的账户安全问题后,就构建了一个当前的比特币电子虚拟货币系统了。而比特币使用的区块链被认为是一个颠覆性的技术,革命性的技术,那他的颠覆性体如今什么地方呢?它不是技术上面的颠覆,主要是在思想层面上的,商业运做模式层面上的革命性。就好比一个国家从集权式的到民主式的转变,对这个国家和社会就是一个革命性的变化。而区块链技术带来两个基本功能: 1. 去中心化的数据存储 2. 保证账户的安全性 理论上让原先须要经过某个第三方机构提供的数据服务,均可以革命性更改成去中心化的方式提供服务,好比比特币能够替代各个国家的法币使用。区块链这种特性也会衍生出各行各业的商业模式颠覆性的变化。 |