由浅及深了解区块链之:(10)带你了解区块头部信息

区块头部信息如下所示

Created with Raphaël 2.2.0 父哈希值 merkleroot target nonce time data 交易记录 时间戳标志 矿工输入的随机数 对本个区块生成哈希值的阈值 对主体data交易记录的哈希值 yes no yes no yes no yes no no

如上图所示,这是比特区块链中矿工所挖的区块信息。
**值得注意的是,区块自己的哈希值不会存储在区块头部。**无论是区块在网络上传输,还是区块做为节点存储的信息被永久存储在一个完整的节点山,它都不会存储在区块上上面,节点在接受区块时会直接计算区块的哈希值,然后区块的哈希值会作为区块链的元数据存储在专门的数据库表中,以提供给人们快速的可视化视图服务
最前面是父区块的哈希值:区块每十分钟产生一块,矿工需要在有限的时间内尽可能的挖出一个区块,当产生一个区块后,相应的节点将区块信息广播,收到该信息的矿工立即停止手上的挖矿工作,将这个区块的信息记录下来,接着将该区块的哈希值放到自己的候选区块头部(矿工每次挖矿都会将相应的交易记录放在候选区块,挖矿成功后候选区块就能变成去区块链的一个有效区块),然后矿工就比对候选区块和父区块的交易记录,将重复的交易记录删除,接下来赶紧投入到下一区块的挖掘之中。父区块的哈希值是计算子区块哈希值的原材料。并且每个子区块记录着父辈区块的哈希值信息,一方面可以通过某一个区块追溯到它前面所有的区块链交易信息,溯源效果好,另一方面,只要某一个区块产生变动,那么这个区块后面所有的区块的哈希值都会改变,除非将它后面所有的区块都进行修改,具有账本不可修改或修改代价无法承受的特性。
接着是Merkleroot树我在上节中讲过,该树是全部交易记录data的数字指纹,唯一标志了区块主体部分全部的交易记录,子要里面的任何交易记录修改了,那么这个Merkleroot数字指纹一定会变化,进而影响该区块的哈希值,以至于后面所有的哈希值都改变了。
Target指代当前区块所得哈希值的阈值。,也就是说,当前这个区块的哈希值必须小于这个Target所代表的值。Target 值的格式为指数-系数,指数占1个字节,系数占3个字节。例如Target的值如下:0x0200000A
这个数所表示尾数为10,指数为2,所以表示的阈值为102=100.所表示的是这个区块的哈希值要小于100才可以成立。
nonce初始值为0,是用户输入试探的随机数,是工作量证明算法的关键,我们来看一下,当前区块的哈希值是等于对整个区块头进行哈希运算的哈希值,所以矿工在计算哈希值前先用将交易记录进行哈希产生merkleroot哈希值,接着对着nonce进行不间断的尝试性输入,直到输入的hash值小于Target指向的阈值。为什么要不间断性的尝试输入呢,因为哈希运算是单向运算,由原始值可以推导出哈希值,反之则不能。过程流程如下所示。

Created with Raphaël 2.2.0 将父区块的哈希值记录下来 计算交易记录产生的merkleroot哈希值 计算Target的阈值t 随机输入nonce,计算整个区块头的哈希值s 检查s是否小于t 将该区块打包发送到各网络节点上去 yes no

例如:假设矿工a计算一次区块头部的哈希值用时1s,然后该区块的哈希值(哈希值占32字节,256比特)要满足前20位为0方可变成有效区块(000000000000000000000.。。。。。。),每次随机输入一个nonce值,那么输入成功的概率为(1/2)20,这样来说根据统计学来说,要输入220次nonce方可成功,可以计算的是,a矿工在十分钟内可输入1*60 *10=600次,约占总次数的600/220=0.3,所以说a约有0.3的概率在十分钟之内计算出符合条件的哈希值,那么假如存在100个像a一样的矿工呢,那么差不多区块一出来就被挖了,这样的话就不符合10分钟内产生一个区块的速度了。下面接着为你解答矿工的挖矿机制。
事实上,现实中矿工的计算速度远比这要大得多,但是区块哈希值的计算难度也远比这要大得多。下面结合一个具体的实例来进行说明:

假设Target的字段信息如下:0x06000400
计算一下它的阈值:06代表指数6,000400代表系数2^10约等于1000
所以target的的阈值=(1000)^6=10^18
假设a的计算机每秒计算哈希值为10亿次,解下来可以计算他的产出正确区块的概率
10^10 *x=10^18  =>x=10^8秒
大概马不停蹄的挖矿需要3年的时间。
然后还有面临的风险是:随着时间的增加,挖矿的计算量更加庞大,且在a挖出区块的同时,
很多人也许在他前面或者几乎同时挖出符合条件的区块,这时候又要进行区块链主链的竞争等。。。
所以独狼式挖矿是伴随着高风险的,因此很多人为了平坦风险,矿工们会组成大大小小的矿池,
收益大家采取公平规则进行分配(具体分配细则看前面章节)。

关键是区块链每10分钟产生一个区块,如果总的矿池的工作量/计算力大于所设置的哈希值阈值,那么产生区块的速度就跟不上计算区块的速度,区块链机制为了应对这种情况的发生,设置了可调节的难度目标,也就是同步区块矿池的工作量来增大或减小Target字段的哈希阈值。
假如在实际生活中,随着挖矿设备的不断升级,矿池大概每5分钟左右就能够计算出一个区块的值,这个时候区块链将会调整Target的阈值,使得该区块的哈希值的计算难度变为原来的两倍,由于区块内产生区块的间隔并不是十分稳定的,区块链规定了每2016个区块才更新一个新的区块阈值,且为了防止难度系数调整过快,区块链设定了调节因子最大为4(也就是难度为4倍),,所以在比特币区块链中,如果由于狂矿池算力发生突变式提升,导致了Target阈值理论上应该调节为8倍,但实际上只能够调节为4倍,下一个调节要等在2016块区块后(也就是14天以后),直到调节稳定。

Created with Raphaël 2.2.0 矿池算力计算次数a Target设定的阈值计算次数b 4b<a Target难度系数直接调整为最大的4倍,14天后再进行调节 调整为一个合适的难度倍数 yes no

time字段信息
时间戳,唯一标志了该交易在此时间的存在。在整个区块链上可以看到一条有序的时间戳链条,由于每个区块的哈希值计算的原材料都有该时间戳信息,每一个随后的哈希块对前一个哈希块进行增强,所以又有维持了该时间戳的不可修改性。
这里还要考虑一个另外的情况,nonce的值只有4个字节(也就是32比特),也就是可以可以输入232
约为4* 109次,现在的好一点的采矿机计算次数都是万亿次/秒,那nonce的数值不是一下子就用完了吗?当然有相应的解决方案。就是增加或者删除候选区块中的一些交易记录,然后再重新输入nonce随机数,这样的话就又可以重新产生新的哈希值了。因为哈希值的生成是不可控的,随意改动一些数据,哈希值将会完全不同的改变,这也正是哈希函数奇妙的地方之一。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值