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

1.1 例说区块链

1.1.1 从一本账本说起

早些时候,农村一般都会有个账房先生,村里人出个工或者买卖些种子肥料等,都会依靠这个账房先生来记账,大部分情况下其他人也没有查账的习惯,那个账本基本就是这个账房先生保管着,到了年底,村长会根据账本余额购置些琐碎物件给村里人发发,一直以来也都是相安无事,谁也没有怀疑账本会有什么问题。账房先生因为承担着替大家记账的任务,因此不用出去干活出工,额外会有些补贴,仅此一点,倒也是让一些人羡慕不已。下图便是当时账本的记账权图示:

终于有一天,有个人无意中发现了账房先生的那本账。看了下账面,发现数字不对,最关键的是支出、收入、余额居然不能平衡。对不上,这可不行,立即报告给其他人,结果大家都不干了,这还得了。经过一番讨论,大家决定,轮流来记账,这个月张三,下个月李四,大家轮着来,防止账本被一个人拿在手里。于是,账本的记账权发生了如下图所示的变化:

通过上图我们可以看到,村里的账本由大家轮流来保管记账了,一切又相安无事了,直到某一天,李四想要挪用村里的公款,可是他又怕这个事情被后来记账的人发现,怎么办呢?李四决定烧掉账本的一部分内容,这样别人就查不出来了,回头只要告诉大家这是不小心碰到蜡烛,别人也没什么办法。

果然,出了这个事情以后,大家也无可奈何。可是紧接着,赵六也说不小心碰到蜡烛了;王五说不小心掉水里;张三说被狗啃了……终于大家决定坐下来重新讨论这个问题。经过一番争论,大家决定启用一种新的记账方法:每个人都拥有一本自己的账本,任何一个人改动了账本都必须要告知所有其他人,其他人会在自己的账本上同样地记上一笔,如果有人发现新改动的账目不对,可以拒绝接受,到了最后,以大多数人都一致的账目表示为准。

果然,使用了这个办法后,很长一段时间内都没有发生过账本问题,即便是有人真的不小心损坏了一部分账本的内容,只要找到其他的人去重新复制一份来就行了。

然而,这种做法还是有问题,时间长了,有人就偷懒了,不愿意这么麻烦地记账,就希望别人记好账后,自己拿过来核对一下,没问题就直接抄一遍。这下记账记得最勤的人就有意见了。最终大家开会决定,每天早上掷骰子,根据点数决定谁来记当天的账,其他人只要核对一下,没问题就复制过来。

我们可以看到,在这个时候,账本的记账权变成了这样:

通过上图,我们可以看到,经历了几次风雨之后,大家终于还是决定共同来记账,这样是比较安全的做法,也不怕账本损坏丢失了。后来大家还决定,每天被掷到要记账的人,能获得一些奖励,从当天的记账总额中划出一定奖励的比例。

实际上,最后大家决定的做法,就是区块链中记账方法的雏形了,接下来我们就来了解一下区块链的技术理念。

1.1.2 区块链技术理念

区块链在本质上就是一种记账方法,当然了,并不是通过人来记账的,而是通过一种软件,我们暂且简称为区块链客户端。以上面的例子来说,张三、李四、王五、赵六等人,就相当于一个个的区块链客户端软件,它们运行在不同的设备上,彼此之间独立工作。通常我们把运行中的客户端软件称为“节点”。这些节点运行后,彼此之间会认识一下。它们彼此之间是这样认识的:张三认识李四也认识王五,赵六联系到了张三,让张三把他认识的人的联系方式发给自己,这样赵六也认识了李四和王五,通过这样的方式,大家就形成了一张网,有什么事只要招呼一声,立马消息就会传遍整个网络节点。这种方式跟新闻转发差不多,不需要依靠某一个人,大家就能互通消息了,在区块链软件的结构中,这种互相通信的功能称为“网络路由”。

在这个网络中,每个节点都维护着自己的一个账本,账本中记录着网络中发生的一笔笔账务。具体是什么样的账务呢?这得看具体是什么样的功能网络。区块链技术属于一种技术方法,可以用来实现各种不同的业务功能,小到如上例中的日常记账,大到各种复杂的商业合约,等等,记录的数据也就不同了。网络中的节点是独立记账的,可是记账的内容要保持彼此一致。所用的方法就是设定一个游戏规则,通过这个规则选出一个记账的节点,就如上例中的掷骰子。在区块链系统中,这个所谓的“掷骰子”称为“共识算法”,就是一种大家都遵守的筛选方案,我们可以先这么简单地理解。选出一个节点后,则一段时间内的账务数据都以这个节点记录的为准,这个节点记录后会把数据广播出去,告诉其他的节点,其他节点只需要通过网络来接收新的数据,接收后各自根据自己现有的账本验证一下能不能接得上,有没有不匹配和不规范的,如果都符合要求,就存储到自己的账本中。

