关于区块链的学习笔记(三)
之前的文章中讲了一些区块链的基本技术知识,今天会稍微深入一点,讲一下关于加密的设计,如果篇幅支持的话,会再聊聊挖矿到底是在干什么。
之前的文章提到区块链每个数据块中保存着三个信息:真正的数据、自己的地址和前一个数据块的地址,如下图所示。
每个数据块的 ID 是根据计算机的哈希算法(Secure Hash)得到的,这个 hash 算法主要是为了实现这几个功能:
·用来生成唯一表示一个数据块的 ID,这个 ID 几乎不能重复
·用来做数据的特征码,只要数据中有一位的数据被修改,整个 hash 值就不一样了,而且数学上保证了我们不能通过 hash 值反推回原数据。
在计算机的世界里有两个 hash 算法很有名,一个叫 MD5,一个叫 SHA-2,区块链用的是后者(SHA-256)。对于上图中第一块数据,我们把数据和之前一块数据的 hash 值一起,做一次 hash 值得到本区块地址 000007cabfa,下一个区块同样把自己的数据和这个 000007cabfa 值一起做 hash 计算,如此往复下去。相信到这里大家应该就能理解为什么说修改区块链数据的成本很高了吧。
下面这张图是区块链的协议格式:
图源来自《左耳听风》专栏
其中 Version,Previous Block Hash,Merkle Root,Timestamp,Difficulty Target 和 Nonce 这六个字段是区块链的协议头部,后面的数据是交易笔数和交易列表(最多不超过 1M)。其中,
·Version 字段:当前区块链协议的版本号,4 个字节。如果升级了,这个版本号会变。
·Previous Block Hash:前面那个区块的 hash 地址,32 个字节
·Merkle Root:可以先简单理解为后面交易信息的 hash 值。32 个字节
·Timestamp:区块生成时间,不早于前面 11 个区块的中尉时间,不晚于你所链接的所有结点时间的中位数。4 个字节
·Difficulty Target:也可称之为 Bits,标明了当前的 hash 生成难度,4 个字节。
·Nonce:一个随机值,用于找到满足特定条件的 hash 值,4 个字节。
对这 6 个字段进行 hash 值计算,就可以得到本区块的 hash 值,但是比特币对于这个 hash 值是有要求的:在区块头中,可以完全自由修改的只有一个字段 Nonce,要求修改 Nonce 这个值来找到某个数字,让整个 hash 值小于 Target,这个 Target 是一个数,决定了我们计算出来的 hash 值前面有几个零,而这个 Target 则是由上文提到的 Difficulty Target(Bits)字段进行控制,它会在每 2016 个区块后就调整一次。我们知道 hash 值本身就是一串相对比较随机的字符串,要想让它有规律是非常困难的事,除了使用暴力破解的方法外没有其他办法(哈希碰撞,hash collision),满足条件的这个难度系数就成了挖矿的关键。而设置这个难度系数,是为了让全网产生的区域名平均在 10 分钟一块,因为比特币的去中心化架构,挖矿的机器是想来就来想走就走的,为了保证每 10 分钟产生一个区块,当算力不足的时候难度下降,当算力充足的时候难度提高。
这个是一个真实的区块链 hash 地址:
“00000000000000000424118cc80622cb26c07b69fbe2bdafe57fea7d5f59d68”
现如今难度是 18 个零(17 年底),所以关于挖矿,一般的电脑和服务器就不要想了。
评论