2

第四期 挖矿的相关算法(2)

卡酷少

Wechat:13260325501


看过(1)篇,相信你一定对挖矿的机制有了一点了解。那么本篇,我们来一起看一下挖矿中涉及的算法。

在本篇文章中,如果在前半篇你遇到了不理解的词汇,也许在文章的后半段就会给出答案。另外本篇主要是零散知识点的介绍,逻辑上不会有那么强。最后关于不理解的部分欢迎大家在文章下面留言,我会及时给出答复。

区块链的区块到底是什么?
  • 挖矿是为了生成一个区块,那么区块到底是什么?区块的作用又是什么?一个区块又包含了哪些信息呢?
  • 简单理解的话,一个区块可以理解为一个结构体。我们知道结构体可以存储不同类型的信息,这些信息可以是字符串,可以是数字,也可以是日期。那一个区块里包含了哪些信息呢?这里我们给出一张图来,先来了解一下区块信息有哪几大类。
  • 图1

image

如图一个区块中信息按类别划分,主要分为的这四大类,这点大家做为了解即可。其中区块头包含了如下信息,这些信息也是真正有作用于生成区块的信息,我们来列举其中的重要项:

  • index(记录当前是第几个区块)
  • current hash(当前哈希值)
  • previous hash(承接的上一区块的哈希值,可保证区块按时间串联)
  • timestamp(时间戳,记录该区块的生成时间)
  • data(交易详情,详细记录了每笔交易的转出方和收入方,金额及数字签名)
  • nounce(随机数,即全网矿工一起pk计算的的,能满足哈希难度要求的答案)

其中希望大家先对nounce值有个印象。这个nounce值不仅与挖矿有关,也在之后的代码实现中有非常重要的身份。

  • 下图给出一个简单的列表:
  • 图2

image

什么是哈希和哈希值?
  • 为理解挖矿的代码机制,首先解决几个概念。第一个就是“哈希”。
  • 在上一篇挖矿中我们提到了算力。也说到算力就是一台矿机每秒钟能做多少次哈希碰撞。那么,什么是哈希,什么又是哈希碰撞呢?
  • 简单理解的话,哈希就是一个函数。哈希碰撞的本质,就是cpu在随机穷举数值的过程中,不断寻找能够生成匹配现阶段比特币“难度”条件的数值。一旦找到这个数值,那么就产生了一次成功的哈希碰撞。
  • 现在你一定很好奇哈希是一个什么样的值呢?我们通过hash算法 ==SHA256== 来测试一下。这里提供一个网址,感兴趣的同学可以跟我一起做一些测试。

link

  • hello

image

  • helloworld

image

  • hello world

image

  • hello,world

image

  • 测试之后,我们可以发现,哈希函数有一些非常独特的特征:
  1. 任意内容都可以生成哈希值。
  2. 哈希值为十六进制表示的数,且长度固定。
  3. 不同的内容生成不同的哈希值。哪怕非常相似的内容生成的值也完全不同,且无规律可循。
  4. 相同的内容每次都会输出相同的哈希值。
  • 通过对比"hello","helloworld",“hello world”和“hello,world”的输出结果,可以验证验证我们对于哈希算法的总结。感兴趣的同学可以再验证别的数值,你会发现,无论多么微小的差别,都会导致哈希值完全无迹可寻的改变。
  • 也正是哈希值的这些特点,赋予了其加密信息时更高的安全性。比如“公钥”“私钥”,以后我们会做出介绍。
有关挖矿的“难度”
  • 最后一个概念就是挖矿的难度。这里的难度,由浅及深,我们先举个例子来理解它的原理。

image

  • 如图所示,比如我们将一个5位数进行排列组合,分个十百千万位。假如第一个排列组合,我指定万位和千位都是5,其他位数不限;第二个排列组合,我只指定万位为5,那么得到谁的几率大,得到谁的几率小呢?
  • ——答案是第一个概率小,第二个概率大。因为被限定的个数越多,其他可选的可能性也就越少了。
  • 同理,挖矿就是去匹配已经被指定了位数的哈希值。而挖矿的“难度”,就是由被指定位数的多少来决定的。这和被指定的是十六进制下的哪个数无关。

image

  • 如上图框内所示,当哈希值难度设定了前四位为“0”的时候,只有当匹配上前四位为“0”的时候,才产生了一次成功的哈希碰撞。如果设定的“0”的个数越多,那么哈希成功的难度也越大,挖矿的难度也就越大。
  • 在比特币最开始的时候,难度是很小的,只有第一位为“0”及碰撞成功。那是的挖矿是非常简单的。而现在随着全网算力的增加,挖矿的难度也大大,现在的哈希难度已经是十几个“0”了。哈希的难度的设定也不是人为操作的,区块链系统会根据当前全网的算力做出调整,将难度保持在能够每10分钟生成一个区块的程度。

kakushao
26 声望12 粉丝