在有些系统中,会考虑到被骰子投中的节点的劳动付出,毕竟它要负责整理数据,验证数据,打包数据,还要再广而告之,这个活还是挺辛苦的。于是会设计一种激励机制,负责打包数据的那个节点可以获得系统的奖励,这个奖励类似于论坛积分,站在软件技术的角度,就是一个数据。这个数据可以视为奖金,有时候大家会很积极地去争取那个奖金,于是就希望骰子能投中自己,有些区块链系统在这个环节会设计出一种带有竞争的机制,让各个节点去抢,谁能抢到这个机会谁就能获得打包数据的权力并且同时获得这笔奖励,在这种情况下,我们会形象地将这个竞争的过程称为“挖矿”。

那么,话又说回来了,我们将一个个运行客户端称为节点,那到底怎么标记不同的使用者呢?也是通过用户名注册吗?实则不然。在区块链系统中,这个地方的设计很有意思,是通过一种密码算法来实现的,具体来说是通过一种叫公开密钥算法的机制来实现的。我们知道,对于一种密码算法来说,无论算法过程是什么样的,都会有一个密钥。而公开密钥算法拥有一对(也就是两个)密钥,跟虎符一样,是彼此配合使用的,可以互相用来加解密。其中一个叫私钥,另外一个叫公钥,公钥可以公开给别人,私钥要自己保管好。在区块链系统中,公钥就是用来用户身份识别的,一般不会直接使用公钥,因为不容易让人记住。公钥往往都比较长,实际处理的时候都会进行转换,比如取得公钥的最后20个字节或者经过一系列更复杂的转换,最后得到一个称为“地址”的转换结果,这个“地址”就能代表一个用户。

为什么在区块链系统中要用这么一个奇怪的用户身份表示方法呢?似乎看起来除了有些创意外,也没特别的用处。这里我们就得再介绍下这个公开密钥算法的特别能力。之前提到说这种算法有两个密钥,那么这两个密钥是怎么配合工作的呢?我们来简单说明一下:用公钥加密的数据必须用对应的私钥来解密,而用私钥加密(通常称为“签名”)的数据必须用对应的公钥来解密。这个特点可是能发挥很大用处的,就如上述的例子中,如果张三要发送给李四一张支票,那怎么传送呢?就这么发过去,会被那个记账的人拿到,风险可就大了。于是张三想了一个办法,他在支票上用李四的公钥加了个密,然后再签上自己的名字(使用自己的私钥签名),这个时候其他人就算拿到支票也没用,因为只有李四才有自己的私钥,也只有李四才能解开这张支票来使用。这种功能设计在区块链系统中称为“脚本系统”。

现在我们知道了,区块链的技术理念,其实就是大家共同来参与记账,通过一种规则不断地选出账务打包者,其他节点接收验证,并且每个用户都有一对密钥表示自己,通过脚本系统的功能实现在公共网络中定向发送有价值的数据。

1.1.3 一般工作流程

通过上面的例子,相信读者朋友对区块链已经有了基本认识。区块链系统有很多种,第一个应用区块链技术的软件就是比特币,事实上区块链的概念就是比特币带出来的。到现在为止,已经出现了相当多的基于区块链技术的衍生系统,比如闪电网络、公证通、以太坊、超级账本项目等。每一类系统都有自己的特点,例如汽车设计,有的设计成跑车,有的设计成运输车,有的设计成商务车,但是有一点,无论是什么类型的车,它的工作方式或者说工作流程都是类似的,在本质上它们都是同一类技术结构的产物。在这一小节,我们从一般性的角度阐述一下区块链系统的工作流程,为了便于说明,我们会选取一些场景例子。

我们先来看一个转账交易的流程。转账交易本质上就是发送一笔数据,这个数据可以表示为资产,也可以表示为订单或者其他各种形式的数据,我们看一下下面的图示。

从图中我们可以看到,整个数据的发送过程其实还是很简单的,数据发送出去后,会被打包进区块,然后广播出去给所有的节点确认,确认没有问题后就写入到各自的本地区块链账本中,当网络中的大多数节点都确认写入后,这个转账过程就算是完成了。有朋友可能会问,在这种分布式的网络中,怎么能知道是被大多数节点确认写入了呢?这里并没有什么服务器登记呀?这个问题我们先留着,在下面讲到区块链分类的时候会有详细的解释,大家可以先思考一下。

这个工作流程图是有代表性的,其他各种系统都是在这个基础上进行衍生和扩展。比如有些会增加身份认证功能,以确保只有符合身份验证的用户才能发送数据;有些则扩展交易数据的表达能力,不但能用来表示一般的交易转账,还能表示更复杂的商业逻辑。各种应用很多,但是万变不离其宗。

实际上,说一千道一万,整个区块链网络,就是大家共同来维护一份公共账本。注意了,这个公共账本是一个逻辑上的概念,每个节点各自都是独立维护自己账本数据的,而所谓的公共账本,是说各自的账本要保持一致,保持一致的部分就是公共账本,我们看下图示:

如图所示,有些节点在广播新的数据,有些节点在接收数据,大家共同维护一个账本,确保达成一致。区块链技术其实就是围绕如何保持数据的一致、如何让这个公共账本的数据不被篡改来展开的。为了解决这些问题,区块链技术拥有一套技术栈,我们通过以下章节来阐述。