区块链到底是什么

作者: 闰土的万事屋 | 来源:发表于2019-11-16 13:36 被阅读0次

    十年前,中本聪提出比特币交易体系,引起了世界范围的热烈反响、催生了比特币狂欢。

    近期,区块链热度再次引爆,作为程序员有必要对其进行了解。

    这篇文章将阐述我对区块链与比特币的理解。

    先总结一下:区块链是一种去中心化的,数据只能增加和查询、不能删除、不能修改的分布式存储技术;而比特币是基于区块链技术实现的一种加密数字货币。

    一点历史细节:比特币与区块链同时出现,但当时发明人并没提出区块链的概念,人们从比特币的技术中单独提出了区块链的概念。

    另外的,要理解区块链,先明白什么是哈希。

    所谓哈希(hash)是一种密码学算法的名称,可以理解为一个函数。该函数接受任意长度的输入,但始终给出固定长度的输出(输出结果为一个数值)。且,相同的输入永远会得到相同的输出。不同的输入,却会得到不同的输出(极小概率会重复,可忽略不计)。即便输入的内容只有一点点不同,其输出结果也会变得完全不一样。

    接下来先阐述什么是区块链。

    所谓区块链,即是由区块构成的链,先理解区块,再理解链。

    区块,是一种用来存储数据的最小单元,它分为区块头和区块体。

    区块

    区块头存放着一些描述区块的基本信息,比如:上一个区块头的哈希值、本区块体的哈希值、创建时间、计算难度等等;区块体则存储着真正的数据。

    区块通常有一些大小限制,例如比特币限制区块最大尺寸为1MB。

    每一个区块,都有一个唯一的哈希值与之对应。因此,只要知道一个哈希值就可以找到与之对应的区块。

    同时,每一个区块都包含了上一个区块的哈希值,所以任意区块都可以通过其包含的上一个区块的哈希值查找到上一个区块。

    这样就形成了一种环环相扣的逻辑关系(参考单向链表),这就是区块链

    区块之间通过哈希值连在一起形成链

    明白了区块链的基本逻辑,再来更深入的理解一些核心问题。

    区块链是如何实现去中心化的?

    既然是分布式存储系统,那么必然是由多个分散的计算机通过网络连接在一起共同组成。

    每一台连接在区块链网络中的计算机都可以被称之为节点

    而区块则存储在节点上。

    节点与节点相连,并相互传递信息(即Peer to Peer),每一个节点的地位都是平等的。

    同时,协议规定每一个节点都要完整的存储所有区块,一旦有新的区块被创建,节点的首要任务就是将该区块同步至本地。

    因此,在网络中任意一个节点上都可以获取到完整的数据,由此实现了去中心化。

    区块是在什么时候、由谁、通过什么方式创建的?

    当有数据需要存储时,先将数据发送至任意节点。节点将其加入待存储列表,并将该数据广播到与自己相连的其他节点上。

    数据不会立即存储到链上,而是要在节点之间进行一番较量,只有获胜者才能得到存储数据的权力。

    数据存储的过程就是区块创建的过程。

    具体来说,节点从链上获取最后一个区块,并取得该区块的区块头哈希值。如果链存在分支,则从最长的链条上获取最后一个区块。

    然后,从自己的待存储列表中获取一定量的数据作为区块体,将上一个区块头的哈希值、本区块体的哈希值、时间戳、难度等信息作为区块头,创建出一个区块。

    一旦节点创建了区块,它就将区块的信息广播到与之相连的其他节点上。其他节点收到广播后,将新区块同步到本地,并广播给其它节点。

    之后,所有收到广播的节点都以新的区块为最后一个块,并基于该块继续创建新的区块。

    流程并没有问题,但是创建区块的过程并没有上述这么容易。

    哈希值的计算速度很快,如果不加限制,区块很快就可以被创建出来,这会导致节点花费大量的时间进行区块同步(因为节点必须基于最新的区块创建下一个区块)。

    为了解决这一问题,区块链引入了工作量证明机制(Proof of work ,简称POW),用来控制区块的创建速度,同时也使用这个机制来保证数据的不可篡改。

    何为工作量证明?

    区块链协议规定了一个约束条件,想要网络中的节点承认某个区块是有效区块,则该区块必须满足协议规定的约束条件。

    一种实现该约束的方案是:要求一个区块的哈希值前面由x个0开始,找到一个由指定数目的0开始的哈希值并不容易,因为哈希值的结果是不可预知的,且无法根据结果反推原文,因此节点必须采用穷举的方式反复计算。

    前文关于哈希算法的介绍表明,一个固定的输入会得到一个固定的哈希值,为了让区块的哈希值不断变化,又在区块头中引入了一个变量,即一个随机数(Nonce),使得区块的哈希值可以发生变化。

    节点不断的改变Nonce的值,以期望自己这个区块的哈希值能够满足协议规定的约束条件(即前面有x个0)。这个过程,必须经过无数次的尝试,整个过程花费的计算量,则为工作量,符合条件的Nonce值,就是工作量的证明

    只有节点找到某个Nonce值,使得区块的哈希结果能够满足协议规定的约束条件,才能让该区块得到其他节点的承认。

    但是,找到Nonce值并不代表区块能够被加入链中。

    在新的区块被创建出来之前,网络中所有的节点都在努力的创建同一个块。所以有极大的概率多个节点同时创建出新的块,并广播到网络上。其他节点在接收到多个新的区块时,会采用链条最长的那个区块或者创建时间最早的那个区块。而没有被采纳的区块则会被丢弃,原先创建出该区块的节点不得不放弃之前的区块,并从待存储列表中剔除已被其他区块存储的数据,然后基于最新的区块重新开始计算。

    节点说:我太难了……

    是的,节点太难了。疯狂计算总算创建了一个区块,到头来却仍然有可能是一场空。

    不过,区块链也正是依靠这种机制保证了链上的数据不可篡改。如果有节点修改了已经上链的区块,那么区块对应的哈希值就会发生变化,然后该区块及链接在该区块以后的所有区块都会脱链,为了将后面的区块重新上链,则必须将后面所有区块的哈希值重新计算一遍。因为其他节点都只认最长的链,那么节点就必须比其他节点更快的创建区块,以此保证被自己修改的链成为最长的链。而在工作量证明的机制下,除非该节点掌握了全网51%以上的算力才有可能实现,而这个要求本身就是不现实的。这就保证了数据不可篡改,因为就算你改了,其他节点也不会认可。

    没有人能办得到

    那么,既然记录数据这么困难(创建区块),为什么还有节点愿意参与进来记录数据呢(任何人都可以加入公链)?

    这就涉及到比特币了。

    本来这篇文章想和比特币一起写,但是本文已经够长了,就放到下一篇吧。

    如果你想知道比特币到底是什么,记得关注和分享哦~

    注:公链,即在互联网上公开,任何人随时都可以加入或退出的区块链。

    相关文章

      网友评论

        本文标题:区块链到底是什么

        本文链接:https://www.haomeiwen.com/subject/qbryictx.html