本人我在公用的底层网络环境中编写了整整三年的源代码代码, 期间被人反复询问的一个话题就是, 区块究竟应该使用什么样子的名称来进行指代, 区块链领域里的区块命名规则这件事情其实并没有那么神秘和难以理解, 其核心的组成部分主要就只有两种东西是高度编号以及哈希值这两项内容, 不过在实际操作的场景中去运用这些知识的时候, 尤其是在需要跨越多条链条来查询相关数据的过程中, 人们确实非常容易将这几个概念混淆在一起从而产生误解。
区块命名规则怎么定
区块高度这个概念, 其实就是从0这个数字开始, 一直在单调递增的整数序列。比特币那个创世块, 它的高度是0。以太坊也是这种情况。每当一个新的区块被生成出来的时候, 高度就会加1, 除此之外, 没有其他的任何规矩。
如果你在本地去运行一个全节点, 那么它的区块数据文件, 基本上就是按照高度来命名的。比如chain目录里面的000001.dat文件, 它就是存储了一个区段的数据。在日常的运维日志里, 如果出现了类似“区块高度落后”这样的报错信息, 它所指的是就是这个特定的数字。
哈希值是另一套, 它是一套完全独立的标识。它是区块头里面所有那些字段的SHA-256摘要, 也就是一个64位十六进制数。如果你把同一批交易换成别的顺序去打包, 那么生成的哈希值就会变得天差地别, 相差极大。
所以说, 真正能够唯一定位到一个区块的东西, 只能是它的哈希值。而所谓的区块高度啊, 它仅仅只是一个为了方便人们阅读的顺序号码罢了, 对人看着方便而已。
区块链命名规则有哪些
在工程实践之中, 人们经常会利用区块时间戳来辅助进行定位操作, 但是千万不要把时间戳当作唯一的标识符来使用。我在BSC测试网上就曾经出现过错误案例, 出现了两个块的时间戳落在同一秒的情况, 这种情况下只能依靠父哈希来进行区分。
另外有一些区块链系统支持针对特定的高度来添加元数据标签, 例如用来标记“硬分叉升级点”这类的情况, 这完全是应用层面的事情, 与底层的协议内容无关。

还有一个点, 容易被人们忽略的, 是区块索引这个东西。在节点的内存里面, 大家是按照高度去维护一棵B+树的, 这个做法的目的, 是为了能够方便大家使用O(log n)的时间复杂度, 去查询任意一个区块的信息, 这样效率会高一些。
从严格意义上来说, 这个技术本身, 并不算是某种形式的“命名”, 但是呢, 当我们把这个东西, 跟实际的命名规则配合起来一起使用的时候, 就会发现在日常的故障排查工作中, 这是非常关键的一环, 是大家在日常工作中无论如何也绕不开的一个要点。
如果下一次有别人向你提问, 询问关于第8430000块到底是什么情况, 那么你可以直接向他们展示一下对应的相关哈希值,要知道, 高度仅仅是一个非常容易被人类所直观看到的顺序号码。
