白话区块链
上QQ阅读APP看书,第一时间看更新
icon0

1.2 区块链技术栈

区块链本身只是一种数据的记录格式,就像我们平常使用的Excel表格、Word文档一样,按照一定的格式将我们的数据存储在电脑上。与传统的记录格式不同的是,区块链是将产生的数据按照一定的时间间隔,分成一个个的数据块记录,然后再根据数据块的先后关系串联起来,也就是所谓的区块链了。按照这种规则,沿着时间线不断增加新的区块,就好像是时光记录仪一样,记录下发生的每一笔操作。

这种数据记录的方式很新颖,在这种记录方式下,数据很难被篡改或者删除。有朋友可能会有说,这有什么不好修改、删除的!比如我在自己电脑上保存了一份Excel数据,再怎么复杂的格式,我也能随便改呀!如果区块链的数据格式只是应用在单机环境或者一个中心化的服务器上,那确实是的,毕竟自己对自己的数据拥有完全的支配权力。然而,一切才刚刚开始,我们接着看。

如果说区块链代表的仅仅只是一个记录格式的话,那么也实在算不上是伟大的发明,也看不出有什么特别的能力,比如难以篡改之类。事实上,区块链是一整套技术组合的代表,在这一组技术的配合下,才能焕发出惊人的能力和耀眼的光芒。区块链系统有很多种,就像聊天软件有很多种,电子邮箱有很多种一样,而无论是什么样的区块链系统,其技术部件的组合都是类似的。就像汽车基本都是由发动机、底盘、车身、电器四大部件组成的,计算机都是由CPU、存储器、输入/输出设备组成的,不管是比特币、莱特币、以太坊还是其他,核心结构和工作原理都是共同的。我们就来看看最基本的技术组合都有哪些:

如图所示,这是区块链系统结构的基本组成,各种系统本质上都是在这个经典结构之上直接实现或者扩展实现。这些零部件装配在一起,组成了一个区块链软件,运行起来后就称之为一个节点,多个这样的节点在不同的计算机设备上运行起来,就组成了一个网络。在这个网络中每个节点都是平等的,大家互相为对方提供服务,这种网络被称为点对点的“对等网络”。为了让大家对这些组成模块的名词有更具体的感受和理解,我们一一来解释一下。

1.区块链账本

如上所述,它表示一种特有的数据记录格式。区块链,就是“区块+链”,所谓的区块就是指数据块的意思,每一个数据块之间通过某个标志连接起来,从而形成一条链,我们看下示意图:

如图所示,一个区块一个区块地衔接。大家可以发现在生活中有很多相似的记录方式,比如企业的会计账簿,每个月会计将记账凭证汇总为账簿并且月结,这样一段时间下来,就按月形成了一个连续账簿,每个月的数据就相当于区块,区块与区块之间通过年月串联起来。以比特币来说,大约是每10分钟产生一个区块,区块中主要包含了交易事务数据以及区块的摘要信息。我们看下比特币中区块链数据的组成示意图:

通过上图我们可以看到比特币中区块链账本的数据组成以及关系,并且可以看到区块数据在逻辑上分成了区块头和区块体,每个区块头中通过梅克尔根梅克尔根也称为“梅克尔根哈希值”,具体概念后续有详细介绍,暂且可以认为就是一个区块中所有交易事务的集体身份证号。关联了区块中众多的交易事务,而每个区块之间通过区块头哈希值(区块头哈希值就是一个区块的身份证号)串联起来。这是一个很有趣的数据格式,它将连续不断发生的数据分成了一个一个的数据块。在下载同步这些数据的时候,可以并行地从各个节点来获得,无论数据先后,到达本地后再根据身份证号组装起来就行。另外,这是一种链条格式,链条最大的特点就是一环扣一环,很难从中间去破坏。比如,有人篡改了中间的2号区块,那么就得同时把2号区块后续的所有区块都更改掉,这个难度就大了。在区块链系统中,一个节点产生的数据或者更改的数据要发送到网络中的其他节点接受验证,而其他节点是不会验证通过一个被篡改的数据的,因为跟自己的本地区块链账本数据匹配不起来,这也是区块链数据不可篡改的一个很重要的技术设计。

