阿里妹导读:很多童鞋反馈,区块链技术有点绕,有点晦涩,大都是一知半解,理解不够通彻。但在阿里技术专家郑吉看来,区块链特别是比特币本身,并没有使用高大上复杂的新技术,只是对现有技术的组合。其天才的地方体现在系统的架构上,体现在把金融学,货币学,博弈学,甚至是哲学思想体现在比特币的系统架构上。如果单纯从系统中的技术点着手学习研究,那么往往就会觉得有点绕,有点晦涩。这就像我们在平时工作中了解某个系统,如果首先搞清楚业务本身,了解清楚系统架构的设计,再去看具体的实现技术,从大局到面到点,那么就有豁然开朗的感觉。
今天,郑吉将试着帮助大家转换视角,从架构的思维分析去解析比特币,从而对区块链技术有一个更深入的理解。
准备工作
区块链不是一种技术实现,而是一个系统的架构设计,使用一系列的技术组合用于完成去中心化的数据存储。比特币在区块链之上融入了金融学,货币学,博弈学,甚至一定程度的哲学思想,用于电子货币的发行,运行和交易。在学习区块链之前有一些基础知识需要提前掌握好,后面将不再对具体技术展开描述,而是从这个技术解决了什么问题,为什么要用这个技术这个角度去描述。
P2P
不可逆算法
不对称加密算法
Merkle树
CAP理论
最终一致性算法
比特币要做什么?
如果你是一个架构师,做一个系统的架构,你首先要搞清楚这个系统要做什么?要解决一个什么问题?带着这个问题进行分析,设计系统整体的架构。对于比特币也一样,首先搞清楚比特币是要做什么,要解决什么问题?然后带着这些问题去解析比特币的技术实现。
如果用一句话来描述比特币要做什么,那么可以这样描述:做一个去中心化电子货币发行交易系统。这里有三个关键词:
去中心化电子货币发行电子货币交易
分析和设计
本章针对上述比特币的三个关键词,去中心化,电子货币发行,货币交易,进行分析和设计。
去中心化
当今世界的所有货币交易都是有一个第三方可信任的金融机构提供服务处理,任何人不能访问由这个第三方机构中心化存储的数据,理论上来说如果这个金融机构发生了欺诈或倒闭,那么存储在这个机构中的货币,以及所做的交易就会存在风险。 当然比特币的去中心化,不是因为担心这种风险,而是根本就不需要这个第三方机构了。这也是区块链的强大颠覆性之一,凡是需要某个第三方可信任的机构需要安全保存处理的数据,都可以去中心化安全存储,所有人都可以访问。
从技术角度分析,如何做到去中心化?
中心化对应的就是分布式,去中心化就是分布式。把原先存储在某个第三方机构,中心化存储的数据,进行分布式存储。
分布式存储要解决的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网络结构下的最终一致性原则,以及帐本的链式结构,一个攻击者需要建立超过目前比特币网络集群,并且算力超过目前的集群下才能创建另外一个帐本分之,而且也只能更改自己的帐户,所以这种攻击投入和产出的收益极低,而对于比特币系统来说,你构建了庞大的集群以及强大的算力,即使攻击成功了,获得了一部分的收益,反过来却让比特币系统更加的稳健了。
区块链的应用
比特币系统解决了去中心化的安全存储问题,解决了货币的发行问题,解决了货币交易的帐户安全问题后,就构建了一个当前的比特币电子虚拟货币系统了。而比特币使用的区块链被认为是一个颠覆性的技术,革命性的技术,那他的颠覆性体现在什么地方呢?它不是技术上面的颠覆,主要是在思想层面上的,商业运作模式层面上的革命性。就比如一个国家从集权式的到民主式的转变,对这个国家和社会就是一个革命性的变化。而区块链技术带来两个基本功能:
去中心化的数据存储保证帐户的安全性
理论上让原先需要通过某个第三方机构提供的数据服务,都可以革命性更改为去中心化的方式提供服务,比如比特币可以替代各个国家的法币使用。区块链这种特性也会衍生出各行各业的商业模式颠覆性的变化。