关于比特币区块的生成以及工作流程,我们都知道是这样的:
一群人参与区块的计算,其中最先计算出区块哈希值的人,将自己算得的哈希值广播发送给其他人。其他人在自己的矿机上进行验证,如果数值正确,会将区块链接到上一个区块,同时最先计算出哈希的那个人获得一定数量的比特币奖励。
我想追问三个问题:
1.如果是算力比不过别人,为什么不提前开始计算下一个区块呢?
2.如果上一个区块的随机数是0X1234567,为什么不直接接着0X1234567算下去?
3.既然矿工是为了寻找一个随机数,那有没有矿工在1分钟左右就找到那个随机数呢?
如果你可以回答出来,可以关闭这个页面了。真的,时间太过宝贵!
比特币的白皮书晦涩难懂,读起来如同嚼蜡。我试着用一些通俗的语言和例子,剖析一个比特币区块的来源,也就是工作量证明背后的原理。当然,还是需要你用大概10分钟的耐心来阅读,才能更加清晰的理解关于区块链的这个重要知识点。至少,出去装逼不会被怼。
开始,我们先从区块的结构来理解:
我们常说一个区块就像一个盒子,里面装的是一条条交易信息。于是,在大部人的想象里面,区块链就像是一排被加工好的,有着前后顺序的盒子!但是,我们都看到过的货物纸盒都会有一个标签,而在区块链的世界这个标签就叫做“区块头”。
我们在BTC.com 在搜索框输入10000,跳出来的页面就是编号10000的区块详情,注意看!摘要,就是我们想象中的“区块头”包含的信息。交易,就是的转账交易记录。
好的,恭喜你!以前你知道的“区块就是一个盒子”,现在你知道了“区块就是贴着标签的盒子”,标签=区块头。
上图红框中Nonce=0x7fe05d3a,对的,它就是传说中的随机数,看上去没那么复杂,但是为何会这么难找呢?
实际上,随机数不是我们要找的,我们是要“通过”这个随机数算得右边的区块哈希(准确的说,应该是叫做区块头哈希,因为哈希实际上和交易信息没有太大关系)
这才是我们最终要得到的真正结果,随机数只是计算哈希时候一个要素而已,而已,而已!
矿工计算时候需要用的数据有这些:
A.上一区块的哈希
B.Merkel树哈希
C.时间戳
D.难度目标值
E.Nonce随机数
这几个概念需要单独解释:
A.上一区块的哈希
现在是打包编号10000区块,那么上一区块编号就是9999,上图可以看到,上一区块的哈希是
B.Merkel树哈希
当前区块包含的所有交易信息的索引,
这里有个不太相关的知识点需要讲一下:尽管单条交易信息的哈希也是32字节,可Merkel树哈希值始终都是32字节,我们可以把它当做一个交易信息的索引即可。
打个不太恰当的比方,我们可以把上面的结构想象成一个祖谱。我们最上面的树根是“孙子”,第二排就是“爸爸”“妈妈”,第三排是”爷爷““奶奶””外公“”外婆“。看!我们只需要通过”孙子“这两个2个字就可以找到另外两个字,而不需要把所有的称呼都记录在Merkel树根,这样的好处就是不会导致数据过大,同时也方便检索每个交易!
认真仔细又好学的你,一定会发现为什么第三排的第三个和第四个一样呢?会不会是我弄重复了?并不是,Merkel数是遵循偶数原则的,当区块包含的数量为单数时,Merkel数会自动的复制一个交易记录的代号出来。所以就有了两个“交易C”
C.时间戳
时间戳就是将当前的时间进行哈希计算后的字符,这个好理解,不多说。
D.难度目标值
还是拿掷骰子打比方,两个骰子。
最开始我们只需要投小于12的点数即可,那很简单。如果比特币网络将难度值调整到2。那我们要投掷到的几率就变小,要投掷的次数也就增加了,相对的难度就肯定增加了嘛!
至于这个数值背后的计算方式,我在这里就不细讲了。我们可以想象难度值就是一个水龙头,它是控制比特币出块速度的一个数值就好了。通常情况下,它规则就是不停变化!矿工需要计算的哈希值,必须要小于这个难度值,区块才能被认可。
到了这里,我需要提醒一下,矿工在创建区块时候,必须要有【上一区块哈希值】(创世区块除外)【Merkel交易引】【时间戳】【难度目标值】!没有上一区块的哈希就像一辆没有汽油的汽车一样,无法启动!
E.Nonce随机数
我们来看看0x7fe05d3a,这个数貌似不太难。我们以彩票来做类比
彩票的数字包括:
1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36
哈希数值包括:
1.2.3.4.5.6.7.8.9.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z
是双色球的中间概率,找到一个区块所需要的随机数哈希值,比中一组500万的双色球几率还要低。我们只需要把它简单的想象成一个随机的数字和字母组合就可以了。
敲黑板,
敲黑板,
敲黑板,
有了上面的共识,我们开始解答开始的3个问题就相对容易了
A代表.上一区块的哈希
B代表.Merkel树哈希
C代表.时间戳
D代表.难度目标值
E代表.Nonce随机数
1.如果是算力比不过别人,为什么不提前开始计算下一个区块呢?
答:理解了区块头,我们就知道需要找到随机数的前提条件有哪些,包括
A+B+C+D 4个数据
但是在对上一个区块哈希值未知的情况下,下列数据也是无法计算的。
A未知?
B可知(假设=2)
C可知(假设=3)
D未知?
E未知?
A+2+3+D+E=Y,
那请问E,等于几?显然,在显示世界问这个问题是会被挨揍的!
2.如果上一个随机数是0X1234567,为什么不直接接着0X1234567算下去?
每个区块的初始值为0,矿工的第一个计算公式是将**(A+B+C+D+0)的结果,再将其进行哈希计算,如果当前哈希结果无法达到目标难度要求(这是矿工的第一次计算),那么矿工会逐渐的在(A+B+C+D)这个数值上加上1,继续进行哈希计算!
同时我们知道,每个区块的哈希和交易数据,以及难度都是不一样的!哪怕是同样的难度值,交易数据和时间戳也是不一样的,那出来的哈希值肯定也是不一样的。看上图,仅仅是在A+B+C+D后面加多一个1,出来的哈希结果完全不一样,没有任何规则可言。那么,如果接着当前的随机数往下算,绝大多数情况下,可能计算的方向就是错误的。
3.既然矿工是为了寻找一个随机数,那有没有矿工在1分钟左右就找到那个随机数呢?
答案是可以的!带来的结果是后面的区块难度相应的会增加,比特币网络会自动的调整难度值,尽可能均衡的将每个区块的生成时间控制在10分钟左右!难度值是比特币区块的智能水龙头!
加多一题,为什么叫工作量证明?而不叫随机数证明?因为其他的矿工可以通过你的得到的数值,通过统计学来估算这个数的难度值,就可以知道找出这个Nonce随机数需要多少工作量,顾名“工作量证明”。
—END—
人生就像一条区块链,
每一天都是一个区块,
昨天的区块里面的事情无法更改,
今天的区块哈希数值正在计算,
明天的区块无法提前计算。
参考资料:精通比特币第二版
区块查询网站:http://btc.com
哈希计算:http://www.fileformat.info/tool/hash.htm
领取专属 10元无门槛券
私享最新 技术干货