比特币系统的底层采用的是区块链的技术架构,一个完整的区块链系统包含了众多的技术,这些技术包括:
用于存储数据的数据区块结构,以及数据签名、时间戳等技术,
有用于通信的P2P网络技术,还有共识算法、挖矿和工作量证明机制等,
还有匿名交易机制、UTXO、Merkle树、双花等关键技术。
这一章将针对这些技术仅做一些简单的介绍,后面会安排单独的章节进行详细介绍。
区块链本身实际上是由大量的区块链接而成的。如图所示,除了第一个区块外,每一个区块都会存储上一个区块的一个指针,于是就形成了区块链。
其中有两个区块比较特殊,第一个区块,这个区块称之为创世块,相信不用解释,只通过这个区块的名字也能理想这个区块对于区块链的重要性,另外一个区块就是将要链接到区块链尾部的区块,这个区块是通过挖矿产生的区块,而通过挖矿如何才能产生区块,我们后续再进行详细介绍。
每一个区块又分为两部分,区块头和区块体,百这个存储上一个区块的指针就存储在区块头中,这个指针是由上一个区块的区块头通过hash运算生成的一个hash值。
在进行更为详细的介绍之前,我们先介绍一下hash函数。
哈希函数是密码学中非常重要的一种数学函数,哈希函数(Hash Function),也称为散列函数,它的最主要的作用是可以在有限合理的时间内,将任意长度的消息压缩为固定长度的二进制串,通过hash函数运算输出的值称之为哈希值,也称为散列值。
简单来说,任意长度的字符串,只要通过特定哈希函数的计算,生成的必定是一个固定长度的hash值,对于长度的选择取决于选择哪类哈希函数。
Hash函数是一个比较大的函数家族,其中最典型的两类hash函数,一类是用于消息摘要的MD5算法,另外一类是SHA安全散列算法,而区块链中采用的是SHA256,它的输出是256位的hash值。
哈希函数有几个非常重要的特点:
第一:高灵敏性。任意字符串,只要发生了变化,哪怕是一个比特位的变化,最终计算出来的hash值也是不同的。
第二:易压缩。任意长度的字符串,在经过同一种hash函数处理后,得到的升序是完全相同的。
第三:效率高。对于长充为N的字符串,计算哈希值的时间复杂度是O(n),也就是说哈希函数的计算时间是与字符串长度线性相关的。
第三:单向性。这是哈希函数非常重要的一个特点。对于已经计算出来的hash值,在计算上具有不可逆性。不可逆是指:不能通过计算出来的hash值反向计算出输入的字符串目标值。而计算上不可逆,是指通过现有的计算能力是无法完成逆向计算的。这也保证了哈希函数的安全性。
第四:抗碰撞性。所有的碰撞性是指,不存在两个不同的文本串,通过相同的hash函数计算之后,得到相同的hash值。但是这种情况只是理想上的hash函数,在实际情况中,会发生hash碰撞,也就是说两个不同的文本串,经过相同的hash函数计算之后,产生的相同的hash值,而我们所介绍的区块链挖矿原理,就是利用了hash碰撞的存在,关于挖矿的内容,后面会再进行介绍。
在了解了hash函数之后,我们继续来介绍区块链中的区块。
正如刚才提到的,区块通过链接的方式组成了区块链,每一个区块的区块头中都存储有上一个区块头的hash值信息,而这个hash值就是将上一个区块的区块头信息进行hash运算之后得到的。
在一个区块的区块头中共包含了六部分信息,分别是版本号、前一个区块的头部哈希值、Merkle根的hash值、时间戳、难度值和一个随机值Nonce,这六部分内容相加之后,进行两次SHA256hash运算就得到了当前区块区块头的hash值。对于这六部分内容在区块中的作用,后面会有专门的章节进行详细的介绍。
区块中的另外一部分是区块体,比特币的交易记录就存储在区块体中,同样的,关于区块体的详细信息也会在后面章节进行详细介绍。
在比特币系统中,大约每10分钟,就会通过挖矿的方式产生一个新的区块。
为了比特币系统的安全,每一个区块的容量被限制在1M以内(后面会有专门的章节介绍比特币的安全问题)。
正如刚才所述,任何人都可以查询比特币系统中的交易,目前有很多的网站都提供了在线查询区块信息的功能。如图所示,是在https://insight.bitpay.com/网站上查询的某个区块的信息。
在Summary部分,提供了关于这个区块的一些描述信息,包括当前区块包含的交易数量,区块高度,时间戳,前一个区块的hash值、困难值、随机数等。但是有一个信息需要注意一下,就是是由谁挖取的此区块,可以看到是由BTCC矿池挖取的,需要注意的是,矿池的信息肯定不会存储在区块中,这只是网站提供的额外信息而已。
在Transactions部分,则提供了详细的比特币交易信息。在截图中,我只截取了第一个交易,因为这个交易至关重要,因为这个交易解释了比特币是如何产生。
在前面我们已经提到过,区块是由矿工挖矿产生的。那么接下来,我来解释两个问题:区块是如何产生的以及比特币是如何产生的。
对于比特币的挖矿,需要提供三要素:
第一要素是怎么挖,也就是挖矿的算法:挖矿算法本质上是hash算法,也就是SHA256的哈希算法。这部分我们已经介绍过。
第二要素是:挖哪?也就是Hash函数的输入值是什么?这个输入值就是区块中区块头的六部分内容。
第三要素是:hash函数计算出来的哈希值,满足一个什么样的条件才算是挖到了矿,这个判断依据就是我们前面提到的hash碰撞。
所以你会发现,所谓的挖矿原来就是这么简单,只要通过不断的hash运算,找到符合目标的hash值就可以了。
接下来,我们来稍微详细的介绍一下这个过程。
如图所示,是区块头中的六部分内容,而这六部分内容是挖矿中hash函数的输入值,这六部分内容又可以分为两类:其中标红的三部分是固定不变的——版本号、前一个区块的头部hash值、难度值。而剩下的三部分则是允许矿工进行调整的。而矿工通过调整这三部分内容,尤其是其中的随机数,就可以不断的提供不同的输入值,比特币的每一次挖矿就是对这80个字节连续进行两次SHA256运算,通过hash运算产生新的hash值来判断hash值是否满足全网的目标值,如果一旦满足了目标值,说明这个矿工就挖到了矿,也就拥有了此区块的交易记帐权。
一旦某个矿工拥有了此区块的交易记帐权,就会得到比特币系统奖励的一定数量的比特币,而系统奖励的比特币就可以由此矿工通过交易记录到自己的比特币钱包中,这也就解释了比特币是如何产生。比特币系统在诞生之初,每挖到一个区块,奖励50个比特币,同时比特币系统规定,每四年的奖励减半,所以现在每挖到一个区块,也只能奖励不到13个比特币了。
另外,还有一个非常重要的问题,一个矿工挖到了区块,需要将产生的区块快速的广播到比特币系统中的其他节点,以便其他节点能对其进行验证,以防造假,只有经过验证后才能最终获利此区块的交易记帐权。
所以可以看出,比特币系统采用的是矿工竞争区块记帐权(也就是将挖到的区块加入到区块链主链的权利)的方式来解决挖矿和记帐的问题,而这个竞争机制就称之为工作量证明机制。
通过挖矿的过程可以看出,挖矿节点的计算能力直接制约着挖到区块的机率,由于比特币带来的巨大利益驱动,挖矿技术也得到了快速的发展,从最初的采用CPU挖矿,再到GPU挖矿,以及到如今的专业矿池挖矿,普通算力的个人或者节点很难再挖到区块。
需要说明的是,在挖矿过程中,很有可能会出现两个矿工同时挖出两个新区块的情况,因为两个新的区块都满足要求,所以都可以链接到上一个区块后,所以这时候区块链的主链就会出现“分叉”。而比特币系统并不会马上决定哪一个区块做为最终的主链区块,而是约定后续的矿工总是选择累计工作量证明最大的区块链。因此,当主链出现分叉后,后续的矿工会通过计算和比较,将挖到的新区块链接到工作量证明最大的分叉链上,形成一个更长的新主链,并且自动抛弃分叉时产生的短链,从而来解决分叉的问题。
--------------------------------------待续!!!!!!!!!!!!!!!!!!!
领取专属 10元无门槛券
私享最新 技术干货