一块区块头, 看起来也就那么80个字节的大小样子, 可是它能把这一整条区块链的安全性全部都撑起来。

我在这个底层协议的代码方面, 写了这么多年的功夫, 越是走向那个比较深的那个层次, 我的感觉就越来越明显, 那就是说, 如果你搞不清楚这个区块头里面的那几行数据是什么情况的话, 那么后面所有的共识机制、校验过程, 还有分叉的判断, 全部都要变得没有作用, 全部都要白费功夫。

现在在下面这里, 把我在平常时候最喜欢拿出来跟那些新进入这个领域的人摊开来讲的那两个部分的内容, 把它书写出来。

区块头有哪些信息

版本号字段,还有前一区块的哈希值, 这两个字段共同解决的是区块链要接在谁的后面这个问题, 版本号用来标记协议的兼容级别, 前一个区块的父级哈希则是把当前区块和链上上一块死死地锁在一起, 哪怕只改动了一个字节, 整条链就会直接断裂。

时间戳、难度目标、nonce和Merkle root, 这四个东西是矿工真正在拼的东西。Merkle root把区块里全部交易压成一个256位指纹。时间戳和难度目标决定了这一轮要“撞”多难。nonce就是那个反复自增的64位整数。哈希结果小于等于目标值才算出块成功。

区块链区块头到底存了哪些信息?搞懂这几处就够

区块头信息如何校验

校验的事情只有两步, 第一步是先把区块里面的交易拿来重新计算一遍Merkle root, 如果发现算出来的结果跟区块头里存的那个东西对不上, 那就把这事情给拒绝掉, 第二步是把整个区块头拿出来做一次双SHA-256的计算, 看一看最后得到的结果是不是落在了难度目标的范围内头一个做法是为了防止有人偷偷把交易给调包了, 后一个办法是为了防止有人在算力上做假造假。

我看到过不少开发者, 只要处理完哈希部分就觉得完成任务了, 却忘记了要去验证时间戳不能超前这一关键点, 如果这样做的话, 当节点一执行同步操作时, 就会被不正确的数据带偏方向, 因此一定要记住, 在生产环境里, 如果出现时间偏差超过两小时的情况, 必须直接将异常踢掉, 千万不要在这一点上偷工减料。

这80个字节构成的空间里, 所蕴含的信息密度是非常的高, 如果你能够将这一点真正彻底地弄懂并且消化进去, 那么以后在面对诸如看明白UTXO集这一回事、弄清楚分叉时如何进行选择以及如何实现轻客户端SPV的同步这类问题时, 逻辑链条就完全能够被接通了。