本帖最后由 Gaohanqing 于 2020-11-6 09:34 编辑
摘要 我们知道,区块链本身只是一个数据的记录格式,就像们平时使用Excel表格、Word文档一样,按照一定的格式将我们的数据存储在电脑上。与传统记录不同的是,区块链将产生的数据按照一定的时间间隔,分成一个个的数据块记录,然后再根据数据块的先后关系串联起来,也就是所谓的区块链了。按照这种规则,沿着时间线不断增加新的区块,记录下发生的每一笔操作。 这种数据记录的方式很新颖,在这种记录方式下,数据很难被篡改或者删除,有朋友可能会说,这有什么不好修改或者删除的,比如我在电脑上保存的Excel数据,再怎么复杂我也能修改啊!如果区块链的数据格式只是应用在单机环境或者一个中心化的服务器上,那确实是,毕竟自己对自己的数据拥有完全支配的权利。然而,事实上并不是如此。 事实上,区块链是一整套技术组合的代表,在这一组技术的配合下,才能显示区块链技术的优点。无论是什么样的区块链系统,不管是比特币、莱特币、以太坊还是其他的,核心结构和工作原理都是相同的。我们来看看最基本的技术组合有哪些吧。 如上图所示,这是区块链系统结构的基本组成,各种系统本质上都是在这个经典结构之上直接实现或者扩展实现。这些零部件装配在一起,组成了一个区块链软件,运行起来后就成为一个节点,多个这样的节点在不同的计算机上运行起来,就组成了一个网络。在这个网络中没个节点都是平等的,大家相互为对方提供服务,这种网络称为点对点的“对等网络”。下面我们来依次解释一下 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.密码算法 密码算法的应用在区块链系统中很巧妙,应用点也很多,我在这里不详细介绍密码的原理,就从几个很关键的应用来介绍一下。 首先我们回顾下区块链账本格式。通过上述讲解我们知道,区块链账本就是一个链接起来的一个个区块。到底是通过什么技术来链接的呢?学过数据结构的同学都知道,数据结构中有一种变量叫指针(Java中没有指针概念)它是可以用来指向某个数据地址的。区块之间的连接,往往不是靠数据地址来关联的,而是靠一种叫做哈希值的数据来关联,什么是哈希值?这是通过密码算法中的哈希算法计算得出的。哈希算法可以通过一段数据计算得出一段摘要字符串,这种摘要字符串与原始数据是唯一对应的。什么意思呢?如果对原始数据进行修改,哪怕只是一点点的修改,那么计算出来的哈希值都会发生完全的变化。区块链账本对每个区块都会计算出一个哈希值,称为区块哈希。通过区块哈希来串联区块。这有一个很好的作用就是,如果有人篡改了中间的某一个区块数据,那么后面的区块就都要进行修改,这个时候并不是简单地修改一下后面区块地址指向就能结束的。由于后面的区块是通过区块哈希来指向的,只要前面的区块发生改动,这个区块哈希就无效了,就指不到正确的区块了。 当然密码算法在区块链中的应用远不止这些,比如通过密码算法来创建账户地址、签名交易事务等等,这些应用在后面会介绍。 4.脚本系统 脚本系统在区块链中是一个相对抽象的概念,也是一个及其重要的功能,可以说是区块系统之所以能形成一个价值的网络,依靠的就是脚本系统。它就像一个发动机一样,驱动着区块链系统不断地进行各种数据的收发。所谓脚本,就是指一组程序规则。在区块链中有些程序的规则是固定的,比如在比特币系统中,只能进行比特币的发送与接收,这个与发送与接收的过程就是通过实现在比特币中的一组脚本程序来完成的。而有些系统是允许用户自行编写一组程序规则的,编写好后可以部署到区块链账本中,这就可以扩展区块链系统的功能,比如以太坊就是通过实现一套可以自定义功能的脚本系统,进而实现了只能合约的功能。 脚本系统使得在区块链中可以实现各种各样的业务功能。本来大家只是通过区块链来财务记账,通过脚本系统,大家可以使用区块来记录各种各样的数据,比如订单、众筹账户、物流信息、供应链信息等,这些数据一旦可以记录到区块链上,那么区块链的优点就能充分发挥出来。有关脚本系统的具体使用和开发,我后面会讲解。 5.网络路由 这个功能模块比较简单。区块链系统是一个分布式的网络,这些网络中的节点如何来彼此进行通信呢?依靠的就是网络路由功能。在分布式的网路结构中,不存在一个指定的服务器,大家没办法通过一个服务器来直接交换彼此的身份信息,就只能依靠彼此联系并传播信息。在区块链系统中,这个功能一般会定义成一种协议,称为“节点发现协议”。 除了要发现节点外,更重要的一个功能就是同步数据。节点要保持自己账本数据是最新的,就必须时时更新自己的数据。从哪更新呢?既然没有服务器下载下来,那就通过邻近的节点了。通过向邻近节点发送数据请求来获得最新的数据,节点彼此都充当服务者和被服务者,通过这种方式,网路中的每个节点都会在某一个时刻达成数据上的一致。 网络路由可以说是区块链系统的触角,通过大量的触角将每个节点连入网络,从而形成一个功能强大的区块链共识网络。 |