跳转到正文
buybitcoinsmart

术语表 /挖矿与共识

默克尔根

默克尔根是什么?
默克尔根是区块头中唯一一个32字节的哈希值,它锁定该区块内的每一笔交易,并锁定矿工排列这些交易的确切顺序。

哪怕只改动某一笔支付中的一聪、调换两笔交易的顺序,或多加一笔交易,默克尔根都会完全改变。矿工正是依赖这一点:32位的随机数(nonce)只能提供约43亿次尝试,因此挖矿软件会修改币基交易,生成新的默克尔根,再继续搜索。对持有比特币的人来说,这一个字段正是区块被挖出后无法悄悄增加或减少一笔支付的原因。

运作方式

默克尔根是计算出来的,而不是选定的,这正是它有价值的原因。

它占据区块头80字节中的32字节,矿工写入的是这些交易算出的任何值。每个收到区块的节点都会根据所收到的交易列表重建默克尔树,并将自己的结果与区块头比对。不一致就意味着拒绝,立即拒绝,没有商量余地。协议中不存在区块头说一套、区块主体说另一套的情形。

这项检查使默克尔根成为挖矿循环的关键枢纽。随机数只有四个字节宽,即4,294,967,296个可能的值;一台算力为每秒200万亿次哈希的机器,只需大约百万分之二十秒就能穷尽所有取值。因此矿工需要一种方法来生成新的候选值,而最省事的办法就是修改币基交易。矿池会把币基交易拆成两半,中间留出空隙,发给每台机器;机器把自己的字节写入空隙,币基交易 ID 随之改变,默克尔根也随之改变,于是又有43亿个新的随机数可用。滚动时间戳,以及 BIP320 保留的16个版本位,还能提供额外的空间。

隔离见证在不改动区块头的情况下增加了第二个根,因为改动区块头就会是一次硬分叉。BIP141 定义了一棵独立的树,建立在见证交易 ID 之上,其根写入币基交易的一个输出中,并以四字节前缀0xaa21a9ed 标记。由于币基交易本身就是普通默克尔树的一个叶子节点,这个见证承诺最终还是会被折叠进区块头的默克尔根,只是隔了一层。

在哪里会遇到它

默克尔根是任何区块浏览器都会显示的字段之一,也是少数可以手工验证的字段之一。

Bitcoin Core 在 getblockheader 和 getblock 的输出中以 merkleroot 字段报告它。创世区块的值以4a5e1e4b 开头,是个不错的起点,因为该区块只有一笔交易:只有一个叶子节点的树,其根就是它自身,所以默克尔根与交易 ID 完全相同。任何只包含币基交易的区块都有同样的特性。

您也会在挖矿协议而不是区块中遇到它。Stratum 的任务通知根本不会把交易发给矿机,而是发送币基交易的两半,外加从币基交易一路向上走到树顶所需的那一小串哈希,这样机器就能针对尝试的每个 extranonce 自行计算默克尔根。Stratum V2 改变了由谁来选择交易,但默克尔根的组装方式依然相同。

默克尔根 vs 前一区块头哈希

默克尔根和前一区块头哈希都是32字节的哈希值,并排位于同一个80字节的区块头中,但它们锁定的方向不同。默克尔根指向内部,即本区块的内容:交易及其顺序,此外别无他物。前一区块头哈希指向后方,即其身后的全部历史。修改一笔支付,只有默克尔根会失效;修改去年的一个区块,此后每个区块的前一区块头哈希都会出错,这就是篡改一个区块与篡改一条链之间的区别。

请勿混淆

常见问题

如果默克尔根与交易不一致会怎样?

该区块会被每个节点拒绝。根据交易列表重建默克尔根是节点执行的成本最低的检查之一,因此无法发布内容与其区块头所锁定的内容不一致的区块。

矿工为什么在挖矿时更改默克尔根?

因为随机数会被用完。四个字节约提供43亿次尝试,现代硬件几乎瞬间就能耗尽,所以矿工会修改币基交易,以生成新的默克尔根和一批新的候选值。

接着阅读

相关术语

挖矿与共识中的更多术语

阅读本页英文版