浅谈区块链
Posted ZhangJiQun.
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈区块链相关的知识,希望对你有一定的参考价值。
目录
浅谈区块链
从一个账本说起,早些时候,农村一般都会有一个账房先生,村子里的公共开销都有账房先生来记账,大部分情况下没有人去查账本,账本也就是账房先生来保管,一直相安无事。下图便是账本的记账权
但是有一天,有个人无意发现数字对不上,这可不行,立即保告了其他人,结果大家都不干了,经过一番讨论大家决定,轮流来记账,这个月张三,下个月李四,大家轮着来,防止账本在一个人手里,于是账本的记账权发生了如下图所示:
通过上图可以看到,大家轮流来记账一切又相安无事了,知道有一天李四想挪用公款但是他又怕被后面记账的人发现,于是他就烧掉了其中一部分,这样别人就查不到了,回头告诉大家是不小心碰到蜡烛了,别人也没办法。果然出了这个事情之后大家也无可奈何,紧接着王五也不小心碰蜡烛了...........于是大家重新坐下来讨论这件事情,经过一番讨论大家决定启用一种新的记账方式,每个人拥有自己的一个账本,任何人改动都要告知其他人,其他人在自己账本上也记一笔,如果发现新改动的账目不对,可拒绝改动,到最后以大多数一至的账本为准。
使用这个方法后一段时间都没有发生事情,但是时间长了有人就偷懒了,不愿意这个麻烦的记账,就希望别人记好了拿过来抄一遍,这样记账最勤快的人就有意见了,最终大家开会决定每天早上掷骰子,根据点数来决定谁记当天的账,这时候记账权就变成了这样:
经过几次风雨后,大家还是决定共同来记账,这样比较安全,后来大家还决定,每天被掷到要记账的人能获得一些奖励,从当天的记账总额中划出一定的奖励比例。
实际上最后大家决定的做法,就是区块链中记账方法的雏形。
区块链技术理念
区块链在本质上就是一种记账方法,当然了,并不是通过人来记账,而是通过一种软件,我们暂且成为区块链客户端,上一篇例子中,张三、李四、王五相当于一个个区块链客户端,他们运行在不同的设备上,彼此之间独立工作,通常我们把运行的客户端称之为节点,这些节点运行后,彼此之间会认识一下,是这样认识的:张三认识李四也认识王五,赵六联系到了张三,张三把他认识的人的联系方式告诉赵六,这样赵六也就认识了李四和王五,通过这种方式大家就形成了一张网,有什么事只要招呼一声,立马消息就会传遍整个网络节点,这种跟新闻转发差不多,不需要依靠某一个人,大家就能互通消息了,在区块链软件结构中,这种互相通信的功能叫做网络路由。
在这个网络中,每个节点维护着自己的账本,账本记录着网络中发生的一笔笔账务,区块链技术属于一种技术方法,可以来实现各种不同的业务场景,小到日常记账,大到复杂的商业合约等,记录的数据也就不同,网络中的节点是独立记账,记账的内容要保持彼此一致,所用的方法就是设定一个游戏规则,通过这个规则选出一个记账的节点,如上篇的掷骰子,在区块链中这个所谓的掷骰子成为“共识算法“,就是大家都遵守的筛选方案,现在可以先简单的理解,选出一个节点后一段时间内所有的账务都由这个节点为准,这个节点记录后会把数据广播出去,告诉其他节点,其他节点只需要通过网络来接受数据就可以,接收后根据自己账本进行验证,有没有不匹配和不规范的,如果没问题就存储。
在有些系统里,会考虑到被骰子投中的节点劳动付出,毕竟他是要整理数据,验证数据,打包数据,还有广而告之,这个活挺辛苦的,于是会设计一个激励机制,负责打包数据的节点获得相应的奖励,这个奖励类似于论坛积分,站着技术角度就是一个数据,这个数据可视为奖励,有时候大家会很积极的去争取奖金,希望筛子投中自己,有些区块链系统中在这个环节会设计一种带有竞争的机制,让各个节点去抢,谁能抢到谁就有打包数据的权利及的到这笔奖金,这个竞争过程叫做挖矿。
那么话又说回来,我们将一个个可运行的客户端称为节点,那到底怎么标记不同的使用者呢?通过用户实名注册吗?实则不然,在区块链中,这个地方设计的很有意思,是通过一种密码算法来实现的,具体来说是通过一种公开的秘钥算法的机制来实现的,我们知道,对于一种密码算法来说,无论算法过程是什么样的,最终都会得到一个秘钥,而公开秘钥算法有一对秘钥,彼此配合使用,可以互相用来加解密,私钥自己保管好,公钥就是用来识别用户身份的,一般不会直接使用公钥,不容易让人记住,实际处理的时候会进行转换,转换后会形成一个地址,这个地址就代表着一个用户。
为什么区块链中要用这么奇怪的用户身份表示呢,这里再简单的介绍一下公开秘钥算法的特别能力,之前提到这种算法有一对秘钥,那他们是怎么工作的呢?用公钥加密的数据必须用对应的私钥进行解密,而用私钥加密(通常称为签名)的数据必须对应公钥来解密,这个特点发挥很大的作用,比如,张三要发送一张支票给李四,怎么传送呢?于是张三想了一个办法,在他的支票上用李四的公钥加了个密,然后再签上自己的名字(自己的私钥签名),这时候就算其他人拿到这张支票也没什么用,只有李四的私钥才能解开这个支票,这种功能在区块链中称为脚本系统。
张三用李四公钥加密,再用自己私钥加密;李四先用张三公钥解密,再用李四私钥解密;
公钥私钥的原则:
- 一个公钥对应一个私钥。
- 密钥对中,让大家都知道的是公钥,不告诉大家,只有自己知道的,是私钥。
- 如果用其中一个密钥加密数据,则只有对应的那个密钥才可以解密。
- 如果用其中一个密钥可以进行解密数据,则该数据必然是对应的那个密钥进行的加密。
现在我们知道了,区块链的技术理念,其实就是大家共同参与记账,通过一种规则来不断的选出账务打包者,其他节点接受验证,并且每一个用户都有一对秘钥表示自己,通过脚本系统的功能实现在公共网络中定向发送有价值的数据。
工作流程
通过前两篇文章,相信大家对区块链有了基本的认识,区块链系统有很多种,第一个应用区块链的软件就是比特币,事实上区块链就是比特币带出来的,到现在为止,已经出现很多基于区块链的系统了,比如超级账本、以太坊等,每一类系统都有自己的特点,无论是什么类型的系统,他们的工作方式及工作流程是类似的,在本质上他们是同一类技术结构的产物,接下来阐述一下区块链的工作流程。
比如一个转账交易的流程,转账交易本质上就是发送一笔数据,这个数据可以表示为资产,也可以表示为订单或其他形式,我们来看下图:
图中我们可以看到,整个数据发送的过程还是很简单的,
数据发送出去后会被打包成区块,
然后广播出去给所有的节点进行确认,
确认没有问题后写入各自的区块链账本中,
当网络的大多数节点都确认后,这个转账过程算是完成了
有朋友可能会问,在这种分布式网络中,怎么能知道大多数节点确认写入了呢?这里并没有服务器登记呀?这个问题我们先留着,在下面说到区块链分类的时候再详细讲解。
这个工作流程图是有代表性的,其他各种系统都是在这个基础上进行扩展的,比如有些会加入身份认证功能,以确保只有符合身份的用户才能发送数据,有些则扩展交易数据的表达能力,但不能用来表示一般的交易转账,还能表示更复杂的商业逻辑,应用很多但是万变不离其宗。
实际上,说一千道一万,整个区块链网络,就是大家共同来维护的一个公共账本,注意了,这个公共账本是个逻辑概念,每个节点各自都是独立维护自己的账本数据,而所谓的公共账本,是说各自的账本要保持一致,保持一致的部分就是公共账本,我们看下图:
如图所示,有些节点在广播新的数据,有些节点在接收数据,大家公同维护一个账本,确保达成一致,区块链技术其实就是围绕如何保持数据一致,如何让这个公共账本的数据不被篡改来展开的,为了解决这些问题,区块链技术拥有一套技术栈,我们下一篇来阐述。
区块链技术栈
区块链本身是一种数据的记录方式,就像我们平常使用的Excel、Word等,按照一定的格式存储到电脑上。与传统的记录格式不同的是,区块链将产生的数据按照一定的时间间隔,分成一个个的数据库记录,然后再根据数据块的先后关系串联起来,也就是所谓的区块链了。按照这种规则,沿着时间线不断增加新的区块就好像是时光记录仪一样,记录发生的每一笔操作。
这种数据记录格式很新颖,在这种记录方式下,数据很难被篡改或删除,有朋友可能会说,这有什么不好修改、删除的!比如我在自己电脑保存一份Excel数据,再怎么复制的格式我也可以随便改呀!如果区块链的数据格式只是应用在单机环境或者一个中心化服务器上,那确实是,毕竟自己对自己的数据拥有完全的支配力,然而一切才刚刚开始,我们接着看。
如果区块链代表的仅仅只是一个记录格式的话,那么也算不上什么伟大的发明,也看不出什么特别的能力,比如难以篡改之类,事实上区块链是一整套技术组合的代表,在这一组技术的配合下,才能焕发出惊人的能力,区块链系统有很多种,就像聊天软件有很多种,而无论什么样的区块链系统,其技术组件都是类似的,不管是比特币、莱特币、以太坊还是其他,核心结构和工作原理都是共同的,我们看下图基本的技术组合有哪些:
如图所示,这是区块链系统结构的基本组成,各系统本质上都是在这个经典结构之上直接实现或扩展实现。这些零件装配在一起,组成了一个区块链系统,运行起来就称之为一个节点,多个这样不同的节点在不同的计算机上运行起来,就组成了一个网络,在这个网络中每个节点都是平等的,大家互相为对方提供服务,这种网络被称为点对点的对等网络。接下来我会一一进行解释。
区块链账本
区块链表示一种特有的数据记录格式,区块链就是“区块+链”,所谓的区块就是数据块的意思,每一个区块之间通过某个标志连接起来,从而形成一条链,如下图:
如图所示,一个区块一个区块的衔接,大家可以发现在生活中有很多相似的记录方式,比如企业会计账本,每个月会将记账凭证汇总并且月结,这样一段时间下来,就按月形成了一个连续账本,每个月的数据就相当于一个区块,区块与区块之间通过年月进行串联。以比特币来说,大约10分钟产生一个区块,区块中主要包含了交易事务数据以及区块的摘要信息。我们看下比特币中区块链数据组成示意图:
通过上图我们可以看到比特币中区块链账本的数据组成及关系,并且可以看到区块数据在逻辑上分成了区块头和区块体,
每个区块头中通过梅克尔根(梅克尔根也称为梅克尔根哈希值,具体概念后续详细介绍,暂且可以认为是一个区块中所有交易事务的集体身份证号)关联了区块中众多的交易事务,而每个区块之间通过区块头的哈希值串联起来,这是一个很有趣的数据格式,它将连续不断的数据分成一个一个的数据块。在下载同步这些数据的时候,可以并行的从各个节点来获得,无论数据的先后,到达本地后在根据身份证号进行组装起来就行,另外,这是一种链条格式,链条最大的特点就是一环扣一环,很难从中间去破坏。比如有人篡改了中间的2号区块,那就得吧2号区块后的所有区块全部改掉,这样的难度非常大。在区块链系统中,一个节点产生的数据和更改的数据要发送到网络中其他节点去确认,而其他节点是不会确认通过一个被篡改的数据的,因为跟自己本地区块链账本匹配不起来,这也就是区块链数据不可篡改的一个很重要的设计。
这种格式还有一个巧妙的地方,如果这个数据总是由一个人来记录那就没什么意思了,但是如果放到网上,大家共同来维护这个数据,这也才会体现出价值,每个区块由谁来记录或打包,可以有一个规则,比如掷骰子,大家约定好一个规则,赢者就让他来记录下一个区块的数据,为了补偿她的劳动投入,奖励他一部分收益,比特币就是使用了这样的原理来不断的发行新的比特币出来,奖励给打包记录区块数据的那个人的比特币就是新发行的比特币,这个也叫做挖矿。
共识机制(筛选算法)
所谓共识,就是指大家都打成一致的意思。在生活中也有许多需要达成共识的场景,比如开会讨论,双方或多方签订一份协议,在区块链系统中,每个节点必须要做的事情就是让自己的账本跟其他节点保持一致,如果是在传统的软件结构中,这几乎就不是问题,因为一个中心服务器的存在,也就是所谓的主库,其他从库向主库看齐就好,在实际生活中,很多事情人们也是按照这逻辑来的。比如企业老板发布了一个通知,员工照着做,但是区块链是一个分布式的对等网络结构,在这个结构中没有哪个节点是“老大”,一切都要商量着来,在区块链系统中,如何让每一个节点通过一个规则将各自节点的数据保持一致是一个很核心的问题,这个问题的解决方案就是制定一套共识算法。
共识算法其实就是一种规则,每个节点都按这个规则去确认各节点的数据,我们暂且抛开算法的原理,先来想一想在生活中我们会如何解决这个问题,假设一群人开会,这群人没有一个领导,大家各抒己见,到最后如何统一一个最终的结果出来呢?实际处理的时候,我们一般在某个时间段选出一个人来发表意见,那个负责汇总大家的内容,然后发布完整的意见,其他人投票表决,每个人都有机会来汇总表达,最后票数最多的按最终意见,这种思路就是一种共识算法了,然而在实际过程中,如果人数多并数量是确定的,那还好处理些,如果人数很多并且数量不可确定,那么很难让每个人去发表意见再投票了,这样效率太低了,我们需要一个机制选出一个代表的人,在共识算法中就是筛选出具有代表性的节点。
如何筛选呢?其实就是设置一组条件,就像我们筛选运动员一样,给一组指标让大家完成,谁能更好的完成指标,谁就有机会被选上。在区块链系统中,存在着多种这样的筛选方案,比如PoW(Proof of Work)工作量证明、PoS(Proof of Stake)权益证明、DPoS(Delegate Proof of Stake)委托权益证明、PBFT(Practical Byzantine Fault Tolerance)实用拜占庭容错算法等,各种不同的算法,其实就是不同的游戏玩法,这里暂且不进行算法的过程详述,大家只要知道这些都是一些筛选算法就行了。区块链系统就是通过这种筛选算法或者共识算法来使用网络中各个节点的账本数据打成一致的。
密码算法
密码算法的应用在区块链中是个很巧妙的东西,它应用的点也很多,我们在这里不详细介绍密码算法的原理,就从几个关键的应用来介绍一下。
首先我们回顾一下区块链账本格式,通过上述讲解我们已经知道,区块链账本就是连接起来的一个个区块,那么到底是通过什么来连接的呢?
学过数据结构的朋友都知道,在数据结构中有一种变量叫做指针,它可以用来指向某数据的地址,那么区块的连接是不是用过这样的方式呢?生活中地址连接的例子很多,比如路牌、门牌等,
然而区块之间的连接,往往都不是靠数据地址来连接的,而是靠一种叫做哈希值的数据来关联的,什么叫哈希值?这是通过密码算法中的哈希算法计算得出的,哈希算法可以通过对一段数据计算后得出一段摘要字符串,这种摘要字符串与原始数据是唯一对应的,什么意思呢?如果对原始数据进行修改,哪怕修改一点点,那么计算出来的哈希值都会完全变化。
区块链账本对每个区块都会计算一个哈希值,称为区块哈希,通过区块哈希来串联区块。这里有个很好的作用就是,如果有人篡改了中间的某一区块数据,那么后面的区块都要进行修改,这个时候并不是简单的修改一下后面区块的地址指向就能结束,由于后面的区块是通过区块哈希来指向的,只要前面的区块发生变动,这个区块哈希就无效了,就指不到正确的区块了。
另外一个对密码算法的应用就是梅克尔树结构,梅克尔树在之后会详细讲解,我们先初步认识一下,通过上述讲解我们知道,每个区块会被计算出一个哈希值,实际上,除了整个区块会被计算哈希值之外,区块中包含的每一笔事务数据都会计算一个哈希值,称为事务哈希,每一个事务哈希都可以唯一的表示一个事务,对一个区块中所有事务进行哈希计算后,可以得出一组事务哈希,再通过对这些事务哈希进行加工处理,最终得出一颗哈希树的数据结构,哈希树的顶部就是树根,称为梅克尔根。通过这个梅克尔根就可以将整个区块中的事务约束起来,只要区块中的事务有任何改变,梅克尔根就会发生变化,利用这一点可以保证区块数据的完整性。
当然,密码算法在区块链系统中的应用还远不止这些,比如通过密码算法来创建账户、地址、签名交易事务等,这些应用在后续会逐步介绍。
脚本系统
脚本系统在区块链中是个比较抽象的概念,也是其中一个很重要的功能,可以说区块链系统之所以能形成一个有价值的网络,依靠的就是脚本系统,他就像是一个发动机一样,驱动着区块链系统不断进行着各种数据的收发。
所谓脚本,就是指一组程序规则,在区块链中,有些系统的程序规则是固定的,比如在比特币系统中,只能进行比特币的发送与接收,这个发送与接收的过程就是通过实现在比特币中的一组脚本程序来完成的,而有些系统是允许用户自行编写一组程序规则的,编写好后可以部署在区块链账本中,这样就可以扩展区块链系统的功能,比如以太坊就是通过实现一套可以自定义功能的脚本系统进而实现了智能合约的功能。
脚本系统使区块链中可以实现各种各样的业务功能。本来大家只是通过区块链来记账,通过脚本系统,大家可以使用区块链来记录各种各样的数据,比如订单、众筹账户、物流信息,供应链信息,这些数据一旦可以记录到区块链上,那么区块链的有点就能够充分发挥出来。
网络路由
这个功能模块比较简单。区块链系统是一个分布式网络,这些网络的节点如何来彼此进行连接通信呢?依靠的就是网络路由功能,前面我们说到,张三、李四、王五、赵六是通过彼此介绍来认识的,这个其实就是网络路由的雏形了,在分布式网络结构中,不存在一个指定的服务器,大家没法通过一个服务器来直接交换彼此的身份信息,就只能依靠彼此联系并传播信息。在区块链中,这个功能一般会定义成一种协议,称为“节点发现协议”。
除了发现节点外,更重要的一个功能就是同步数据,节点要保持自己的账本数据是最新的,就必须要实时更新自己的数据,从哪更新呢?既然没有服务器下载,那就是通过临近的节点了,通过向临近节点发送数据请求来获取最新数据,节点彼此都充当服务者和被服务者,通过这种方式,网络中的每一个节点都会在某一时刻达成数据上的一致。
网络路由可以说是区块链中的触角,通过大量的触角将每一个节点连入网络,从而形成一个功能强大的区块链共识网络。
以上是关于浅谈区块链的主要内容,如果未能解决你的问题,请参考以下文章