【编者Peter Ye按】
可以打开如下链接,详细阅读前几篇:
下面的段落是:第1章第3节 《区块链技术栈》。
---Begin---
区块链本身只是一种数据的记录格式,就像我们平常使用的Excel表格、Word文档一样,按照一定的格式将我们的数据存储在电脑上,与传统的记录格式不同的是,区块链是将产生的数据按照一定的时间间隔,分成一个一个的数据块记录,然后再根据数据块的先后关系串联起来,也就是所谓的区块链了,按照这种规则,沿着时间线不断的增加新的区块,就好像是时光记录仪一样,记录下发生的每一笔操作。
这种数据记录的方式很是新颖,在这种记录方式下,数据很难被篡改或者删除,有朋友可能会有疑问,这有什么不好修改删除的,比如我在自己电脑上保存了一份Excel数据,再怎么复杂的格式,我也能随便改啊。如果区块链的数据格式只是应用在单机环境或者是一个中心的服务器上,那确实是的,毕竟自己对自己的数据拥有完全的支配权力。然而,一切才刚刚开始,我们接着看。
如果说区块链代表的仅仅只是一个记录格式的话,那么也实在算不上是伟大的发明,也看不出有什么特别的能力比如难以篡改之类。事实上,区块链是一整套技术组合的名词代表,在这一组技术的配合下,才能焕发出惊人的能力和耀眼的光芒。区块链系统有很多种,就像聊天软件有很多种,电子邮箱有很多种一样,而无论是什么样的区块链系统,其技术部件的组合都是类似的,就像汽车基本都是由发动机、底盘、车身、电器四大部件组成的;计算机都是由CPU、存储器、输入输出设备组成的,不管是比特币、莱特币、以太坊还是其他,核心结构和工作原理都是共同的。我们就来看看最基本的技术组合都有哪些:
如图所示,这是区块链系统结构的基本组成,各种系统本质上都是在这个经典结构之上的直接实现或者是扩展实现,这些零部件装配在一起,组成了一个区块链软件,运行起来后就称之为一个节点,多个这样的节点在不同的计算机设备上运行起来,就组成了一个网络,在这个网络中每个节点都是平等的,大家互相为对方提供服务,这也是被称之为是点对点的对等网络。为了让大家对这些组成模块的名词有更具体的感受理解,我们一一来解释一下:
1. 区块链账本
如上所述,它表示一种特有的数据记录格式。区块链,就是“区块+链”,所谓的区块就是指数据块的意思,每一个数据块之间通过某个标志连接起来,从而形成一条链,我们看下示意图:
如图,一个区块一个区块的衔接,大家看到这样的格式,可以发现在生活中有很多相似的记录方式,比如企业的会计账簿,每个月会计将记账凭证汇总为账簿并且月结,每个月都汇总一次,这样一段时间下来,就形成了一个月一个月的连续的账簿,每个月的数据就相当于是区块,区块与区块之间通过年月链接起来。以比特币来说,大约是每十分钟一个区块,区块中主要包含了交易事务数据以及区块的摘要信息,我们看下比特币中区块链数据的组成示意图:
通过上图我们可以看到比特币中区块链账本的数据组成以及关系,并且可以看到区块数据在逻辑上分成了区块头和区块体,每个区块头中通过梅克尔根关联了区块中众多的交易事务(梅克尔根也称之为是梅克尔根哈希值,具体的概念后续有详细的介绍,暂且可以认为就是一个区块中所有交易事务的集体身份证号),而每个区块之间通过区块头哈希值(区块头哈希值就是一个区块的身份证号)串联了起来。
这是一个很有趣的数据格式,它将连续不断的发生的数据分成了一个一个的数据块。在下载同步这些数据的时候,可以并行的从各个节点来获得,无论数据先后,到达本地后再根据身份证号组装起来就行,另外,这种格式是一种链条的格式,链条最大的特点就是一环扣一环,很难从中间去破坏,比如有人篡改了中间的2号区块,那么就得同时把2号区块后续的所有区块都要更改掉,这个难度就大了。在区块链系统中,一个节点产生的数据或者更改的数据要发送到网络中的其他节点接受验证,而其他节点是不会验证通过一个被篡改的数据的,因为跟自己的本地区块链账本数据匹配不起来,这也是区块链数据不可篡改的一个很重要的技术设计。
这种格式还有个巧妙的地方,如果这个数据总是由一个人来记录的,那自然也没什么,但是如果放到网络中,大家共同来记录这个数据,那就有点意思了,每个区块数据由谁来记录或者说打包,是可以有一个规则的,比如说掷骰子,大家约定谁能连续3次掷出6,那就让他来记录下一个区块的数据,为了补偿一下他的劳动投入,奖励给他一些收益,比特币正是使用了这样的原理来不断的发行新的比特币出来,奖励给打包记录区块数据的那个人的比特币就是新发行的比特币。
2. 共识机制
所谓共识,就是指大家都达成一致的意思,在生活中也有很多需要达成共识的场景,比如开会讨论,双方或多方签订一份合作协议等,在区块链系统中,每个节点必须要做的事情就是让自己的账本跟其他节点的账本保持一致,如果是在传统的软件结构中,这几乎就不是问题,因为有一个中心服务器的存在,也就是所谓的主库,其他的从库向主库看齐就行了。
在实际生活中,很多事情人们也都是按照这种思路来的,比如国家发布了一个政策,大家都照着办;企业老板发布了一个通知,员工照着做。但是在区块链的结构中,是一个分布式的对等网络结构,没有哪个节点是特别的“老大”,一切都要商量着来,因此在区块链系统中,如何让每个节点通过一个规则将各自的数据保持一致,是一个很核心的问题,这个问题的解决方案就是制定一套共识算法。
共识算法其实就是一个规则,每个节点都按照这个规则去确认各自的数据。我们暂且先抛开算法的原理,先来想一想在生活中我们会如何去解决这样一个问题,假设一群人开会,这群人中并没有一个领导或者说老大,大家各抒己见,那么最后如何统一出一个决定出来呢?
实际处理的时候,我们一般会在某一个时间段中选出一个人来发表意见,那个人负责汇总大家的内容,然后发布出完整的意见,其他人投票表决,每个人都有机会来做汇总发表,最后谁的支持者多就以谁的最终意见为准。这种方法思路其实就算是一种共识算法了,然而在实际过程中,如果人数不多并且是数量确定的,那还好处理些,如果人数很多,而且数量也不固定,那我们就很难让每个人都去发表一遍意见然后再来投票决定了,这个时候大家轮一圈的做法,效率就太低了,我们需要通过一种机制筛选出最有代表性的人,在共识算法中就是筛选出具有代表性的节点。
如何筛选呢,其实就是设置一组条件,就像我们筛选运动员,帅选尖子生一样,给一组指标让大家来完成,谁能更好的完成指标,谁就能有机会被选上,在区块链系统中,存在着多种这样的筛选方案,比如POW(Proof of Work 工作量证明)、POS (Proof of Stake 权益证明)、DPOS(Delegate Proof of Stake 委托权益证明)、PBFT(Practical Byzantine Fault Tolerance 实用拜占庭容错算法)以及等等,各种不同的算法,其实就是不同的游戏玩法,限于篇幅,这里暂不进行算法过程的详述,大家只要知道这些都是一种筛选算法就行了,区块链系统就是通过这种筛选算法或者说是共识算法来使得网络中各个节点的账本数据达成一致。
3. 密码算法
密码算法的应用在区块链系统中是很巧妙的,应用的点也很多,我们在这里不展开详细介绍密码算法的原理作用,就从几个很关键的应用来介绍下。
首先我们来回顾下区块链账本格式,通过上述的了解,我们已经知道了,区块链账本就是一个区块一个区块的连接,那么到底是通过什么来连接的呢?
学过软件数据结构的朋友知道,在数据结构中,有一种变量叫指针,是可以用来指向某个数据的地址的,那么区块的连接是不是通过这样的数据地址呢?生活中,通过地址来连接指向的例子很多,比如路牌、门牌等。
然而,区块之间的连接,往往都不是靠数据地址来关联的,而是靠一种叫做哈希值的数据来关联的,什么叫哈希值?这是通过密码算法中的哈希算法来计算得出的,哈希算法可以通过对一段数据计算后得出一段摘要字符串,这种摘要字符串与原始数据是唯一对应的,什么意思呢?如果对原始数据进行修改,哪怕只是一点点的修改,那么计算出来的哈希值就会发生完全的变化。区块链账本中对每个区块都会计算出一个哈希值,称之为区块哈希,通过区块哈希来串联区块,有一个很好的作用就是,如果有人篡改了中间的某一个区块数据,那么后面的区块就都要进行修改,这个时候并不是简单的靠修改一下后面区块的地址指向就能结束的,由于后面的区块是通过区块哈希来指向的,只要前面的区块发生变动,这个区块哈希就无效了,就指不到正确的区块了。
另外一个对密码算法的应用就是称之为梅克尔树的结构,梅克尔树的结构在后续章节中有详细的介绍,我们这里先初步认识下,通过上述的解释,我们知道,每个区块会被计算出一个哈希值,实际上,除了整个区块会被计算哈希值外,区块中包含的每一笔事务数据也会被计算出一个哈希值,称之为是事务哈希,每一个事务哈希都可以唯一的表示一条事务,通过对一个区块中所有的事务进行哈希计算后,可以得出一组事务哈希,再通过对这些事务哈希进行一个加工处理,最终会得出一棵哈希树的数据结构,哈希树的顶部就是树根,被称之为是梅克尔根,通过这个梅克尔根就可以将整个区块中的事务约束起来,只要区块中的事务有任何改变,梅克尔根就会发生变化,利用这一点,可以确保区块数据的完整性。
当然,密码算法在区块链系统中的应用还远不止这些,比如通过密码算法来创建账户地址、签名交易事务等,这些应用点我们在后续章节中会逐步的介绍。
4. 脚本系统
脚本系统在区块链中是一个相对抽象的概念,也是极其重要的一个功能,可以说区块链系统之所以能形成一个有价值的网络,依靠的就是脚本系统,它就像是发动机一样,驱动着区块链系统不断的进行着各种数据的收发。所谓的脚本,就是指一组程序规则,在区块链系统中,有些系统中的程序规则是固定的,比如比特币,在比特币系统中,只能进行比特币的发送与接收,这个发送与接收的过程就是通过实现在比特币中的一组脚本程序来完成的;而有些系统是允许用户自行编写一组程序规则的,编写好后可以部署到区块链账本中,这样就可以扩展区块链系统的功能,比如以太坊就是通过实现一套可以自定义功能的脚本系统,进而实现了智能合约的功能。
脚本系统使得在区块链中可以实现各种各样的业务功能,本来大家只是通过区块链来记个财务账的,通过脚本系统,大家可以使用区块链来记录各种各样的数据,比如订单、众筹账户、物流信息、供应链信息等等,这些数据一旦可以记录到区块链上,那么区块链的优点就能够被充分的发挥出来。有关脚本系统的具体使用和开发,大家可以通过后续的第六章、第七章以及第八章来理解。
5. 网络路由
这个功能模块比较简单,区块链系统是一个分布式的网络,这些网络中的节点如何来彼此进行连接通信呢?依靠的就是网络路由功能。在上述的章节中,我们有看到,张三李四以及王五赵六是通过彼此介绍来认识的,这个其实就是网络路由的雏形了,在分布式的网络结构中,不存在一个指定的服务器,大家没法通过一个服务器来直接交换彼此的身份信息,就只能依靠彼此联系,像传销一样将信息传播出去,在区块链系统中,这个一般会定义成一种协议,称之为节点发现协议。
除了要发现节点外,更重要的一个功能需求就是同步数据,节点要保持自己的账本数据是最新的,就必须要时时的更新自己的数据,从哪更新呢?既然没有服务器来下载,那就是通过邻近的节点了,通过向邻近节点发送数据请求来获得最新的数据,节点彼此都充当服务者和被服务者,通过这种方式,网络中的每一个节点都会在某一个时刻达成数据上的一致。
网络路由可以说就是区块链系统中的触角,通过大量的触角将每个节点连入了网络,从而形成一个功能强大的区块链共识网络。
---End---
未完待续,下一节将介绍《区块链分类与架构》。欢迎持续关注“乐生活与爱IT”。在这个公众号平台上,之前也分享过和区块链相关的如下文章:
雄文:知耻而后勇,数字代币和区块链技术的未来 (修改版-20180213)
对《白话区块链》这本书感兴趣的朋友,可以直接在京东等网店购买:
http://item.jd.com/12236097.html#comment
---
微信公众号平台"乐生活与爱IT"在目前阶段,主要是分享软件定义存储(SDS),及VMware vSAN相关的文章,偶尔也会分享虚拟化、云计算、大数据、人工智能、IoT、区块链等IT类文章,甚至生活类的好文章。欢迎投稿,特别是原创文章。如果原创文章属于首次发布,根据质量和阅读量的不同,能获得20~500元的稿费。我的QQ号:9269216。另外,如果还有赞赏收入,作者可获得60%。
欢迎对SDS感兴趣的朋友,加入软件定义存储讨论 QQ群:122295009,可下载原创的一些文章,及其他有参考价值的文档。可直接搜索群号,或者扫描如下二维码:
同时,欢迎您加入 "开放讨论群-SDS&虚拟化" 微信群,并邀请其他对SDS和虚拟化感兴趣的朋友加入此微信群。可以通过添加如下管理员之一的微信号,建议添加管理员时,告知你的公司名和姓名,方便备注保存。
sdg8848
libo9538
yangzhuan
dts0103
欢迎您通过扫描关注微信公众号:“乐生活与爱IT”。
关注后,可以通过点击左下角的“文章目录”,通过输入三位数(记住!是三位数,目前第一位是0或者1)详细了解如何查看历史文章。
点击左下角“阅读原文”,可以跳转到前一篇《白话区块链 之2: 区块链技术理念》。