跳转到正文
buybitcoinsmart

术语表 /挖矿与共识

前一区块头哈希

前一区块头哈希是什么?
前一区块头哈希是每个区块头中长度为32字节的字段,用于指明其父区块,也是把一堆区块变成一条链的唯一连接。

每个区块都向后指向,从不向前指向。由于该指针位于参与哈希计算的80字节之内,改动旧区块中的任何内容都会改变其哈希,并使建立在其上的所有区块失效,因此要撤销一年前的一笔付款,就必须重做大约52,000个区块的工作量证明。人们说比特币不可篡改,指的正是这一点,而不是任何关于删除数据的规则。

运作方式

前一区块头哈希是对父区块长度为80字节的区块头连续进行两次 SHA-256运算得出的,它也是一个区块对自身以外任何内容保留的唯一引用。

由于父区块的区块头包含其自身父区块的哈希,依此一直追溯到起点,这个长度为32字节的字段就锁定了其背后的全部历史。已验证链尖的节点,也就隐含地验证了通向链尖的这条链在内部是一致的。若篡改去年夏天挖出的某个区块中的一笔交易,该区块的区块头哈希就会改变,子区块中保存的那份哈希便不再与之匹配,子区块随之无效,其后的所有区块也都无效。要修复这一破坏,就必须重新挖出其中的每一个区块,按每天约144个区块计算,一年为52,560个。

创世区块是例外,也必须是例外:它之前没有任何区块,因此该字段为32个零字节。

区块中没有任何内容指向后一个区块。当 Bitcoin Core 报告 nextblockhash 时,它读取的是自己的索引,而不是区块本身,这正是该值可能在区块链重组期间发生变化,而前一区块头哈希从不改变的原因。两个区块指向同一个父区块也不是错误。从数据的角度看,分叉就是这个样子,网络解决分叉的方式是选择累计工作量最多的分支,而不是宣布其中任何一个指针有误。

在哪里会遇到它

前一区块头哈希会因您所查看的对象不同,而以略有差异的名称出现。

Bitcoin Core 通过 getblockheader 和 getblock 将其作为 previousblockhash 返回。对于区块0,响应中根本没有该字段,因为没有可指明的父区块。区块浏览器通常将其标为 Previous Block 并做成链接,向后逐个点击浏览历史就是这样实现的。

它也是区块头链同步的全部实质内容。下载区块头的节点对每个区块头检查两件事:这个区块头是否指向上一个区块头,以及其哈希是否满足目标值。只有这条链成立之后,节点才开始请求区块主体。轻量钱包不会做得更深入,只保留这些连接和工作量,别无其他。

如果您曾手动构造该字段,请预期会在眼前的字节上费一番周折,因为区块头中的字节顺序与哈希通常被引用的顺序并不相同。

前一区块头哈希 vs 内部字节序

前一区块头哈希的存储字节序与人们通常引用的字节序相反,这使几乎所有试图手动验证区块头的人都会感到困惑。区块1中保存的其父区块哈希为6fe28c0ab6f1b372c1a6a246ae63f74f931e8365e15a089c68d6190000000000。这就是创世区块的哈希000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f 逐字节倒序书写的结果。工作量证明产生的前导零,在原始字段中变成了末尾的零。两者看起来不一致并不表示出了问题:把字节顺序反转过来,两者就一致了。

请勿混淆

常见问题

创世区块的前一区块头哈希是什么?

32个零字节。区块0之前没有任何区块,因此该字段全部填零,Bitcoin Core 在针对该区块的 getblockheader 响应中也直接省略 previousblockhash。

为什么区块浏览器中的区块哈希看起来是反过来的?

因为区块头存储哈希时使用的字节序,与人们通常引用的字节序相反。区块1中保存的其父区块哈希以6fe28c0a 开头,这就是以00000000开头的常见创世区块哈希逐字节倒序书写的结果。

接着阅读

相关术语

挖矿与共识中的更多术语

阅读本页英文版