第四期 挖矿的相关算法(2)
卡酷少Wechat:13260325501
看过(1)篇,相信你一定对挖矿的机制有了一点了解。那么本篇,我们来一起看一下挖矿中算法。
下面的文章中,如果在文章的前半篇你遇到了不理解的词汇,也许在文章的后半段就会给出答案。最后关于不理解的部分欢迎大家在文章下面留言,我会及时给出答复。
区块链的区块到底是什么?
- 挖矿是为了生成一个区块,那么区块到底是什么?区块的作用又是什么?一个区块又包含了哪些信息呢?
- 简单理解的话,一个区块可以理解为一个结构体。我们知道结构体可以存储不同类型的信息,这些信息可以是字符串,可以是数字,也可以是日期。那一个区块里包含了哪些信息呢?这里我们给出一张图来,先来了解一下区块信息有几大类。
- 图1
- 如图一个区块中信息按类别划分,主要分为的这四大类,这点大家只做概念性了解即可。真正有作用于生成区块的信息,主要是区块头中这几项:
- index(记录当前是第几个区块)
- current hash(当前哈希值)
- previous hash(承接的上一区块的哈希值,可保证区块按时间串联)
- timestamp(时间戳,记录该区块的生成时间)
- data(交易详情,详细记录了每笔交易的转出方和收入方,金额及数字签名)
- nounce(随机数,即全网矿工一起pk计算的的,能满足哈希难度要求的答案)
- 其中希望大家先对nounce值有个印象。这个nounce值不仅与挖矿有关,也在之后的代码实现中有非常重要的身份。
- 下图给出一个简单的列表:
- 图2
什么是哈希和哈希值?
- 为理解挖矿的代码机制,首先解决几个概念。第一个就是“哈希”。
- 在上一篇挖矿中我们提到了算力。也说到算力就是一台矿机每秒钟能做多少次哈希碰撞。那么,什么是哈希,什么又是哈希碰撞呢?
- 简单理解的话,哈希就是一个函数。哈希碰撞的本质,就是cpu在随机穷举数值的过程中,不断寻找能够生成匹配现阶段比特币“难度”条件的数值。一旦找到这个数值,那么就产生了一次成功的哈希碰撞。
- 现在你一定很好奇哈希是一个什么样的值呢?我们通过 ==SHA256== hash算法来了解一下。
- 这里提供一个网址,感兴趣的同学可以跟我一起做一些测试。
- hello
- helloworld
- hello world
- hello,world
- 测试之后,我们可以发现,哈希函数有一些非常独特的特征:
- 任意内容都可以生成哈希值。
- 哈希值为十六进制表示的数,且长度固定。
- 不同的内容生成不同的哈希值。哪怕非常相似的内容生成的值也完全不同,且无规律可循。
- 相同的内容每次都会输出相同的哈希值。
- 通过对比"hello","helloworld",“hello world”和“hello,world”的输出结果,可以验证验证我们对于哈希算法的总结。感兴趣的同学可以再验证别的数值,你会发现,无论多么微小的差别,都会导致哈希值完全无迹可寻的改变。
- 也正是哈希值的这些特点,赋予了其加密信息时更高的安全性。
有关挖矿的“难度”
- 最后一个概念就是挖矿的难度。这里的难度,由浅及深,我们先举个例子来理解它的原理。
- 如图所示,比如我们将一个5位数进行排列组合,分个十百千万位。假如第一个排列组合,我指定万位和千位都是5,其他位数不限;第二个排列组合,我只指定万位为5,那么得到谁的几率大,得到谁的几率小呢?
- ——答案是第一个概率小,第二个概率大。因为被限定的个数越多,其他可选的可能性也就越少了。
- 同理,挖矿就是去匹配已经被指定了位数的哈希值。而挖矿的“难度”,就是由被指定位数的多少来决定的。这和被指定的是十六进制下的那个数无关。
- 如上图框内所示,当哈希值难度设定了前四位为“0”的时候,只有当匹配上前四位为“0”的时候,才产生了一次成功的哈希碰撞。如果设定的“0”的个数越多,那么哈希成功的难度也越大,挖矿的难度也就越大。
- 在比特币最开始的时候,难度是很小的,只有第一位为“0”及碰撞成功。那是的挖矿是非常简单的。而现在随着全网算力的增加,挖矿的难度也大大,现在的哈希难度已经是十几个“0”了。
有疑问加站长微信联系(非本文作者)