这种格式还有个巧妙的地方,如果这个数据总是由一个人来记录的,那自然也没什么,但是如果放到网络中,大家共同来记录这个数据,那就有点意思了,每个区块数据由谁来记录或者说打包,可以有一个规则。比如掷骰子,大家约定谁能连续3次掷出6,那就让他来记录下一个区块的数据,为了补偿他的劳动投入,奖励给他一些收益。比特币正是使用了这样的原理来不断发行新的比特币出来,奖励给打包记录区块数据的那个人的比特币就是新发行的比特币。

2.共识机制

所谓共识,就是指大家都达成一致的意思。在生活中也有很多需要达成共识的场景,比如开会讨论,双方或多方签订一份合作协议等。在区块链系统中,每个节点必须要做的事情就是让自己的账本跟其他节点的账本保持一致。如果是在传统的软件结构中,这几乎就不是问题,因为有一个中心服务器存在,也就是所谓的主库,其他的从库向主库看齐就行了。在实际生活中,很多事情人们也都是按照这种思路来的,比如企业老板发布了一个通知,员工照着做。但是区块链是一个分布式的对等网络结构,在这个结构中没有哪个节点是“老大”,一切都要商量着来。在区块链系统中,如何让每个节点通过一个规则将各自的数据保持一致是一个很核心的问题,这个问题的解决方案就是制定一套共识算法。

共识算法其实就是一个规则,每个节点都按照这个规则去确认各自的数据。我们暂且抛开算法的原理,先来想一想在生活中我们会如何解决这样一个问题:假设一群人开会,这群人中并没有一个领导或者说老大,大家各抒己见,那么最后如何统一出一个决定出来呢?实际处理的时候,我们一般会在某一个时间段中选出一个人来发表意见,那个人负责汇总大家的内容,然后发布完整的意见,其他人投票表决,每个人都有机会来做汇总发表,最后谁的支持者多就以谁的最终意见为准。这种思路其实就算是一种共识算法了。然而在实际过程中,如果人数不多并且数量是确定的,那还好处理些,如果人数很多而且数量也不固定,那我们就很难让每个人都去发表意见然后再来投票决定了,这样效率就太低了。我们需要通过一种机制筛选出最有代表性的人,在共识算法中就是筛选出具有代表性的节点。

如何筛选呢?其实就是设置一组条件,就像我们筛选运动员,筛选尖子生一样,给一组指标让大家来完成,谁能更好地完成指标,谁就能有机会被选上。在区块链系统中,存在着多种这样的筛选方案,比如PoW(Proof of Work,工作量证明)、PoS(Proof of Stake,权益证明)、DPoS(Delegate Proof of Stake,委托权益证明)、PBFT(Practical Byzantine Fault Tolerance,实用拜占庭容错算法)等,各种不同的算法,其实就是不同的游戏玩法,限于篇幅,这里暂不进行算法过程的详述,大家只要知道这些都是一种筛选算法就行了。区块链系统就是通过这种筛选算法或者说共识算法来使得网络中各个节点的账本数据达成一致的。

3.密码算法

密码算法的应用在区块链系统中是很巧妙的,应用的点也很多,我们在这里不详细介绍密码算法的原理,就从几个很关键的应用来介绍一下。

首先我们回顾下区块链账本格式。通过上述讲解我们已经知道,区块链账本就是连接起来的一个个区块。那么到底是通过什么来连接的呢?学过数据结构的朋友都知道,在数据结构中,有一种变量叫指针,它是可以用来指向某个数据的地址的。那么区块的连接是不是通过这样的数据地址呢?生活中的地址连接例子很多,比如路牌、门牌等。然而,区块之间的连接,往往都不是靠数据地址来关联的,而是靠一种叫作哈希值的数据来关联的。什么叫哈希值?这是通过密码算法中的哈希算法计算得出的。哈希算法可以通过对一段数据计算后得出一段摘要字符串,这种摘要字符串与原始数据是唯一对应的。什么意思呢?如果对原始数据进行修改,哪怕只是一点点修改,那么计算出来的哈希值都会发生完全的变化。区块链账本对每个区块都会计算出一个哈希值,称为区块哈希,通过区块哈希来串联区块。这有一个很好的作用就是,如果有人篡改了中间的某一个区块数据,那么后面的区块就都要进行修改,这个时候并不是简单地修改一下后面区块的地址指向就能结束的,由于后面的区块是通过区块哈希来指向的,只要前面的区块发生变动,这个区块哈希就无效了,就指不到正确的区块了。

另外一个对密码算法的应用就是梅克尔树结构,梅克尔树结构在3.1.3节中有详细介绍,我们这里先初步认识下。通过上述解释我们知道,每个区块会被计算出一个哈希值。实际上,除了整个区块会被计算哈希值外,区块中包含的每一笔事务数据也会被计算出一个哈希值,称为“事务哈希”,每一个事务哈希都可以唯一地表示一个事务。对一个区块中所有的事务进行哈希计算后,可以得出一组事务哈希,再通过对这些事务哈希进行加工处理,最终会得出一棵哈希树的数据结构。哈希树的顶部就是树根,称为“梅克尔根”。通过这个梅克尔根就可以将整个区块中的事务约束起来,只要区块中的事务有任何改变,梅克尔根就会发生变化,利用这一点,可以确保区块数据的完整性。

当然,密码算法在区块链系统中的应用还远不止这些,比如通过密码算法来创建账户地址、签名交易事务等,这些应用在后续章节中会逐步介绍。

4.脚本系统

脚本系统在区块链中是一个相对抽象的概念,也是极其重要的一个功能,可以说区块链系统之所以能形成一个有价值的网络,依靠的就是脚本系统,它就像是发动机一样,驱动着区块链系统不断进行着各种数据的收发。所谓脚本,就是指一组程序规则。在区块链系统中,有些系统中的程序规则是固定的,比如在比特币系统中,只能进行比特币的发送与接收,这个发送与接收的过程就是通过实现在比特币中的一组脚本程序来完成的;而有些系统是允许用户自行编写一组程序规则的,编写好后可以部署到区块链账本中,这样就可以扩展区块链系统的功能,比如以太坊就是通过实现一套可以自定义功能的脚本系统,进而实现了智能合约的功能。

脚本系统使得在区块链中可以实现各种各样的业务功能。本来大家只是通过区块链来记财务账的,通过脚本系统,大家可以使用区块链来记录各种各样的数据,比如订单、众筹账户、物流信息、供应链信息等,这些数据一旦可以记录到区块链上,那么区块链的优点就能够被充分地发挥出来。有关脚本系统的具体使用和开发,大家可以通过后续的第6~8章来理解。

5.网络路由

这个功能模块比较简单。区块链系统是一个分布式的网络,这些网络中的节点如何来彼此进行连接通信呢?依靠的就是网络路由功能。前面我们说到,张三、李四、王五、赵六是通过彼此介绍来认识的,这个其实就是网络路由的雏形了。在分布式的网络结构中,不存在一个指定的服务器,大家没法通过一个服务器来直接交换彼此的身份信息,就只能依靠彼此联系并传播信息。在区块链系统中,这个功能一般会定义成一种协议,称为“节点发现协议”。

除了要发现节点外,更重要的一个功能就是同步数据。节点要保持自己的账本数据是最新的,就必须要时时更新自己的数据。从哪更新呢?既然没有服务器来下载,那就是通过邻近的节点了。通过向邻近节点发送数据请求来获得最新的数据,节点彼此都充当服务者和被服务者,通过这种方式,网络中的每一个节点都会在某一个时刻达成数据上的一致。

网络路由可以说是区块链系统中的触角,通过大量的触角将每个节点连入网络,从而形成一个功能强大的区块链共识网络。